Como algunas personas lo pidieron, convertí esta respuesta
en un paquete .
Si tiene Melpa configurado, puede instalarlo con
M-x package-install RET aggressive-indent
Consulte el archivo Léame para ver todas las opciones, pero la forma más sencilla de activarlo es:
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
La vieja respuesta
Lo siguiente hace una sangría automática solo en los buffers de elisp. Tiene la ventaja de funcionar también cuando borra o tira cosas (en lugar de simplemente escribir). También es fácil agregar a otros modos.
Esta función sangrará cualquier expresión-s en la que se encuentre el punto actualmente. Puede vincularlo a una clave si lo desea, pero consulte a continuación primero.
(require 'cl-lib)
(defun endless/indent-defun ()
"Indent current defun.
Do nothing if mark is active (to avoid deactivating it), or if
buffer is not modified (to avoid creating accidental
modifications)."
(interactive)
(ignore-errors
(unless (or (region-active-p)
buffer-read-only
(null (buffer-modified-p)))
(let ((l (save-excursion (beginning-of-defun 1) (point)))
(r (save-excursion (end-of-defun 1) (point))))
(cl-letf (((symbol-function 'message) #'ignore))
(indent-region l r))))))
Este enlace hará que esta función se ejecute después de escribir cualquier cosa, pero solo en búferes elisp. Esto debería mantener todo siempre sangrado.
(add-hook
'emacs-lisp-mode-hook
(lambda ()
(add-hook 'post-command-hook
#'endless/indent-defun nil 'local)))
¡Intentalo! Funciona notablemente bien.
Además, siguiendo la sugerencia de @ holocronweaver en los comentarios, puede usar algo como lo siguiente para lenguajes tipo c:
(define-key c++-mode-map ";"
(lambda () (interactive)
(insert ";")
(endless/indent-defun)))