Zum Hauptinhalt springen

Bei der Implementierung einer Änderung am OpenVOS-Kernel sah ich mich mit der Aufgabe konfrontiert, etwa 150 Dateien zu ändern. Das bedeutete, sie im Quellcode-Kontrollsystem zu reservieren, das Copyright zu aktualisieren, eine Änderungshistorie hinzuzufügen und die Codeänderung vorzunehmen (die darin bestand, eine #include-Präprozessoranweisung hinzuzufügen. Ich wusste, dass es ewig dauern würde, wenn ich diese Arbeit einfach von Hand machen würde. Also benutzte ich ein paar Abkürzungen, um die Arbeit schneller zu erledigen.

Der erste Trick, den ich anwandte, bestand darin, eine Liste aller Dateien zu erstellen, die ich bearbeiten musste. Ich benutzte unser Versionskontrollsystem, um diese Liste zu erstellen, aber sie lag nicht in einer Form vor, die ich leicht verwenden konnte. Also habe ich die Ausgabe des Befehls erfasst und sie mit einem emacs-Tastaturmakro in ein Befehlsmakro umgewandelt. Wenn Sie noch nie ein emacs-Tastaturmakro benutzt haben, werden Sie sich freuen. Wenn Sie sie schon benutzt haben, können Sie diesen Teil überspringen und zum nächsten Trick übergehen.

Der emacs-Editor verfügt über einen Befehl, mit dem Bearbeitungsanfragen bei der Eingabe aufgezeichnet werden können. Sowohl im OpenVOS-Emacs als auch im GNU-Emacs ist der Befehl zum Starten der Aufnahme von Befehlen "ESC-(". Jeder Befehl, den Sie danach eingeben, wird ausgeführt und aufgenommen. Wenn Sie bereit sind, die Aufzeichnung zu beenden, geben Sie "ESC-)" ein. Sie können das Tastaturmakro ein einziges Mal ausführen, indem Sie "ESC-m" (in OpenVOS emacs) oder "^X-e" (in GNU emacs) eingeben. Tastaturmakros eignen sich hervorragend für die Bearbeitung sich stark wiederholender Dateien, was genau der Fall war, mit dem ich konfrontiert wurde. Hier ist ein vereinfachtes Beispiel, das eine Liste der POSIX-Funktionen verwendet, die mit dem Buchstaben "a" beginnen:

Liste

Dateien: 17, Blöcke: 19

r 2 abort.c

r 1 access.c

r 1 adjtime.c

r 1 aio_cancel.c

r 1 aio_error.c

r 1 aio_fsync.c

r 1 aio_read.c

r 1 aio_return.c

r 1 aio_suspend.c

r 1 aio_write.c

r 2 alarm.c

r 1 altzone.c

r 1 asctime.c

r 1 asctime_r.c

r 1 asprintf.c

r 1 assert.c

r 1 atexit.c

Ich musste diesen Puffer so bearbeiten, dass jede Zeile wie folgt aussieht:

fixup abort.c

wobei fixup.cm ein Befehlsmakro war, das mehrere Aufgaben erfüllen sollte (dazu später mehr). Ich löschte also die ersten paar Zeilen, so dass im Emacs-Puffer nur noch die sich wiederholende Liste der Dateien übrig war. Mit dem Cursor am Anfang der ersten Zeile tippte ich "ESC-(", um die Aufzeichnung zu starten, und editierte dann die Zeile, um die ersten beiden "Wörter" zu löschen und sie durch die Zeichenfolge "fixup" zu ersetzen. Dann ließ ich den Cursor am Anfang der nächsten Zeile stehen und beendete die Aufnahme mit "ESC-)". Hier ist die genaue Sequenz, die ich getippt habe (unter Verwendung der OpenVOS-Emacs-Tastenbindungen):

ESC-( ESC-d ESC-d fixup ^N ^A ESC-)

Jetzt ist die erste Zeile bearbeitet und mein Cursor steht am Anfang der 2. Zeile. Da alles gut funktioniert hat, habe ich dann getippt:

ESC-99 ESC-m

um den Rest der Datei zu bearbeiten. Da der Puffer weniger als 99 Zeilen hat, läuft dieses Makro, bis es das Ende des Puffers erreicht, und hält dann an. Dann habe ich den Puffer als "fixup_all.cm" ausgeschrieben.

Der nächste Schritt bestand darin, das Befehlsmakro "fixup.cm" zu schreiben. Ich beschloss, das Copyright zu aktualisieren, die Änderungshistorie zu aktualisieren und dann Emacs aufzurufen, damit ich die #include-Anweisung manuell hinzufügen konnte. Während ich noch in emacs war, erstellte ich ein neues Tastaturmakro, um die notwendige #include-Anweisung am Cursor einzufügen:

ESC-( #include "sample.h" ESC-)

Da ich den Emacs für jede Datei ein- und ausschalten würde, musste ich dieses Makro dauerhaft speichern und an eine Taste binden. Die Emacs-Aufforderung, das aktuelle Tastaturmakro als permanentes Makro zu speichern, lautet "save_macro", aber es hat keine Standard-Tastenbindung. Um es einmal auszuführen, geben Sie ein

ESC-r save_macro

und Sie werden aufgefordert, einen Namen für das neue Makro zu vergeben. Ich nannte mein Makro "add_include_file". Dann habe ich meine Datei start_up.emacs so bearbeitet, dass sie die folgende Zeile enthält:

set_key ^z-i add_include_file

Ich beendete also Emacs und startete ihn neu, um sicher zu sein, dass die set_key-Anweisung richtig funktioniert. Dann habe ich den Text von fixup.cm eingegeben. Ich benutzte den Zeileneditor, weil ich dachte, dass dies der einfachste Weg sei, die Änderungshistorie zu aktualisieren.

&begin_parameters

Datei-Pfadname,Anfrage

&end_parameters

!add_copyright &file&

&anbringen_input

!line_edit &file& -no_backup -no_verbose

l/Ende der Änderungshistorie/

-1

i

/* Geändert am 10-05-17 von Paul Green zu ... */

.

schreiben.

kündigen

&Entfernen_Eingang

emacs &Datei&

&Rückkehr

Dieses Makro fügt die Copyright-Informationen hinzu (oder aktualisiert sie), fügt die Zeile mit der Änderungshistorie direkt vor dem Kommentar ein, mit dem wir das Ende des Abschnitts mit der Änderungshistorie markieren, und ruft dann emacs auf, damit ich manuell die Stelle finden kann, an der ich die %include-Anweisung hinzufügen muss.

Ich habe jetzt zwei Befehlsmakros: "fixup_all.cm" und "fixup.cm". Das erste Makro ruft das zweite Makro einmal für jede zu ändernde Datei auf. Ich habe dann meinen Bearbeitungsmarathon mit der Eingabe von "fixup_all" begonnen und musste nur noch die Stelle finden, an der ich die #include-Anweisung einfügen wollte, "^Z-i" eingeben, die Datei ausschreiben und die Sitzung beenden. Die Makros erledigten den Rest der Arbeit.

Trotz der Zeit, die ich zum Schreiben der Makros benötigte, habe ich durch die Erstellung dieser Editor- und Befehlsmakros viel Zeit und Mühe (und wahrscheinlich auch einige Tippfehler) gespart. Außerdem wurde dadurch eine langweilige Aufgabe in eine viel interessantere Aufgabe verwandelt.

Ich hoffe, Sie finden diese Informationen nützlich. Das war's für den Moment.

© 2020 Stratus Technologies.