Eşlemeniz yapması gerekeni yapmıyor veya beklenenden farklı davranıyorsa, sorunu gidermek için izlenmesi gereken birkaç adım vardır:
Anahtarın ne yapması gerektiği ile etkili bir şekilde eşleştirildiğini kontrol edin
Vim bir komut sağlar :map
. Varsayılan olarak (hiçbir argüman verilmediğinde) komut, o anda oluşturulan tüm eşlemeleri gösterecektir. İşte komutun sonucuna bir örnek:
Her zamanki gibi doktor senin arkadaşın: :h map-listing
İlk sütunda eşleme modunu görebilirsiniz ( n
normal mod
v
için, görsel mod için, vb.), İkinci sütun eşlenen tuşları ve neyin eşlendiği son sütunu gösterir. Eşlenen işlemlerden önce bazı ek karakterlerin görünebileceğini unutmayın, bunları anlamanız önemlidir:
*
yeniden gönderilemez olduğunu gösterir (yani özyinelemeli bir haritalama değildir know when to use nore
, bu cevabın ilerleyen bölümlerine bakınız )
&
yalnızca komut dosyası yerel eşlemelerinin yeniden gönderilebileceğini gösterir
@
bir tampon yerel eşlemesini gösterir
Bir haritalama hakkında yardım isterken, bu bilgileri eklemek iyi bir şeydir, çünkü başkalarının haritalama davranışınızı anlamalarına yardımcı olabilir.
Kardeş-komutları ile belirli moduna istemini kısıtlamak mümkündür :map
gibi :vmap
, :nmap
, :omap
vb
Artık aramanızı sorunlu haritalama ile sınırlandırmak için, hata ayıkladığınız anahtar sırasını komutların parametresi olarak aktarabilirsiniz:
:map j
:map <Leader>m
:map <F5>
<Leader>
Anahtarın listedeki gerçek değeriyle değiştirileceğini unutmayın .
Komutun sonucu, anahtarlarınızın doğru şekilde eşlendiğini gösteriyorsa, bu muhtemelen sorunun Vim'den değil, terminalinizden veya masaüstü ortamınızdan geldiği anlamına gelir. Eşlemenize gerçekten Vim tarafından müdahale edilip edilmediğini kontrol etme bölümüne bakın
Komutun sonucu, anahtarlarınızın doğru şekilde eşleştirilmediğini gösteriyorsa, aşağıdaki bölüme bakın.
Haritanızdakileri neyin abarttığını kontrol edin
:map
Komutun bir başka uygun kullanımı da onu kombine etmektir verbose
: Bu, eşlemenizi değiştiren son dosyayı ister.
Örneğin, sonuçları olan bu iki ekran görüntüsüne bakın :verbose map
: birincisi benim tarafından değiştirilen bir haritalama .vimrc
ve ikincisi bir eklenti tarafından oluşturulan bir haritalama:
Şimdi başka bir komut dosyasının eşlemenizi değiştirdiğini görürseniz, onu kaldırabilir veya davranışını değiştirip değiştiremeyeceğinizi görmeniz gerekir. (Bazı eklentilerin haritalarını etkinleştirmek / devre dışı bırakmak için değişken sağladığını unutmayın, ne yazık ki bütün eklentiler bunu yapmaz)
Eşlemenizi değiştiren son dosya sizin ise .vimrc
, aynı anahtar için bir eşleme tanımlayan başka bir satır olmadığından emin olun. .vimrc
Dosya mutlu dosyada türünün sonuncusu ile herhangi eşleştirmeleri geçersiz kılar.
Haritanızın gerçekten Vim tarafından yakalanıp yakalanmadığını kontrol edin
Bazı durumlar Vim'in anahtarınızı engellemediğini gösterebilir:
- Komut
:map
, anahtarınızın doğru bir şekilde eşlendiğini ancak tuşa basmanın hiçbir şey yapmadığını gösterir.
- Eşlemeniz gVim'de (GUI) çalışıyor ancak Vim terminalinde hiçbir şey yapmıyor
- Eşlemeniz tanımlı bir terminal emülatöründe çalışır ancak başka bir cihazda değil
- Eşlemeniz tanımlı bir işletim sisteminde çalışıyor ancak başka bir bilgisayarda değil.
Muhtemelen aşağıdaki iki şeyden biri neden olur:
Bir şey Vim'den önce anahtarı keser : Farklı uygulamalar olabilir: işletim sisteminiz, masaüstü ortamınız, terminal emülatörünüz, Tmux (eğer kullanıyorsanız) ...
Bu sorunu gidermek için yapmanız gerekenler:
.tmux.conf
Eğer tmux kullanıyorsanız , geçici olarak kaldırmak
- Terminalinizin veya masaüstü ortamınızın belgesine bakın.
Ayrıca süper kullanıcı ,
Unix ve Linux , askUbuntu , vb. Gibi kardeş sitelerine de başvurabilirsiniz .
Sorun buysa, iki çözüme sahip olursunuz: Soruna neden olan uygulamanın davranışını değiştirmek için (çok) zaman harcarsınız veya haritaya başka bir uygulama tarafından yakalanmayan başka bir tuş kombinasyonu bulur.
Terminal emülatörünüz haritalandırmaya çalıştığınız tuş kombinasyonunu kullanamıyor : Terminal emülatörleri farklı şekilde uygulandı ve bazıları belirli bir tuş kombinasyonunu kullanamıyor. (Yapamamalarının nedeni, bu sorunun kapsamı dışında kalıyor, daha fazla bilgi için doktorlarına ya da daha önce belirtilen kardeş sitelerine bakınız).
Bu durumda çok fazla çözüme sahip değilsiniz: ya anahtarınızı terminaliniz tarafından doğru bir şekilde tutulan bir başkasıyla değiştirirsiniz ya da terminal emülatörünüzü değiştirirsiniz.
Ortak tuzakları kontrol et
Haritalamadaki bazı problemler oldukça tekrarlayıcıdır ve çoğunlukla vimscript sözdizimi ile ilgilidir. Eşlemenizde beklenmeyen bir davranış varsa, aşağıdaki noktaları kontrol etmeyi unutmayın:
Haritanızla aynı satıra yorum yapmayın , bunun yerine yukarıdaki satırı yorum yapın. Örnek:
Yapma bunu:
inoremap ii <esc> " ii to go back into normal mode
Vim, boşlukları "
ve yorumu , eşleşmenin bir parçası olarak beklenmedik bir davranışla sonuçlanacak olarak değerlendirecektir.
Bunun yerine şunu yapın:
" ii to go back into normal mode
inoremap ii <esc>
Bunu okumak daha kolaydır ve eşlemenizi karıştırmaz.
Komutlarını kullanmayın|
. Örnek:
Yapma bunu:
nnoremap <Leader>x :w | !% python -m json.tools
Vim boruyu |
komut sonlandırması olarak kabul eder : Kaynak yaptığınızda .vimrc
haritalama nnoremap <Leader>x :w
oluşturulacak ve harici komut !% python -m json.tools
çalıştırılacaktır.
Bunun yerine şunu yapın:
nnoremap <Leader>x :w <bar> !% python -m json.tools
Hakkında bir açıklamaya<bar>
bakınız .
Ne zaman kullanılacağını bilmek nore
: her zaman .
LearnVimscriptTheHardWay oldukça net bir şekilde anlatmaya: kullanmak asla map
, nmap
, vmap
, vb ... Her zaman nore versiyonunu tercih: noremap
, nnoremap
, vnoremap
, vs ... Neden? nore
açılımı non-recursive
haritalama haritaya da sağ taraftaki olarak kabul edilecektir anlamına gelir yerleşik bunu remmaped bile özellik. Örnek:
Diyelim ki >
bir çizgiyi silmek ve bir çizginin -
girintisini artırmak için eşlemek istediğinizi varsayalım . Özyinelemeli olmayan eşlemeleri kullanmazsanız, şunu yaparsınız:
( Yapmayın, örneğin )
nmap > dd
nmap - >
Vurduğunuzda >çizginiz silinecek, bu iyi. Ancak, vuracağınız -zaman çizginiz girintili değil de silinir. Neden? Çünkü Vim " -
Tercüme >
etmem gereken, sonra da çevirmem gereken bir hit aldım" anlamıştı dd
.
Bunun yerine bunu yapın
nnoremap > dd
nnoremap - >
Vim çevirecek Bu şekilde -
olarak >
ve çünkü başka çevirisini yapmaya çalışacağım olmaz nore
.
Düzenleme notu "Her zaman", bazı durumlarda özyinelemeli haritalama formunu kullanmanız gerekecek ancak abartılı bir cevap olabilir, ancak gerçekten yaygın değildir. Netleştirmek için şu cevabı @romainl'den alıntılayacağım :
Özyinelemeli bir eşleme, yalnızca eşlemenizde başka eşlemeler kullanmayı düşünüyorsanız. Yapmazsanız özyinelemeli olmayan eşlemeler kullanın.
Bazı tuş kombinasyonlarının eşdeğer olduğunu unutmayın : Üretilen onaltılık kodlar nedeniyle, bazı tuş kombinasyonları Vim tarafından başka bir anahtar olarak yorumlanır. Örneğin
<C-h>
eşittir <backspace>
<C-j>
gibi <enter>
- Fransızca klavyelerde
<M-a>
aynı á
ve tüm <m-
eşlemeler için de aynı şey geçerli
. @LucHermitte, vim-lateks gibi bu tür eşlemeleri kullanan eklentilerle ilgili bir sorun olduğunu belirtti.
<C-S-a>
eşittir
<C-a>
. Ctrl + büyük harflerin Ctrl + küçük harflerden ayrı olarak eşlenmesi, terminallerin ASCII kodları gönderme şeklinden dolayı mümkün değildir.
Eşlemeniz başka bir anahtarı etkiliyor gibi göründüğünde başka bir lhs kombinasyonu kullanmaya çalışın, bu sorunu çözerse, hangi onaltılık kodların Vim'e gönderildiğini inceleyin.
Liderinizin doğru tanımlanıp tanımlanmadığını kontrol edin : Eğer dahil ettiğiniz eşlemeleriniz<leader>
çalışmıyorsa ve liderinizi komutla değiştirdiyseniz, liderinizintanımının eşlemelerin tanımından öncemapleader
yapıldığını kontrol edin. Aksi takdirde, Vim sizin düşündüğünüz olmayan bir anahtarla eşlemeler oluşturmaya çalışacaktır. Ayrıca boşluk çubuğunu lideriniz (oldukça güncel olan) olarak kullanmak istiyorsanız, doğru gösterimi kullandığınızdan emin olun:let mapleader = "\<Space>"
Haritanız hala çalışmıyor mu?
Bu cevabın tüm adımlarını geçtiyseniz ve eşlemeniz hala istediğiniz gibi çalışmıyorsa, muhtemelen bu sitede yardım isteyeceksiniz.
İnsanların yardım etmelerine yardımcı olmak için önemli bilgiler sağladığınızı hatırlayın:
- Eşlemenizi tanımlamak için kullandığınız komut.
- Haritanızın ne yapmasını bekliyorsunuz?
Sorunun kesin bir açıklaması:
"İşe yaramaz" size yardım etmeye çalışacak insanlara gerçekten yardımcı olmayacaktır. Haritalama hiçbir şey yapmıyorsa veya beklediğinizden farklı şekilde davranıyorsa, kesin olmalısınız.
- Ayrıca aslında adımlar Burada anlatılan takip ettiğini göstermektedir ve sonuçları ile almak
:map
ve:verbose map
Tüm bunlar sizi ve sitenin kullanıcılarını çok zaman kazandıracak.
Yararlı bir komut: :unmap
Bazen davranışını hata ayıklamaya yardımcı olmak için Vim'den çıkmadan bir eşlemeyi sıfırlamak faydalı olabilir.
Bunu yapmak için Normal, Görsel ve İşlem Bekleyen modları için :unmap <key>
atanan eşlemeyi kaldıracak komutu kullanabilirsiniz <key>
. :iunmap
Ekle modu için eşlemeleri kaldıracak. Diğer modlar için bkz :help :unmap
.
Referanslar
Haritalamaya mükemmel bir giriş: learnvimscriptthehardway (Vim'in diğer birçok yönü)
Doc: :h mapping
,
:h :map
Vim'in SSS bölümünün 20. bölümü haritalama ile ilgili ve ilginç sorular içeriyor:
Ve bir bonus: Haritanızda hangi anahtarların kullanılacağını bulmak için en iyi uygulamalar hakkında bir soru
I see a lot of questions on here where a user has a mapping which doesn't work and most of the time the reasons are pretty similar
sorumun ilk satırında söylediğim gibi, bu nedenleri toplamak haritalama ile ilgili tekrarlanan soru sayısını azaltmaya izin vermelidir.