การทำแผนที่<C-F>
( Ctrl+letter) จะเหมือนกับการทำแผนที่<C-f>
( Ctrl+Shift+letter) เสมอ คุณไม่สามารถแมปหนึ่งโดยไม่มีอีก
รากของปัญหาคือ Vim อ่านอักขระจากเทอร์มินัลซึ่งส่ง^F
(รหัส ASCII 0x06
) สำหรับทั้งสองCtrl+fและCtrl+Shift+f; Vim ไม่มีทางรู้ว่าคุณกดปุ่ม Shift หรือไม่ โพสต์นี้จะให้ข้อมูลบางอย่างเพิ่มเติมเกี่ยวกับอาคารและตัวควบคุม
ในทางทฤษฎีสิ่งนี้สามารถทำได้ด้วย gVim เนื่องจากสภาพแวดล้อมกราฟิกส่วนใหญ่ (หรือทั้งหมด) ส่งเหตุการณ์สำคัญที่มีรายละเอียดมากขึ้น แต่น่าเสียดายที่ gVim ทำงานเหมือนเทอร์มินัลอีมูเลเตอร์และไม่สามารถแยกความแตกต่างระหว่าง<C-f>
และ<C-F>
อย่างใดอย่างหนึ่งได้ (นี่อาจเป็นการตัดสินใจออกแบบสำหรับความเข้ากันได้ของ Vim-gVim)
การแก้ปัญหาที่เป็นไปได้:
คุณสามารถกำหนดค่าการจำลอง terminal 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>
ไปยังกลุ่มซึ่งคุณสามารถรับได้ด้วย:
nnoremap <C-S-F12> :echo 'ctrl+F pressed!'<CR>
nnoremap <C-S-F11> :echo 'ctrl+R pressed!'<CR>
โปรดทราบว่าคุณสามารถจับAlt+Shift+letterคู่ได้เนื่องจากเทอร์มินัลส่งรหัสที่แตกต่างกันสำหรับ: <Esc>f
( 0x1b0x66
) หรือ<Esc>F
( 0x1b0x46
)
NeoVim มีเท่าที่ฉันสามารถหาได้ไม่แก้ไขปัญหานี้ยกเว้นในบางกรณีเช่นCtrl+Shift+EnterและCtrl+Shift+Tabแต่เป็นไปได้ว่าคุณลักษณะนี้จะถูกเพิ่มในอนาคต