Em qual arquivo foi A tecla de atalho definida?
-
03-07-2019 - |
Pergunta
Considerando uma batida de tecla no Emacs, v.g. C-x C-s . Eu posso descobrir qual função ele chama digitando C-h c keystroke , mas como posso encontrar onde este atalho de teclado foi definido?
(Talvez a resposta certa é que ele não pode ser decidido, porque os mapas de teclado não armazenar esse tipo de informação.)
Solução
As informações a respeito de onde keybindings estão associados com funções não é mantido pelo Emacs. Na verdade, a resposta é geralmente indefinido.
Muitas vezes teclas são configurados como um efeito colateral de um modo menor, ou através do modo-ganchos. A chave de ligação para os modos de menores é muitas vezes armazenados em alguma variável como comint-mode-map
. Este mapa de teclado está ativado, definindo o comint-mode
modo variável. No entanto, esse mapa modo é uma variável global e qualquer pessoa, em qualquer lugar pode adicionar atalhos de teclado para ele. Então, fazer o que você quer é essencialmente de rastreamento que definir uma variável com um valor particular. Da mesma forma para atalhos de teclado que estão apenas definidos localmente através de ganchos de modo (usando local-set-key
). Além disso, você pode até mesmo configurar atalhos de teclado através de variáveis ??de arquivo . Tudo isso é só para dizer que as teclas em Emacs são efêmeras.
Sobre o melhor que você pode fazer é encontrar a função associada com a chave, e olhar nesse arquivo (ou quaisquer arquivos relacionados se o modo é dividido em vários arquivos).
vinculativochave de pesquisa no emacs está bastante envolvido devido à infinidade de maneiras que você pode definir / cursos chaves associadas (globalmente, de modo importante, modos menores, imperiosas modos menores, local para buffers, propriedades de texto, etc.). Para uma visão geral, veja esta documentação .
Você pode escrever uma função como este para olhar nos modos menores para ver onde uma combinação de teclas pode ser definido, mas é claro que meu primeiro teste mostrou que o atalho de teclado não foi definido lá. Mas talvez o código será instrutivo.
(defun guess-where-keybinding-is-defined (key)
"try to guess where a key binding might be defined"
(interactive (list (read-key-sequence "Describe key: ")))
(let ((bindings (minor-mode-key-binding key))
found)
(while (and bindings (not found))
(if (setq found (caar bindings))
(find-function (cdar bindings)))
(setq bindings (cdr bindings)))))
Existe um problema específico que você está tentando resolver (com excepção a esta pergunta)?
Outras dicas
Basta fazer M-x encontra-função
De Emacs doc:
(função-função encontrar)
Encontre a definição da função perto do ponto.
Localiza o arquivo de origem que contém o definição da função próximo ponto (Seleccionada pela `Função chamada-a-ponto ') numa tampão e lugares ponto antes do definição. Definir marca antes de se mudar, se o buffer já existia.