Da einige Leute danach fragten, habe ich diese Antwort
in ein Paket umgewandelt .
Wenn Sie Melpa konfiguriert haben, können Sie es mit installieren
M-x package-install RET aggressive-indent
In der Readme-Datei finden Sie alle Optionen. Die einfachste Methode zum Aktivieren ist jedoch:
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
Die alte Antwort
Im Folgenden wird die automatische Einrückung nur für Elisp-Puffer ausgeführt. Es hat den Vorteil, dass es auch funktioniert, wenn Sie etwas löschen oder ruckeln (anstatt nur zu tippen). Es ist auch einfach, andere Modi hinzuzufügen.
Diese Funktion rückt jeden S-Ausdruck ein, in dem sich der Punkt gerade befindet. Sie können es an einen Schlüssel binden, wenn Sie möchten, aber sehen Sie zuerst weiter unten.
(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))))))
Dieser Haken bewirkt, dass diese Funktion ausgeführt wird, nachdem Sie etwas eingegeben haben, jedoch nur in Elisp-Puffern. Dies sollte alles immer eingerückt halten.
(add-hook
'emacs-lisp-mode-hook
(lambda ()
(add-hook 'post-command-hook
#'endless/indent-defun nil 'local)))
Versuch es! Es funktioniert bemerkenswert gut.
Wenn Sie dem Vorschlag von @ holocronweaver in den Kommentaren folgen, können Sie für c-ähnliche Sprachen Folgendes verwenden:
(define-key c++-mode-map ";"
(lambda () (interactive)
(insert ";")
(endless/indent-defun)))