Karena beberapa orang memintanya, saya mengubah jawaban ini
menjadi satu paket .
Jika Anda telah mengkonfigurasi Melpa, Anda dapat menginstalnya dengan
M-x package-install RET aggressive-indent
Lihat Readme untuk semua opsi, tetapi cara paling sederhana untuk menyalakannya adalah:
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
Jawaban Lama
Berikut ini melakukan indentasi otomatis hanya pada buffer elisp. Ini memiliki keuntungan juga bekerja ketika Anda menghapus atau menarik barang (bukan hanya mengetik). Sangat mudah untuk menambahkan ke mode lain juga.
Fungsi ini akan indentasi apa pun s-ekspresi titik saat ini di dalam Anda dapat mengikatnya ke kunci jika Anda mau, tetapi lihat di bawah terlebih dahulu.
(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))))))
Hook ini akan membuatnya sehingga fungsi ini akan berjalan setelah Anda mengetik apa pun, tetapi hanya di buffer elisp. Ini harus menjaga semuanya selalu menjorok ke dalam.
(add-hook
'emacs-lisp-mode-hook
(lambda ()
(add-hook 'post-command-hook
#'endless/indent-defun nil 'local)))
Cobalah! Ini bekerja dengan sangat baik.
Juga, mengikuti saran @ holocronweaver di komentar, Anda dapat menggunakan sesuatu seperti berikut untuk bahasa c-like:
(define-key c++-mode-map ";"
(lambda () (interactive)
(insert ";")
(endless/indent-defun)))