2013-08-30 44 views
7

Prawie zawsze szukam w Vimie pod numerem /, a następnie kontynuuję poszukiwanie z n i wstecz z N. Czasami jednak używam ?, aby przeskoczyć do pozycji zaledwie o kilka linii powyżej linii, w której aktualnie się znajduję, iw takim przypadku, jeśli chcę przeszukać ten sam element do przodu, muszę użyć N zamiast n, irytujący próg psychiczny.Make 'n' zawsze szuka naprzód, niezależnie od tego, czy/i? został użyty do wyszukiwania

Moje pytanie brzmi: czy możliwe jest, aby n zawsze iść do przodu, a N do tyłu?

P.S. Dokumentacja wydaje się wskazywać, że nie jest to możliwe, ponieważ n po prostu "Powtarza ostatnie"/"lub"? "[Liczy] razy", ale kto wie.

Odpowiedz

9

Zostało to zrobione z ZyX's post na liście mailowej vim.

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

Mapuje n oryginalnej N lub N bazujących od zmiennej v:searchforward przez indeksowanie 'Nn' postaci listy dwóch elementów. Działa to tylko dlatego, że mapowanie nie jest rekurencyjne. Jeśli był rekursywny, nazwałby to "ja" i byłbyś w nieskończonej pętli.

Kiedy v:searchforward == 1 (wyszukiwanie do przodu) mapowania są równoważne

noremap <expr> n n 
noremap <expr> N N 

i kiedy v:searchfoward == 0 (wyszukiwanie do tyłu) odwzorowania są równoważne

noremap <expr> n N 
noremap <expr> N n 

To odwzorowanie działa w Normal, wideo oraz Operator oczekuje na tryby.


Prawdopodobnie napisałbym to tak. (Chociaż nie jestem pewien, czy jest to bardziej wyraźne)

noremap <expr> n (v:searchforward ? 'n' : 'N') 
noremap <expr> N (v:searchforward ? 'N' : 'n') 
+0

Whoa, to genialne mapowanie. – dorserg

+0

Nawiasem mówiąc, po wyskoczeniu tego wątku mam nowe rozwiązanie: "Masz rację, ale na początku chciałem /pattern d // e (naciśnij Enter, jeśli jest to potrzebne), aby było powtarzalne z nnnn "zażalenie. – ZyX

6

To jest po prostu tak jest, pomimo pewnego debaty na liście dyskusyjnej deweloperów ...

Oto co można zrobić:

:noremap n /<CR> 
:noremap N ?<CR> 

odpowiedni wykaz pocztowy wątek z wieloma bardziej interesujące informacje: https://groups.google.com/d/msg/vim_dev/8jSoA931P2Y/JklYtxFOiAYJ

+0

Nie wydaje mi się, żebym zgubił flagę '/ e'. – FDinoff

+0

Ach, masz rację, pomyliłem to z ': s' i nie przetestowałem wystarczająco. Zastanawiam się, czy jest inny problem, rozwiązanie wydaje się prawie zbyt proste ... – glts

+0

Podoba mi się odpowiedź Zyxa na dole wątku. (I dokąd zmierzałem, gdybym mógł znaleźć tę zmienną, gdybyś nie pisał najpierw) 'noremap n 'Nn' [v: searchforward]' i 'noremap N 'nN' [v: searchforward]' – FDinoff