Como definir uma parada temporária após Cx Cc?

10

Se eu rodar C-x C-cno emacs, ele será fechado imediatamente. Se eu definir confirm-kill-emacsa y-or-n-pele vai pedir a confirmação antes de fechar.

Em vez de y-or-n-p, quero definir um temporizador temporário por 3 segundos antes de fechar o emacs. Então, se eu pressionar C-x C-c, deve mostrar algo como

O Emacs será encerrado em 3 segundos. Pressione Cg para parar

Se eu não fizer nada, ele deve encerrar o emacs, mas se eu pressionar C-g, deve impedir o desligamento. Como posso conseguir isso?

ChillarAnand
fonte

Respostas:

13

Você pode rolar sua própria função de predicado que aguarda 3 segundos e, invariavelmente, retorna nulo (a menos que seja interrompido C-g):

(setq confirm-kill-emacs
      (lambda (&rest args)
        (interactive)
        (message "Quitting in 3 seconds. Press `C-g' to stop.")
        (sleep-for 3)
        t))

ou uma variante que lerá qualquer chave:

(setq confirm-kill-emacs
      (lambda (&rest args)
        (interactive)
        (null (read-event "Quitting in 3 seconds. Hit any key to stop."
                          nil 3))))
François Févotte
fonte
7

Você pode usar em sit-forvez de usar sleep-formais t. E a função não precisa ser um comando ( interactive).

sit-forretorna tse aguardou e nilse o usuário interrompeu a espera.

(setq confirm-kill-emacs
      (lambda (&rest _)
        (message "Quit in 3 sec (`C-g' or other action cancels)")
        (sit-for 3)))
Desenhou
fonte