Ich möchte in jeder Zeile einer Auswahl ein Makro ausführen, anstatt die Anzahl der Zeilen in meinem Kopf zu summieren. Zum Beispiel könnte ich ein Makro schreiben, um es zu transformieren:
Last, First
In
First Last
und ich möchte, dass es auf all diesen Zeilen läuft:
Stewart, John
Pumpkin, Freddy
Mai, Stefan
...
Irgendwelche Ideen Vim Gurus?
EDIT: Dies ist nur ein Beispiel, offensichtlich ist dies trivial regexable, aber es gibt andere Instanzen, die nicht ganz so einfach sind, dass ich lieber Makros verwenden würde.
Antworten:
Angenommen, Sie hatten ein Makro
q
, das in einer einzelnen Zeile ausgeführt wurde (und blieb). Dann können Sie es in jeder Zeile Ihrer Auswahl ausführen mit:(Wenn Sie bereits eine Gruppe von Zeilen ausgewählt haben, wird durch Drücken von in der Befehlszeile
:
erzeugt.:'<,'>
)Das folgende Makro schreibt beispielsweise jedes Wort außer dem ersten in einer Zeile groß:
Führen Sie es also wie folgt aus (wo die
+
Zeilen ausgewählt sind)Mit dem obigen
normal @q
Befehl wird Folgendes erzeugt:quelle
:let @q="^wgU$"
:'<,'>normal! @q
@q
. Von:help normal
- "Wenn das [!] Angegeben ist, werden keine Zuordnungen verwendet."@
im visuellen Modus wie folgt abzubilden :vnoremap @ :normal @
. Auf diese Weise können Sie immer noch das tun, was@a
Sie erwarten (obwohl Sie danach die Eingabetaste drücken müssen :()Wählen Sie die Zeilen aus und drücken Sie
:
, um den Befehlsmodus aufzurufen. Vim wird automatisch ausgefüllt'<,'>
, wodurch der Bereich auf die ausgewählten Zeilen beschränkt wird. In Ihrem Beispiel können Sie den:s
Befehl verwenden, um den Austausch durchzuführen:Dadurch werden zwei durch ein Komma getrennte Wörter in jeder Zeile der visuellen Auswahl ausgetauscht.
Sie können auch jedes andere Lesezeichen oder jede andere Zeilenposition verwenden
'<
und'>
mögen, z. B. als Teil eines Bewegungsbefehls, sodass im normalen Modusd'<
von der aktuellen Cursorposition bis zum Anfang der ersten Zeile in der visuellen Auswahl gelöscht wird. Die Markierungen bleiben auch dann wirksam, wenn der Block nicht mehr optisch hervorgehoben wird.Wenn Sie ein aufgezeichnetes Makro in jeder Zeile wiedergeben möchten, müssen Sie das Makro mit dem
:normal
Befehl ausführen . Leider:normal
funktioniert der Befehl nicht in einer Reihe von Zeilen, aber Sie können dies mit dem:global
Befehl beheben . Dadurch wird in:ex
jeder Zeile ein Befehl ausgeführt, der einem regulären Ausdruck entspricht. Sie können dies also tun:Erläuterung:
quelle
^
mit.
dem Makro läuft auf Linien nur zu machen , die einen Text hat, würde das nicht?Sie können die folgende Funktion zu Ihrer hinzufügen
~/.vimrc
oder sie einfach in Ihren Browser kopieren und ausführen:@+
Der Vorteil ist, dass Sie ein beliebiges Makro auf die visuelle Auswahl anwenden können. Sie müssen den Makrobuchstaben als Argument angeben, z.
quelle