Desative <Esc>, mas mantenha <C - [>

24

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?

mxlian
fonte
13
Depende do ambiente em que você está trabalhando. A maioria dos terminais de texto envia as mesmas informações para o aplicativo quando você pressiona Escou C-[, portanto, você está sem sorte, mas pode fazer algo com uma versão GUI do Vim ou reconfigurar seu terminal.
Gilles 'SO- stop be evil'
Direita! Não é um problema de vim. Vou encontrar uma solução alternativa com os mapeamentos do teclado. Graças
mxlian
3
@Gilles, por que você não responde isso? É melhor para os Googlers e as estatísticas do nosso site.
Robbie Wxyz
2
@SuperScript Eu pesquisei isso um pouco mais e postei uma resposta.
Gilles 'SO- stop be evil'

Respostas:

35

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-Iquando 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: 1afeta apenas meta combinações e combinações de controle que não possuem um caractere ASCII.
  • Com ?.VT100.modifyOtherKeys: 2e ?.VT100.formatOtherKeys: 0(padrão), Ctrl+ [envia ␛[27;5;91~e Ctrl+ Ienvia ␛[27;5;105~.
  • Com ?.VT100.modifyOtherKeys: 2e ?.VT100.formatOtherKeys: 1, Ctrl+ [envia ␛[91;5ue Ctrl+ Ienvia ␛[105;5u.

O suporte pode ser ativado ao definir o modifyOtherKeys recurso ao iniciar o xterm (e formatOtherKeyspara 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 modifyOtherKeysmodo, 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.

Gilles 'SO- parar de ser mau'
fonte