Eu quero fazer Control-i
performance indent-region
(basicamente porque o Xcode já construiu essa memória muscular).
Eu percebo isso Control-i
e tab
são indistinguíveis no sentido Ascii, mas eles são no sentido do código-chave.
Eu tentei o óbvio:
(global-unset-key (kbd "C-i"))
(global-set-key (kbd "C-i") 'indent-region)
sem sucesso - pressionar Control-i
ainda faz apenas o que a tab
tecla faz no contexto atual. Existe algo que eu possa fazer para ajudar o Emacs a tratar o botão da guia de maneira diferente Control-i
?
Atualização: Eu acho que um resultado equivalente seria alcançado sendo capaz de remapear o que a tab
/ Control-i
press faz quando uma região é selecionada.
Respostas:
Eu não acho que isso possa ser alcançado a partir de um terminal, mas no modo GUI você pode tentar o seguinte:
Eu faço a mesma coisa
C-m
para que possa ser distinguido deRET
EDITAR:
O seguinte deve funcionar se você estiver no modo GUI ou TTY:
Não é bonito, mas parece fazer o trabalho. Congratulo-me com quaisquer aperfeiçoamentos ou edições neste código, conforme necessário.
fonte
<C-i>
e[C-i]
poderia ter sido um identificador arbitrário, como<foobar>
e[foobar]
, e ainda funcionaria; apenas não chametab
oubackspace
Quadros da GUI
Nos quadros da GUI (seja X11, Windows, OSX,…), o Emacs lê a Tabchave como a
tab
tecla de função. No entanto, como a Tabtecla nos terminais envia tradicionalmente o caractere^I
( Control + I), o Emacs converte atab
tecla de função no caractere Control + I (caractere 9), que é exibido comoTAB
. Esta tradução é feita viafunction-key-map
.Uma tradução semelhante ocorre com algumas outras teclas de função. ( Backspacee Deleteé um caso espinhoso que não discutirei em detalhes aqui.)
Se você deseja separar Taba partir Ctrl+ Icompletamente, remover a ligação de
function-key-map
:No entanto, isso não é muito útil, porque as entradas em
function-key-map
são substituídas por ligações em mapas de teclas específicos de modo ou no mapa global. Portanto, se você deseja definir uma ligação diferentetab
, basta fazê-lo (no Elisp, não de maneira interativa, porque o prompt de leitura de chave aplica afunction-key-map
tradução, para que você acabe religandoTAB
e nãotab
):Todos os modos padrão que modificam a ação da Tabchave fazem isso modificando a
TAB
chave, que é um apelido para oC-i
caractere gerado pela combinação de teclas Ctrl+ I. Se você deseja que as ligações padrão sejam aplicadas emtab
vez deC-i
, deixefunction-key-map
e modifique os mapas de teclas sozinhos e, em vez disso, redirecione Ctrl+ Ipara uma chave diferente.Agora o Emacs reportará Ctrl+ Icomo "
<control-i>
(traduzido deTAB
)". Isso não é bonito, mas é inevitável: a bonita impressão do personagem 9, comoTAB
está embutida no código-fonte do Emacs.Quadros de terminais
Nos quadros de terminais, o problema é mais difícil e geralmente impossível. Os terminais não transmitem chaves, eles transmitem caracteres (mais precisamente, eles transmitem bytes). A Tabtecla é transmitida como o caractere de tabulação - que é Control + I, igual ao que a combinação de teclas Ctrl+ Igera. As teclas de função que não possuem caracteres correspondentes (como teclas de cursor) são transmitidas como seqüências de escape, ou seja, sequências de caracteres começando com
ESC
= Control + [(é por isso que o Emacs define escapecomo uma tecla de prefixo -ESC
deve ser um prefixo). Consulte Como funcionam a entrada do teclado e a saída de texto? para mais informações.Existem alguns terminais que podem ser configurados para enviar sequências de teclas diferentes para teclas de função, mas não muitas. Ambos de LeoNerd libtermkey / libtickit e xterm de Thomas Dickey (desde a versão 216) suporta isto. No Xterm, o recurso é opcional e ativado por meio do
modifyOtherKeys
recurso. No entanto, não conheço outro emulador de terminal popular que não seja o xterm que suporte isso, em particular os muitos emuladores criados com libvte . Alguns emuladores de terminal permitem fazer isso manualmente por meio de uma correspondência definida pelo usuário, dos acordes de teclas, para escapar das seqüências.Este mecanismo permite distinguir muitas combinações de teclas, não apenas tab / Ci, return / Cm e escape / C- [. Consulte Problemas com atalhos de teclas ao usar o terminal para obter uma descrição mais detalhada.
O recurso básico do xterm é suportado desde o Emacs 24.4. No entanto, os fundamentos (em particular Tab, Return, Escape, Backspace) ainda enviar os caracteres de controle tradicionais, porque é isso que as aplicações esperar. Existe um modo em que Ctrl+ letterenvia uma sequência de escape em vez do caractere de controle. Portanto, para distinguir as teclas de função das Ctrlcombinações no Emacs 24.4, modifique seu suporte para
modifyOtherKeys
usar esse modo, configurando o recurso para 2 em vez de 1.fonte