Mapping <C-F>
(Ctrl+letter
) is always the same as mapping <C-f>
(Ctrl+Shift+letter
). You can't map one without the other.
The root of the problem is that Vim reads characters from the terminal, which sends ^F
(ASCII code 0x06
) for both Ctrl+f
and Ctrl+Shift+f
; Vim has no way of knowing whether you pressed the Shift key. This site provides some more information about terminals and control characters.
In theory, this could be done with gVim, since most (or all?) graphic environments send much more detailed key events. But unfortunately, gVim operates much like a terminal emulator, and can't distinguish between <C-f>
and <C-F>
either (this was perhaps a design decision for Vim-gVim compatibility).
Possible solutions:
You could configure your terminal emulator to send a different code to Vim when you press Ctrl+Shift+f
. For example, for xterm you could do:
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~")
This will send the code for <C-S-F12>
and <C-S-F11>
to Vim, which you can pick up with:
nnoremap <C-S-F12> :echo 'ctrl+F pressed!'<CR>
nnoremap <C-S-F11> :echo 'ctrl+R pressed!'<CR>
Note that you can map Alt+Shift+letter
, since the terminal sends a different code for those: <Esc>f
(0x1b0x66
) or <Esc>F
(0x1b0x46
).
NeoVim has, as far as I can find, not fixed this problem except for a few cases such as Ctrl+Shift+Enter
and Ctrl+Shift+Tab
, but it's possible that this feature will be added in the future.