2009-05-19 34 views
6

Tôi có một tập lệnh tuyệt vời cho Emacs mà tôi muốn làm một số trong sạch nếu người dùng truy cập Ctrl + G. Tôi sử dụng 'sự kiện đọc' để nắm bắt tất cả các sự kiện, nhưng điều này không bắt được Ctrl + G. Khi Ctrl + G bị nhấn, nó chỉ dừng thực hiện.Tôi làm cách nào để chặn Ctrl-G trong Emacs

Trong XEmacs, khi bạn gọi tiếp theo lệnh-event nó sẽ cung cấp cho bạn tất cả các sự kiện kể cả khi người dùng chạm Ctrl +G. Phải có một số tương đương trong Emacs.

Trả lời

11

Bạn có thể sử dụng with-local-quit để xác định xem C-g được nhấn:

giải pháp Edited để nuốt bỏ theo đề nghị của efunneko.

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

Lưu ý: với địa phương-bỏ trả về giá trị của biểu thức cuối cùng, hoặc nil nếu C-g được nhấn, vì vậy hãy chắc chắn để trở lại một cái gì đó không phải là con số không khi không có C-g được nhấn. Tôi tìm thấy tài liệu elisp trên quitting hữu ích. Một khu vực liên quan là nonlocal exits và cụ thể là unwind-protect, áp dụng cho nhiều hơn là chỉ thoát.

+0

Điều này giải quyết một phần vấn đề, nhưng nó không nuốt điều khiển-g - chỉ cho bạn biết rằng nó đã xảy ra. Nếu bạn muốn ngăn chặn control-g thoát khỏi khối, hãy sử dụng biến 'quitit-quit' và 'quit-flag'. – efunneko

+1

Điều này thật ghê gớm và giòn. Tôi khá chắc chắn rằng bất cứ điều gì OP muốn có thể được giải quyết đơn giản hơn và mạnh mẽ với một trong hai điều kiện-case' hoặc 'thư giãn-bảo vệ'. – Stefan

5

condition-caseunwind-protect hữu ích ở đây. condition-case cho phép bạn "bắt" "ngoại lệ", trong đó thoát là một:

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

Bạn cũng có thể gặp các lỗi khác, như "lỗi".

unwind-protect cũng giống như cuối cùng; nó sẽ thực hiện "các hình thức cơ thể" và sau đó "thư giãn các hình thức". Tuy nhiên, "các hình thức thư giãn" được thực thi bất kể "hình thức cơ thể" có chạy thành công hay không:

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

Bạn muốn unwind-protect trong trường hợp của bạn.

+1

'condition-case' yêu cầu đối số" var "trước phần thân (ít nhất là trong Emacs 24). Tôi không chỉnh sửa câu trả lời của bạn vì tôi không chắc chắn bạn muốn vượt qua giá trị nào. (Cảm ơn câu trả lời btw!) – Dogbert

Các vấn đề liên quan