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

Le
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/
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sébastien Kirche
Le #21767591
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
Alain Ketterlin
Le #21767581
Ph. Ivaldi
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.
Ph. Ivaldi
Le #21767571
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/
Ph. Ivaldi
Le #21767561
Le 22 septembre 2009, Alain Ketterlin écrivit :

Ph. Ivaldi
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 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 " (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/
Ph. Ivaldi
Le #21767551
Le 22 septembre 2009, Ph. Ivaldi écrivit :

(while (search-forward-regexp "


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 " (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/
Asgeir
Le #21767541
Ph. Ivaldi
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
Ph. Ivaldi
Le #21767531
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/
Ph. Ivaldi
Le #21767521
Quelle avantage


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

(while (search-forward-regexp "


N'est-ce pas plutôt "
--
LL
Ph. Ivaldi
Le #21767501
Le 23 septembre 2009, Lucas Levrel écrivit :

Le 22 septembre 2009, Ph. Ivaldi a écrit :
(while (search-forward-regexp "

N'est-ce pas plutôt "


Oui, c'est sans incidence dans le cas présent mais c'est effectivement
mieux.
--
Philippe Ivaldi.
http://www.piprime.fr/
Publicité
Poster une réponse
Anonyme