2009-05-19 5 views
6

내가 이맥스를위한 elisp 스크립트를 가지고 있는데, 사용자가 쳤을 때 정리하려고한다. Ctrl + G. 모든 이벤트를 잡기 위해 'read-event'를 사용하지만, Ctrl + G을 잡지 않습니다. Ctrl + G을 누르면 실행이 중지됩니다. 이맥스에서어떻게 이맥스에서 Ctrl-G를 가로 채기

, 당신은 사용자가 Ctrl 키 + G을 칠 때 다음-명령 이벤트가 당신을 포함한 모든 이벤트를 줄 것이다 호출합니다. Emacs에 상응하는 것이 있어야합니다.

답변

11

당신은 C-g 누를 있는지 확인 with-local-quit를 사용할 수 있습니다

편집 솔루션을 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))))) 

참고 :는 반환에게 마지막 표현식의 값을 가진 로컬-종료, 또는 nilC-g 누르면, 그래서 C-g 누르지 않을 때 뭔가 nil이 아닌를 반환해야합니다. 나는 quitting에 관한 elisp 문서를 찾았습니다. 관련 영역은 nonlocal exits이며 특히 종료시 이상에 적용되는 unwind-protect입니다.

+0

이렇게하면 문제의 일부가 해결되지만 제어 장치를 삼키지 않아 문제가 발생했음을 알릴 수 있습니다. 컨트롤 -g가 블록을 벗어나지 않게하려면 'inhibit-quit'및 'quit-flag'변수를 사용하십시오. – efunneko

+1

이것은 끔찍하고 부서지기 쉽습니다. 나는 OP가 원하는 것은 무엇이든간에 '조건 케이스'또는 '풀림 방지'중 하나를 사용하여보다 간단하고 견고하게 해결할 수 있다고 확신합니다. – Stefan

5

condition-caseunwind-protect이 여기 유용합니다. "오류 : condition-case는"당신은 다른 오류를 잡을 수

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

처럼 하나입니다 종료있는 "당신"캐치 ""예외를 할 수 있습니다.

unwind-protect과 같습니다. "본문 양식"을 실행 한 다음 "양식 풀기"를 실행합니다. 그러나, "언 와인드 형태"에 관계없이 "몸의 형태는"성공적으로 실행 여부와 실행됩니다 : 귀하의 경우에 당신은 unwind-protect을 원하는

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

.

+1

'condition-case'는 본문 앞에 "var"인자가 있어야합니다 (최소한 Emacs 24에서는). 나는 당신이 어떤 가치를 전달하고자했는지 확신 할 수 없기 때문에 대답을 편집하지 않았습니다. (답변 주셔서 감사합니다 btw!) – Dogbert