Wyłącz <Esc>, ale trzymaj <C - [>


24

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?


13
To zależy od środowiska, w którym pracujesz. Większość terminali tekstowych wysyła te same informacje do aplikacji po naciśnięciu Esclub C-[, więc nie masz szczęścia, ale możesz być w stanie coś zrobić z wersją GUI Vima lub przez rekonfigurację terminala.
Gilles „SO - przestań być zły”

Dobrze! Nie jest to problem z vimem. Znajduję obejście z mapowaniami klawiatury. Dzięki
mxlian,

3
@Gilles, dlaczego nie umieścisz tego w odpowiedzi? Jest to lepsze dla Googlersów i statystyk naszej witryny.
Robbie Wxyz

2
@SuperScript Przeanalizowałem to trochę więcej i opublikowałem odpowiedź.
Gilles „SO- przestań być zły”

Odpowiedzi:


35

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.