Gibt es einen Hook, der für alle schreibgeschützten Puffer ausgeführt wird?

7

Ich möchte show-trailing-whitespacefür bearbeitbare Dateien aktivieren und show-trailing-whitespacefür schreibgeschützte Dateien deaktivieren . ich habe es versucht

(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)

Dies scheint aber nur zu funktionieren, wenn ich es read-only-modemanuell aktiviere . Wenn ich einen Puffer öffne, der automatisch schreibgeschützt wird (z. B. eine schreibgeschützte Datei), wird der Hook nicht ausgeführt.

Gibt es einen Hook, der für alle schreibgeschützten Puffer ausgeführt wird?

Moyamo
quelle

Antworten:

6

Wenn Sie möchten, dass dies in einem beliebigen Puffer funktioniert, nicht nur in einem Puffer, der Dateien besucht, find-file-hookist dies nicht geeignet. (Sie sagten " alle Puffer ", aber Sie sprachen auch von bearbeitbaren / nicht bearbeitbaren " Dateien ".)

Wenn Sie möchten, dass es in allen Puffern funktioniert, ist dies eine Lösung:

(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)

Sie können dies in einen Nebenmodus-Befehl einschließen, wenn Sie möchten.

Eine andere Möglichkeit ist die Verwendung eines Leerlauf-Timers, der jedoch post-command-hookfür das, was Sie suchen , in Ordnung zu sein scheint.

Soweit ich weiß, gibt es keinen Haken, der einer Änderung in entspricht buffer-read-only. Wenn Sie jedoch Emacs 26 oder höher verwenden, können Sie die Funktion add-variable-watcherzum Ein- und Ausschalten des nachgestellten Leerzeichens verwenden, wenn eine Variable buffer-read-onlygeändert wird.

(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))))
Drew
quelle
Es scheint ein bisschen übertrieben, diese Funktion nach jedem Befehl auszuführen. Ist ihr Weg nicht einfacher?
Moyamo
@Moyamo Probieren Sie es aus und entscheiden Sie dann, ob Emacs dadurch träge werden. Ich wette, dass Sie aufgrund dieses Codes keine Verlangsamung oder erhöhte CPU-Auslastung bemerken. Wenn Sie sich Sorgen machen, stellen Sie sicher, dass dies my-show-trailing-wskompiliert ist.
Harald Hanche-Olsen
Die Variable Watcher-Lösung für Emacs 26 funktioniert gut.
GDP2
1

Sie find-file-hookkönnen den schreibgeschützten Status des Puffers verwenden und überprüfen:

(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)
Harald Hanche-Olsen
quelle
Wie @Drew sagte, funktioniert dies nicht für spezielle Puffer wie Organisations-Agenda-Puffer.
Moyamo
1
Da hat er recht. Mir war jedoch nicht klar, dass Sie diese Allgemeinheit wollten. (Vielleicht war es Ihnen auch nicht klar ...)
Harald Hanche-Olsen