Table of Contents
Ein Mercurial-Log zerlegen
Ich möchte die Ausgabe von hg log zerlegen, so dass der Logeintrag jeder Revision in eine Datei geschrieben wird, deren Dateiname die Revisionsnummer aus dem Log ist.
Ein Beispiel für die Ausgabe von hg log:
changeset: 66:efc0519aae42 user: solar date: Mon Nov 21 18:04:55 2005 +0000 files: functions/string/strncpy.c description: Added test driver, fixed off-by-one bug. changeset: 65:1b840d800436 user: solar date: Sun Nov 20 17:25:25 2005 +0000 files: functions/string/memset.c description: Added test driver.
Mit dem Cursor in der ersten Spalte der ersten Zeile:
qqqum das Makro 'q' zu leeren.qqum das Makro 'q' aufzunehmen.Wum zum Anfang des nächsten WORTS zu springen (hier: die6von65:1b840d800436).<Strg>-vfür zeichenweise visuelle Selektion./:<Eingabe>um zum Doppelpunkt zu springen.hum ein Zeichen zurück zu gehen.yum die Selektion in den Zwischenspeicher zu holen.0um zum Zeilenanfang zurück zu springen. (Nicht wirklich notwendig, aber…)<Umschalt>-vfür zeilenweise visuelle Selektion./^changeset:<Eingabe>um zur nächsten Zeile zu springen, die mitchangeset:anfängt. (Damit sind aber die zwei Leerzeilen mit markiert…)?^[^\n]<Eingabe>um rückwärts zur ersten Zeile zu springen, die nicht leer ist.:um auf die Selektion einen Befehl auszuführen.wfür “write”, das Schreiben des Bereichs in eine Datei.<Strg>-r“<Eingabe>um den Inhalt des Zwischenspeichers auf die Kommandozeile zu schreiben./^changeset:<Eingabe>um zur nächsten Zeile zu springen, die mitchangeset:anfängt.@qum das Makro 'q' rekursiv aufzurufen.qum das Aufzeichnen des Makro 'q' zu beenden.@qum das Makro 'q' auszuführen.
HTML-Auszeichnung für Unicode Charakternamen
In einem umfangreichen HTML-Dokument stehen Unicode-Charakternamen der folgenden Form:
Das Zeichen U+00A0 no-break space sollte im Allgemeinen...
Der Charaktername (hier: “no-break space”) soll durch ein <span>-Element in Kapitälchen gesetzt werden. Allerdings gibt es in dem Dokument tausende unterschiedlicher Charakternamen unterschiedlicher Längen. Manchmal steht zwischen dem Code Point (hier: U+00A0) und dem Charakternamen noch das entsprechende Zeichen; dieses soll nicht mit in das <span>-Element.
Hier war jede Menge Handarbeit gefragt, und ich wollte die Aufgabe mit so wenig Tastenanschlägen wie möglich erledigen. Also habe ich mir zwei Makros und fünf Tastaturmappings angelegt.
Die beiden Makros, ausgehend von einer Cursorposition auf dem letzten Buchstaben des Charakternamens, zum Einfassen mit dem gewünschen HTML-Element, wobei das w-Makro das erste Element nach dem Code Point (das Zeichen selbst) ausläßt:
qqqqqa</span>, <Esc>,NWi<span class=“uname”>, <Esc>,/U+[0-9A-F]\{4,6\}, <Eingabe>,Weqqwqqwa</span>, <Esc>,N2Wi<span class=“uname”>, <Esc>,/U+[0-9A-F]\{4,6\}, <Eingabe>,Weq
Dann vier Tastaturbelegungen um das Ganze dann einfach durchführen zu können:
:map <F2> @q:map <F3> @w:map <F6> e(an das Ende des nächsten Worts springen –estattE, weil am Ende des Charakternamens z.B. auch ein Komma stehen kann):map <F7> bbe(zwei Worte zurück und dann zum Ende – ein “Rückgängig” für ein F6 zuviel):map <F8> nWe(zum Ende des ersten Wortes nach dem nächsten Code Point springen)
Source-Zeilen nach Vorlage sortieren
Ich habe (in meinem Projekt PDCLib) zwei Source-Dateien, die sich mit errno-Werten beschäftigen.
Datei 1:
{ /* No Error */ 0, (char *)"Success" },
{ /* EPERM */ 0, (char *)"EPERM (Operation not permitted)" },
{ /* ENOENT */ 0, (char *)"ENOENT (No such file or directory)" },
...
Datei 2:
case 0:
return errno_texts[0];
case E2BIG:
return errno_texts[1];
case EACCESS:
return errno_texts[2];
...
Jeweils für knapp 80 Einträge. Die Aufgabe ist, die Einträge in Datei 1 in dieselbe Sortierung wie in Datei 2 zu bringen.
Ich öffne beide Dateien in parallelen Fenstern, und füge nach dem Eintrag Success in Datei 1 eine Leerzeile ein. Dann bewege ich mich in Datei 2 auf case E2BIG:.
qqum das Makroqaufzunehmen.Wum übercaseaufE2BIGzu springen.<Strg>-vum zu markieren.eum auf das Ende vonE2BIGzu springen.yum den markierten Bereich ins Default-Register”zu holen.<Strg>-w<Strg>-wum zu Datei 1 zu wechseln./für Suchmodus.<Strg>-r“<Eingabe>um nach dem Inhalt von Register”zu suchen.ddum die Zeile auszuschneiden.{um einen Paragraphen zurück (zur eingefügten Leerzeile) zu springen.Pum die Zeile einzufügen.<Strg>-w<Strg>-wum zu Datei 2 zu wechseln.<Eingabe><Eingabe>um zum nächstencasezu kommen.qum die Makro-Aufnahme zu beenden.77@qum die nächsten 77 Einträge ebenfalls zu sortieren.
