Primeiro, um pouco de história. Antigamente, quando você digitava algum texto em um terminal , cada tecla enviava um caractere ao aplicativo. À medida que as máquinas às quais o terminal estava conectado se tornaram mais potentes, os terminais padronizaram uma tecla de controle , que enviava alguns caracteres especiais, que não eram impressos, mas tinham algum tipo de função. O conjunto de caracteres eventualmente triunfante foi ASCII , com 128 caracteres, dos quais 32 são caracteres de controle. Pressionar Ctrljunto com uma letra ou outro símbolo escrito 10xxxxx₂ (notação binária) envia o caractere de controle cujo código é 00xxxxx₂, por exemplo, Ctrl+ [envia o número de caractere 27₁₀ = 0011011₂ porque [
é 91₁₀ = 1011011₂.
Algumas teclas de função nos terminais enviaram caracteres de controle:
- Backspace=
Ctrl-H
(BS = BackSpace) ¹
- Tab=
Ctrl-I
(HT = separador horizontal)
- Linefeed=
Ctrl-J
(LF = avanço de linha) (poucos terminais já tiveram essa chave)
- Returnou Enter=
Ctrl-M
(CR = retorno de carro)
- Escape=
Ctrl-[
(ESC = Escape)
Quando os terminais tinham mais teclas de função, não havia caracteres de controle suficientes para representá-los todos. Então eles enviaram seqüências de caracteres, e a convenção universal é que essas seqüências de caracteres começam com o caractere de escape Ctrl-[
,.
Com o passar do tempo, os terminais de hardware tornaram-se cada vez mais raros; Atualmente, existem muitos níveis de tradução entre o teclado e o aplicativo . A limitação no número de caracteres disponíveis e as correspondências codificadas entre determinadas combinações de teclas e certos caracteres de controle não são mais relevantes. No entanto, os aplicativos permaneceram compatíveis com os terminais existentes, e os terminais permaneceram compatíveis com os aplicativos existentes, o que dificultou a alteração de qualquer coisa.
Então, ainda hoje, em sistemas Unix, os aplicativos executados em um emulador de terminal recebem o caractere Ctrl-I
quando o usuário pressiona a Tabtecla, o caractere Ctrl-[
quando o usuário pressiona Esc, etc. Se o Vim estiver sendo executado em um terminal Unix, não será possível distinguir entre <Esc>
e <Ctrl-[>
porque o terminal envia a mesma informação.
A execução do Vim em outros ambientes não tem essa limitação, portanto, em princípio, seria possível que eles enviassem informações diferentes. Dado que o Vim usa o Ctrl-[
personagem para representar <Esc>
em muitos lugares, mudar isso seria impraticável; em vez disso, pode ser feito Ctrl+ [para enviar um evento de entrada diferente.
Não conheço nenhuma versão do Vim que diferencie entre + Esce (mas não é como se eu já tivesse usado alguma). Gvim, por exemplo, parece emular um terminal de variedades de jardins .Ctrl[
Ironicamente, sua melhor aposta pode ser o Vim sendo executado em um emulador de terminal. Alguns emuladores de terminal permitem personalizar seqüências de escape enviadas por teclas e acordes de teclas. Portanto, você pode mandar Ctrl+ [para enviar não o Ctrl-[
caractere ␛ ( ), mas alguma sequência de escape. O Xterm, o emulador de terminal de "referência" para sistemas tipo Unix, suporta dois desses esquemas. Por exemplo:
- Escenvia
␛
e Tabenvia ␉
, em todas as configurações.
- Com
?.VT100.modifyOtherKeys: 0
(padrão) ou ?.VT100.modifyOtherKeys: 1
, Ctrl+ [envia ␛
e Ctrl+ Ienvia ␉
. ?.VT100.modifyOtherKeys: 1
afeta apenas meta combinações e combinações de controle que não possuem um caractere ASCII.
- Com
?.VT100.modifyOtherKeys: 2
e ?.VT100.formatOtherKeys: 0
(padrão), Ctrl+ [envia ␛[27;5;91~
e Ctrl+ Ienvia ␛[27;5;105~
.
- Com
?.VT100.modifyOtherKeys: 2
e ?.VT100.formatOtherKeys: 1
, Ctrl+ [envia ␛[91;5u
e Ctrl+ Ienvia ␛[105;5u
.
O suporte pode ser ativado ao definir o modifyOtherKeys
recurso ao iniciar o xterm (e formatOtherKeys
para selecionar entre os dois esquemas) ou pode ser ativado e desativado dinamicamente pelo aplicativo.
O Vim não possui suporte interno que eu conheça. Você pode escrever suas próprias ligações para essas seqüências de escape. Pode ser possível fazer com que o Vim configure automaticamente o terminal no modifyOtherKeys
modo, alimentando-o com uma definição de terminal modificada, mas isso está além do escopo desta resposta.
O Neovim possui suporte interno para uma das variantes . Tanto quanto eu entendo, ele não liga o suporte se o terminal suportar, isso depende do usuário.
¹ Cada vez mais e mais comumente hoje em dia, Backspaceenvia o caractere 127.
Esc
ouC-[
, portanto, você está sem sorte, mas pode fazer algo com uma versão GUI do Vim ou reconfigurar seu terminal.