Disabilita <Esc> ma mantieni <C - [>


24

Per tornare dalla modalità Inserisci a cui sono abituato <Esc>. Ora sto cercando di riqualificarmi <C-[>invece di <Esc>. Per questo ho bisogno di disabilitare <Esc>per aiutare con la riqualificazione.

Il problema è

:inoremap <Esc> <Nop>

disabilita anche <C-[>. Per Vim sembrano essere la stessa cosa.

C'è un modo per disabilitare l'uno senza l'altro?


13
Dipende dall'ambiente in cui lavori. La maggior parte dei terminali di testo invia le stesse informazioni all'applicazione quando si preme Esco C-[, quindi si è sfortunati, ma si potrebbe essere in grado di fare qualcosa con una versione GUI di Vim o riconfigurando il terminale.
Gilles 'SO- smetti di essere malvagio'

Destra! Non è un problema di VIM. Troverò una soluzione alternativa con le mappature della tastiera. Grazie
mxlian

3
@Gilles perché non lo metti in una risposta? È meglio per i googler e le statistiche del nostro sito.
Robbie Wxyz,

2
@SuperScript L'ho cercato un po 'di più e ho pubblicato una risposta.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


35

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-Iquando 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: 1influisce solo sulle meta combinazioni e combinazioni di controllo prive di carattere ASCII.
  • Con ?.VT100.modifyOtherKeys: 2e ?.VT100.formatOtherKeys: 0(impostazione predefinita), Ctrl+ [invia ␛[27;5;91~e Ctrl+ Iinvia ␛[27;5;105~.
  • Con ?.VT100.modifyOtherKeys: 2e ?.VT100.formatOtherKeys: 1, Ctrl+ [invia ␛[91;5ue Ctrl+ Iinvia ␛[105;5u.

Il supporto può essere attivato impostando la modifyOtherKeys risorsa all'avvio di xterm (e formatOtherKeysper 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 modifyOtherKeysmodalità 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.