我试图弄清楚如何更快地浏览Windows,所以我想映射以下内容:

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

问题是这会重新映射^f(小写) f)映射,即向下翻页。有什么方法可以只重映射^F(大写F)并保留^f不变吗?

评论

如果使用xterm或iterm以及最近的Vim,则可以。有关更多信息,请参见此答案。

#1 楼

映射<C-F>Ctrl+letter)始终与映射<C-f>Ctrl+Shift+letter)相同。
问题的根源在于Vim从终端读取字符,终端同时为^F0x06发送Ctrl+f(ASCII码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>f0x1b0x66)或<Esc>F0x1b0x46)。


NeoVim据我所知可以找到但没有解决此问题,除了少数情况,例如Ctrl+Shift+EnterCtrl+Shift+Tab,但将来可能会添加此功能。



评论


请注意,Vim的最新版本通过使用ModifyOtherKeys功能将其与最新的实际xterm结合使用。另请参阅:h ModifyOtherKeys和vimhelp.org/vim_faq.txt.html#faq-20.5

–克里斯蒂安·布拉班特(Christian Brabandt)
20-09-23在8:07