Qual è la differenza tra "sequenze di tasti mappati" e "codici chiave"? (timeoutlen v ttimeoutlen)


20

Il manuale di Vim dice che possiamo usare timeoutlenper specificare la durata del timeout delle sequenze di tasti mappati e possiamo usare ttimeoutlenper specificare la lunghezza del timeout dei codici chiave :

Un'impostazione utile sarebbe

:set timeout timeoutlen=3000 ttimeoutlen=100

(timeout sulla mappatura dopo tre secondi, timeout sui codici chiave dopo un decimo di secondo).

Quali sono i codici chiave ? In cosa differiscono dalle sequenze di tasti mappate ?

Conosco un esempio di una sequenza di tasti mappata jkdalla mappatura seguente:

inoremap jk <esc>

In questo esempio, quando sono in modalità di inserimento e digitazione j, vim attenderà timeoutlenmillisecondi kprima che decida quale sia il mio intento.

Ma cos'è un codice chiave e in che modo lo ttimeoutleninfluenza? Grazie.

Risposte:


22

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 timeoutlene ttimeoutleninvece 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 catnel 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 timeoutlene 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;6Ba 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 timeoutlenagirà a un "livello superiore", se si dispone dei seguenti mapping:

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

Quando si digita jvim timeoutlennon 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.