==== 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: * ''qqq'' um das Makro 'q' zu leeren. * ''qq'' um das Makro 'q' aufzunehmen. * ''W'' um zum Anfang des nächsten //WORTS// zu springen (hier: die ''6'' von ''65:1b840d800436''). * ''-v'' für zeichenweise visuelle Selektion. * ''/:'' um zum Doppelpunkt zu springen. * ''h'' um ein Zeichen zurück zu gehen. * ''y'' um die Selektion in den Zwischenspeicher zu holen. * ''0'' um zum Zeilenanfang zurück zu springen. (Nicht wirklich notwendig, aber...) * ''-v'' für zeilenweise visuelle Selektion. * ''/^changeset:'' um zur nächsten Zeile zu springen, die mit ''changeset:'' anfängt. (Damit sind aber die zwei Leerzeilen mit markiert...) * ''?^[^\n]'' um rückwärts zur ersten Zeile zu springen, die //nicht leer// ist. * '':'' um auf die Selektion einen Befehl auszuführen. * ''w'' für "write", das Schreiben des Bereichs in eine Datei. * '' -r"'' um den Inhalt des Zwischenspeichers auf die Kommandozeile zu schreiben. * ''/^changeset:'' um zur nächsten Zeile zu springen, die mit ''changeset:'' anfängt. * ''@q'' um das Makro 'q' rekursiv aufzurufen. * ''q'' um das Aufzeichnen des Makro 'q' zu beenden. * ''@q'' um 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 ''''-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 ''''-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'', , ''NWi'', , ''/U+[0-9A-F]\{4,6\}'', , ''Weq'' * ''qwqqwa'', , ''N2Wi'', , ''/U+[0-9A-F]\{4,6\}'', , ''Weq'' Dann vier Tastaturbelegungen um das Ganze dann einfach durchführen zu können: * '':map @q'' * '':map @w'' * '':map e'' (an das Ende des nächsten Worts springen -- ''e'' statt ''E'', weil am Ende des Charakternamens z.B. auch ein Komma stehen kann) * '':map bbe'' (zwei Worte zurück und dann zum Ende -- ein "Rückgängig" für ein F6 zuviel) * '':map 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:''. * ''qq'' um das Makro ''q'' aufzunehmen. * ''W'' um über ''case'' auf ''E2BIG'' zu springen. * ''-v'' um zu markieren. * ''e'' um auf das Ende von ''E2BIG'' zu springen. * ''y'' um den markierten Bereich ins Default-Register ''"'' zu holen. * ''-w'' ''-w'' um zu Datei 1 zu wechseln. * ''/'' für Suchmodus. * ''-r"'' um nach dem Inhalt von Register ''"'' zu suchen. * ''dd'' um die Zeile auszuschneiden. * ''{'' um einen Paragraphen zurück (zur eingefügten Leerzeile) zu springen. * ''P'' um die Zeile einzufügen. * ''-w'' ''-w'' um zu Datei 2 zu wechseln. * '''' um zum nächsten ''case'' zu kommen. * ''q'' um die Makro-Aufnahme zu beenden. * ''77@q'' um die nächsten 77 Einträge ebenfalls zu sortieren.