VIM: Kann ein benutzerdefiniertes Verhalten hinzugefügt werden, wenn / c mit dem Ersatzbefehl verwendet wird?

336
Steve Vermeulen

Es gab einige Fälle, in denen es sinnvoll wäre, das Such- und Ersetzungsverhalten für bestimmte Dinge zu nutzen. Zum Beispiel habe ich die folgende Zuordnung in meiner vimrc:

nnoremap n nzzzv

Dadurch wird der Bildschirm jedes Mal zentriert, wenn Sie mit dem nächsten Spiel fortfahren. Dies funktioniert gut, gilt jedoch nicht für den Befehl% s // c. Gibt es eine Möglichkeit, eine Verbindung herzustellen, wenn der Benutzer eine der Bestätigungsoptionen auswählt, y / n / q / q / l / etc. damit du Befehle auslösen kannst?

2

3 Antworten auf die Frage

2
Ingo Karkat

Leider nicht. Der übliche Weg, sich daran zu beteiligen, wäre durch eine

:autocmd CursorMoved * ... 

Dieses Ereignis wird jedoch nicht in der :substitute///cAbfrageschleife ausgelöst . Stellen Sie sich dies als eine besondere Art von Modus mit vielen Einschränkungen vor. Es wäre sehr schwierig, benutzerdefinierte Funktionen zuzulassen, während der korrekte Suchstatus beibehalten wird.

Sie müssten die :substituteFunktionalität selbst neu implementieren . Vielleicht können Sie ein :help sub-replace-expressionmit der Abfrage dort verwenden; Ich habe noch nicht versucht, ob eine Benutzerinteraktion möglich ist.

2
Ingo Karkat

Eine Problemumgehung für Ihren speziellen Anwendungsfall des Zentrierens der aktuell ersetzten Zeile ist die

:set scrolloff=999 

vor dem :substituteBefehl. Das hat den gleichen Effekt, wenn Sie die aktuelle Linie wie Ihren zzBefehl zentrieren .

1
Steve Vermeulen

Based on Ingo Karkat's suggestion to use the scrolloff option I ended up going with this:

command! -nargs=1 CC set scrolloff=999|exec <f-args>|set scrolloff=0 

So now you can just run "CC %s//c" and it will center the cursor temporarily during the command. It's tempting to find an abbreviation or something for this but I couldn't think of anything that would work reliably.