私はウィンドウを少し速くナビゲートする方法を見つけようとしているので、次のものをマップしたいと思います:
:nmap <silent> <C-F> :wincmd f<CR>
問題は、これが^f
(小文字のf
)マッピングを再マッピングすることで、これはページダウンです。リマップ^F
(大文字F
)のみを行い、その^f
ままにする方法はありますか?
私はウィンドウを少し速くナビゲートする方法を見つけようとしているので、次のものをマップしたいと思います:
:nmap <silent> <C-F> :wincmd f<CR>
問題は、これが^f
(小文字のf
)マッピングを再マッピングすることで、これはページダウンです。リマップ^F
(大文字F
)のみを行い、その^f
ままにする方法はありますか?
回答:
マッピングは、<C-F>
(Ctrl+letter)は常にマッピングと同じである<C-f>
(Ctrl+Shift+letter)を。他方なしでは一方をマップできません。
問題の根本は、Vimが端末から文字を読み取ることです。端末は、との両方に^F
(ASCIIコード0x06
)を送信Ctrl+fしCtrl+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>f
0x1b0x66
<Esc>F
0x1b0x46
NeoVimでは、Ctrl+Shift+Enterやなどのいくつかのケースを除いて、この問題を解決できていませんCtrl+Shift+Tabが、この機能は将来追加される可能性があります。