Como substituir a função focus-out-hook com after-focus-change-function no emacs 27?

Oct 03 2020

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

1 ManuelUberti Oct 03 2020 at 20:17

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.