Posso mappare una lettera Ctrl + maiuscole separatamente da Ctrl + lettera minuscola?


16

Sto cercando di capire come navigare in Windows un po 'più veloce, quindi vorrei mappare quanto segue:

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

Il problema è che questo rimappa la mappatura ^f(minuscola f), che è in fondo alla pagina. Esiste un modo per rimappare solo ^F(maiuscolo F) e lasciare ^fcosì com'era?

Risposte:


22

Mapping <C-F>( Ctrl+letter) è sempre lo stesso di mapping <C-f>( Ctrl+Shift+letter). Non puoi mappare l'uno senza l'altro.

La radice del problema è che Vim legge i caratteri dal terminale, che invia ^F(codice ASCII 0x06) per entrambi Ctrl+fe Ctrl+Shift+f; Vim non ha modo di sapere se hai premuto il tasto Maiusc. Questo post fornisce ulteriori informazioni su terminali e caratteri di controllo .

In teoria, ciò potrebbe essere fatto con gVim, poiché la maggior parte (o tutti?) Gli ambienti grafici inviano eventi chiave molto più dettagliati. Ma, purtroppo, gVim funziona tanto come un emulatore di terminale, e non può distinguere tra <C-f>e <C-F>sia (questa è stata forse una decisione di progettazione per la compatibilità Vim-gVim).


Possibili soluzioni:

  • È possibile configurare l'emulatore di terminale per inviare un codice diverso a Vim quando si preme Ctrl+Shift+f. Ad esempio, per xterm potresti fare:

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

    Questo invierà il codice per <C-S-F12>e <C-S-F11>a Vim, che puoi ritirare con:

    nnoremap <C-S-F12> :echo 'ctrl+F pressed!'<CR>
    nnoremap <C-S-F11> :echo 'ctrl+R pressed!'<CR>
    
  • Nota che puoi mappare Alt+Shift+letter, poiché il terminale invia un codice diverso per quelli: <Esc>f( 0x1b0x66) o <Esc>F( 0x1b0x46).

  • NeoVim, per quanto posso trovare, non ha risolto questo problema, tranne per alcuni casi come Ctrl+Shift+Entere Ctrl+Shift+Tab, ma è possibile che questa funzione verrà aggiunta in futuro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.