Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Indente tout le buffer... oui mais « smartly »

11 réponses
Avatar
Ph. Ivaldi
Bonjour,

Je ne saurai plus me passer de C-S-iso-lefttab:
8<------8<------8<------8<------8<------8<------8<------8<------8<------
;; --------------------------
;; * Indente tout le buffer *
(defun pi-indent-all ()
(interactive)
(indent-region (point-min) (point-max) nil))
(global-set-key (kbd "<C-S-iso-lefttab>") 'pi-indent-all)
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Il y a un problème quand le buffer contient du code en verbatim; genre
\begin/end{verbatim} en LaTeX ou <pre></pre> en html où je ne veux pas
que l'indentation soit modifiée.

Quelqu'un a-t-il une idée ou un bout de code dans un coin de disque pour
arranger ça ?

Entre parenthèses, mes recherches m'ont amené sur
http://www.emacswiki.org/emacs/AutoIndentation
où j'y ai découvert comment indenter automatiquement le code lors d'un
« coller »; je trouve ça assez pratique.
--
Philippe Ivaldi.
http://www.piprime.fr/

10 réponses

1 2
Avatar
Sébastien Kirche
Le 22 septembre 2009 à 11:32, Ph. Ivaldi a formulé :

Bonjour,

Je ne saurai plus me passer de C-S-iso-lefttab:
8<------8<------8<------8<------8<------8<------8<------8<------8<------
;; --------------------------
;; * Indente tout le buffer *
(defun pi-indent-all ()
(interactive)
(indent-region (point-min) (point-max) nil))
(global-set-key (kbd "<C-S-iso-lefttab>") 'pi-indent-all)
8<------8<------8<------8<------8<------8<------8<------8<------8<------



C'est quoi la touche iso-lefttab ? TAB ?

Il y a un problème quand le buffer contient du code en verbatim; genre
begin/end{verbatim} en LaTeX ou <pre></pre> en html où je ne veux pas
que l'indentation soit modifiée.

Quelqu'un a-t-il une idée ou un bout de code dans un coin de disque
pour arranger ça ?

Entre parenthèses, mes recherches m'ont amené sur
http://www.emacswiki.org/emacs/AutoIndentation
où j'y ai découvert comment indenter automatiquement le code lors d'un
« coller »; je trouve ça assez pratique.



Faut que j'aille voir ça, je code toute la journée (en principe avec
d'autres éditeurs, avec Emacs c'est seulement le soir) mais je me sers
quand même assez souvent d'Emacs pour reformater des portions de code
(avec M-x align et C-u M-x align-regexp notamment), ou pour utiliser
re-builder.

--
Sébastien Kirche
Avatar
Alain Ketterlin
Ph. Ivaldi writes:

Je ne saurai plus me passer de C-S-iso-lefttab:



(je ne connais pas iso-lefttab. C'est un mac-ism ?)

8<------8<------8<------8<------8<------8<------8<------8<------8<------
;; --------------------------
;; * Indente tout le buffer *
(defun pi-indent-all ()
(interactive)
(indent-region (point-min) (point-max) nil))
(global-set-key (kbd "<C-S-iso-lefttab>") 'pi-indent-all)
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Il y a un problème quand le buffer contient du code en verbatim; gen re
begin/end{verbatim} en LaTeX ou <pre></pre> en html où je ne veux p as
que l'indentation soit modifiée.



Quand je fais C-x h TAB, tout s'indente correctement (y compris
begin/end{verbatim} et tutti quanti). C'est peut-être une piste...

-- Alain.
Avatar
Ph. Ivaldi
Le 22 septembre 2009, Sébastien Kirche écrivit :

C'est quoi la touche iso-lefttab ? TAB ?



Oui, C-h k C-S-TAB me donne
<C-S-iso-lefttab> runs the command pi-indent-all etc...

reformater des portions de code
(avec M-x align et C-u M-x align-regexp notamment)



Je ne connaissais pas... c'est intéressant.
--
Philippe Ivaldi.
http://www.piprime.fr/
Avatar
Ph. Ivaldi
Le 22 septembre 2009, Alain Ketterlin écrivit :

Ph. Ivaldi writes:
Je ne saurai plus me passer de C-S-iso-lefttab:


(je ne connais pas iso-lefttab. C'est un mac-ism ?)



Nonnon, c'est un pc portatif tout ce qu'il y a de plus classique
(thinkpad T43).

Quand je fais C-x h TAB,



Cette méthode envoie le curseur au début du buffer et ça m'énerve
toujours.

tout s'indente correctement (y compris
begin/end{verbatim} et tutti quanti).



Exact pour verbatim en latex-mode, mais pas pour <pre> en html et c'est
justement celui-là qui me gène en ce moment.
J'ai testé en xhtml-mode et avec nxhtml, c'est le même comportement.

C'est peut-être une piste...



Oui et non. :-)
J'ai regardé comment fait latex-mode; il y a pléthore de routines qui
calculent l'indentation. Inutile de dire que je ne vais pas m'amuser à
rentrer là dedans sur du php/html...

D'un autre côté ça semble prouver qu'il n'y a pas une solution toute
faite.
D'où la bête idée d'intenter la région qui va du début du buffer jusqu'au
prochain <pre.+> puis la région que va du </pre> jusqu'au prochain
<pre.+> etc...
S'il n'y a pas de <pre>... ben yapas de pb.

Aussitôt dit, aussitôt fait (pas trop le temps de fignoler quand même) ;-)
8<------8<------8<------8<------8<------8<------8<------8<------8<------
(defun pi-indent-html-buffer nil
(interactive)
(save-excursion
(beginning-of-buffer)
(let ((find-pre) (ppoint (point)))
(while (search-forward-regexp "<pre.+>" (point-max) t)
(or find-pre (setq find-pre t))
(indent-region ppoint (point) nil)
(search-forward-regexp "</pre>" (point-max) t)
(setq ppoint (point)))
(or find-pre (indent-region ppoint (point-max) nil)))))
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Voilà, il n'y a plus qu'à modifier pi-indent-all pour qu'il détecte si
on édite du html et appeler le function qui va bien.
Tiens... ça me fait mon prochain article sur mon blog.

