Como substituir a função focus-out-hook com after-focus-change-function no emacs 27?
Em meu antigo emacs, defini o código a seguir.
(add-hook 'focus-out-hook (lambda () (save-some-buffers t)))
Após a atualização para o emacs 27, ele disse que o foco para fora do gancho está obsoleto, e o novo é after-focus-change-function, mas simplesmente substituí-lo não funciona. O seguinte não funciona
(add-hook 'after-focus-change-function (lambda () (save-some-buffers t)))
Parece-me que o primeiro é um gancho, então preciso usar o add-hook, mas para a nova função funcionar, como usá-lo? Meu objetivo é salvar um buffer depois de mudar para outro aplicativo.
Respostas
Você pode tentar usar algo como:
(add-function :after after-focus-change-function #'your-function-here)
Então, no seu caso, algo assim deve fazer o que você está procurando:
(add-function :after after-focus-change-function (lambda () (save-some-buffers t)))
Se você olhar a documentação de after-focus-change-functioncom C-h v after-focus-change-function RET, notará que sugere usar add-functionpara modificá-lo:
[...] Código que deseja fazer algo quando o foco do quadro muda deve usar
add-functionpara adicionar uma função a este [...]
Observe também que a documentação sugere que sua função deve chamar frame-focus-statepara recuperar o último estado de foco conhecido de cada quadro, para que você possa fazer algo como:
(add-function :after after-focus-change-function (lambda () (unless (frame-focus-state) (save-some-buffers t))))
Observe que frame-focus-stateretorna nilquando o quadro selecionado não está focalizado.