Pourquoi la carte en mode d'insertion "<F4>" insère-t-elle de manière imprévisible ou exécute-t-elle des frappes de touches voulues?

Dans Vim 7.3.1-762, mintty 1.1.2 (xterm), cygwin, Windows XP, la carte en mode d'insertion <F4> exécute les traits de touche voulus en même time, mais s'insère à un autre moment. Ce comportement indéterministe se produit surtout si je maintiens la touche <F4> enfoncée.

Comment rendre le comportement prévisible sur plusieurs versions de Vim, de terminal et de operating system?

C'est le code que j'ai défini dans mon file ~/.vimrc , qui me semble pertinent:

 set compatible set timeout set ttimeout set timeoutlen=1000 set ttimeoutlen=100 imap <F4> <C-\><CO>:set relativenumber! relativenumber?<CR> 

Si j'affecte le mappage à une touche de fonction au-dessus de <F4> , par exemple <F5> , <S-F7> etc., je ne rencontre pas le comportement mentionné ci-dessus. Aussi, si je désactive l'option timeout avec set notimeout cela semble faire l'affaire.

J'ai fait fonctionner la touche <F4> apparemment dans tous les modes en utilisant les map <expr> expression map <expr> comme suit:

 MapOptToggle <F4> relativenumber MapOptToggle! <S-F4> number command! -bang -nargs=+ MapOptToggle call <SID>MapOptToggle(<bang>0, <f-args>) function! s:MapOptToggle(bang, key, opt) function! s:ToggleOpt(opt) if mode() =~# '\vno?' || !&showmode exec 'set ' . a:opt . '! ' . a:opt . '?' else exec 'set ' . a:opt . '!' endif redraw return '' endfunction let a='noremap' let b='<unique> <silent> <expr> ' . a:key . ' <SID>ToggleOpt(' . ssortingng(a:opt) . ')' exec a . ' ' . b exec a . '! ' . b exec 'set ' . (a:bang ? 'no' : '') . a:opt endfunction 

Mais encore ma réponse n'explique pas le comportement imprévisible de la carte imap insert-mode.

Ce commentaire

 especially occurs if I hold the <F4> key depressed. 

indique que le problème est dû à la répétition de la touche (augmentation de la vitesse de répétition lorsque vous maintenez la touche enfoncée) interférant avec le timeout d'attente utilisé pour déterminer si un caractère d'échappement est le début d'une touche de fonction ou le caractère spécial vi. Quand vi (ou vim) reçoit trop de caractères trop vite, il voit le début d'une touche de fonction comme échappement et (par exemple) interrompt l'insertion en cours.

Certains programmes (tels que xterm) enverront PF1-PF4 de style vt100 pour F1 à F4 . L' échappement résultant O S est une command vi qui vous met en mode insertion, ce qui lui permet d'insert des parties des séquences d'échappement qu'il lit.

Pour en savoir plus:

  • Touches de fonction de style VT220 (séquences de command XTerm)