W skrócie:
- keycodes to sposób na przedstawienie klucza
- Odwzorowana sekwencja klawiszy jest ciągiem kodów uruchamiających działanie
Teraz myślę, że twoje pytanie dotyczy raczej różnicy między timeoutlen
i ttimeoutlen
zamiast różnicy między mapowaną sekwencją klawiszy a kodem klucza.
Moja odpowiedź oparta jest na tym artykule z Wikipedii , który naprawdę powinieneś przeczytać, ponieważ odnosi się do niektórych kwestii, o których nie wspomniałem tutaj, aby odpowiedź była jak najkrótsza i jasna.
Najpierw porozmawiajmy o kluczowych kodach. W artykule zdefiniowano dwa typy kodów dostępu:
Kody klawiszy terminala:
To w jaki sposób terminal reprezentuje klucz.
Te kody wysyłane przez terminal do Vima.
Aby uzyskać listę tych kodów, należy skorzystać z dokumentacji terminala. Możesz je również zobaczyć, wpisując polecenie cat
w terminalu i wpisując klucz, który chcesz znać kod. Na przykład na moim terminalu kod klucza ShiftF1wygląda następująco:
^[[23~
Kody Vima:
Są jak vim stanowią klucz.
Vim potrzebuje spójnego sposobu przedstawiania kluczy, ponieważ kody klawiszy terminala zmieniają się z terminala na inny. Lista kodów Vima jest dostępna pod adresem :h t_ku
. Kod Vima dla ShiftF1wygląda następująco:
<S-F1>
Tak więc, kiedy naciskam ShiftF1klawiaturę, sterowniki i system operacyjny poinformują terminal, że nacisnąłem te klawisze, które będzie interpretował ^[[23~
. Terminal wyśle to do Vima, który zrozumie, że to oznacza, <S-F1>
i uruchomi akcję zamapowaną na ten kod klucza.
Możemy ustawić kody Vima, więc jeśli twój terminal wyśle kod, którego Vim nie rozumie, <S-F1>
na przykład możesz użyć następującego polecenia. To powie Vimowi, kiedy otrzymasz kod ^[[24~
, przetłumaczy on <S-F1>
:
set <S-F1> ^[[24~
Czym jest zmapowana sekwencja klawiszy?
Odwzorowana sekwencja klawiszy będzie lewą częścią mapowania i może być kodem klucza Vima lub kodem klucza terminala. Na przykład:
:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>
Pierwsze mapowanie mapuje kod terminalu, podczas gdy drugie mapuje kod Vima.
Teraz różnica między timeoutlen
i ttimeoutlen
?
ttimeoutlen
to czas, w którym Vim będzie czekał na różne części kodów kluczy terminala (w naszym poprzednim przykładzie byłoby ^[
to [
wtedy 2
itd.)
Ponieważ te kody klawiszy są wysyłane przez terminal, nie powinno być opóźnienia między tymi wejściami (ponieważ są one wysyłane „przez wszystkie” jednocześnie przez terminal). Dlatego doktor zaleca naprawdę małą wartość dla tego ustawienia.
timeoutlen
jest czasem, w którym Vim będzie oczekiwał na kolejne kody Vima, które są wprowadzane ręcznie przez użytkownika, a zatem są dłuższe do wprowadzenia niż kod terminala.
Aby użyć przykładu, powiedzmy, że:
- Zamapowałeś
^[[1;6B
na akcję
^[1;6B
jest kodem twojego terminala ctrlshiftdown
^[
jest kodem twojego terminala Escape.
Zachowanie, którego należy się spodziewać:
- Jeśli ustawisz dużą wartość
ttimeoutlen
, za każdym razem, gdy wpiszesz Escape, Vim zaczeka, aby sprawdzić, czy masz na myśli ^[
(tj. Escape) Czy ^[1;6B
(tj. ctrlshiftdown)
- Jeśli ustawisz mały
ttimeoutlen
, nie będziesz miał opóźnienia podczas pisania, Escapeponieważ Vim będzie wiedział, że jest to kompletny kod.
I timeoutlen
będzie działać na „wyższym poziomie”, jeśli masz następujące mapowania:
inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>
Po wpisaniu jvim nie będzie czekać, timeoutlen
ponieważ początek kodu terminala dla jnie jest kompletny, ale ponieważ czeka na następny kod Vima.
Mam nadzieję, że moje wyjaśnienie ma sens, zwróć uwagę, że niektóre z mapowań, których użyłem, nie mają sensu z funkcjonalnego punktu widzenia, ale są tutaj dla wygody wyjaśnienia.