'N' ile aramaya başlasam bile 'n' nin ileri gitmesini nasıl sağlayabilirim? veya '#'?


19

Vim, (en azından) zıt yönlerde arama yapan iki komut kümesine sahiptir. /Sonra bir desen yazmak , desende belgeyi ileri doğru arar; yazdığınızda ?bir desen geriye doğru arama yapar. *Ve #komutları arasında aynı ilişki vardır .

Sevmediğim şey, bu komutların ayrıca nve Nkomutları için arama yönünü ayarlamasıdır . Kullandıktan sonra /, nbelgenin ileriye doğru gider ve Ngeriye gider; kullandıktan sonra ?, ngeriye gider ve Nileri gider. (Başka bir deyişle, nher zaman orijinal arama ile aynı yönde ve Nher zaman diğer yönde gider.)

Hangi yönde aramaya başladığımdan bağımsız olarak nbelgede nasıl ileri gidebilir ve Ngeri gidebilirim?

Yanıtlar:


29

Aşağıdakileri kullanarak davranışını değiştirebilir nve Nsürekli olarak aşağı / yukarı doğru arama yapabilirsiniz :

nnoremap <expr> n 'Nn'[v:searchforward]
nnoremap <expr> N 'nN'[v:searchforward]

Güncelleme: Nasıl çalışır?

Bu, lhs ile her karşılaşıldığında haritanın lh'lerini değerlendirilecek bir ifadeyle eşleyen ifade haritaları kullanır. :h map-expressionYardıma bakın .

Olan şey, v: searchforward değişkeninin (son aramanın hangi yöne ait olduğunu belirleyen iç durumu belirler :h v:searchforward), önündeki dize için bir dizin olarak kullanılmasıdır. Dolayısıyla, ilk harita olması durumunda, son arama yönü ileriye doğru olsaydı, n 'n' (1 dizini, yani ikinci karakteri döndürür) olarak eşlenir ve geriye doğru ise, 'n' 'N' (v: searchforward değişkeni 0 olduğu için 'N' döndürülecektir.

Bu haritaları yazmanın alternatif bir yolu (daha açık olabilir):

nnoremap <expr> n (v:searchforward ? 'n' : 'N')
nnoremap <expr> N (v:searchforward ? 'N' : 'n')

Bunu yapan bazı eklentiler de vardır (yani SearchRepeat eklentisi ve muhtemelen diğerleri).


Eklentimden bahsettiğiniz için teşekkürler; Ben bunu alternatif olarak tavsiye etmek üzereydim :-)
Ingo Karkat

2
Aboneliğin akıllı kullanımı!
wchargin

6
Lütfen bir açıklama ekler misiniz? Daha önce bu sözdizimini görmedim ve nasıl çalıştığını bilmek istiyorum.
EvergreenTree

1
@EvergreenTree: Biraz daha açıklama eklendi
Christian Brabandt

2
@ChristianBrabandt Bu çok akıllı. v:searchforwardEndeks olarak kullandığını hiç düşünmemiştim .
EvergreenTree

1

Christian Brabandt'ın çözümüne dayanarak

nnoremap <expr> n 'Nn'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')
nnoremap <expr> N 'nN'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')

Bu eşleşmeler de itaat foldopenayarı


0

SearchIndex eklentisini kullanıyorum . Christian Brabandt'ın cevabını kullanmak, ancak her yazdığımda eklentinin maç numarasını görüntüleme işlevselliğini korumak için nveya Nbunu vimrc'ime koydum:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
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.