何人かの人々がそれを求めたので、私はこの答えをパッケージに変え
ました。
Melpaが構成されている場合は、次のコマンドでインストールできます。
M-x package-install RET aggressive-indent
すべてのオプションについてはReadmeを参照してください。ただし、有効にする最も簡単な方法は次のとおりです。
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
古い答え
以下は、elispバッファーでのみ自動インデントを行います。(入力するだけでなく)ものを消去したりヤンクしたりするときにも機能するという利点があります。他のモードにも簡単に追加できます。
この関数は、ポイントが現在内部にあるs-expressionをインデントします。必要に応じてキーにバインドできますが、最初に以下を参照してください。
(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)))