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-I
gdy 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: 1
wpływa tylko na kombinacje meta i kombinacje kontrolne pozbawione znaku ASCII.
- Z
?.VT100.modifyOtherKeys: 2
i ?.VT100.formatOtherKeys: 0
(domyślnie), Ctrl+ [wysyła ␛[27;5;91~
i Ctrl+ Iwysyła ␛[27;5;105~
.
- Za pomocą
?.VT100.modifyOtherKeys: 2
i ?.VT100.formatOtherKeys: 1
, Ctrl+ [wysyła ␛[91;5u
i Ctrl+ Iwysyła ␛[105;5u
.
Wsparcie można włączyć, ustawiając modifyOtherKeys
zasób podczas uruchamiania Xterm (i formatOtherKeys
wybierają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 modifyOtherKeys
trybie, 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.
Esc
lubC-[
, więc nie masz szczęścia, ale możesz być w stanie coś zrobić z wersją GUI Vima lub przez rekonfigurację terminala.