Dapatkah saya memetakan huruf besar Ctrl + huruf besar secara terpisah dari huruf Ctrl + huruf kecil?

16

Saya mencoba mencari cara menavigasi windows sedikit lebih cepat, jadi saya ingin memetakan berikut ini:

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

Masalahnya adalah ini memetakan kembali pemetaan ^f(huruf kecil f), yang merupakan halaman ke bawah. Apakah ada cara untuk memetakan kembali ^F(huruf besar F) dan membiarkannya ^fseperti semula?

pengguna1135541
sumber

Jawaban:

22

Pemetaan <C-F>( Ctrl+letter) selalu sama dengan pemetaan <C-f>( Ctrl+Shift+letter). Anda tidak dapat memetakan satu tanpa yang lainnya.

Akar masalahnya adalah bahwa Vim membaca karakter dari terminal, yang mengirim ^F(kode ASCII 0x06) untuk keduanya Ctrl+fdan Ctrl+Shift+f; Vim tidak memiliki cara untuk mengetahui apakah Anda menekan tombol Shift. Posting ini memberikan beberapa informasi lebih lanjut tentang terminal & karakter kontrol .

Secara teori, ini bisa dilakukan dengan gVim, karena sebagian besar (atau semua?) Lingkungan grafis mengirimkan peristiwa kunci yang jauh lebih rinci. Namun sayangnya, gvim beroperasi seperti emulator terminal, dan tidak dapat membedakan antara <C-f>dan <C-F>baik (ini mungkin keputusan desain untuk kompatibilitas Vim-gvim).


Solusi yang memungkinkan:

  • Anda dapat mengkonfigurasi emulator terminal Anda untuk mengirim kode berbeda ke Vim ketika Anda menekan Ctrl+Shift+f. Misalnya, untuk xterm yang dapat Anda lakukan:

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

    Ini akan mengirim kode untuk <C-S-F12>dan <C-S-F11>ke Vim, yang dapat Anda ambil dengan:

    nnoremap <C-S-F12> :echo 'ctrl+F pressed!'<CR>
    nnoremap <C-S-F11> :echo 'ctrl+R pressed!'<CR>
    
  • Perhatikan bahwa Anda dapat memetakan Alt+Shift+letter, karena terminal mengirimkan kode yang berbeda untuk itu: <Esc>f( 0x1b0x66) atau <Esc>F( 0x1b0x46).

  • NeoVim sejauh ini dapat menemukan saya, tidak memperbaiki masalah ini kecuali untuk beberapa kasus seperti Ctrl+Shift+Enterdan Ctrl+Shift+Tab, tetapi ada kemungkinan bahwa fitur ini akan ditambahkan di masa depan.

Martin Tournoij
sumber