Haritalama nasıl hata ayıklanır?


65

Burada, bir kullanıcının çalışmayan bir haritaya sahip olduğu ve çoğu zaman nedenlerin oldukça benzer olduğu birçok soru görüyorum.

Bu soruyu bu tür sorular için referansta bulmanızı, bir haritalamada hata ayıklamak için eksiksiz bir prosedür vermenizi öneririm. Eğer bir haritalama ile ilgili bir problem olarak kullanıcı, en yaygın sorunları gidermek için buraya yönlendirilebilir.

Tabii ki hala özel bir soru gerektiren ve burada ele alınmayacak olan özel durumlar olacak.

Yanıtlar:


88

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:

<code>: map </code> sonucu

Her zamanki gibi doktor senin arkadaşın: :h map-listing

İlk sütunda eşleme modunu görebilirsiniz ( nnormal mod viç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 :mapgibi :vmap, :nmap, :omapvb

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

:mapKomutun 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 .vimrcve ikincisi bir eklenti tarafından oluşturulan bir haritalama:

Vimrc'den eşleme kümesi

Bir eklentiden ayarlanmış eşleme

Ş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. .vimrcDosya 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.confEğ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 .vimrcharitalama nnoremap <Leader>x :woluş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? noreaçılımı non-recursiveharitalama 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 :mapve: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>. :iunmapEkle 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


2
Deneyimimi, moderatörümüzün önerdiği gibi diğer kullanıcılarla paylaşmak . Ve 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 similarsorumun ilk satırında söylediğim gibi, bu nedenleri toplamak haritalama ile ilgili tekrarlanan soru sayısını azaltmaya izin vermelidir.
statox

1
Vim-lateks ve Fransızca klavyelerde tekrarlanan bir sorun: <m-i>ve évim için aynıdır ve tüm meta + tuşlarıyla aynıdır: farklı bir aksanla ilişkilendirilirler.
Luc Hermitte

1
Tanımlarını istediğimizde tampon yerel eşlemeleri nasıl okuyacağımızı bilmek de önemlidir :map {sequence}-> *ilgili eylemden önce vim'in ne yazdırdığına dair ters bir vurgu vardır.
Luc Hermitte

2
Bazen olanları gerçekten hata ayıklamak istiyoruz. Tipik olarak, haritalama bir fiş eşlemesi veya hatırlamak imkansız bir ismi olan veya karmaşık parametrelerle bir işlev çağırdığında. Bu durumda biz yürütebilirsiniz: :debug normal {keysequence}(herhangi bir patlama olmadan) veya :debug i{keysequence}tuş sırası özel tuşları gibi şeyler (içeriyorsa, vb ekleme modu eşleştirmeleri için <cr>, <left>, <c-x>, <m-i>, <leader>...). O zaman execute + double-quotes + ters eğik çizgi -> ile oynamamız gerekir :debug execute "normal \<leader>\<cr>Z".
Luc Hermitte

2
Meta-dizileri ile ilgili olarak, bu eski bir SSS noktasıdır, çünkü vim-latex gibi şeyleri kullanmayı seçti <m-i>. Çoğu kullanıcı meta anahtarı kullanmaz, çünkü terminalde Vim'i çalıştırmaya yöneliktir - burada meta anahtar basitçe kullanılamaz. Sorunu fark etmek için gvim veya macvim kullanmamız gerekiyor.
Luc Hermitte
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.