Jaka jest różnica między „mapowanymi sekwencjami klawiszy” a „kodami klawiszy”? (timeoutlen v ttimeoutlen)


20

Podręcznik vim mówi, że możemy użyć, timeoutlenaby określić limit czasu zmapowanych sekwencji klawiszy i możemy użyć, ttimeoutlenaby określić limit czasu kodów kluczy :

Przydatne byłoby ustawienie

:set timeout timeoutlen=3000 ttimeoutlen=100

(czas oczekiwania na mapowanie po trzech sekundach, czas oczekiwania na kody kluczy po dziesiątej części sekundy).

Co to są kody kluczowe ? Czym różnią się od mapowanych sekwencji klawiszy ?

Wiem, że przykład odwzorowanej sekwencji klawiszy pochodzi jkz poniższego odwzorowania:

inoremap jk <esc>

W tym przykładzie, gdy jestem w trybie wstawiania i pisania j, vim będzie czekał timeoutlenmilisekundy na naciśnięcie, kzanim zdecyduję, co zamierzam.

Ale co to jest kluczowy kod i jak ttimeoutlenna niego wpływa? Dzięki Ci.

Odpowiedzi:


22

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 timeoutleni ttimeoutlenzamiast 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 catw 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 timeoutleni ttimeoutlen?

  • ttimeoutlento 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 2itd.)

    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;6Bna 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 timeoutlenbę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ć, timeoutlenponieważ 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.

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.