Bagaimana cara memetakan Ctrl + A dan Ctrl + Shift + A secara berbeda?

92

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
Kohsuke Kawaguchi
sumber
3
@vivoconunxino Tautan tersebut tidak menyebutkan tentang penambahan pengubah shift ke ctrl-a.
graywh

Jawaban:

47

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 .Xresourcesuntuk xterm untuk mengirim <Esc>[65;5uuntuk 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".)

! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")

iTerm dan [u] rxvt juga dapat dikonfigurasi untuk melakukan ini (contoh tidak tersedia).

Info lebih lanjut: http://www.leonerd.org.uk/hacks/fixterms/

greywh
sumber
Untuk memetakan ulang beberapa kunci, lihat dokumen ini : Pisahkan entri kunci dengan \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")
cfi
Demi kelengkapan, mungkin bisa menambah jawabannya juga bagaimana memetakannya di vi? Misalnya 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 .
cfi
Yang kami butuhkan adalah spesifikasi terminal baru! xterm-256color(yang terbaru) menderita begitu banyak keterbatasan.
Jérôme Pouiller
@Jezz Batasannya ada pada termcap itu sendiri, bukan pada file termcap xterm-256color.
graywh
@graywh Tentu, fitur baru untuk termcap akan diperlukan
Jérôme Pouiller
9

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) atau autohotkey(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:

$ cat ~/.config/autokey/data/gnome-terminal/ctrlshifta-gnome-terminal.py
#ctrl+shift+a sends '<S-F1>a'
keyboard.send_keys("<shift>+<f1>a") # Note that `f` in `f1` needs to be in lower case.

Tetapkan properti ini:

  1. pintasan keyboard sebagai ctrl+shift+a
  2. kelas jendela: gnome-terminal-server.Gnome-terminal

Kemudian Anda ~/.vimrcdapat membuat pemetaan untuk <S-F1>amelakukan apa pun yang Anda inginkan.


Catatan:

  1. Saya telah digunakan <S-F1>sebagai semacam kunci pemimpin untuk mendeteksi <C-S>. Ini karena terminal saya tidak menerima <F13>- <F37>kunci dll. Jika aplikasi Anda mendukungnya, ( gvimmenurut saya) menggunakan tombol tersebut disarankan.
  2. Saya terutama vimdalam gnome-terminal. Jadi saya gunakan window class = gnome-terminal-server.Gnome-terminalsebagai filter. Ubah untuk digunakan gvimjika Anda mau. autokeymendukung tombol untuk menangkap properti jendela lain seperti kelas / judul.
anishsane
sumber
Terima kasih banyak. Ada banyak hal di luar sana tentang menggunakan Autokey untuk pemetaan ulang kunci tetapi tidak ada instruksi aktual tentang cara melakukannya. Akhirnya jawaban Anda berhasil. Saya tidak percaya tidak ada orang lain yang memuji Anda.
acar323
1
Sialan autokey! Saya melakukan semua yang saya bisa tetapi saya tidak bisa menginstalnya di ubuntu 16.04 saya.
yukashima huksay
apt install autokey-gtk?
anishsane
1
Sebelum menginstal perangkat lunak tambahan, Anda dapat memeriksa apakah pengelola jendela Anda menangani ini secara langsung. Misalnya, di i3 .config saya memiliki ini bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h,wmh<C-S-h>,wmh
:,
^^ Ini bagus juga. Namun, saya ingin membatasi terjemahan kunci hanya ke gnome-terminal atau gvim. Bukan aplikasi lain. Aplikasi lain harus terus menerima <C-S-H>ketika saya menekannya.
anishsane
5

Jika yang mengganggu Anda adalah kehilangan fungsionalitas CV yang ada, Anda dapat menggunakan CQ sebagai gantinya. Lihat,: bantuan CTRL-V-alternatif.

Anurag Priyam
sumber
3

NeoVim sekarang menawarkan fungsionalitas ini untuk klien terminal dan gui-nya. Lihat : h nvim-features-new

OliverUv
sumber
3
Kurang tepat, kecuali Anda mengaktifkan kode CSI di terminal Anda. CTRL-SHIFT varian yang Neovim tidak mendukung keluar dari kotak sebagian besar karakter non-printable (contoh yang tercantum di neovim.org/doc/user/vim_diff.html#nvim-features-new ). Namun, meta akord (termasuk <m-s-...>varian) yang sebagian besar bekerja benar-benar keluar dari kotak.
Justin M. Keyes
Dokumen tersebut mengatakan 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.
Adam Katz
@ justin-m-keyes <c-s-l>sangat sempurna dibedakan dari <c-l>dalam Konsoletanpa kerumitan ekstra
Slava
3

Karena 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.

Ingo Karkat
sumber
1

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.

Javier
sumber
1
Saya kira poin dari pertanyaan saya adalah bahwa mengingat gvim mampu membuat perbedaan seperti itu (meskipun vim biasa tidak bisa), apakah ada ekstensi khusus gvim yang dapat saya andalkan untuk membedakan Ctrl + Shift + V vs Ctrl + V .
Kohsuke Kawaguchi
9
bagaimana cara memeriksa status kunci Sial? Saya mencari, tetapi tidak menemukan sesuatu yang berguna.
bolov