Merci,
--
Philippe Ivaldi.
http://www.piprime.fr/
Avatar
Ph. Ivaldi
Le 22 septembre 2009, Ph. Ivaldi écrivit :

(while (search-forward-regexp "<pre.+>" (point-max) t)



Et s'il n'y a pas d'attribut alors ?

(or find-pre (setq find-pre t))



Inutile !

(indent-region ppoint (point) nil)
(search-forward-regexp "</pre>" (point-max) t)
(setq ppoint (point)))
(or find-pre (indent-region ppoint (point-max) nil)))))



Et le fin du buffer, goret va !

Je la refais en couleur:
8<------8<------8<------8<------8<------8<------8<------8<------8<------
(defun pi-indent-html-buffer nil
(interactive)
(save-excursion
(beginning-of-buffer)
(let ((ppoint (point)))
(while (search-forward-regexp "<pre.*+>" (point-max) t)
(indent-region ppoint (point) nil)
(search-forward-regexp "</pre>" (point-max) t)
(setq ppoint (point)))
(indent-region ppoint (point-max) nil))))
8<------8<------8<------8<------8<------8<------8<------8<------8<------

--
Philippe Ivaldi.
http://www.piprime.fr/
Avatar
Asgeir
Ph. Ivaldi writes:
Quand je fais C-x h TAB,



Cette méthode envoie le curseur au début du buffer et ça m 'énerve
toujours.



(defun indent-whole-buffer ()
(interactive)
(save-excursion
(mark-whole-buffer)
(indent-for-tab-command)))

(define-key global-map (kbd "C-x-h-iso-lefttab" 'indent-whole-buffer)
--
Asgeir
Avatar
Ph. Ivaldi
Le 22 septembre 2009, Asgeir écrivit :

(defun indent-whole-buffer ()
(interactive)
(save-excursion
(mark-whole-buffer)
(indent-for-tab-command)))
(define-key global-map (kbd "C-x-h-iso-lefttab" 'indent-whole-buffer)



Quelle avantage par rapport à pi-indent-all donnée au début du fil ?
--
Philippe Ivaldi.
http://www.piprime.fr/
Avatar
Ph. Ivaldi
Quelle avantage


Quel
Avatar
Lucas Levrel
Le 22 septembre 2009, Ph. Ivaldi a écrit :

(while (search-forward-regexp "<pre.*+>" (point-max) t)



N'est-ce pas plutôt "<pre.*?>" ?

--
LL
Avatar
Ph. Ivaldi
Le 23 septembre 2009, Lucas Levrel écrivit :

Le 22 septembre 2009, Ph. Ivaldi a écrit :
(while (search-forward-regexp "<pre.*+>" (point-max) t)


N'est-ce pas plutôt "<pre.*?>" ?



Oui, c'est sans incidence dans le cas présent mais c'est effectivement
mieux.
--
Philippe Ivaldi.
http://www.piprime.fr/
1 2