Ctrl + A ve Ctrl + Shift + A'yı farklı şekilde nasıl eşleyebilirim?


92

Bir terminalde, Ctrl+ Ave Ctrl+ Shift+ Aaynı anahtar kodunu yaydıkları için ayırt edilemez , böylece Vim'in bunu neden yapamadığını anlayabilirim. Ancak bir X uygulaması olan gVim, Ctrl+ Ave Ctrl+ Shift+ ' yı ayırt edebilir A. Bu iki şeyi farklı şekilde haritalamanın bir yolu var mı?

Yeni başlayanlar için, aşağıdakine benzer bir şey yapmak istiyorum: "panodan yapıştır" ın Gnome terminali gibi çalışmasını ve Ctrl+ Vgörsel modda kalmasını sağlayın .

:nmap <C-S-V> "+gP


3
@vivoconunxino Bu bağlantı, ctrl-a'ya bir shift değiştirici eklemekten bahsetmiyor.
graywh

Yanıtlar:


47

Gvim bunu yapmaz çünkü vim yapamaz (normal şartlar altında). Üzgünüm, ama öyle.


Ancak...

Bazı terminaller (örneğin, xterm ve iterm2) herhangi bir tuş kombinasyonu için rastgele bir kaçış dizisi gönderecek şekilde yapılandırılabilir.

Örneğin, .Xresourcesxterm'in gönderilmesi <Esc>[65;5uiçin aşağıdakini ekleyin CtrlShiftA. Daha sonra bunu Vim ile eşleyebilirsiniz <C-S-a>. (65, shift-a için ondalık Unicode değeridir ve 5, ctrl değiştiricisinin bitidir. Bu durumda u "unicode" anlamına gelir.)

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

iTerm ve [u] rxvt de bunu yapacak şekilde yapılandırılabilir (örnekler verilmemiştir).

Daha fazla bilgi: http://www.leonerd.org.uk/hacks/fixterms/


Birden çok anahtarı yeniden eşleştirmek için şu belgeye bakın : Anahtar girişlerini ile ayırın \n. Satırları ayırmak için ters eğik çizgi kullanın. Örneğin <kbd> CSB </kbd> ve <kbd> CSF </kbd> ' 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")
yi de eşlemek için şunu

Bütünlük uğruna, cevaba, bunun vi'de nasıl haritalanacağını da ekleyebilir misiniz? Örneğin map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>, durum satırında bir mesaj yazdırmak için ctrl-shift-b'yi eşlemek için. AskUbuntu'da benzer bir soru vardı ve bunu özetledim .
cfi

İhtiyacımız olan şey yeni bir terminal spesifikasyonu! xterm-256color(en yenisi) çok fazla sınırlamadan muzdarip.
Jérôme Pouiller

@Jezz Sınırlamalar termcap'in kendisiyle ilgilidir, termcap dosyası için değil xterm-256color.
graywh

@graywh Elbette, termcap için yeni özellikler gerekli olacak
Jérôme Pouiller

9

Daha önce de belirtildiği gibi, bundan <C-S-A>farklı haritalamanın hiçbir yolu yok <C-A>.

Bununla birlikte, autokey(Linux ve pencereler için) veya autohotkey( Windows için) gibi araçları kullanarak <C-S-A>, belirli uygulamalar için farklı bir tuş vuruşları göndermek için yeniden eşleştirebilirsiniz .

Örneğin, sistemimde şu ayar var 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.

Ona şu özellikleri atayın:

  1. klavye kısayolu olarak ctrl+shift+a
  2. pencere sınıfı: gnome-terminal-server.Gnome-terminal

Daha sonra istediğinizi yapmak ~/.vimrciçin haritalama oluşturabilirsiniz <S-F1>a.


Notlar:

  1. Ben kullandım <S-F1>tespit etmek için lider anahtarının tür olarak <C-S>. Bunun nedeni, terminalimin <F13>- <F37>vb. Anahtarları kabul etmemesiydi . Uygulamanız destekliyorsa, ( gvimsanıyorum) bu tuşları kullanmanız önerilir.
  2. Ben esas vimolarak içerim gnome-terminal. Bu yüzden window class = gnome-terminal-server.Gnome-terminalfiltre olarak kullandım . gvimİsterseniz kullanmak için değiştirin . autokeysınıf / başlık gibi diğer pencerelerin özelliklerini yakalamak için bir düğmeyi destekler.

Çok teşekkürler. Autokey'i anahtar yeniden eşleme için kullanma hakkında birçok şey var, ancak bunun nasıl yapılacağına dair gerçek talimat yok. Sonunda cevabınız bunu yapıyor. Kimsenin sana oy vermediğine inanamıyorum.
pickle323

