Mapping <C-F>
( Ctrl+letter) est toujours identique à mapping <C-f>
( Ctrl+Shift+letter). Vous ne pouvez pas mapper l'un sans l'autre.
La racine du problème est que Vim lit les caractères du terminal, qui envoie ^F
(code ASCII 0x06
) pour les deux Ctrl+fet Ctrl+Shift+f; Vim n'a aucun moyen de savoir si vous avez appuyé sur la touche Maj. Cet article fournit plus d'informations sur les terminaux et les personnages de contrôle .
En théorie, cela pourrait être fait avec gVim, car la plupart (ou tous?) Les environnements graphiques envoient des événements clés beaucoup plus détaillés. Mais malheureusement, gVim fonctionne un peu comme un émulateur de terminal, et ne peut pas faire la distinction entre <C-f>
et <C-F>
non plus (c'était peut-être une décision de conception pour la compatibilité Vim-gVim).
Solutions possibles:
Vous pouvez configurer votre émulateur de terminal pour envoyer un code différent à Vim lorsque vous appuyez sur Ctrl+Shift+f. Par exemple, pour xterm, vous pouvez faire:
XTerm*VT100.translations: #override \n\
Ctrl ~Meta Shift <Key>f: string(0x1b) string("[24;6~")\n\
Ctrl ~Meta Shift <Key>r: string(0x1b) string("[23;6~")
Cela enverra le code pour <C-S-F12>
et <C-S-F11>
à Vim, que vous pouvez récupérer avec:
nnoremap <C-S-F12> :echo 'ctrl+F pressed!'<CR>
nnoremap <C-S-F11> :echo 'ctrl+R pressed!'<CR>
Notez que vous pouvez mapper Alt+Shift+letter, car le terminal envoie un code différent pour ceux: <Esc>f
( 0x1b0x66
) ou <Esc>F
( 0x1b0x46
).
Pour autant que je puisse trouver, NeoVim n'a pas résolu ce problème, à l'exception de quelques cas tels que Ctrl+Shift+Enteret Ctrl+Shift+Tab, mais il est possible que cette fonctionnalité soit ajoutée à l'avenir.
Martin Tournoij
la source