VIM: Wie prüfe ich, ob das aktuelle Skript in einem Makro läuft?

366
Steve Vermeulen

In einigen Fällen habe ich ein vim-Skript, das ich nur ausführen möchte, wenn es nicht in einem Makro ausgeführt wird. In einigen Fällen blinke ich beispielsweise mit dem Cursor, um mich daran zu erinnern, wo er sich gerade befindet (was bei der Ausführung in einem Makro sinnlos ist und dazu führt, dass das Makro 10x so lange dauert).

Daher möchte ich für diese Fälle prüfen, ob es als Makro ausgeführt wird, und die unnötige Operation in diesem Fall vermeiden. Ich suchte ein bisschen nach Hilfe, konnte aber keine Flagge finden, um dies zu erkennen. Ist das möglich?

1
Wie lösen Sie das Blinken aus? Wenn es sich um ein Mapping handelt, verwenden Sie es nicht. Wenn es sich um eine Autocmd handelt, verwenden Sie ein Ereignis, das nicht während eines Makros wie CursorHold ausgelöst wird. Oder starten Sie jedes Makro mit einem Befehl, mit dem Sie die Blinkfunktion vorübergehend aktivieren können. romainl vor 10 Jahren 0

1 Antwort auf die Frage

2
Ingo Karkat

Es gibt keine funktionsähnlichen mode()oder speziellen v:macro_runningVariablen, und viele würden argumentieren, dass diese nur schlechte Praktiken fördern würden.

Sie können das Verhalten von verwenden feedkeys(), dessen übergebene Schlüssel normalerweise direkt nach dem Befehl / Mapping ausgeführt werden, jedoch nur am Ende der Makroausführung. Wenn Sie Ihre lang laufenden Befehle dort einfügen, werden sie normale Befehle direkt verlangsamen, jedoch nur (kumulativ) nach der Makroausführung (und Sie können dies normalerweise mit abbrechen <C-C>).

Beispiel

let @q = ',a,b' 

Anstatt:

nnoremap ,a aHello<Esc>2gs nnoremap ,b aWorld<Esc>2gs 

benutzen

nnoremap ,a aHello<Esc>:call feedkeys('2gs', 'n')<CR> nnoremap ,b aWorld<Esc>:call feedkeys('2gs', 'n')<CR> 

Dadurch wird der gesamte HelloWorldText sofort in ein Makro eingefügt.