In breve:
- keycodes è un modo per rappresentare una chiave
- Una sequenza di tasti mappata è una successione di codici chiave che innescano un'azione
Ora penso che la tua domanda riguardi più la differenza tra timeoutlen
e ttimeoutlen
invece della differenza tra una sequenza di chiavi mappata e un codice chiave.
La mia risposta si basa su questo articolo di wiki che dovresti davvero leggere perché affronta alcuni punti che non ho menzionato qui per mantenere la risposta il più breve e chiara possibile.
Innanzitutto parliamo di codici chiave. L'articolo definisce due tipi di codici chiave:
Codici chiave terminali:
Sono come il terminale rappresenta una chiave.
Questi codici inviati dal terminale a Vim.
Per ottenere un elenco di questi codici chiave è necessario utilizzare la documentazione del terminale. Puoi anche vederli digitando il comando cat
nel tuo terminale e digitando la chiave che vuoi conoscere il codice chiave. Ad esempio sul mio terminale il codice chiave per ShiftF1assomiglia a:
^[[23~
Codici chiave Vim:
Sono come Vim rappresenta una chiave.
Vim ha bisogno di un modo coerente per rappresentare le chiavi perché i codici chiave del terminale cambiano da un terminale all'altro. Un elenco di codici chiave Vim è accessibile all'indirizzo :h t_ku
. Il codice chiave di Vim ShiftF1è simile a:
<S-F1>
Quindi quando premo ShiftF1sulla tastiera, i driver e il sistema operativo faranno sapere al terminale che ho premuto questi tasti che interpreterà come ^[[23~
. Il terminale lo invierà a Vim che capirà che significa <S-F1>
e attiverà l'azione mappata a questo codice chiave.
Possiamo impostare i codici chiave di Vim, quindi se il tuo terminale invia un codice chiave che Vim non comprende come <S-F1>
ad esempio potresti usare il seguente comando. Questo dirà a Vim quando riceverai il codice chiave ^[[24~
, tradurlo ha <S-F1>
:
set <S-F1> ^[[24~
Quindi cos'è una sequenza di tasti mappata?
Una sequenza di tasti mappata sarà un lhs di una mappatura e può essere codici chiave Vim o codici chiave Terminale. Per esempio:
:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>
La prima mappatura mapperà il codice chiave del terminale mentre la seconda mapperà il codice chiave Vim.
Ora per la differenza tra timeoutlen
e ttimeoutlen
?
ttimeoutlen
è il tempo in cui Vim attenderà le diverse parti dei codici di una chiave terminale (nel nostro esempio precedente che sarebbe ^[
quindi [
allora 2
, ecc ...
Poiché questi codici chiave vengono inviati dal terminale, non dovrebbe esserci un ritardo tra questi ingressi (poiché vengono inviati "tutti in una volta" dal terminale). Questo è il motivo per cui il documento raccomanda un valore veramente piccolo per questa impostazione.
timeoutlen
è il tempo che Vim attenderà per i successivi codici chiave Vim che vengono inseriti manualmente da un utente e quindi è più lungo da inserire rispetto a un codice chiave terminale.
Per usare un esempio diciamo che:
- Hai eseguito il mapping
^[[1;6B
a un'azione
^[1;6B
è il codice chiave del terminale per ctrlshiftdown
^[
è il codice chiave del terminale per Escape.
Il comportamento che dovresti aspettarti:
- Se si imposta un valore grande
ttimeoutlen
, ogni volta che si digita Escape, Vim attenderà di vedere se intendevi ^[
(ie Escape) o ^[1;6B
(ie ctrlshiftdown)
- Se si imposta un valore piccolo
ttimeoutlen
, non si avrà un ritardo quando si digita Escapeperché Vim saprà che si tratta di un codice chiave completo.
E timeoutlen
agirà a un "livello superiore", se si dispone dei seguenti mapping:
inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>
Quando si digita jvim timeoutlen
non attenderà perché l'inizio del codice chiave terminale per jnon è completo ma perché è in attesa del codice chiave successivo Vim.
Spero che la mia spiegazione abbia un senso, nota che alcune delle mappature che ho usato non hanno senso dal punto di vista funzionale ma sono qui per comodità la spiegazione.