Bei der Implementierung einer Änderung am OpenVOS-Kernel stand ich vor der Aufgabe, etwa 150 Dateien zu modifizieren. Das bedeutete, sie im Quellcodeverwaltungssystem zu reservieren, das Copyright zu aktualisieren, eine Zeile mit dem Änderungsverlauf 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 erledigen würde. Also habe ich ein paar Abkürzungen genommen, 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 habe unser Quellkontrollsystem verwendet, um diese Liste zu erstellen, aber sie war nicht in einer Form, 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 verwendet haben, werden Sie begeistert sein. Wenn Sie sie bereits kennen, können Sie diesen Teil überspringen und mit dem nächsten Trick fortfahren.
Der Emacs-Editor verfügt über einen Befehl, mit dem Bearbeitungsanforderungen bei ihrer Eingabe aufgezeichnet werden können. Sowohl in OpenVOS Emacs als auch in GNU Emacs lautet der Befehl zum Starten der Aufzeichnung „ESC-(“. Jeder Befehl, den Sie danach eingeben, wird ausgeführt und aufgezeichnet. Wenn Sie die Aufzeichnung beenden möchten, geben Sie „ESC-)“ ein. Sie können das Tastaturmakro einmalig ausführen, indem Sie „ESC-m“ (in OpenVOS Emacs) oder „^X-e“ (in GNU Emacs) eingeben. Tastaturmakros eignen sich hervorragend zum Bearbeiten von Dateien mit vielen Wiederholungen, was genau mein Fall war. Hier ist ein vereinfachtes Beispiel mit einer Liste der POSIX-Funktionen, 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 aussah:
Fixup abort.c
wobei fixup.cm ein Befehlsmakro war, das mehrere Aufgaben ausführen konnte (mehr dazu später). Also löschte ich die ersten paar Zeilen, sodass im Emacs-Puffer nur noch die sich wiederholende Liste von Dateien übrig blieb. Mit dem Cursor am Anfang der ersten Zeile tippte ich „ESC-(“, um die Aufzeichnung zu starten, und bearbeitete dann die Zeile, um die ersten beiden „Wörter“ zu löschen und durch die Zeichenfolge „fixup“ zu ersetzen. Dann ließ ich den Cursor am Anfang der nächsten Zeile stehen und beendete die Aufzeichnung mit „ESC-)“. Hier ist die genaue Sequenz, die ich eingegeben habe (unter Verwendung der OpenVOS-Emacs-Tastenkombinationen):
ESC-( ESC-d ESC-d-Korrektur ^N ^A ESC-)
Nun wurde die erste Zeile bearbeitet und mein Cursor befindet sich am Anfang der zweiten Zeile. Da alles gut funktioniert hat, habe ich dann Folgendes eingegeben:
ESC-99 ESC-m
um den Rest der Datei zu bearbeiten. Da der Puffer weniger als 99 Zeilen enthält, läuft dieses Makro bis zum Ende des Puffers und stoppt dann. Anschließend habe ich den Puffer als „fixup_all.cm” gespeichert.
Der nächste Schritt war das Schreiben des Befehlsmakros „fixup.cm“. Ich beschloss, dass es das Copyright und die Änderungshistorie aktualisieren und dann Emacs aufrufen sollte, damit ich die #include-Anweisung manuell hinzufügen konnte. Während ich noch in Emacs war, erstellte ich ein neues Tastaturmakro, um die erforderliche #include-Anweisung an der Cursorposition einzufügen:
ESC-( #include „sample.h” ESC-)
Da ich Emacs für jede Datei aufrufen und wieder verlassen würde, musste ich dieses Makro dauerhaft speichern und einer Taste zuweisen. Der Emacs-Befehl zum Speichern des aktuellen Tastaturmakros als permanentes Makro lautet „save_macro“, hat jedoch keine Standardtastenzuweisung. Um ihn einmal auszuführen, geben Sie Folgendes ein:
ESC-r Makro speichern
und Sie werden aufgefordert, einen Namen für dieses neue Makro einzugeben. Ich habe mein Makro „add_include_file” genannt. Anschließend habe ich meine Datei start_up.emacs so bearbeitet, dass sie folgende Zeile enthält:
set_key ^z-i add_include_file
Also habe ich Emacs beendet und neu gestartet, um sicherzugehen, dass die Anweisung „set_key“ ordnungsgemäß funktioniert. Anschließend habe ich den Text von „fixup.cm“ eingegeben. Ich habe den Zeileneditor verwendet, weil ich dachte, dass dies der einfachste Weg wäre, um den Änderungsverlauf zu aktualisieren.
&begin_parameters
Dateipfadname,req
&end_parameters
!add_copyright &Datei&
&attach_input
!line_edit &file& -no_backup –no_verbose
l/Ende der Änderungshistorie/
-1
i
/* Geändert am 17.05.2010 von Paul Green zu … */
.
schreiben
aufhören
&detach_input
emacs &Datei&
&zurück
Dieses Makro fügt die Copyright-Informationen hinzu (oder aktualisiert sie), fügt die Zeile mit dem Änderungsverlauf direkt vor dem Kommentar ein, mit dem wir das Ende des Abschnitts mit dem Änderungsverlauf markieren, und ruft dann Emacs auf, damit ich manuell die Stelle finden kann, an der die Anweisung %include hinzugefügt werden soll.
Ich habe jetzt zwei Befehlsmakros: „fixup_all.cm” und „fixup.cm”. Das erste ruft das zweite einmal für jede Datei auf, die geändert werden muss. Dann startete ich meine Marathon-Bearbeitungssitzung, indem ich „fixup_all” eingab, und alles, was ich tun musste, war, die Stelle zu finden, an der die #include-Anweisung eingefügt werden sollte, „^Z-i” einzugeben, die Datei zu schreiben und zu beenden. Die Makros erledigten den Rest der Arbeit.
Selbst mit der Zeit, die ich für das Schreiben der Makros gebraucht habe, habe ich durch die Erstellung dieser Editor- und Befehlsmakros viel Zeit und Mühe (und wahrscheinlich auch einige Tippfehler) gespart. Außerdem wurde eine langweilige Aufgabe dadurch zu einer viel interessanteren Aufgabe.
Ich hoffe, diese Informationen sind für Sie nützlich. Das wäre alles für heute.
