Có một cái móc chạy cho tất cả các bộ đệm chỉ đọc


7

Tôi muốn kích hoạt show-trailing-whitespacecho tập tin có thể chỉnh sửa và vô hiệu hóa show-trailing-whitespacecho các tập tin chỉ đọc. Tôi đã thử

(defun my/read-only-whitespace ()
  (setq-local show-trailing-whitespace (not buffer-read-only)))

(setq-default show-trailing-whitespace t)
(add-hook 'read-only-mode-hook #'my/read-only-whitespace)

Nhưng điều này chỉ có vẻ hoạt động nếu tôi kích hoạt read-only-modebằng tay. Khi tôi mở bộ đệm trở thành chỉ đọc tự động (ví dụ: tệp chỉ đọc) thì hook không chạy.

Có một cái móc chạy cho tất cả các bộ đệm chỉ đọc?

Câu trả lời:


6

Nếu bạn muốn điều này hoạt động trong bất kỳ bộ đệm nào, không chỉ là bộ đệm truy cập tệp thì find-file-hookkhông phù hợp. (Bạn đã nói " tất cả bộ đệm ", nhưng bạn cũng đã nói về " tệp " có thể chỉnh sửa / không thể chỉnh sửa .)

Nếu bạn muốn nó hoạt động trong tất cả các bộ đệm thì đây là một giải pháp:

(defun my-show-trailing-ws ()
  "Show trailing whitespace in the current buffer, unless it is read-only."
  (setq-local show-trailing-whitespace (not buffer-read-only)))

(add-hook 'post-command-hook 'my-show-trailing-ws)

Bạn có thể gói nó trong một lệnh chế độ nhỏ, nếu bạn muốn.

Một khả năng khác là sử dụng bộ đếm thời gian nhàn rỗi, nhưng post-command-hookcó vẻ tốt cho những gì bạn đang tìm kiếm.

Theo tôi biết, không có cái móc nào tương ứng với sự thay đổi trong buffer-read-only. Tuy nhiên, nếu bạn sử dụng Emacs 26 trở lên thì bạn có thể sử dụng chức năng add-variable-watcherđể bật / tắt hiển thị khoảng trắng theo sau mỗi khi buffer-read-onlythay đổi biến.

(add-variable-watcher 'buffer-read-only 'foo) ; Add watcher `foo'

(defun foo (symbol newval operation where) ; 100% untested...
   "Show trailing whitespace in the current buffer, unless it is read-only."
   (when (and (eq symbol 'buffer-read-only)
              (memq operation '(set let))
              (eq where (current-buffer)))
     (setq-local show-trailing-whitespace (not newval))))

Có vẻ hơi quá mức để chạy chức năng này sau mỗi lệnh. Là cách đơn giản hơn của họ?
Moyamo

@Moyamo Hãy thử nó, sau đó quyết định nếu bạn nghĩ rằng nó làm cho emacs chậm chạp. Đặt cược của tôi là bạn sẽ không nhận thấy bất kỳ việc sử dụng CPU chậm hoặc tăng do mã này. Nếu bạn lo lắng, hãy chắc chắn rằng nó my-show-trailing-wsđược biên dịch.
Harald Hanche-Olsen

Giải pháp theo dõi biến cho Emacs 26 hoạt động tốt.
GDP2

1

Bạn có thể sử dụng find-file-hookvà kiểm tra trạng thái chỉ đọc của bộ đệm:

(defun my/read-only-whitespace ()
  (when buffer-read-only
    (setq-local show-trailing-whitespace (not buffer-read-only))))
(add-hook 'find-file-hook 'my/read-only-whitespace)

Như @Drew đã nói, điều này sẽ không hoạt động đối với các bộ đệm đặc biệt như bộ đệm org-agenda.
Moyamo

1
Anh ấy đúng về điều đó. Tuy nhiên, tôi đã không rõ ràng rằng bạn muốn sự chung chung đó. (Có lẽ điều đó không rõ ràng với bạn, dù là))
Harald Hanche-Olsen
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.