Оскільки деякі люди просили його, я перетворив цю відповідь
на пакет .
Якщо у вас налаштована 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)))