Aufbauend auf den Kommentaren gibt es zwei Möglichkeiten, um das zu erreichen, was Sie versuchen. (Nicht ausgiebig getestet, also YMMV.)
Option 1: post-command-hook
Erstellen Sie eine Funktion, die testet, ob der Puffer geändert wurde, und hängen Sie ihn dann an 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)
Der Vorteil ist, dass es ziemlich einfach ist. Der Nachteil ist, dass Emacs diesen Test nach jedem einzelnen Befehl ausführt, was wie ein Overkill erscheint.
Option 2: first-change-hook
, after-save-hook
, undundo
Erstellen Sie eine Funktion zum hl-line-mode
Ausschalten und Einhängen first-change-hook
. Erstellen Sie eine Funktion zum Einschalten hl-line-mode
und haken Sie sie ein after-save-hook
. Geben Sie after
Hinweise undo
, damit es aktiviert wird, hl-line-mode
wenn ein Rückgängigmachen den Puffer in einen unveränderten Zustand zurückversetzt hat:
(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)))
Der Vorteil ist, dass diese Funktionen selten und nicht nach jedem Befehl aufgerufen werden. Der Nachteil ist, dass Sie sich mit Ratschlägen befassen mussten und es möglicherweise andere, unerwartete Möglichkeiten gibt, einen Puffer in einen unveränderten Zustand zu versetzen, die den hl-line-mode
Schritt "Wieder einschalten " nicht auslösen .
after-change-functions
undfirst-change-hook
. Wenn das Rückgängigmachen von einem geänderten Puffer zu einem nicht geänderten Puffer aus irgendeinem Grund nicht als "Änderung" für diese Hooks gilt, können Sie empfehlenundo
, das Umschalten durchzuführen.