Bagaimana cara mengatur penghentian sementara setelah Cx Cc?

10

Jika saya menjalankan C-x C-cdi emacs, itu akan segera ditutup. Jika saya mengatur confirm-kill-emacsuntuk y-or-n-pitu akan meminta konfirmasi sebelum menutup.

Alih-alih y-or-n-p, saya ingin mengatur timer sementara selama 3 detik sebelum menutup emacs. Jadi, jika saya tekan C-x C-citu harus menunjukkan sesuatu seperti

Emacs akan dimatikan dalam 3 detik. Tekan Cg untuk berhenti

Jika saya tidak melakukan apa-apa, itu harus mematikan emacs, tetapi jika saya menekan C-g, itu harus mencegah mematikan. Bagaimana saya bisa mencapai ini?

ChillarAnand
sumber

Jawaban:

13

Anda dapat memutar fungsi predikat Anda sendiri yang menunggu selama 3 detik dan selalu mengembalikan non-nil (kecuali jika terganggu dengan C-g):

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

atau varian yang akan membaca kunci apa pun:

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

Anda dapat menggunakan sit-fordaripada menggunakan sleep-forplus t. Dan fungsinya tidak harus berupa perintah ( interactive).

sit-forkembali tjika menunggu dan niljika pengguna menginterupsi menunggu.

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