Comment définir un arrêt temporaire après Cx Cc?

10

Si je lance C-x C-cdans emacs, il se fermera immédiatement. Si je mets confirm-kill-emacsà y-or-n-pil demandera confirmation avant la fermeture.

Au lieu de y-or-n-p, je veux régler une minuterie temporaire pendant 3 secondes avant de fermer emacs. Donc, si j'appuie, C-x C-ccela devrait montrer quelque chose comme

Emacs sera arrêté dans 3 secondes. Appuyez sur Cg pour arrêter

Si je ne fais rien, cela devrait arrêter emacs, mais si j'appuie C-g, cela devrait empêcher l'arrêt. Comment puis-je atteindre cet objectif?

ChillarAnand
la source

Réponses:

13

Vous pouvez lancer votre propre fonction de prédicat qui attend 3 secondes et renvoie invariablement non nulle (sauf si elle est interrompue par 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 une variante qui lira n'importe quelle clé:

(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
la source
7

Vous pouvez utiliser sit-forau lieu d'utiliser sleep-forplus t. Et la fonction n'a pas besoin d'être une commande ( interactive).

sit-forrenvoie ts'il a attendu et nilsi l'utilisateur a interrompu l'attente.

(setq confirm-kill-emacs
      (lambda (&rest _)
        (message "Quit in 3 sec (`C-g' or other action cancels)")
        (sit-for 3)))
A dessiné
la source