Para voltar do modo Inserir, estou acostumado <Esc>
. Agora estou procurando me treinar em <C-[>
vez de <Esc>
. Para isso eu preciso desativar <Esc>
para ajudar com a reciclagem.
O problema é
:inoremap <Esc> <Nop>
também desativa <C-[>
. Para o vim, eles parecem ser a mesma coisa.
Existe alguma maneira de desativar um sem o outro?
key-bindings
mxlian
fonte
fonte
Esc
ouC-[
, portanto, você está sem sorte, mas pode fazer algo com uma versão GUI do Vim ou reconfigurar seu terminal.Respostas:
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:
Ctrl-H
(BS = BackSpace) ¹Ctrl-I
(HT = separador horizontal)Ctrl-J
(LF = avanço de linha) (poucos terminais já tiveram essa chave)Ctrl-M
(CR = retorno de carro)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 caractereCtrl-[
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:␛
e Tabenvia␉
, em todas as configurações.?.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.?.VT100.modifyOtherKeys: 2
e?.VT100.formatOtherKeys: 0
(padrão), Ctrl+ [envia␛[27;5;91~
e Ctrl+ Ienvia␛[27;5;105~
.?.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 (eformatOtherKeys
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.
fonte