Deshabilite <Esc> pero mantenga <C - [>

24

Para volver del modo Insertar estoy acostumbrado <Esc>. Ahora estoy buscando volver a entrenarme en <C-[>lugar de <Esc>. Para eso necesito deshabilitar <Esc>para ayudar con el reciclaje.

El problema es

:inoremap <Esc> <Nop>

También deshabilita <C-[>. Para vim parecen ser lo mismo.

¿Hay alguna forma de desactivar uno sin el otro?

mxlian
fuente
13
Depende de en qué entorno estés trabajando. La mayoría de los terminales de texto envían la misma información a la aplicación cuando presiona Esco C-[, por lo que no tiene suerte, pero es posible que pueda hacer algo con una versión GUI de Vim o reconfigurando su terminal.
Gilles 'SO- deja de ser malo'
¡Correcto! No es un problema vim. Encontraré una solución alternativa con las asignaciones de teclado. Gracias
mxlian
3
@Gilles, ¿por qué no pones eso en una respuesta? Es mejor para Googlers y las estadísticas de nuestro sitio.
Robbie Wxyz
2
@ SuperScript He investigado esto un poco más y publicado una respuesta.
Gilles 'SO- deja de ser malvado'

Respuestas:

35

Primero, un poco de historia. En los viejos tiempos, cuando escribía texto en una terminal , cada tecla enviaba un carácter a la aplicación. A medida que las máquinas a las que estaba conectado el terminal se volvieron más potentes, los terminales se estandarizaron en una tecla de control , que enviaría algunos caracteres especiales, que no se imprimieron pero tenían algún tipo de función. El conjunto de caracteres finalmente triunfante fue ASCII , con 128 caracteres de los cuales 32 son caracteres de control. Al presionar Ctrljunto con una letra u otro símbolo escrito 10xxxxx₂ (notación binaria) se envía el carácter de control cuyo código es 00xxxxx₂, por ejemplo, Ctrl+ [envía el número de carácter 27₁₀ = 0011011₂ porque [es 91₁₀ = 1011011₂.

Algunas teclas de función en los terminales enviaron caracteres de control:

  • Backspace= Ctrl-H(BS = Retroceso) ¹
  • Tab= Ctrl-I(HT = pestaña horizontal)
  • Linefeed= Ctrl-J(LF = avance de línea) (pocas terminales alguna vez tuvieron esta tecla)
  • Returno Enter= Ctrl-M(CR = retorno de carro)
  • Escape= Ctrl-[(ESC = Escape)

Cuando los terminales tenían más teclas de función, no había suficientes caracteres de control para representarlos a todos. Así que enviaron a secuencias de caracteres, y la Convención Universal es que estas secuencias de caracteres comienzan con el carácter de escape, Ctrl-[.

Con el paso del tiempo, las terminales de hardware se volvieron cada vez más raras; Hoy en día hay muchos niveles de traducción entre el teclado y la aplicación . La limitación en el número de caracteres disponibles y las correspondencias codificadas entre ciertas combinaciones de teclas y ciertos caracteres de control ya no son relevantes. Sin embargo, las aplicaciones se han mantenido compatibles con los terminales existentes, y los terminales se han mantenido compatibles con las aplicaciones existentes, lo que dificulta el cambio de cualquier cosa.

Entonces, incluso hoy, en sistemas similares a Unix, las aplicaciones que se ejecutan en un emulador de terminal reciben el carácter Ctrl-Icuando el usuario presiona la Tabtecla, el carácter Ctrl-[cuando presiona el usuario Esc, etc. Si Vim se está ejecutando en un terminal Unix, no puede distinguir entre <Esc>y <Ctrl-[>porque el terminal envía la misma información.

Vim que se ejecuta en otros entornos no tiene esta limitación, por lo que en principio les sería posible enviar información diferente. Dado que Vim usa el Ctrl-[personaje para representar <Esc>en muchos lugares, cambiar eso no sería práctico; en su lugar, se podría hacer Ctrl+ [para enviar un evento de entrada diferente.

No conozco ninguna versión de Vim en sí que diferencie entre Escy Ctrl+ [(pero no es como si hubiera usado alguna vez). Gvim, por ejemplo, parece emular una terminal de variedad de jardín .

Irónicamente, tu mejor opción puede ser Vim corriendo en un emulador de terminal. Algunos emuladores de terminal le permiten personalizar secuencias de escape enviadas por teclas y teclados. Por lo tanto, puede organizar que Ctrl+ [envíe no el carácter ␛ ( Ctrl-[), sino alguna secuencia de escape. Xterm, el emulador de terminal de "referencia" para sistemas tipo Unix, admite dos de estos esquemas. Por ejemplo:

  • Escenvía y Tabenvía , en todas las configuraciones.
  • Con ?.VT100.modifyOtherKeys: 0(predeterminado) o ?.VT100.modifyOtherKeys: 1, Ctrl+ [envía y Ctrl+ Ienvía . ?.VT100.modifyOtherKeys: 1solo afecta a las combinaciones meta y combinaciones de control que carecen de un carácter ASCII.
  • Con ?.VT100.modifyOtherKeys: 2y ?.VT100.formatOtherKeys: 0(predeterminado), Ctrl+ [envía ␛[27;5;91~y Ctrl+ Ienvía ␛[27;5;105~.
  • Con ?.VT100.modifyOtherKeys: 2y ?.VT100.formatOtherKeys: 1, Ctrl+ [envía ␛[91;5uy Ctrl+ Ienvía ␛[105;5u.

El soporte se puede activar configurando el modifyOtherKeys recurso al iniciar xterm (y formatOtherKeysseleccionar entre los dos esquemas), o la aplicación puede activarlo y desactivarlo dinámicamente.

Vim no tiene soporte incorporado que yo sepa. Puede escribir sus propios enlaces para estas secuencias de escape. Es posible que Vim configure automáticamente el terminal en el modifyOtherKeysmodo al alimentarlo con una definición de terminal modificada, pero hacerlo está más allá del alcance de esta respuesta.

Neovim tiene soporte incorporado para una de las variantes . Según tengo entendido, no activa el soporte si el terminal lo admite, eso depende del usuario.

¹ Cada vez más y más comúnmente hoy en día, Backspaceenvía el personaje 127.

Gilles 'SO- deja de ser malvado'
fuente