A partir de los comentarios, aquí hay dos formas de lograr lo que está tratando de hacer. (No ampliamente probado, por lo que YMMV).
Opción 1: post-command-hook
Cree una función que pruebe si se modifica o no el búfer y luego conéctelo a 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)
La ventaja es que es bastante simple. La desventaja es que Emacs ejecutará esta prueba después de cada comando , lo que parece excesivo.
Opción 2: first-change-hook, after-save-hookyundo
Cree una función para hl-line-modeapagar y conectarla first-change-hook. Cree una función para encender hl-line-modey engancharla after-save-hook. Proporcione afterconsejos para undoque se active hl-line-modecuando un deshacer haya devuelto el búfer a un estado no modificado:
(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)))
La ventaja es que llama a estas funciones con poca frecuencia en lugar de después de cada comando. La desventaja es que ha tenido que profundizar en los consejos, y puede haber otras formas imprevistas de llevar un búfer a un estado no modificado que no active el paso " hl-line-modevolver a encender ".
after-change-functionsyfirst-change-hook. Si, por alguna razón, deshacer de un búfer modificado a uno no modificado no cuenta como un "cambio" para estos ganchos, puede aconsejarundoque realice el cambio.