Com base nos comentários, aqui estão duas maneiras de conseguir o que você está tentando fazer. (Não testado extensivamente, portanto YMMV.)
Opção 1: post-command-hook
Crie uma função que testa se o buffer está ou não modificado e conecte-o 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)
A vantagem é que é bem simples. A desvantagem é que o Emacs executará esse teste após cada comando , o que parece ser um exagero.
Opção 2: first-change-hook, after-save-hookeundo
Crie uma função para hl-line-modedesligar e conectá-la first-change-hook. Crie uma função para ativar hl-line-modee conectá-la after-save-hook. Forneça afterconselhos sobre undocomo ativar hl-line-modequando um desfazer retornou o buffer para um estado não 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)))
A vantagem é que ele chama essas funções com pouca frequência e não após cada comando. A desvantagem é que você teve que se aprofundar em conselhos, e pode haver outras maneiras imprevistas de obter um buffer para um estado não modificado que não desencadeie a etapa "ativar hl-line-modenovamente".
after-change-functionsefirst-change-hook. Se, por algum motivo, desfazer de um buffer modificado para um não modificado não conta como uma "alteração" para esses ganchos, você pode aconselharundoexecutar a alternância.