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-modeAusschalten und Einhängen first-change-hook. Erstellen Sie eine Funktion zum Einschalten hl-line-modeund haken Sie sie ein after-save-hook. Geben Sie afterHinweise undo, damit es aktiviert wird, hl-line-modewenn 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-modeSchritt "Wieder einschalten " nicht auslösen .
after-change-functionsundfirst-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.