Puis-je mapper une lettre majuscule Ctrl + séparément de la lettre minuscule Ctrl +?

16

J'essaie de comprendre comment naviguer un peu plus rapidement dans Windows, je voudrais donc mapper les éléments suivants:

:nmap <silent> <C-F> :wincmd f<CR>

Le problème est que cela remappe le mappage ^f(en minuscules f), qui se trouve à la page suivante. Existe-t-il un moyen de remapper uniquement ^F(majuscules F) et de laisser le ^ftel quel?

user1135541
la source

Réponses:

22

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