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-hook
eundo
Crie uma função para hl-line-mode
desligar e conectá-la first-change-hook
. Crie uma função para ativar hl-line-mode
e conectá-la after-save-hook
. Forneça after
conselhos sobre undo
como ativar hl-line-mode
quando 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-mode
novamente".
after-change-functions
efirst-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 aconselharundo
executar a alternância.