Posso mapear uma letra Ctrl + maiúscula separadamente de Ctrl + letra minúscula?

16

Estou tentando descobrir como navegar pelas janelas um pouco mais rápido, então gostaria de mapear o seguinte:

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

O problema é que isso remapeia o mapeamento ^f(em minúsculas f), que é a página para baixo. Existe alguma maneira de remapear apenas ^F(maiúsculas F) e deixar ^fcomo estava?

user1135541
fonte

Respostas:

22

Mapping <C-F>( Ctrl+letter) é sempre o mesmo que mapping <C-f>( Ctrl+Shift+letter). Você não pode mapear um sem o outro.

A raiz do problema é que o Vim lê caracteres do terminal, que envia ^F(código ASCII 0x06) para ambos Ctrl+fe Ctrl+Shift+f; O Vim não tem como saber se você pressionou a tecla Shift. Esta publicação fornece mais informações sobre terminais e caracteres de controle .

Em teoria, isso poderia ser feito com o gVim, já que a maioria (ou todos?) Dos ambientes gráficos envia eventos-chave muito mais detalhados. Mas, infelizmente, gVim funciona muito como um emulador de terminal, e não pode distinguir entre <C-f>e <C-F>quer (este foi talvez uma decisão de projeto para compatibilidade Vim-gVim).


Soluções possíveis:

  • Você pode configurar o emulador de terminal para enviar um código diferente ao Vim quando pressionar Ctrl+Shift+f. Por exemplo, para xterm, você poderia fazer:

    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~")
    

    Isso enviará o código para <C-S-F12>e <C-S-F11>para o Vim, que você poderá obter:

    nnoremap <C-S-F12> :echo 'ctrl+F pressed!'<CR>
    nnoremap <C-S-F11> :echo 'ctrl+R pressed!'<CR>
    
  • Observe que você pode mapear Alt+Shift+letter, pois o terminal envia um código diferente para aqueles: <Esc>f( 0x1b0x66) ou <Esc>F( 0x1b0x46).

  • Até onde eu sei, o NeoVim não corrigiu esse problema, exceto em alguns casos como Ctrl+Shift+Entere Ctrl+Shift+Tab, mas é possível que esse recurso seja adicionado no futuro.

Martin Tournoij
fonte