Najpierw trochę historii. W dawnych czasach, kiedy pisałeś jakiś tekst na terminalu , każdy klawisz wysyłał znak do aplikacji. Gdy maszyny, do których podłączono terminal, stały się bardziej wydajne, terminale ustandaryzowano na klawiszu sterującym , który wysyłał niektóre znaki specjalne, które nie były drukowane, ale miały jakąś funkcję. Ostatecznie triumfalnym zestawem znaków był ASCII , z 128 znakami, z których 32 to znaki kontrolne. Naciśnięcie Ctrlrazem z literą lub innym symbolem zapisanym 10xxxxx₂ (notacja binarna) wysyła znak sterujący, którego kod to 00xxxxx₂, np. Ctrl+ [Wysyła znak o numerze 27₁₀ = 0011011₂, ponieważ [jest to 91₁₀ = 1011011₂.
Kilka klawiszy funkcyjnych na terminalach wysłało znaki sterujące:
- Backspace=
Ctrl-H(BS = BackSpace) ¹
- Tab=
Ctrl-I(HT = Zakładka pozioma)
- Linefeed=
Ctrl-J(LF = Line Feed) (kilka terminali kiedykolwiek miało ten klucz)
- Returnlub Enter=
Ctrl-M(CR = powrót karetki)
- Escape=
Ctrl-[(ESC = Escape)
Gdy terminale miały więcej klawiszy funkcyjnych, nie było wystarczającej liczby znaków sterujących, aby je wszystkie przedstawić. Wysłali więc sekwencje charakteru i uniwersalna konwencja jest taka, że te sekwencje znaków rozpoczyna się od znaku sterującego, Ctrl-[.
Z biegiem czasu terminale sprzętowe stawały się coraz rzadsze; obecnie istnieje wiele poziomów tłumaczenia między klawiaturą a aplikacją . Ograniczenie liczby dostępnych znaków i zakodowane na stałe zależności między pewnymi kombinacjami klawiszy i niektórymi znakami kontrolnymi nie są już istotne. Jednak aplikacje pozostały kompatybilne z istniejącymi terminalami, a terminale pozostały kompatybilne z istniejącymi aplikacjami, co utrudniło zmianę czegokolwiek.
Nawet dzisiaj, w systemach uniksowych, aplikacje działające w emulatorze terminali odbierają znak, Ctrl-Igdy użytkownik naciska Tabklawisz, znak, Ctrl-[gdy użytkownik naciska klawisz Escitp. Jeśli Vim działa w terminalu Unix, nie może odróżnić <Esc>i <Ctrl-[>ponieważ terminal wysyła te same informacje.
Vim działający w innych środowiskach nie ma tego ograniczenia, więc w zasadzie byłoby możliwe, aby wysyłali różne informacje. Biorąc pod uwagę, że Vim używa Ctrl-[postaci do reprezentowania <Esc>w wielu miejscach, zmiana tego byłaby niepraktyczna; zamiast tego można dodać Ctrl+, [aby wysłać inne zdarzenie wejściowe.
Nie znam żadnej wersji samego Vima, która odróżnia + Esci (ale nie jest tak, jakbym kiedykolwiek używał). Gvim, na przykład, wydaje się naśladować terminal odmian ogrodowych .Ctrl[
Jak na ironię, najlepszym rozwiązaniem może być Vim działający w emulatorze terminali. Niektóre emulatory terminali pozwalają dostosować sekwencje specjalne wysyłane przez klucze i słowa kluczowe. Możesz więc ustawić Ctrl+, [aby + nie wysyłał Ctrl-[znaku ␛ ( ), ale pewną sekwencję zmiany znaczenia. Xterm, „referencyjny” emulator terminala dla systemów uniksopodobnych, obsługuje dwa takie schematy. Na przykład:
- Escwysyła
␛i Tabwysyła ␉we wszystkich konfiguracjach.
- Z
?.VT100.modifyOtherKeys: 0(domyślnie) lub ?.VT100.modifyOtherKeys: 1, Ctrl+ [wysyła ␛i Ctrl+ Iwysyła ␉. ?.VT100.modifyOtherKeys: 1wpływa tylko na kombinacje meta i kombinacje kontrolne pozbawione znaku ASCII.
- Z
?.VT100.modifyOtherKeys: 2i ?.VT100.formatOtherKeys: 0(domyślnie), Ctrl+ [wysyła ␛[27;5;91~i Ctrl+ Iwysyła ␛[27;5;105~.
- Za pomocą
?.VT100.modifyOtherKeys: 2i ?.VT100.formatOtherKeys: 1, Ctrl+ [wysyła ␛[91;5ui Ctrl+ Iwysyła ␛[105;5u.
Wsparcie można włączyć, ustawiając modifyOtherKeys zasób podczas uruchamiania Xterm (i formatOtherKeyswybierając pomiędzy dwoma schematami), lub można go dynamicznie włączać i wyłączać przez aplikację.
Vim nie ma wbudowanego wsparcia, o którym wiem. Możesz napisać własne powiązania dla tych sekwencji specjalnych. Możliwe, że Vim będzie automatycznie ustawiał terminal w modifyOtherKeystrybie, karmiąc go zmodyfikowaną definicją terminala, ale robi to poza zakresem tej odpowiedzi.
Neovim ma wbudowane wsparcie dla jednego z wariantów . O ile rozumiem, nie włącza obsługi, jeśli terminal ją obsługuje, to zależy od użytkownika.
¹ Coraz częściej i najczęściej w dzisiejszych czasach Backspacewysyła postać 127.
EsclubC-[, więc nie masz szczęścia, ale możesz być w stanie coś zrobić z wersją GUI Vima lub przez rekonfigurację terminala.