Mapowanie <C-F>
( Ctrl+letter) jest zawsze takie samo jak mapowanie <C-f>
( Ctrl+Shift+letter). Nie możesz zmapować jednego bez drugiego.
Źródłem problemu jest to, że Vim odczytuje znaki z terminala, który wysyła ^F
(kod ASCII 0x06
) zarówno dla, jak Ctrl+fi Ctrl+Shift+f; Vim nie ma pojęcia, czy nacisnąłeś klawisz Shift. Ten post zawiera więcej informacji na temat terminali i znaków kontrolnych .
Teoretycznie można to zrobić za pomocą gVim, ponieważ większość (lub wszystkie?) Środowiska graficzne wysyłają znacznie bardziej szczegółowe kluczowe zdarzenia. Niestety, gVim działa podobnie jak emulator terminala i nie potrafi rozróżnić pomiędzy nimi <C-f>
a nimi <C-F>
(była to być może decyzja projektowa dotycząca zgodności Vim-gVim).
Możliwe rozwiązania:
Możesz skonfigurować emulator terminala, aby po naciśnięciu przycisku wysyłał do Vima inny kod Ctrl+Shift+f. Na przykład dla Xterm możesz wykonać:
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~")
Spowoduje to wysłanie kodu do <C-S-F12>
i <C-S-F11>
do Vima, który możesz odebrać za pomocą:
nnoremap <C-S-F12> :echo 'ctrl+F pressed!'<CR>
nnoremap <C-S-F11> :echo 'ctrl+R pressed!'<CR>
Pamiętaj, że możesz mapować Alt+Shift+letter, ponieważ terminal wysyła inny kod dla tych: <Esc>f
( 0x1b0x66
) lub <Esc>F
( 0x1b0x46
).
O ile mi wiadomo, NeoVim nie naprawił tego problemu, z wyjątkiem kilku przypadków, takich jak Ctrl+Shift+Enteri Ctrl+Shift+Tab, ale możliwe jest, że ta funkcja zostanie dodana w przyszłości.