Poiché alcune persone lo hanno chiesto, ho trasformato questa risposta
in un pacchetto .
Se hai configurato Melpa, puoi installarlo con
M-x package-install RET aggressive-indent
Consulta il file Leggimi per tutte le opzioni, ma il modo più semplice per attivarlo è:
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
La vecchia risposta
Quanto segue esegue il rientro automatico solo sui buffer elisp. Ha il vantaggio di lavorare anche quando cancelli o strappi cose (invece di scrivere semplicemente). È facile da aggiungere anche ad altre modalità.
Questa funzione indenterà qualunque espressione s sia attualmente presente nel punto. Se lo desideri, puoi associarlo a una chiave, ma prima vedi sotto.
(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))))))
Questo hook lo farà in modo che questa funzione verrà eseguita dopo aver digitato qualsiasi cosa, ma solo nei buffer elisp. Questo dovrebbe mantenere tutto sempre rientrato.
(add-hook
'emacs-lisp-mode-hook
(lambda ()
(add-hook 'post-command-hook
#'endless/indent-defun nil 'local)))
Provalo! Funziona straordinariamente bene.
Inoltre, seguendo il suggerimento di @ holocronweaver nei commenti, puoi usare qualcosa di simile al seguente per i linguaggi di tipo c:
(define-key c++-mode-map ";"
(lambda () (interactive)
(insert ";")
(endless/indent-defun)))