Ponieważ niektórzy o to prosili, zamieniłem tę odpowiedź
w pakiet .
Jeśli masz skonfigurowaną Melpę, możesz ją zainstalować za pomocą
M-x package-install RET aggressive-indent
Zobacz plik Readme dla wszystkich opcji, ale najprostszym sposobem na jego włączenie jest:
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
Stara odpowiedź
Następujące automatyczne wcięcie dotyczy tylko buforów elisp. Ma tę zaletę, że działa również podczas wymazywania lub szarpania (zamiast pisania). Łatwo jest również dodać do innych trybów.
Ta funkcja wcina dowolne wyrażenie s, w którym znajduje się obecnie punkt. Możesz powiązać go z kluczem, jeśli chcesz, ale najpierw zobacz poniżej.
(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))))))
Ten haczyk sprawi, że ta funkcja będzie uruchamiana po wpisaniu czegokolwiek, ale tylko w buforach elisp. To powinno sprawić, że wszystko będzie zawsze wcięte.
(add-hook
'emacs-lisp-mode-hook
(lambda ()
(add-hook 'post-command-hook
#'endless/indent-defun nil 'local)))
Spróbuj! Działa wyjątkowo dobrze.
Ponadto, postępując zgodnie z sugestią @ holocronweaver w komentarzach, możesz użyć czegoś takiego jak dla języków podobnych do c:
(define-key c++-mode-map ";"
(lambda () (interactive)
(insert ";")
(endless/indent-defun)))