¿Cómo establecer una detención temporal después de Cx Cc?

10

Si ejecuto C-x C-cen emacs, se cerrará inmediatamente. Si fijo confirm-kill-emacsa y-or-n-pél se solicita la confirmación antes de cerrar.

En lugar de eso y-or-n-p, quiero configurar un temporizador temporal durante 3 segundos antes de cerrar emacs. Entonces, si presiono C-x C-cdebería mostrar algo como

Emacs se apagará en 3 segundos. Presione Cg para detener

Si no hago nada, debería cerrar emacs, pero si presiono C-g, debería evitar el apagado. ¿Cómo puedo conseguir esto?

ChillarAnand
fuente

Respuestas:

13

Puede rodar su propia función de predicado que espera 3 segundos e invariablemente devuelve un valor nulo (a menos que se interrumpa con C-g):

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

o una variante que leerá cualquier clave:

(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
fuente
7

Puede usar en sit-forlugar de usar sleep-formás t. Y la función no necesita ser un comando ( interactive).

sit-forvuelve tsi esperó y nilsi el usuario interrumpió la espera.

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