Di terminal, seseorang tidak dapat membedakan Ctrl+ Adan Ctrl+ Shift+ Akarena keduanya memancarkan kode kunci yang sama, jadi saya dapat melihat mengapa Vim tidak dapat melakukannya. Tetapi gVim, sebagai aplikasi X, dapat membedakan Ctrl+ AdanCtrl + Shift+ A. Adakah cara untuk memetakan kedua hal itu secara berbeda?
Sebagai permulaan, saya ingin melakukan sesuatu seperti berikut: Jadikan "tempel dari papan klip" berfungsi seperti terminal Gnome, sambil mempertahankan Ctrl+ Vke mode visual.
:nmap <C-S-V> "+gP
vim
key-bindings
Kohsuke Kawaguchi
sumber
sumber
Jawaban:
Gvim tidak melakukannya karena vim tidak dapat melakukannya (dalam keadaan normal). Maaf, tapi begitulah adanya.
Namun...
Beberapa terminal (misalnya, xterm dan iterm2) dapat dikonfigurasi untuk mengirim urutan escape sembarang untuk kombinasi kunci apa pun.
Misalnya, tambahkan berikut untuk
.Xresources
untuk xterm untuk mengirim<Esc>[65;5u
untuk CtrlShiftA. Anda kemudian dapat memetakannya di Vim ke<C-S-a>
. (65 adalah nilai Unicode desimal untuk shift-a dan 5 adalah bit untuk pengubah ctrl. U dalam hal ini adalah singkatan dari "unicode".)iTerm dan [u] rxvt juga dapat dikonfigurasi untuk melakukan ini (contoh tidak tersedia).
Info lebih lanjut: http://www.leonerd.org.uk/hacks/fixterms/
sumber
\n
. Gunakan garis miring terbalik untuk memisahkan garis. Misalnya untuk juga memetakan <kbd> CSB </kbd> dan <kbd> CSF </kbd> gunakan ini:XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u") \n Ctrl ~Meta Shift <Key>b: string(0x1b) string("[66;5u") \n Ctrl ~Meta Shift <Key>f: string(0x1b) string("[70;5u")
map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>
untuk memetakan ctrl-shift-b untuk mencetak pesan di baris status. Di AskUbuntu ada Q yang serupa dan saya telah merangkumnya .xterm-256color
(yang terbaru) menderita begitu banyak keterbatasan.xterm-256color
.Seperti yang telah ditunjukkan, tidak ada cara untuk memetakan secara
<C-S-A>
berbeda dari<C-A>
.Namun, dengan menggunakan alat seperti
autokey
(untuk linux & windows) atauautohotkey
(untuk windows), Anda dapat memetakan ulang<C-S-A>
untuk mengirim penekanan tombol yang berbeda untuk aplikasi tertentu.mis. Di sistem saya, saya memiliki pengaturan ini di
autokey
:Tetapkan properti ini:
ctrl+shift+a
gnome-terminal-server.Gnome-terminal
Kemudian Anda
~/.vimrc
dapat membuat pemetaan untuk<S-F1>a
melakukan apa pun yang Anda inginkan.Catatan:
<S-F1>
sebagai semacam kunci pemimpin untuk mendeteksi<C-S>
. Ini karena terminal saya tidak menerima<F13>
-<F37>
kunci dll. Jika aplikasi Anda mendukungnya, (gvim
menurut saya) menggunakan tombol tersebut disarankan.vim
dalamgnome-terminal
. Jadi saya gunakanwindow class = gnome-terminal-server.Gnome-terminal
sebagai filter. Ubah untuk digunakangvim
jika Anda mau.autokey
mendukung tombol untuk menangkap properti jendela lain seperti kelas / judul.sumber
apt install autokey-gtk
?bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h
,wmh
<C-S-h>
,wmh
<C-S-H>
ketika saya menekannya.Jika yang mengganggu Anda adalah kehilangan fungsionalitas CV yang ada, Anda dapat menggunakan CQ sebagai gantinya. Lihat,: bantuan CTRL-V-alternatif.
sumber
NeoVim sekarang menawarkan fungsionalitas ini untuk klien terminal dan gui-nya. Lihat : h nvim-features-new
sumber
<m-s-...>
varian) yang sebagian besar bekerja benar-benar keluar dari kotak.ALT (|META|) chords always work (even in the |TUI|). Map |<M-| with any key: <M-1>, <M-BS>, <M-Del>, <M-Ins>, <M-/>, <M-\>, <M-Space>, <M-Enter>, etc. Case-sensitive: <M-a> and <M-A> are two different keycodes.
Ada baris baru sebelum bagian "Peka huruf besar / kecil:", membuat ini menjadi ambigu. Terima kasih atas koreksinya, @ JustinM.Keyes. Selain itu, vim 8.1 tampaknya membedakan antara<M-a>
dan<M-A>
juga.<c-s-l>
sangat sempurna dibedakan dari<c-l>
dalamKonsole
tanpa kerumitan ekstraKarena cara input keyboard ditangani secara internal, sayangnya hal ini tidak dapat dilakukan saat ini, bahkan di GVIM. Beberapa kombinasi tombol, seperti Ctrl+ non-alfabet tidak dapat dipetakan, dan Ctrl+ huruf vs. Ctrl+ Shift+ huruf tidak dapat dibedakan. (Kecuali terminal Anda mengirimkan kode termcap berbeda untuk itu, yang kebanyakan tidak.) Dalam mode sisipkan atau baris perintah, coba ketikkan kombinasi tombol. Jika tidak ada yang terjadi / dimasukkan, Anda tidak dapat menggunakan kombinasi tombol itu. Ini juga berlaku untuk
<Tab>
/<C-I>
,<CR>
/<C-M>
/<Esc>
/<C-[>
dll. (Kecuali hanya<BS>
/<C-H>
.) Ini adalah masalah yang diketahui, dan menjadi subjek berbagai diskusi di vim_dev dan saluran IRC #vim.Beberapa orang (terutama Paul LeoNerd Evans) ingin memperbaikinya (bahkan untuk konsol Vim di terminal yang mendukung ini), dan telah mengajukan berbagai proposal, cp. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8
Namun hingga hari ini, belum ada patch atau relawan yang muncul, meskipun banyak yang telah menyatakan keinginan untuk memilikinya di rilis Vim mendatang.
sumber
Seperti yang Anda catat, Anda mendapatkan kode kunci yang sama. Jadi satu-satunya cara untuk membedakannya adalah dengan memeriksa status Shiftkunci dalam fungsi penanganan acara Anda. Tentu saja, jika Anda memiliki jeda lebih dari 0,5 detik antara penekanan tombol dan pemrosesan, Anda akan melewatkan beberapa klik.
sumber