Il y a des moments où je modifie des fichiers (manifestes de marionnettes, par exemple) où je veux aligner le contenu du tampon à la volée. Par exemple, je sais que je peux utiliser align-regexp
ou align
pour aligner un code comme celui-ci, tant que je l'ai sélectionné:
# M-x align-regexp "=>" will line everything up nicely
file { "/etc/foo":
ensure => present,
mode => "0666",
source => "puppet:///modules/example/foo",
}
Mais ce que je veux vraiment, c'est que cela se produise à la volée - sans avoir à sélectionner une région ou la totalité du tampon. Existe-t-il un package ou un mode qui fera cela, ou est-ce quelque chose qui devrait être intégré au mode qui m'intéresse?
Edit: J'ai posé des questions sur Puppet et CFEngine, car c'est ce que je code la plupart du temps et j'ai une forte préférence pour le texte aligné. Cependant, j'étais également curieux (et je ne l'ai pas bien exprimé) de savoir si l'alignement à la volée est une fonctionnalité courante dans les modes Emacs (principalement dans les modes pour les langages de programmation), ou si la plupart des gens s'alignent lors de l'enregistrement ou à certains moments. autre point.
indent-region
paralign-to-equals
et définissez cette fonction comme(defun align-to-equals (begin end) (interactive "r") (align-regexp begin end "\\(\\s-*\\)=" 1 1 nil))
; etemacs-lisp-mode-hook
avecpuppet-mode-hook
.Réponses:
Si vous souhaitez marquer une région pour l'alignement automatique, ce n'est probablement pas trop difficile à faire avec quelque chose comme:
Mais si vous voulez qu'il soit entièrement automatique, vous devez trouver un moyen de caractériser les régions que vous souhaitez aligner automatiquement (et avec quelle expression rationnelle), ce qui est plus difficile. Je suppose que vous pouvez fournir des expressions régulières, puis analyser le tampon pour trouver des lignes consécutives correspondant à l'une de ces expressions régulières.
la source
my-auto-align
est utilisée pour définir ces superpositions (marquez les régions que vous souhaitez aligner). La raison (je pense) que Stefan traverse tous ces problèmes est que (contrairement à l'indentation) si vous essayez simplement d'aligner tout le tampon, vous obtiendrez des résultats indésirables, vous devez donc aligner les pièces à la fois.Mode marionnette fournit
puppet-align-block
. Vous pouvez faire en sorte que cette fonction soit appelée automatiquement, par exemple en l'ajoutant àpost-command-hook
localement (non testé):Notez cependant qu'il y a une bonne raison de ne pas le faire. Ce n'est pas particulièrement intelligent, et écrasera tout alignement manuel que vous pourriez faire n'importe où, ce qui se cassera particulièrement mal, si l'alignement automatique ne fonctionne pas pour un code Puppet plus compliqué.
Par conséquent, en tant que responsable du mode Puppet, je le déconseille et nous ne vous aiderons pas ou n'accepterons pas les rapports de bogues si vous utilisez ce code.
En outre, pour les blocs de ressources volumineux, cela peut être lent, vous voudrez donc probablement utiliser un minuteur inactif au lieu de le faire
post-command-hook
directement.la source