User Tools

Site Tools


viki:beispiele

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).
  • <Strg>-v für zeichenweise visuelle Selektion.
  • /:<Eingabe> 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…)
  • <Umschalt>-v für zeilenweise visuelle Selektion.
  • /^changeset:<Eingabe> um zur nächsten Zeile zu springen, die mit changeset: 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.
  • w fü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 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 <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>, Weq
  • qwqqwa</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 – e statt E, 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:.

  • qq um das Makro q aufzunehmen.
  • W um über case auf E2BIG zu springen.
  • <Strg>-v um zu markieren.
  • e um auf das Ende von E2BIG zu springen.
  • y um den markierten Bereich ins Default-Register zu holen.
  • <Strg>-w <Strg>-w um zu Datei 1 zu wechseln.
  • / für Suchmodus.
  • <Strg>-r“<Eingabe> 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.
  • <Strg>-w <Strg>-w um zu Datei 2 zu wechseln.
  • <Eingabe><Eingabe> 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.
viki/beispiele.txt · Last modified: 2020/02/04 10:05 by solar