Иногда я редактирую файлы (например, манифесты Puppet), где я хочу выровнять содержимое буфера на лету. Например, я знаю, что могу использовать align-regexp
или align
для выравнивания кода следующим образом, если я его выбрал:
# M-x align-regexp "=>" will line everything up nicely
file { "/etc/foo":
ensure => present,
mode => "0666",
source => "puppet:///modules/example/foo",
}
Но я действительно хочу, чтобы это происходило на лету - без необходимости выбирать регион или весь буфер. Есть ли пакет или режим, который будет делать это, или это то, что должно быть встроено в интересующий меня режим?
Изменить: я спросил о Puppet и CFEngine, так как это то, что я кодирую в большинстве случаев, и у меня есть сильные предпочтения для выравнивания текста. Тем не менее, мне также было любопытно (и не очень хорошо выразил это) узнать, является ли выравнивание «на лету» функцией, характерной для режимов Emacs (в основном в режимах для языков программирования), или большинство людей выравнивают при сохранении или при некоторых другой момент.
indent-region
наalign-to-equals
и определите эту функцию как(defun align-to-equals (begin end) (interactive "r") (align-regexp begin end "\\(\\s-*\\)=" 1 1 nil))
; иemacs-lisp-mode-hook
сpuppet-mode-hook
.Ответы:
Если вы хотите пометить область для автоматического выравнивания, то, вероятно, не так уж сложно сделать что-то вроде:
Но если вы хотите, чтобы он был полностью автоматическим, вам нужно было бы найти способ охарактеризовать, какие области вы хотите автоматически выровнять (и с какими регулярными выражениями), что более сложно. Я думаю, вы могли бы предоставить несколько регулярных выражений, а затем просканировать буфер на наличие последовательных строк, соответствующих одному из этих регулярных выражений.
источник
my-auto-align
используется для определения этих наложений (отметьте области, которые вы хотите выровнять). Причина (я думаю), что Стефан преодолевает все эти проблемы, заключается в том, что (в отличие от отступа), если вы просто попытаетесь выровнять весь буфер, вы получите нежелательные результаты, поэтому вам нужно выровнять фрагменты за раз.Кукольный режим обеспечивает
puppet-align-block
. Вы можете организовать автоматический вызов этой функции, например, добавив ее вpost-command-hook
локально (не проверено):Обратите внимание, что есть веская причина не делать этого. Это не особенно умно, и перезапишет любое ручное выравнивание, которое вы могли бы сделать где угодно, что особенно сильно сломается, если автоматическое выравнивание не сработает для более сложного кода Puppet.
Поэтому, выступая в роли сопровождающего Puppet Mode, я рекомендую против этого, и мы не поможем вам и не примем сообщения об ошибках, если вы используете этот код.
Кроме того, для больших блоков ресурсов это может быть медленным, поэтому вы, вероятно, захотите использовать таймер простоя вместо
post-command-hook
прямого.источник