Wie kann ich 'n' erhalten, um fortzufahren, auch wenn ich mit '?' oder '#'?

19

Vim hat (mindestens) zwei Befehlssätze, die in entgegengesetzte Richtungen suchen. Wenn Sie tippen /und dann ein Muster eingeben , wird das Dokument nach dem Muster durchsucht. Tippen ?und dann wird ein Muster rückwärts suchen. Die gleiche Beziehung besteht zwischen den Befehlen *und #.

Was mir nicht gefällt, ist, dass diese Befehle auch die Suchrichtung für die Befehle nund festlegen N. Nach der Verwendung /, ngeht nach vorne durch das Dokument und Ngeht nach hinten; nach der Verwendung ?, ngeht rückwärts und Nvorwärts geht. (Mit anderen Worten, ngeht immer in die gleiche Richtung wie die ursprüngliche Suche und Ngeht immer in die andere Richtung.)

Wie kann ich ndas Dokument durchblättern und Nzurückblättern, unabhängig davon, in welche Richtung ich gesucht habe?

bdesham
quelle

Antworten:

29

Sie können das Verhalten von nund ändern N, um konsequent nach unten / oben zu suchen, indem Sie Folgendes verwenden:

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

Update: Wie funktioniert es?

Dabei werden Ausdruckszuordnungen verwendet, die die lhs der Zuordnung einem Ausdruck zuordnen, der jedes Mal ausgewertet wird, wenn die lhs angetroffen werden. Siehe :h map-expressionin der Hilfe.

Was passiert ist, dass die Variable v: searchforward (die den internen Zustand der letzten Suche festlegt, siehe :h v:searchforward) als Index für den String davor verwendet wird. Wenn also bei der ersten Karte die letzte Suchrichtung vorwärts war, wird das n auf 'n' abgebildet (Index von 1, was bedeutet, dass das zweite Zeichen zurückgegeben wird), und wenn es rückwärts war, wird das 'n' abgebildet 'N' (weil die Variable v: searchforward 0 ist und daher das 'N' zurückgegeben wird.

Ein alternativer Weg, diese Karten zu schreiben, wäre (was klarer sein könnte):

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

Es gibt auch einige Plugins, die dies tun ( zB das SearchRepeat-Plugin und möglicherweise auch andere).

Christian Brabandt
quelle
Danke, dass du mein Plugin erwähnt hast. Ich wollte das gerade als Alternative empfehlen :-)
Ingo Karkat
2
Clevere Verwendung von Subskription!
wchargin
6
Könnten Sie bitte eine Erklärung hinzufügen? Ich habe diese Syntax noch nie gesehen und möchte wissen, wie sie funktioniert.
EvergreenTree
1
@EvergreenTree: Weitere Erklärung hinzugefügt
Christian Brabandt
2
@ChristianBrabandt Das ist sehr schlau. Ich hätte nie gedacht, dass Sie v:searchforwardals Index verwenden.
EvergreenTree
1

Basierend auf der von Christian Brabandt entwickelten Lösung

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

Diese Zuordnungen gehorchen auch der foldopenEinstellung

Naumann
quelle
0

Ich benutze das SearchIndex- Plugin. Um die Antwort von Christian Brabandt zu verwenden, aber die Funktionalität des Plugins beizubehalten, bei jeder Eingabe von noder die Übereinstimmungsnummer anzuzeigen N, schreibe ich Folgendes in mein vimrc:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
bdesham
quelle