Existe uma função para inserir o `correto (kbd“… ”)` pressionando a tecla?

20

Estou cansado de procurar nomes de teclas para a kbdfunção; existe uma maneira de inserir automaticamente o nome correto da tecla apenas pressionando a tecla?

Então, por exemplo, eu quero algo para fazer isso: eu estou digitando

(local-set-key |

Eu corro magical-insert-kbd-command, pressione f6 e recebo

(local-set-key (kbd "<f6>") |
dshepherd
fonte

Respostas:

20

Não tenho certeza exatamente o que você está perguntando. Mas, C-h kseguido de pressionar a tecla, você mostra exatamente para qual string você precisa passar kbd. Por exemplo, C-h k f6mostra você <f6>.

Aqui está um comando que faz o que você quer, eu acho e vincula o resultado a C-c c:

(defun foo (key)
  (interactive "kKey: ")
  (insert (format "(kbd %S)" (key-description key))))

(global-set-key (kbd "C-c c") 'foo)

Então digite:

(local-set-key C-c c

Isso solicita que você use uma chave. Se você pressionar a F6tecla, receberá o seguinte:

(local-set-key (kbd "<f6>") 

[Atualizado por sugestão de @HaraldHancheOlsen: alterado "(kbd \"%s\")"para".](kbd %S)"

Desenhou
fonte
Perfeito, obrigado! A principal coisa que estava faltando foi a falta da key-descriptionfunção.
dshepherd
Mas o OP está certo de que seria útil ter uma função que colocasse automaticamente a combinação de teclas no anel de morte.
incandescentman
1
@incandescentman: Hein? Onde o OP diz algo sobre o ringue de matar ? E o que você quer dizer com "combinação de teclas" nessa frase? Uma ligação de chave não é uma sequência, que é o que ela kill-ringcontém. Você quer dizer a key-descriptioncorda? ou o valor de retorno do formatsexp acima ? De qualquer forma, deve ficar claro como modificar o comando que dei, para adicionar um deles ao kill-ring(apenas use kill-new).
21815 Drew
"inserir automaticamente." Se bem entendi, a solução acima exibe apenas a combinação de teclas (por exemplo kbd <M-return>), mas não a insere em um arquivo init. (Você precisaria executar a etapa adicional de copiar / colar.) Talvez eu tenha entendido errado. Para o meu próprio caso de uso pessoal, eu iria encontrá-lo útil ter uma maneira de consultar a sintaxe para uma combinação de teclas (por exemplo, é a sintaxe M-RETou M-<return>ou o quê?) E automaticamente colocar essa corda no anel da matança / área de trabalho, de modo que eu poderia então cole a combinação de teclas no meu arquivo init ao escrever uma linha como (define-key map (kbd "<M-return>") 'org-return).
incandescentman
1
Sim, você não entendeu. (Mas também houve um erro de digitação no sexp de ligação de teclas: esqueci de usar kbdo global-set-keysexp - corrigido agora.) O comando foo(ao qual o global-set-keysexp se liga C-c c) lê uma sequência de teclas e depois insere, no ponto do buffer atual, o comando kbdsexp adequado para isso. Se você usa C-c cno seu arquivo init, depois (local-set-key , ele insere o kbdsexp necessário para a chave que lê.
Tirou
7

Se você usa M-x local-set-keya combinação de teclas de maneira interativa, pode usar C-x ESC ESC( repeat-complex-command) para obter uma expressão Lisp que pode colar na sua configuração. Provavelmente, não usará (kbd ...)descrições de estilo amigável .

Sacha Chua
fonte
Arrumado. define-keyEmbora eu costumo usar , na verdade, parece mais simples definir a chave diretamente do que configurar um gancho para chamar uma função para definir a chave.
dshepherd