ฉันสามารถแมป Ctrl + ตัวอักษรตัวพิมพ์ใหญ่แยกต่างหากจาก Ctrl + ตัวพิมพ์เล็กหรือไม่


16

ฉันกำลังพยายามหาวิธีนำทางหน้าต่างได้เร็วขึ้นเล็กน้อยดังนั้นฉันจึงต้องการแมปต่อไปนี้:

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

ปัญหาคือสิ่งนี้แมป^f(ตัวพิมพ์เล็กf) ซึ่งแมปลง มีวิธีใดที่จะทำการแมปใหม่อีกครั้ง^F(ตัวพิมพ์ใหญ่F) และปล่อยให้^fเหมือนเดิมหรือไม่

คำตอบ:


22

การทำแผนที่<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แต่เป็นไปได้ว่าคุณลักษณะนี้จะถูกเพิ่มในอนาคต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.