Quelle est la différence entre les «séquences de touches mappées» et les «codes de touches»? (timeoutlen v ttimeoutlen)

20

Le manuel de vim indique que nous pouvons utiliser timeoutlenpour spécifier la durée d'expiration des séquences de touches mappées et que nous pouvons utiliser ttimeoutlenpour spécifier la durée d'expiration des codes de touche :

Un cadre utile serait

:set timeout timeoutlen=3000 ttimeoutlen=100

(expiration du mappage après trois secondes, expiration des codes clés après un dixième de seconde).

Quels sont les codes clés ? En quoi sont-ils différents des séquences de touches mappées ?

Je sais qu'un exemple d'une séquence de touches mappée jkprovient du mappage ci-dessous:

inoremap jk <esc>

Dans cet exemple, lorsque je suis en mode d'insertion et que je tape j, vim attendra des timeoutlenmillisecondes pour que j'appuie kavant de décider quelle est mon intention.

Mais qu'est-ce qu'un code clé et comment l' ttimeoutlenaffecte-t-il? Merci.

Niko Bellic
la source

Réponses:

22

En bref:

  • les codes-clés sont un moyen de représenter une clé
  • Une séquence de touches mappée est une succession de codes clés déclenchant une action

Maintenant, je pense que votre question concerne davantage la différence entre timeoutlenet ttimeoutlenau lieu de la différence entre une séquence de touches mappée et un code de clé.

Ma réponse est basée sur cet article wikia que vous devriez vraiment lire car il aborde certains points que je n'ai pas mentionnés ici pour garder la réponse aussi courte et claire que possible.


Parlons d'abord des codes clés. L'article définit deux types de codes clés:

  • Codes clés du terminal:

    C'est ainsi que le terminal représente une clé.

    Ces codes qui sont envoyés par le terminal à Vim.

    Pour obtenir une liste de ces codes clés, vous devez utiliser la documentation de votre terminal. Vous pouvez également les voir en tapant la commande catdans votre terminal et en tapant la clé dont vous voulez connaître le code clé. Par exemple, sur mon terminal, le code clé pour ShiftF1ressemble à:

    ^[[23~

  • Codes clés Vim:

    C'est ainsi que vim représente une clé.

    Vim a besoin d'un moyen cohérent de représenter les clés car les codes de clé du terminal changent d'un terminal à un autre. Une liste des codes clés Vim est accessible à l'adresse :h t_ku. Le code clé Vim pour ShiftF1ressemble à:

    <S-F1>

Ainsi, lorsque j'appuie ShiftF1sur mon clavier, les pilotes et le système d'exploitation indiquent au terminal que j'ai appuyé sur ces touches qu'il interprètera comme ^[[23~. Le terminal enverra cela à Vim qui comprendra que cela signifie <S-F1>et déclenchera l'action mappée à ce code clé.

Nous pouvons définir des codes clés Vim, donc si votre terminal envoie un code clé que Vim ne comprend pas, <S-F1>par exemple, vous pouvez utiliser la commande suivante. Cela indiquera à Vim lorsque vous recevrez le code clé ^[[24~, traduisez-le <S-F1>:

set <S-F1> ^[[24~

Qu'est-ce qu'une séquence de touches mappée?

Une séquence de touches mappée sera un lhs d'un mappage et peut être des codes de clé Vim ou des codes de clé de terminal. Par exemple:

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

Le premier mappage mappera le code clé du terminal tandis que le second mappera le code clé Vim.

Maintenant, pour la différence entre timeoutlenet ttimeoutlen?

  • ttimeoutlenest le temps que Vim attendra pour les différentes parties d'un code clé de terminal (dans notre exemple précédent ce serait ^[alors [alors 2, etc ...

    Étant donné que ces codes clés sont envoyés par le terminal, il ne devrait pas y avoir de délai entre ces entrées (car ils sont envoyés «tout à la fois» par le terminal). C'est pourquoi le doc recommande une très petite valeur pour ce paramètre.

  • timeoutlen est le temps que Vim attendra pour les codes-clés Vim successifs qui sont entrés manuellement par un utilisateur et est donc plus long à saisir qu'un code-clé de terminal.

Pour utiliser un exemple, disons que:

  • Vous avez mappé ^[[1;6Bà une action
  • ^[1;6B est le code clé de votre terminal pour ctrlshiftdown
  • ^[est le code clé de votre terminal pour Escape.

Le comportement auquel vous devez vous attendre:

  • Si vous définissez un grand ttimeoutlen, chaque fois que vous tapez Escape, Vim attendra de voir si vous vouliez dire ^[(ie Escape) ou ^[1;6B(ie ctrlshiftdown)
  • Si vous définissez un petit ttimeoutlen, vous n'aurez pas de délai lorsque vous taperez, Escapecar Vim saura qu'il s'agit d'un code clé complet.

Et timeoutlenagira à un «niveau supérieur», si vous disposez des mappages suivants:

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

Lorsque vous tapez jvim attendra timeoutlennon pas parce que le début du code clé du terminal jn'est pas terminé mais parce qu'il attend le code clé Vim suivant.


J'espère que mon explication a du sens, notez que certains des mappages que j'ai utilisés n'ont pas de sens d'un point de vue fonctionnel mais sont ici pour la commodité de l'explication.

statox
la source