Jak ustawić tymczasowe zatrzymanie po Cx Cc?

10

Jeśli uruchomię C-x C-cemacsa, natychmiast się zamknie. Jeżeli ustawić confirm-kill-emacsdo y-or-n-pniego poprosi o potwierdzenie przed zamknięciem.

Zamiast tego y-or-n-pchcę ustawić tymczasowy timer na 3 sekundy przed zamknięciem emacsa. Tak więc, jeśli nacisnę C-x C-c, powinno to pokazać coś takiego

Emacs zostanie wyłączony za 3 sekundy. Naciśnij Cg, aby zatrzymać

Jeśli nic nie zrobię, powinno to wyłączyć emacsa, ale jeśli nacisnę C-g, powinno to uniemożliwić zamknięcie. Jak mogę to osiągnąć?

ChillarAnand
źródło

Odpowiedzi:

13

Możesz rzucić własną funkcję predykatu, która czeka 3 sekundy i niezmiennie zwraca wartość inną niż zero (chyba że zostanie przerwana C-g):

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

lub wariant, który będzie czytał dowolny klucz:

(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
źródło
7

Możesz użyć sit-forzamiast sleep-forplus t. A funkcja nie musi być poleceniem ( interactive).

sit-forzwraca, tjeśli czekał, a nilużytkownik przerwał oczekiwanie.

(setq confirm-kill-emacs
      (lambda (&rest _)
        (message "Quit in 3 sec (`C-g' or other action cancels)")
        (sit-for 3)))
Rysował
źródło