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-I
cuando 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: 1
solo afecta a las combinaciones meta y combinaciones de control que carecen de un carácter ASCII.
- Con
?.VT100.modifyOtherKeys: 2
y ?.VT100.formatOtherKeys: 0
(predeterminado), Ctrl+ [envía ␛[27;5;91~
y Ctrl+ Ienvía ␛[27;5;105~
.
- Con
?.VT100.modifyOtherKeys: 2
y ?.VT100.formatOtherKeys: 1
, Ctrl+ [envía ␛[91;5u
y Ctrl+ Ienvía ␛[105;5u
.
El soporte se puede activar configurando el modifyOtherKeys
recurso al iniciar xterm (y formatOtherKeys
seleccionar 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 modifyOtherKeys
modo 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.
Esc
oC-[
, por lo que no tiene suerte, pero es posible que pueda hacer algo con una versión GUI de Vim o reconfigurando su terminal.