Ctrl +小文字をCtrl +大文字とは別にマッピングできますか?


16

私はウィンドウを少し速くナビゲートする方法を見つけようとしているので、次のものをマップしたいと思います:

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

問題は、これが^f(小文字のf)マッピングを再マッピングすることで、これはページダウンです。リマップ^F(大文字F)のみを行い、その^fままにする方法はありますか?

回答:


22

マッピングは、<C-F>Ctrl+letter)は常にマッピングと同じである<C-f>Ctrl+Shift+letter)を。他方なしでは一方をマップできません。

問題の根本は、Vimが端末から文字を読み取ることです。端末は、との両方に^F(ASCIIコード0x06)を送信Ctrl+fCtrl+Shift+fます。Vimには、Shiftキーが押されたかどうかを知る方法がありません。この投稿では、端末と制御文字に関する詳細情報を提供します

理論的には、これ gVimで実行できます。これ、ほとんどの(またはすべての)グラフィック環境がより詳細な主要イベントを送信するためです。しかし、残念ながら、gVimはターミナルエミュレータのように動作し<C-f><C-F>どちらも区別できません(これはおそらくVim-gVim互換性の設計上の決定でした)。


可能な解決策:

  • を押しCtrl+Shift+fたときにVimに異なるコードを送信するようにターミナルエミュレータを設定できます。たとえば、xtermの場合:

    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~")
    

    これは、ためのコードが送信されます<C-S-F12>し、<C-S-F11>あなたが拾うことができVimのに:

    nnoremap <C-S-F12> :echo 'ctrl+F pressed!'<CR>
    nnoremap <C-S-F11> :echo 'ctrl+R pressed!'<CR>
    
  • 端末は()または()の異なるコードを送信するため、マッピングできることに注意してください。Alt+Shift+letter<Esc>f0x1b0x66<Esc>F0x1b0x46

  • NeoVimでは、Ctrl+Shift+Enterやなどのいくつかのケースを除いて、この問題を解決できていませんCtrl+Shift+Tabが、この機能は将来追加される可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.