align – ¿Existe un paquete o modo de alineación automática para Emacs?

Pregunta:

Hay momentos en los que estoy editando archivos (manifiestos de marionetas, por ejemplo) en los que quiero alinear el contenido del búfer sobre la marcha. Por ejemplo, sé que puedo usar align-regexp o align para 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 algún 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 los días y tengo una fuerte preferencia por el texto alineado. Sin embargo, también tenía curiosidad (y no lo expresé bien) por saber si la alineación sobre la marcha es una característica que es común en los modos de 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.

Respuesta:

Si desea marcar una región para la alineación automática, probablemente no sea demasiado difícil de hacer con algo como:

(require 'cl-lib)

(defvar my--auto-align-overlays nil)
(make-variable-buffer-local 'my--auto-align-overlays)

(defun my-auto-align (beg end regexp)
  (interactive "r\nsRegexp: ")
  (let ((ol (make-overlay beg end)))
    (overlay-put ol 'evaporate t)
    (overlay-put ol 'my--auto-align-regexp regexp)
    (overlay-put ol 'modification-hooks '(my--auto-align-function))
    (push ol my--auto-align-overlays)
    (add-hook 'post-command-hook 'my--auto-align-pch nil t)))

(defun my--auto-align-function (ol &rest _args)
  (cl-pushnew ol my--auto-align-overlays)
  (add-hook 'post-command-hook 'my--auto-align-pch nil t))

(defun my--auto-align-pch ()
  (dolist (ol my--auto-align-overlays)
    (align-regexp (overlay-start ol) (overlay-end ol)
                  (concat "\\(\\s-*\\)" (overlay-get ol 'my--auto-align-regexp))
                  1 align-default-spacing))
  (setq my--auto-align-overlays nil)
  (remove-hook 'post-command-hook 'my--auto-align-pch))

Pero si desea que sea completamente automático, deberá encontrar una manera de caracterizar qué regiones desea alinear automáticamente (y con qué expresiones regulares), 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.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım