เนื่องจากบางคนถามว่าผมหันคำตอบนี้
เป็นแพคเกจ
หากคุณมีการกำหนดค่า Melpa คุณสามารถติดตั้งได้ด้วย
M-x package-install RET aggressive-indent
ดูReadmeสำหรับตัวเลือกทั้งหมด แต่วิธีที่ง่ายที่สุดในการเปิดใช้งานคือ:
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
คำตอบเก่า ๆ
ต่อไปนี้จะทำการเยื้องอัตโนมัติกับบัฟเฟอร์ elisp เท่านั้น มันมีข้อดีของการทำงานเมื่อคุณลบหรือดึงข้อมูล (แทนที่จะพิมพ์) มันง่ายที่จะเพิ่มไปยังโหมดอื่นเช่นกัน
ฟังก์ชั่นนี้จะเยื้องสิ่งที่แสดงออกในจุดที่อยู่ภายใน คุณสามารถผูกมันไว้กับกุญแจหากคุณต้องการ แต่ดูด้านล่างก่อน
(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-like:
(define-key c++-mode-map ";"
(lambda () (interactive)
(insert ";")
(endless/indent-defun)))