Làm thế nào để móc vào trạng thái đệm sửa đổi?


8

Chẳng hạn như trong biến tích mode-line-modifiedhợp hiển thị dấu hoa thị trong dòng chế độ nếu bộ đệm được sửa đổi.

Cụ thể, tôi muốn hl-line-modetắt khi bộ đệm được sửa đổi và bật khi không.

Tôi đã đọc tài liệu về "Thay đổi móc", nhưng tôi muốn hl-line-modechuyển đổi khi tôi hoàn tác một thay đổi như dấu hoa thị dòng chế độ.


3
Móc liên quan xuất hiện after-change-functionsfirst-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ên undothực hiện chuyển đổi.
Dân

Xem thêm chức năng buffer-modified-pđể kiểm tra xem một sửa đổi đã xảy ra. Tôi đang sử dụng after-save-hookfirst-change-hookđể chuyển đổi một chỉ báo đã sửa đổi trên thanh tab của mình.
luật

3
nếu móc thay đổi không hoạt động hoàn hảo khi hoàn tác, cách chắc chắn nhất là post-command-hookkiểm tra buffer-modified-p.
Malabarba

Câu trả lời:


5

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-modetắt và móc nó vào first-change-hook. Tạo một chức năng để bật hl-line-modevà móc nó vào after-save-hook. Cung cấp afterlời khuyên undođể nó bật hl-line-modekhi 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-modelại".


À, vâng, cảm ơn vì đã đưa nó vào câu trả lời. Tôi đã kết thúc bằng cách sử dụng tùy chọn thứ hai để không sử dụng a post-command-hook.
mẫu

revert-buffercó vẻ như một trường hợp phổ biến khác sẽ đặt bộ đệm vào trạng thái không thay đổi. Bạn có thể sử dụng after-revert-hookđể xử lý cái này.
glucas

Bạn cũng cần một số cách để bật sáng cho bộ đệm mới mở - có lẽ là after-change-major-mode-hook?
glucas

1
Lưu ý rằng add-hookcó một localtham số, vì vậy nếu bạn chỉ muốn ghi đè hành vi trong các chế độ hoặc bộ đệm chính nhất định, bạn có thể.
Wilfred Hughes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.