Xây dựng các ý kiến, đây là hai cách để đạt được những gì bạn đang cố gắng thực hiện. (Không được thử nghiệm rộng rãi, vì vậy YMMV.)
Lựa chọn 1: post-command-hook
Tạo một hàm kiểm tra xem bộ đệm có được sửa đổi hay không, sau đó nối nó vào post-command-hook
:
(defun hl-line-mode-toggle-maybe ()
"Turn on `hl-line-mode' when buffer is unmodified, turn it off
when it is modified."
(hl-line-mode (if (buffer-modified-p) -1 1)))
(add-hook 'post-command-hook #'hl-line-mode-toggle-maybe)
Ưu điểm là nó khá đơn giản. Nhược điểm là Emacs sẽ chạy thử nghiệm này sau mỗi lệnh đơn lẻ , có vẻ như quá mức cần thiết.
Phương án 2: first-change-hook
, after-save-hook
, vàundo
Tạo một chức năng để hl-line-mode
tắt và móc nó vào first-change-hook
. Tạo một chức năng để bật hl-line-mode
và móc nó vào after-save-hook
. Cung cấp after
lời khuyên undo
để nó bật hl-line-mode
khi hoàn tác đã trả lại bộ đệm về trạng thái chưa sửa đổi:
(defun hl-line-mode-off ()
"Turn off `hl-line-mode'."
(hl-line-mode -1))
(defun hl-line-mode-on ()
"Turn off `hl-line-mode'."
(hl-line-mode 1))
(add-hook 'first-change-hook #'hl-line-mode-off)
(add-hook 'after-save-hook #'hl-line-mode-on)
(defadvice undo (after hl-line-when-unmodified activate)
(unless (buffer-modified-p)
(hl-line-mode 1)))
Ưu điểm là nó gọi các hàm này không thường xuyên hơn là sau mỗi lệnh. Nhược điểm là bạn đã phải đi sâu vào tư vấn, và có thể có những cách khác, không lường trước được để đưa bộ đệm đến trạng thái không sửa đổi, không kích hoạt bước "bật hl-line-mode
lại".
after-change-functions
vàfirst-change-hook
. Nếu, vì một số lý do, hoàn tác từ bộ đệm đã sửa đổi thành bộ đệm chưa sửa đổi không được tính là "thay đổi" cho các móc này, bạn có thể khuyên nênundo
thực hiện chuyển đổi.