我可以分别映射Ctrl +大写字母和Ctrl +小写字母吗?


16

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

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

问题在于这会重新映射^f(小写f)映射,即向下翻页。有什么方法可以只重映射^F(大写F)并保持^f原样?

Answers:


22

映射<C-F>Ctrl+letter)始终与映射<C-f>Ctrl+Shift+letter)相同。没有另一个,您就无法映射。

问题的根源是Vim从终端读取字符,该终端为和发送^F(ASCII码0x06)。Vim无法知道您是否按了Shift键。这篇文章提供了有关终端和控制字符的更多信息Ctrl+fCtrl+Shift+f

从理论上讲,这可以使用gVim来完成,因为大多数(或所有?)图形环境都会发送更为详细的关键事件。但不幸的是,gVim的工作就像一个终端模拟器,并且不能区分<C-f>,并<C-F>任(这也许是对的Vim-gVim的兼容性设计决定)。


可能的解决方案:

  • 您可以将终端仿真器配置为在按时向Vim发送不同的代码Ctrl+Shift+f。例如,对于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,但它可能是这个功能将在未来增加。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.