Vim'deki remap, noremap, nnoremap ve vnoremap eşleme komutları arasındaki fark nedir?


1113

Arasındaki fark nedir remap, noremap, nnoremapve vnoremapVim haritalama komutları?


1
Dikkat vnoremapve vmapVisual AND Select modunda çalışın. Sadece Görsel modunda, kullanımda bir eşleme sahip olmak xmapve xnoremap.
Benoit

Yanıtlar:


1626

remapeşlemelerin tekrar tekrar çalışmasını sağlayan bir seçenektir . Varsayılan olarak açıktır ve bu şekilde bırakmanızı tavsiye ederim. Geri kalanlar aşağıda açıklanan eşleme komutlarıdır :

:mapve :noremapolan özyinelemeli ve özyinesiz çeşitli haritalama komutların sürümleri. Bunun anlamı şudur:

:map j gg
:map Q j
:noremap W j

jile eşlenecek gg. Qaynı zamanda eşlenecektir gg, çünkü jözyinelemeli eşleme için genişletilecektir. Weşlenir j(ve değil ggçünkü) jözyinesiz haritalama genişletilmiş edilmeyecektir.

Şimdi Vim'in kalıcı bir editör olduğunu unutmayın . Bu bir var , normal mod, görsel modu ve diğer modları.

Bu eşleme kümelerinin her biri için, normal, görsel, seçim ve operatör modlarında ( ve ), biri normal modda ( ve ), biri görsel modda ( ve ) çalışan bir eşleme vardır .:map:noremap:nmap:nnoremap:vmap:vnoremap

Bununla ilgili daha fazla yardım için bkz:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes

8
Cevabınız için teşekkürler! Ayrıca, özyinelemeli ne zaman ve özyinelemesiz ne zaman kullanılır?
Chetan

14
@Chetan: Neyi başarmak istediğinize bağlı. Yinelemeli olmayanları daha sık kullanma eğilimindeyim, ancak yinelemesiz olmayan ve ilk eşlemenin yaptığı her şeyi ve daha fazlasını yapan başka bir eşleme kullanarak nispeten karmaşık bir eşleme tanımladıysanız, aşağıdakileri içeren yinelemeli bir eşleme kullanmak daha kolay olabilir Özyinelemesiz olanın tamamını tekrar yazmak yerine orijinal olanı (özellikle orijinali değiştirmeniz gerekiyorsa).
DrAl

10
Ben noremapbazı zıt olduğu varsayım vardı map. Bir haritayı kaldıran bir şey demek istiyorum. Cevap için teşekkürler. Beni açıkladı
Pavan Manjunath

4
Bu kullanım durumları çoğunluğu için o kadar önemli değildir, ancak unutulmamalıdır :mapvb iş yok hepsi , modları tam olarak, sadece tüm yaygın olanları (özellikle, normal mod, görsel mod seçeneğini modu ve operatör beklemede). Bir eşlemenin insert, komut satırı veya lang-arg modunda çalışmasını istiyorsanız :map!vb. Kullanmanız gerekir . (Kaynak: vimdoc.sourceforge.net/htmldoc/map.html#map-overview )
Ken Bellows

3
@whytheq noremap = özyinelemesiz haritalama
Dan Bechard

281

Bence Vim belgeleri bu komutların isimlendirilmesinin ardındaki anlamı açıklamalıydı. Sadece ne yaptıklarını söylemek isimleri hatırlamanıza yardımcı olmaz.

maptüm özyinelemeli eşleme komutlarının "kökü" dür. Kök formu "normal", "görsel + seçim" ve "operatör beklemede" modlarına uygulanır. ( Dilbilimdeki gibi "kök" terimini kullanıyorum .)

noremaptüm özyinelemesiz eşleme komutlarının "kökü" dür. Kök formu, aynı modlar için geçerlidir map. ( nore"Özyinelemesiz" anlamına gelen öneki düşünün .)

( Ekleme ve komut satırı için de !böyle modların map!geçerli olduğunu unutmayın.)

Bu bağlamda "özyinelemeli" ne anlama geldiğini görmek için aşağıya bakın.

Eşlemenin nçalıştığı modları değiştirmek gibi bir mod harfi eklemek . Uygulanabilir modlar listesinin bir alt kümesini seçebilir (örneğin yalnızca "görsel") veya mapuygulanamayan diğer modları seçebilir (örneğin "ekle").

Kullanım help map-modessize eşlemenin hangi modlara uygulanacağını açıklayan birkaç tablo gösterecektir.

Mod harfleri:

  • n: sadece normal
  • v: görsel ve seç
  • o: operatör bekliyor
  • x: sadece görsel
  • s: sadece seç
  • i: ekle
  • c: Komut satırı
  • l: insert, komut satırı, regexp-search (ve diğerleri. Toplu olarak "Lang-Arg" sözde modu olarak adlandırılır)

" Özyinelemeli ", eşlemenin bir sonuca genişletildiği, ardından sonucun başka bir sonuca genişletildiği anlamına gelir.

Bunlardan biri doğru olduğunda genişleme durur:

  1. sonuç artık başka hiçbir şeyle eşlenmiyor.
  2. özyinelemesiz bir haritalama uygulanmıştır (yani "noremap" [veya ilkinden biri) son genişlemedir).

Bu noktada, Vim'in nihai sonucun varsayılan "anlamı" uygulanır / yürütülür.

" Özyinelemesiz ", eşlemenin yalnızca bir kez genişletildiği ve bu sonucun uygulandığı / yürütüldüğü anlamına gelir.

Misal:

 nmap K H
 nnoremap H G
 nnoremap G gg

Yukarıdaki K, genişlemeye H, sonra Hgenişlemeye Gve durmaya neden olur . Hemen nnoremapgenişleyen ve durduğu için durur. Anlamı Gidam edilecektir (yani "son satıra atlamak"). En fazla bir özyinelemeli olmayan eşleme, bir genişleme zincirine uygulanacaktır (gerçekleşecek son genişleme olacaktır).

Haritalanması Giçin ggtuşuna eğer geçerlidir Gama sen basarsanız, K. Bu eşleme, yinelemeli olarak eşlenip eşlenmediğinden Kbağımsız olarak preslemeyi etkilemez G, çünkü genişlemenin Kdurmasına neden olan 2. satır olduğundan, 3. satır kullanılmaz.


4
Bir şey: maptüm modlar için değil, yalnızca normal, görsel, seçim ve operatör bekleyen modlar için geçerlidir.
Brian McCutchon

1
cevap kabul edilmelidir.
Tycholiz

bu, kabul edilenden daha iyi bir cevaptır.
MilMike

19

Bir fark şudur:

  • :map etmez nvo== Normal + (+ görsel seçmek) + operatör bekleyen
  • :map!does ic + komut satırı modunda eki ==

help map-modestablolarda belirtildiği gibi .

Yani: maptüm modlarla eşleşmez .

Tüm modlara eşlemek için hem :mapve 'ye ihtiyacınız vardır :map!.


5
Dikkatli !! viz'in bir command modebaşka tarihi adıdır normal mode. bölüm 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ). 'C' kısaltması 'komut satırı' içindir. Başka bir deyişle, varsayılan olarak: insert + komut satırı modları için lhs'yi rhs ile map! lhs rhs özyinelemeli olarak eşler . Bu, varsayılan seçenek ~ / .vimrc ile açıkça devre dışı bırakılmadığı sürece geçerlidir . Bu durumda eşleme yinelemeli olmaz (önerilmez). remapset noremap[!]
Cbhihe
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.