Como faço para interceptar Ctrl-G no Emacs

votos
6

Eu tenho um script elisp para o Emacs que eu quero fazer alguma limpeza em se um usuário atinge Ctrl+ G. Eu uso 'leia-evento' para pegar todos os eventos, mas isso não pegar o Ctrl+ G. Quando Ctrl+ Gé atingido, ele só pára a execução.

Em XEmacs, quando você chamar próxima comando evento vai dar-lhe todos os eventos, incluindo quando um usuário atinge Ctrl+ G. Deve haver algum equivalente em Emacs.

Publicado 19/05/2009 em 20:08
fonte usuário
Em outras línguas...                            


2 respostas

votos
12

Você pode usar with-local-quitpara determinar se C-gfoi pressionado:

Solução editado para engolir sair como sugerido por 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)))))

Nota: com-local-saia retorna o valor da última expressão, ou nilse C-gfor pressionado, por isso não deixe para retornar algo não-nulo quando não C-gestá pressionado. Eu encontrei a documentação elisp em desistir útil. A área relacionada é saídas não-locais e, especificamente unwind-protect, o que se aplica mais do que apenas sair.

Respondeu 19/05/2009 em 20:17
fonte usuário

votos
5

condition-casee unwind-protectsão úteis aqui. condition-casepermite "pegar" "exceções", dos quais param é uma só:

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

Você também pode pegar outros erros, como "erro".

unwind-protecté como finalmente; ele irá executar "formas corporais" e depois "formas relaxar". No entanto, as "formas relaxar" são executados independentemente de as "formas do corpo" foi executado com êxito:

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

Você quer que unwind-protectno seu caso.

Respondeu 09/07/2009 em 09:44
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more