Was ist der Unterschied zwischen "zugeordneten Tastenfolgen" und "Tastencodes"? (timeoutlen v ttimeoutlen)

20

Das vim-Handbuch besagt, dass wir timeoutlendie Timeout-Länge von zugeordneten Schlüsselsequenzen und ttimeoutlendie Timeout-Länge von Schlüsselcodes festlegen können :

Eine nützliche Einstellung wäre

:set timeout timeoutlen=3000 ttimeoutlen=100

(Zeitüberschreitung beim Mapping nach drei Sekunden, Zeitüberschreitung bei Tastencodes nach einer Zehntelsekunde).

Was sind Schlüsselcodes ? Wie unterscheiden sie sich von zugeordneten Tastenfolgen ?

Ich weiß, dass ein Beispiel für eine zugeordnete Tastenfolge jkaus der folgenden Zuordnung stammt:

inoremap jk <esc>

Wenn ich mich in diesem Beispiel im Einfügemodus befinde und jtippe, wartet vim timeoutlenMillisekunden, bis kich die Taste drücke, bevor ich mich für meine Absicht entscheide.

Aber was ist ein Schlüsselcode und wie wirkt ttimeoutlener sich aus? Danke.

Niko Bellic
quelle

Antworten:

22

Zusamenfassend:

  • Schlüsselcodes sind eine Möglichkeit, einen Schlüssel darzustellen
  • Eine zugeordnete Tastenfolge ist eine Folge von Tastencodes, die eine Aktion auslösen

Jetzt denke ich, dass sich Ihre Frage eher auf den Unterschied zwischen timeoutlenund als ttimeoutlenauf den Unterschied zwischen einer zugeordneten Tastenfolge und einem Tastencode bezieht.

Meine Antwort basiert auf diesem Wikia-Artikel , den Sie unbedingt lesen sollten, da er einige Punkte anspricht, die ich hier nicht erwähnt habe, um die Antwort so kurz und klar wie möglich zu halten.


Lassen Sie uns zuerst über Schlüsselcodes sprechen. Der Artikel definiert zwei Arten von Schlüsselcodes:

  • Terminal-Schlüsselcodes:

    Sie sind, wie das Terminal einen Schlüssel darstellt.

    Diese Codes, die vom Terminal an Vim gesendet werden.

    Um eine Liste dieser Schlüsselcodes zu erhalten, sollten Sie Ihre Terminaldokumentation verwenden. Sie können sie auch anzeigen, indem Sie den Befehl catin Ihr Terminal eingeben und den Schlüssel eingeben, dessen Schlüsselcode Sie wissen möchten. Zum Beispiel ShiftF1sieht auf meinem Terminal der Schlüsselcode für so aus:

    ^[[23~

  • Vim-Schlüsselcodes:

    Sie sind, wie vim einen Schlüssel darstellen.

    Vim benötigt eine konsistente Darstellung der Schlüssel, da sich die Schlüsselcodes des Terminals von einem Terminal zum anderen ändern. Eine Liste der Vim-Schlüsselcodes finden Sie unter :h t_ku. Der Vim-Schlüsselcode für ShiftF1sieht folgendermaßen aus:

    <S-F1>

Wenn ich also ShiftF1auf meiner Tastatur drücke, teilen die Treiber und das Betriebssystem dem Terminal mit, dass ich diese Tasten gedrückt habe, die es interpretieren wird ^[[23~. Das Terminal sendet das an Vim, das versteht, dass dies bedeutet, <S-F1>und löst die Aktion aus, die diesem Tastencode zugeordnet ist.

Wir können Vim-Schlüsselcodes festlegen. Wenn Ihr Terminal also einen von Vim nicht verstandenen Schlüsselcode sendet, können <S-F1>Sie beispielsweise den folgenden Befehl verwenden. Dies teilt Vim mit, wann Sie den Schlüsselcode erhalten ^[[24~haben <S-F1>.

set <S-F1> ^[[24~

Was ist eine zugeordnete Tastenfolge?

Eine zugeordnete Tastenfolge ist ein lhs einer Zuordnung und kann Vim-Tastencodes oder Terminal-Tastencodes sein. Beispielsweise:

:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>

Die erste Zuordnung ordnet den Terminal-Schlüsselcode zu, während die zweite den Vim-Schlüsselcode ordnet.

Nun zum Unterschied zwischen timeoutlenund ttimeoutlen?

  • ttimeoutlenVim ist die Zeit für die verschiedenen Teile eines Terminals Tastencodes warten (in unserem vorherigen Beispiel , das wäre ^[dann [dann 2, etc ...

    Da diese Schlüsselcodes vom Terminal gesendet werden, sollte es keine Verzögerung zwischen diesen Eingaben geben (da sie vom Terminal auf einmal gesendet werden). Aus diesem Grund empfiehlt das Dokument einen sehr kleinen Wert für diese Einstellung.

  • timeoutlen ist die Zeit, die Vim auf die aufeinanderfolgenden Vim-Schlüsselcodes wartet, die von einem Benutzer manuell eingegeben werden, und ist daher länger als die Eingabe eines Terminal-Schlüsselcodes.

Um ein Beispiel zu verwenden, sagen wir, dass:

  • Sie haben ^[[1;6Beine Aktion zugeordnet
  • ^[1;6B ist der Schlüsselcode Ihres Terminals für ctrlshiftdown
  • ^[ist der Schlüsselcode Ihres Terminals für Escape.

Das Verhalten, das Sie erwarten sollten:

  • Wenn Sie bei ttimeoutlenjeder EscapeEingabe ein großes Zeichen setzen, wartet Vim, ob Sie ^[(dh Escape) oder ^[1;6B(dh ctrlshiftdown) gemeint haben.
  • Wenn Sie einen kleinen Wert festlegen ttimeoutlen, wird die Eingabe nicht verzögert, Escapeda Vim weiß, dass es sich um einen vollständigen Schlüsselcode handelt.

Und timeoutlenwird auf einer höheren Ebene agieren, wenn Sie die folgenden Zuordnungen haben:

inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>

Wenn Sie jvim eingeben, wird timeoutlennicht gewartet , weil der Anfang des Terminal-Schlüsselcodes für jnicht vollständig ist, sondern weil er auf den nächsten Vim-Schlüsselcode wartet.


Ich hoffe, dass meine Erklärung sinnvoll ist. Beachten Sie, dass einige der verwendeten Zuordnungen aus funktionaler Sicht keinen Sinn ergeben, aber der Einfachheit halber hier aufgeführt sind.

statox
quelle