Vì một số người hỏi nó, tôi đã biến câu trả lời này
thành một gói .
Nếu bạn đã cấu hình Melpa, bạn có thể cài đặt nó với
M-x package-install RET aggressive-indent
Xem Readme cho tất cả các tùy chọn, nhưng cách đơn giản nhất để bật nó là:
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
Câu trả lời cũ
Dưới đây không chỉ tự động thụt vào bộ đệm elisp. Nó có lợi thế là cũng hoạt động khi bạn xóa hoặc kéo đồ (thay vì chỉ gõ). Thật dễ dàng để thêm vào các chế độ khác.
Hàm này sẽ thụt vào bất cứ biểu thức s nào mà điểm hiện tại bên trong. Bạn có thể liên kết nó với một khóa nếu bạn muốn, nhưng xem bên dưới trước.
(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))))))
Móc này sẽ làm cho nó để chức năng này sẽ được chạy sau khi bạn gõ bất cứ thứ gì, nhưng chỉ trong bộ đệm elisp. Điều này sẽ giữ mọi thứ luôn thụt vào.
(add-hook
'emacs-lisp-mode-hook
(lambda ()
(add-hook 'post-command-hook
#'endless/indent-defun nil 'local)))
Thử nó! Nó hoạt động rất tốt.
Ngoài ra, theo gợi ý của @ holocronweaver trong các bình luận, bạn có thể sử dụng một cái gì đó như sau cho các ngôn ngữ giống như c:
(define-key c++-mode-map ";"
(lambda () (interactive)
(insert ";")
(endless/indent-defun)))