Могу ли я отобразить букву Ctrl + в верхнем регистре отдельно от буквы Ctrl + в верхнем регистре?

16

Я пытаюсь выяснить, как перемещаться по окнам немного быстрее, поэтому я хотел бы отобразить следующее:

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

Проблема заключается в том, что это переопределяет отображение ^f(в нижнем регистре f), которое является страницей вниз. Есть ли способ переназначить только ^F(в верхнем регистре F) и оставить ^fкак было?

user1135541
источник

Ответы:

22

Mapping <C-F>( Ctrl+letter) всегда совпадает с mapping <C-f>( Ctrl+Shift+letter). Вы не можете сопоставить одно без другого.

Корень проблемы в том, что Vim читает символы из терминала, который отправляет ^F(код ASCII 0x06) для обоих Ctrl+fи Ctrl+Shift+f; Vim не может узнать, нажали ли вы клавишу Shift. Этот пост содержит дополнительную информацию о терминалах и управляющих персонажах .

Теоретически это можно сделать с помощью gVim, поскольку большинство (или все?) Графических сред посылают более подробные ключевые события. Но, к сожалению, gVim работает так же, как эмулятор терминала, и не может различить <C-f>и <C-F>то и другое (возможно, это было дизайнерское решение для совместимости с Vim-gVim).


Возможные решения:

  • Вы можете настроить эмулятор терминала для отправки другого кода в Vim при нажатии 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>в Vim, который вы можете получить с помощью:

    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, но возможно, что эта функция будет добавлена ​​в будущем.

Мартин Турной
источник