Ich bin gerade dabei, Quellcode mit vim zu verschönern. {1}
Ich habe ein paar vim-Makros erstellt, die die einzelnen Schritte ausführen: Entfernen von nachgestellten Leerzeichen, Entfernen von Leerzeilen danach {
, Entfernen von Leerzeilen davor {
, solche Dinge .
Jetzt möchte ich ein Makro erstellen, das alle einzelnen Makros nacheinander ausführt. Sobald das erste rekursive Makro beendet wird (da es keine Übereinstimmungen mehr findet -> Übereinstimmungsfehler), wird auch mein "Wrapper" -Makro beendet.
Gibt es eine Möglichkeit, ein vim-Makro fortzusetzen, nachdem ein Submacro einen Fehler generiert hat?
{1} Ich kenne automatische Reformatierer. Ich könnte sie sogar für mein aktuelles Problem verwenden. Ich habe lediglich die Neuformatierung der Quelle erwähnt, um das Beispiel zu verdeutlichen. Veröffentlichen Sie keine Antworten zu diesem oder jenem Quellverschönerer. Die Frage ist nicht über Code Neuformatierung per se , sondern um vim Makros.
Beispiel:
- Makro 1 - abschließendes Leerzeichen entfernen -
qw/\s\+$d$@wq
- Makro 2 - Löschen von Leerzeilen vor} -
qe/\n\n *}dd@eq
- Wrapper Macro - Retabbing, Macro 1, Macro 2 -
qr:retab@w@eq
Wenn ich den Wrapper ausführe @r
, wird er retabiert, dann wird Makro 1 ausgeführt, bis kein abschließendes Leerzeichen mehr gefunden wird, und dann wird beendet ( ohne Makro 2 auszuführen).
Klärung:
Nach was ich suche, ist, wie man ein Submacro aufruft, damit, wenn dieses Submacro beendet wird, das aufrufende Makro fortfährt?
Wenn der fehlgeschlagene Befehl eine Substitution ist, deren Muster nicht gefunden wird, z.
Wenn
foo
der Puffer nicht vorhanden ist, können Sie dase
Flag hinzufügen , um diesen Fehler zu ignorieren. Beispiel:Sehen
Sie können Vim anweisen, die Fehler einiger: ex-Befehle zu ignorieren, indem Sie ihnen Folgendes voranstellen
:silent!
. SehenBearbeiten Sie nach dem Hinzufügen eines Beispiels zur Frage
Makro 1 und Makro 2 sind beide rekursiv und haben keinen expliziten Mechanismus zum Beenden der Rekursion. Ich vermute, dass einer von Vims internen Tests auf unbegrenzte Rekursion ausgelöst wird, was einen Fehler erzeugt. Wenn Makro 1 einen solchen Fehler generiert, wird die Ausführung des Wrapper-Makros unmittelbar danach durch diesen Fehler abgebrochen
@w
.Mein Vorschlag wäre, die Anzahl der ausgeführten Makros zu begrenzen, indem Sie sie wie folgt umschreiben: ex-Befehle und den Zeilenbereich einschränken, über den sie ausgeführt werden. Beispielsweise:
Wo
^M
bedeutet die Eingabe Ihrer Eingabetaste oder Return-Taste. Ich habe diese in Ihrem Wrapper-Makro nicht zusammen getestet, aber ich denke, Sie können alle Fehler beheben, die ich möglicherweise gemacht habe.quelle
/foo
). Zwar:silent!
hat der Trick des rekursiven Submakros das Wrapper-Makro nicht abgebrochen, aber jetzt wird das Submakro überhaupt nicht beendet. Scheint, als würde ich stecken bleiben. : - \Was für mich funktioniert hat, war eine Kombination aus @Peter Rincker und @garyjohn Antworten. Separat bekam ich immer wieder seltsame Probleme.
Ich denke, die
silent!
in der<leader>rt
, und die Pipe-Zeichen zwischenendtry
undw
waren die Schlüssel - einfach mit dem Zeilenumbruch nach demendtry
fehlgeschlagenen. Dastry
s hat funktioniert, als ich sie gerade eingegeben habe, aber wenn es als Makro ausgeführt wurde, wurde der Fehler bezüglich des Suchtexts nicht gefunden.quelle
Ich erstelle regelmäßig Makros, wenn ich eine sich wiederholende Aufgabe in vielen Dateien ausführen muss. In meinem Fall habe ich NERDtree ( http://www.vim.org/scripts/script.php?script_id=1658 ) in VIM installiert, wodurch ein
vsplit
Fenster erstellt wird, und auf der linken Seite habe ich eine Liste aller Dateien in das aktuelle Verzeichnis. In einem Beispiel muss ich die erste Instanz der ZeichenfolgeMY_TEST
in der Datei suchen und dann, falls vorhanden, ein Präfix löschen, das alsCUSTOM_PREFIX-
aus dieser Zeile beschriftet ist, die Datei speichern und dann mit der nächsten fortfahren.Hier ist, wie ich dieses Makro auf etwa 2000 Dateien im aktuellen Verzeichnis arbeiten lassen. Ich könnte ein Bash-Skript schreiben, um dies zu tun, aber in meinem Fall ist es in VIM schneller. Die
+
Tasten werden gleichzeitig gedrücktq,a
CTRL+ W,←
↓
ENTER
q
1000 @,a
Hoffe das hilft!
quelle