Ánh xạ <C-F>
( Ctrl+letter) luôn giống như ánh xạ <C-f>
( Ctrl+Shift+letter). Bạn không thể ánh xạ cái này mà không có cái kia.
Nguyên nhân của vấn đề là Vim đọc các ký tự từ thiết bị đầu cuối, nó sẽ gửi ^F
(mã ASCII 0x06
) cho cả hai Ctrl+fvà Ctrl+Shift+f; Vim không có cách nào để biết liệu bạn có nhấn phím Shift hay không. Bài đăng này cung cấp thêm một số thông tin về thiết bị đầu cuối và nhân vật điều khiển .
Về lý thuyết, điều này có thể được thực hiện với gVim, vì hầu hết (hoặc tất cả?) Môi trường đồ họa gửi các sự kiện quan trọng chi tiết hơn nhiều. Nhưng thật không may, gVim hoạt động giống như một trình giả lập thiết bị đầu cuối và không thể phân biệt giữa <C-f>
và <C-F>
(đây có lẽ là một quyết định thiết kế cho khả năng tương thích Vim-gVim).
Phương pháp khả thi:
Bạn có thể định cấu hình trình giả lập thiết bị đầu cuối của mình để gửi một mã khác đến Vim khi bạn nhấn Ctrl+Shift+f. Ví dụ: đối với xterm bạn có thể làm:
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~")
Điều này sẽ gửi mã cho <C-S-F12>
và <C-S-F11>
đến Vim, mà bạn có thể nhận:
nnoremap <C-S-F12> :echo 'ctrl+F pressed!'<CR>
nnoremap <C-S-F11> :echo 'ctrl+R pressed!'<CR>
Lưu ý rằng bạn có thể ánh xạ Alt+Shift+letter, vì thiết bị đầu cuối gửi một mã khác cho những người đó: <Esc>f
( 0x1b0x66
) hoặc <Esc>F
( 0x1b0x46
).
NeoVim đã, như xa như tôi có thể tìm thấy, chứ không phải cố định vấn đề này ngoại trừ một vài trường hợp như Ctrl+Shift+Entervà Ctrl+Shift+Tab, nhưng nó có thể rằng tính năng này sẽ được bổ sung trong thời gian tới.