Поскольку некоторые люди просили об этом, я превратил этот ответ
в пакет .
Если у вас настроен Melpa, вы можете установить его с
M-x package-install RET aggressive-indent
См. Readme для всех опций, но самый простой способ включить его:
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
Старый ответ
Следующее делает авто-отступ только для буферов elisp. Он также имеет преимущество работы, когда вы стираете или дергаете вещи (вместо того, чтобы просто печатать). Это легко добавить и в другие режимы.
Эта функция будет делать отступ для любого s-выражения, внутри которого находится точка. Вы можете привязать его к клавише, если хотите, но сначала смотрите ниже.
(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))))))
Этот хук сделает так, что эта функция будет запускаться после того, как вы что-нибудь напечатаете, но только в буферах elisp. Это должно держать все всегда с отступом.
(add-hook
'emacs-lisp-mode-hook
(lambda ()
(add-hook 'post-command-hook
#'endless/indent-defun nil 'local)))
Попытайся! Это работает замечательно хорошо.
Кроме того, следуя предложению @ holocronweaver в комментариях, вы можете использовать что-то вроде следующего для c-подобных языков:
(define-key c++-mode-map ";"
(lambda () (interactive)
(insert ";")
(endless/indent-defun)))