2009-05-19 11 views
6

Ctrl-G önünü nasıl bir kullanıcı Ctrl + G vurursa ben bazı temizlemek yapmak istiyorum Emacs için bir elisp komut dosyası var. Tüm olayları yakalamak için 'read-event' kullanıyorum, ancak bu Ctrl + G'u yakalamıyor. Ctrl + G vurulduğunda, yalnızca yürütmeyi durdurur. XEmacs yılındaBen Emacs

, bir kullanıcı Ctrl + G çarptığında sonraki komut olay size de dahil olmak üzere tüm olayları verecektir diyoruz. Emacs'te bir miktar eşdeğer olmalı.

cevap

11

Sen C-g basılı olup olmadığını belirlemek için with-local-quit kullanabilirsiniz:

Düzenlendi çözüm efunneko önerdiği gibi çıkmak yutmak.

(defun my-c-g-test() 
    "test catching control-g" 
    (interactive) 
    (let ((inhibit-quit t)) 
    (unless (with-local-quit 
       (y-or-n-p "arg you gonna type C-g?") 
       t) 
     (progn 
     (message "you hit C-g") 
     (setq quit-flag nil))))) 

Not: döndürür son ifadenin değerini ile yerel-çıkın veya nilC-g basıldığında hiçbir C-g basıldığında bir şey olmayan nil dönmek emin olun. quitting'da elisp belgelerini faydalı buldum. İlgili bir alan nonlocal exits ve özellikle unwind-protect olup, bu sadece çıkmaktan daha fazlası için geçerlidir.

+0

Bu sorunun bir bölümünü çözüyor, ancak kontrol g yutmuyor - sadece bunun olduğunu bilmenizi sağlar. Control-g'nin bloktan kaçmasını önlemek istiyorsanız, 'stopit-quit' ve 'quit-flag' değişkenlerini kullanın. – efunneko

+1

Bu iğrenç ve kırılgan. OP'nin istediği her ne olursa olsun, 'koşul-durumu' ya da 'gevşetme-koruma' ile daha basit ve sağlam bir şekilde çözülebilir. – Stefan

5

condition-case ve unwind-protect burada yararlıdır. "Hatasının: condition-case "Ayrıca diğer hataları yakalamak

(condition-case 
    (while t) ; never terminates 
    (quit (message "C-g was pressed"))) 

gibi biridir çıkmak üzere," siz "yakalamak"" istisnalar sağlar.

nihayet gibidir; "vücut formlarını" ve sonra "formları çöz" i yürütecek. Ancak, "açma formlar" ne olursa olsun "vücut şekilleri" başarıyla koştu bakılmaksızın yürütülür: sizin durumunuzda Sen unwind-protect istiyorum

(unwind-protect 
    (while t) 
    (message "Done with infinite loop")) 

.

+1

"condition-case", vücuttan önce bir "var" argümanı gerektirir (en azından Emacs 24'te). Cevabını ben düzenlemedim, çünkü oraya ne kadar değer vermek istediğinden emin değilim. (Cevabınız için teşekkürler btw!) – Dogbert