Hay momentos en que estoy editando archivos (manifiestos de Puppet, por ejemplo) donde quiero alinear los contenidos del búfer sobre la marcha. Por ejemplo, sé que puedo usar align-regexp
o align
alinear código como este, siempre que lo tenga seleccionado:
# M-x align-regexp "=>" will line everything up nicely
file { "/etc/foo":
ensure => present,
mode => "0666",
source => "puppet:///modules/example/foo",
}
Pero lo que realmente quiero es que esto suceda sobre la marcha , sin tener que seleccionar una región o todo el búfer. ¿Hay un paquete o modo que haga esto, o es algo que debería integrarse en el modo que me interesa?
Editar: pregunté sobre Puppet y CFEngine, ya que eso es lo que codifico en la mayoría de estos días y tengo una gran preferencia por el texto alineado. Sin embargo, también tenía curiosidad (y no expresé esto bien) de saber si la alineación sobre la marcha es una característica común en los modos Emacs (principalmente en los modos para lenguajes de programación), o si la mayoría de las personas se alinean al guardar o en algún momento otro punto
indent-region
conalign-to-equals
y defina esta función como(defun align-to-equals (begin end) (interactive "r") (align-regexp begin end "\\(\\s-*\\)=" 1 1 nil))
; yemacs-lisp-mode-hook
conpuppet-mode-hook
.Respuestas:
Si desea marcar una región para la alineación automática, entonces probablemente no sea demasiado difícil hacer algo como:
Pero si desea que sea completamente automático, necesitará encontrar una manera de caracterizar qué regiones desea alinear automáticamente (y con qué expresión regular), lo cual es más difícil. Supongo que podría proporcionar algunas expresiones regulares y luego escanear el búfer en busca de líneas consecutivas que coincidan con una de esas expresiones regulares.
fuente
my-auto-align
se utiliza para definir estas superposiciones (marque las regiones que desea alinear). La razón (creo) que Stefan está pasando por todos estos problemas es que (a diferencia de la sangría) si solo intenta alinear todo el búfer, obtendrá resultados no deseados, por lo que debe alinear las piezas a la vez.Modo títere proporciona
puppet-align-block
. Puede organizar la invocación automática de esta función, por ejemplo, agregándolapost-command-hook
localmente (sin probar):Tenga en cuenta, sin embargo, que hay una buena razón para no hacer esto. No es particularmente inteligente, y sobrescribirá cualquier alineación manual que pueda hacer en cualquier lugar, lo que se romperá particularmente mal, si la alineación automática no funciona para un código Puppet más complicado.
Por lo tanto, hablando como mantenedor del modo Puppet, recomiendo no hacerlo, y no le ayudaremos ni aceptaremos informes de errores, si está utilizando este código.
Además, para bloques de recursos grandes, puede ser lento, por lo que probablemente desee usar un temporizador inactivo en lugar de
post-command-hook
directamente.fuente