Do przełączania się z trybu wstawiania jestem przyzwyczajony <Esc>
. Teraz chcę się przekwalifikować <C-[>
zamiast <Esc>
. W tym celu muszę wyłączyć, <Esc>
aby pomóc w przekwalifikowaniu.
Problemem jest
:inoremap <Esc> <Nop>
wyłącza również <C-[>
. Dla vimów wydają się być tym samym.
Czy jest jakiś sposób na wyłączenie jednego bez drugiego?
key-bindings
mxlian
źródło
źródło
Esc
lubC-[
, więc nie masz szczęścia, ale możesz być w stanie coś zrobić z wersją GUI Vima lub przez rekonfigurację terminala.Odpowiedzi:
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:
Ctrl-H
(BS = BackSpace) ¹Ctrl-I
(HT = Zakładka pozioma)Ctrl-J
(LF = Line Feed) (kilka terminali kiedykolwiek miało ten klucz)Ctrl-M
(CR = powrót karetki)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:␛
i Tabwysyła␉
we wszystkich konfiguracjach.?.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.?.VT100.modifyOtherKeys: 2
i?.VT100.formatOtherKeys: 0
(domyślnie), Ctrl+ [wysyła␛[27;5;91~
i Ctrl+ Iwysyła␛[27;5;105~
.?.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 (iformatOtherKeys
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.
źródło