1
Allah kahretsin otomatik anahtar! Yapabileceğim her şeyi yaptım ama 16.04 ubuntu'ma yükleyemedim.
yukashima huksay

apt install autokey-gtk?
anishsane

1
Ekstra yazılım yüklemeden önce, pencere yöneticinizin bunu doğrudan ele alıp almadığını kontrol edebilirsiniz. Örneğin, i3 benim .config'dir bu vardır: bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m hhangi presler ,wmhben bastığınızda <C-S-h>ve ardından vim ele bilir,wmh
MatrixManAtYrService

^^ Bu da iyi. Ancak, anahtar çevirisini yalnızca gnome-terminal veya gvim ile sınırlamak istedim. Diğer uygulamalar değil. Buna bastığımda diğer uygulamalar almaya devam etmeli <C-S-H>.
anishsane

5

Sizi rahatsız eden şey mevcut CV işlevselliğini kaybediyorsanız, bunun yerine CQ kullanabilirsiniz. Bakınız: yardım CTRL-V-alternatif.


3

NeoVim artık bu işlevselliği hem terminal hem de GUI istemcileri için sunuyor. Bakınız : h nvim-features-new


3
Terminalinizde CSI kodlarını etkinleştirmediğiniz sürece tam olarak değil. CTRL-SHIFT Neovim olduğunu varyantları gelmez olmayan basılabilir karakterler (listelenen örnekler çoğunlukla kutunun dışında desteklemek neovim.org/doc/user/vim_diff.html#nvim-features-new ). Ancak, meta (dahil akor <m-s-...>varyantları) do çoğunlukla kutunun dışında tamamen çalışır.
Justin

Bu belge 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., "Büyük / küçük harf duyarlı:" bölümünden önce bir satır sonu olduğunu söylüyor ve bu da bunu belirsiz hale getiriyor. Düzeltme için teşekkürler, @ JustinM.Keyes. Ayrıca, vim 8.1 arasında <M-a>ve <M-A>aynı zamanda ayrım yapıyor görünmektedir .
Adam Katz

@ Justin -m-Keyes <c-s-l>mükemmel ayırt edilir <c-l>içinde Konsoleherhangi bir ek bir zorluk olmadan
Slava

3

Klavye girişinin dahili olarak ele alınma şekli nedeniyle, bu maalesef günümüzde GVIM'de bile genellikle mümkün değildir. Ctrl+ Alfabetik olmayan gibi bazı tuş kombinasyonları eşleştirilemez ve Ctrl+ harf ile Ctrl+ Shift+ harf ayırt edilemez. (Terminaliniz bunun için farklı bir termcap kodu göndermediği sürece , ki çoğu bunu yapmaz.) Ekleme veya komut satırı modunda, tuş kombinasyonunu yazmayı deneyin. Hiçbir şey olmazsa / takılmazsa, bu tuş kombinasyonunu kullanamazsınız. Bu aynı zamanda<Tab> / <C-I>, <CR>/ <C-M>/ <Esc>/ <C-[>vb. İçin (Tek istisna <BS>/ dir <C-H>.) Bu bilinen bir sorun noktasıdır ve vim_dev ve #vim IRC kanalı ile ilgili çeşitli tartışmaların konusudur.

Bazı insanlar (başta Paul LeoNerd Evans) bunu düzeltmek istiyor (bunu destekleyen terminallerdeki konsol Vim için bile) ve çeşitli öneriler sundular, cp. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

Ancak bugün itibariyle, hiçbir yama veya gönüllü henüz ortaya çıkmadı, ancak birçoğu bunu gelecekteki bir Vim sürümünde yapma arzusunu dile getirdi.


1

Belirttiğiniz gibi, aynı anahtar kodunu alırsınız. Dolayısıyla, bunları ayırt etmenin tek yolu Shift, olay işleme işlevinizdeki anahtarın durumunu kontrol etmektir . Elbette, tuşa basma ve işleme arasında 0,5 saniyeden fazla gecikme yaşarsanız, bazı isabetleri kaçıracaksınız.


1
Sanırım sorumun amacı, gvim'in böyle bir ayrım yapabildiği düşünüldüğünde (düz vim yapamasa da), Ctrl + Shift + V ile Ctrl + V'yi ayırt etmek için güvenebileceğim herhangi bir gvim'e özgü uzantı var mıdır. .
Kohsuke Kawaguchi

9
Shit anahtarının durumu nasıl kontrol edilir? Aradım, ancak uzaktan bile yararlı bir şey bulamadım.
bolov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.