Jak mogę „n” iść naprzód, nawet jeśli zacząłem szukać z „?” lub „#”?

19

Vim ma (przynajmniej) dwa zestawy poleceń, które szukają w przeciwnych kierunkach. Wpisanie, /a następnie wzór spowoduje wyszukanie wzoru w dokumencie do przodu; wpisanie, ?a następnie wzorzec rozpocznie wyszukiwanie do tyłu. Ten sam związek istnieje między poleceniami *i #.

Nie podoba mi się to, że te polecenia również ustawiają kierunek wyszukiwania dla poleceń ni N. Po użyciu /, nidzie do przodu w dokumencie i Nidzie do tyłu; po użyciu ?, nidzie do tyłu i Nidzie do przodu. (Innymi słowy, nzawsze idzie w tym samym kierunku co oryginalne wyszukiwanie i Nzawsze idzie w innym kierunku).

Jak mogę przejść ndo przodu i Ndo tyłu, niezależnie od tego, w którym kierunku zacząłem szukać?

bdesham
źródło

Odpowiedzi:

29

Możesz zmienić zachowanie ni, Naby wyszukiwać konsekwentnie w dół / w górę, używając następujących czynności:

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

Aktualizacja: jak to działa?

To używa map wyrażeń, które mapują lhs mapy na wyrażenie, które będzie oceniane, za każdym razem, gdy lhs napotka. Zobacz :h map-expressionw pomocy.

Co się dzieje, to że zmienna v: searchforward (która określa wewnętrzny stan, w którym kierunku było ostatnie wyszukiwanie, patrz :h v:searchforward) jest używana jako indeks ciągu przed nim. Tak więc w przypadku pierwszej mapy, jeśli ostatni kierunek wyszukiwania był do przodu, n zostanie zmapowane na „n” (indeks 1, co oznacza zwrócenie drugiego znaku), a jeśli było odwrócone, „n” zostanie zmapowane na „N” (ponieważ zmienna v: searchforward ma wartość 0 i dlatego zostanie zwrócone „N”.

Alternatywnym sposobem napisania tych map byłoby (co może być jaśniejsze):

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

Istnieją również niektóre wtyczki, które to robią (tj. Wtyczka SearchRepeat i ewentualnie także inne).

Christian Brabandt
źródło
Dzięki za wzmiankę o mojej wtyczce; Właśnie miałem polecić to jako alternatywę :-)
Ingo Karkat
2
Sprytne użycie indeksowania!
wchargin
6
Czy możesz dodać wyjaśnienie? Nie widziałem wcześniej tej składni i chciałbym wiedzieć, jak to działa.
EvergreenTree,
1
@EvergreenTree: Dodano kilka wyjaśnień
Christian Brabandt
2
@ChristianBrabandt To jest bardzo sprytne. Nigdy nie myślałem o tobie v:searchforwardjako o indeksie.
EvergreenTree,
1

Na podstawie rozwiązania Christiana Brabandta wpadłem na pomysł

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

Te mapowania są również zgodne z foldopenustawieniem

Naumann
źródło
0

Korzystam z wtyczki SearchIndex . Aby użyć odpowiedzi Christiana Brabandta, ale zachować funkcjonalność wtyczki w wyświetlaniu numeru dopasowania za każdym razem, gdy wpisuję nlub Numieszczam to w moim vimrc:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
bdesham
źródło