Innanzitutto, un po 'di storia. Ai vecchi tempi, quando si scriveva del testo su un terminale , ogni chiave inviava un carattere all'applicazione. Man mano che le macchine a cui era collegato il terminale diventavano più potenti, i terminali si standardizzavano su un tasto di controllo , che avrebbe inviato alcuni caratteri speciali, che non erano stampati ma avevano una sorta di funzione. Il set di caratteri alla fine trionfante era ASCII , con 128 caratteri di cui 32 sono personaggi di controllo. Premendo Ctrlinsieme una lettera o un altro simbolo scritto 10xxxxx₂ (notazione binaria) si invia il carattere di controllo il cui codice è 00xxxxx₂, ad es. Ctrl+ [Invia il numero di carattere 27₁₀ = 0011011₂ perché [
è 91₁₀ = 1011011₂.
Alcuni tasti funzione sui terminali hanno inviato caratteri di controllo:
- Backspace=
Ctrl-H
(BS = BackSpace) ¹
- Tab=
Ctrl-I
(HT = scheda orizzontale)
- Linefeed=
Ctrl-J
(LF = Line Feed) (pochi terminali hanno mai avuto questa chiave)
- Returnoppure Enter=
Ctrl-M
(CR = ritorno a capo)
- Escape=
Ctrl-[
(ESC = Escape)
Quando i terminali avevano più tasti funzione, non c'erano abbastanza caratteri di controllo per rappresentarli tutti. Allora mandarono sequenze di carattere, e la convenzione universale, è che queste sequenze di caratteri iniziano con il carattere di escape, Ctrl-[
.
Col passare del tempo, i terminali hardware sono diventati sempre più rari; al giorno d'oggi ci sono molti livelli di traduzione tra la tastiera e l'applicazione . La limitazione del numero di caratteri disponibili e le corrispondenze codificate tra determinate combinazioni di tasti e determinati caratteri di controllo non sono più pertinenti. Tuttavia, le applicazioni sono rimaste compatibili con i terminali esistenti e i terminali sono rimasti compatibili con le applicazioni esistenti, il che ha reso difficile cambiare qualsiasi cosa.
Quindi anche oggi, su sistemi simili a Unix, le applicazioni in esecuzione in un emulatore di terminale ricevono il carattere Ctrl-I
quando l'utente preme il Tabtasto, il carattere Ctrl-[
quando l'utente preme Esc, ecc. Se Vim è in esecuzione in un terminale Unix, non è possibile distinguere tra <Esc>
e <Ctrl-[>
poiché il terminale invia le stesse informazioni.
Vim in esecuzione in altri ambienti non ha questa limitazione, quindi in linea di principio sarebbe possibile per loro inviare informazioni diverse. Dato che Vim usa il Ctrl-[
personaggio per rappresentare <Esc>
in molti luoghi, il cambiamento sarebbe impraticabile; invece Ctrl+ [potrebbe essere fatto per inviare un diverso evento di input.
Non sono a conoscenza di alcuna versione di Vim stessa che distingua tra + Esce (ma non è come se ne avessi mai usato). Gvim, per esempio, sembra emulare un terminale di varietà da giardino .Ctrl[
Ironia della sorte, la tua scommessa migliore potrebbe essere Vim in esecuzione in un emulatore di terminale. Alcuni emulatori di terminale consentono di personalizzare le sequenze di escape inviate da tasti e tasti. Quindi potresti disporre che Ctrl+ [non invii il carattere ␛ ( Ctrl-[
), ma una sequenza di escape. Xterm, l'emulatore di terminale "di riferimento" per sistemi simili a Unix, supporta due di questi schemi. Per esempio:
- Escinvia
␛
e Tabinvia ␉
, in tutte le configurazioni.
- Con
?.VT100.modifyOtherKeys: 0
(impostazione predefinita) o ?.VT100.modifyOtherKeys: 1
, Ctrl+ [invia ␛
e Ctrl+ Iinvia ␉
. ?.VT100.modifyOtherKeys: 1
influisce solo sulle meta combinazioni e combinazioni di controllo prive di carattere ASCII.
- Con
?.VT100.modifyOtherKeys: 2
e ?.VT100.formatOtherKeys: 0
(impostazione predefinita), Ctrl+ [invia ␛[27;5;91~
e Ctrl+ Iinvia ␛[27;5;105~
.
- Con
?.VT100.modifyOtherKeys: 2
e ?.VT100.formatOtherKeys: 1
, Ctrl+ [invia ␛[91;5u
e Ctrl+ Iinvia ␛[105;5u
.
Il supporto può essere attivato impostando la modifyOtherKeys
risorsa all'avvio di xterm (e formatOtherKeys
per selezionare tra i due schemi), oppure può essere attivato e disattivato dinamicamente dall'applicazione.
Vim non ha supporto integrato di cui io sia a conoscenza. Puoi scrivere i tuoi collegamenti per queste sequenze di escape. Potrebbe essere possibile convincere Vim a impostare automaticamente il terminale in modifyOtherKeys
modalità fornendo una definizione di terminale modificata, ma farlo non rientra nell'ambito di questa risposta.
Neovim ha il supporto integrato per una delle varianti . Per quanto ho capito, non attiva il supporto se il terminale lo supporta, spetta all'utente farlo.
¹ Sempre più spesso al giorno d'oggi, Backspaceinvia il carattere 127.
Esc
oC-[
, quindi si è sfortunati, ma si potrebbe essere in grado di fare qualcosa con una versione GUI di Vim o riconfigurando il terminale.