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?
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.