Como posso substituir Cc globalmente por outra ligação de chave?

7

A combinação de teclas C-cnão é conveniente para digitar o layout do teclado que eu uso e estou tentando alterá-lo globalmente. O objetivo é substituir cada ocorrência de C-cpor outra ligação <apps> d, de modo que o envio de uma mensagem no Gnus seja <apps> d <apps> d, a compilação no auxtex seja a mesma e a chave de prefixo do usuário C-ctambém seja sempre <apps> d. A tecla <apps>está <f19>no meu teclado.

Lendo o manual, parece que eu preciso usar key-translation map. Funciona muito bem com a tradução de <f19>para<apps>

(define-key key-translation-map (kbd "<f19>") (kbd "<apps>"))
(global-set-key (kbd "<apps> s") 'save-buffer)

Infelizmente, ele não funciona quando quero fazer isso C-c.

(define-key key-translation-map (kbd "<apps> d") (kbd "C-c"))

Quando tento usá-lo, recebo

<apps> d is undefined

e se eu procurar ( C-h k), eu vejo

<apps> d (translated from <f19> d) is undefined

Existe uma maneira de fazer isso funcionar?

brab
fonte
Um palpite, um mapa semelhante ( input-decode-map) tem isso em sua documentação: "Os eventos que vêm das ligações em` input-decode-map '' não são eles mesmos pesquisados ​​em `input-decode-map '." O que faz sentido, se você pensar sobre isso: essa seria uma maneira de impedir traduções infinitas.
Wwxvw

Respostas:

2

O problema em sua tentativa é que appsvem de uma tradução via key-translation-mape essa saída não é pesquisada key-translation-maprecursivamente. Se você omitir appscompletamente e trabalhar f19diretamente, isso funcionará.

(global-set-key (kbd "<f19> s") 'save-buffer)
(define-key key-translation-map (kbd "<f19> d") (kbd "C-c"))

Se você deseja usar o appsalias, pode usar o fato de que existem dois mapas de tradução semelhantes: input-decode-mape key-translation-map. Use input-decode-mappara declarar as teclas de função virtual correspondentes às seqüências de teclas enviadas pelo teclado, por exemplo, a tradução de f19para apps. Use key-translation-mappara fazer uma tradução interna no Emacs, por exemplo, de apps dpara C-c.

(define-key input-decode-map (kbd "<f19>") (kbd "<apps>"))
(global-set-key (kbd "<apps> s") 'save-buffer)
(define-key key-translation-map (kbd "<apps> d") (kbd "C-c"))
Gilles 'SO- parar de ser mau'
fonte
Obrigado, isso funciona muito bem. Eu tentei usar local-function-key-mape também funciona. Existe uma razão para usar um sobre o outro?
BRAB
A diferença local-function-key-mapé que isso local-function-key-mappode ser substituído por uma ligação global ou local para apps d. Que venha a pensar nisso pode ser um recurso, e não um bug.
Gilles 'SO- stop be evil'