Как установить временную остановку после Cx Cc?

10

Если я C-x C-cзапустлю emacs, он немедленно закроется. Если я настроен confirm-kill-emacsна y-or-n-pэто, попросит подтверждение перед закрытием.

Вместо этого y-or-n-pя хочу установить временный таймер на 3 секунды перед закрытием emacs. Итак, если я нажму C-x C-cэто должно показать что-то вроде

Emacs будет отключен через 3 секунды. Нажмите Cg, чтобы остановить

Если я ничего не делаю, это должно отключить emacs, но если я нажму C-g, это должно предотвратить отключение. Как мне этого добиться?

ChillarAnand
источник

Ответы:

13

Вы можете свернуть свою собственную функцию предиката, которая ждет 3 секунды и неизменно возвращает ненулевое значение (если оно не прерывается C-g):

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

или вариант, который будет читать любой ключ:

(setq confirm-kill-emacs
      (lambda (&rest args)
        (interactive)
        (null (read-event "Quitting in 3 seconds. Hit any key to stop."
                          nil 3))))
Франсуа Февотт
источник
7

Вы можете использовать sit-forвместо того, чтобы использовать sleep-forплюс t. И функция не обязательно должна быть командой ( interactive).

sit-forвозвращается, tесли он ждал и nilесли пользователь прервал ожидание.

(setq confirm-kill-emacs
      (lambda (&rest _)
        (message "Quit in 3 sec (`C-g' or other action cancels)")
        (sit-for 3)))
Нарисовалась
источник