Wie erzeuge ich mit Vim bzw. gVim das Steuerungszeichen ^M (Return) im Ersetzen-Modus


dieweltist

Grünschnabel
Seit einiger Zeit versuche ich mich in die Bedienung des Texteditors Vim einzuarbeiten; insbesondere weiß ich schon, wie man mit diesem Editor ein Makro erstellt; dank dieser englischsprachigen Anleitung: Klick!.

Mit diesem Editor möchte ich ein Übersetzungsmakro erstellen, das mir Wort für Wort die wichtigsten englischen Wörter durch die entsprechenden deutschen Wörter ersetzt.

Nachdem ich schon eine ziemlich umfangreiche Datei fertiggestellt habe, muss jede dort angegebene Übersetzung in ein Makro umgeformt werden. Um das nicht manuell machen zu müssen, hatte ich die geniale Idee, dafür wiederum ein Makro zu erstellen, dass mir diese zeitaufwändige Arbeit abnehmen soll.

Mit dem Befehl "ap kann ich bspw. den Inhalt des Makros a in eine leere Zeile einfügen. Diesen Text kann ich dann weiterbearbeiten und mit dem Befehl "ay$ wieder zurück ins Makro a abspeichern.

Nur gibt es da ein großes Problem. Nachdem ich bspw. eine einfache Ersetzung als Makro aufgezeichnet habe, die am Schluss auch die Benutzung der Taste <Return> enthält, so ist letztere Aktion als blaues Steuerzeichen ^M dargestellt. Leider schlugen bisher alle Versuche fehl, durch einen Ersetzungsbefehl so ein blaues ^M zu erzeugen.

Ich kann zwar manuell mit 'Kopieren' und 'Einfügen' so eine blaue Zeichenfolge erzeugen, nicht aber mit einem Ersetzungsbefehl; was aber notwendig wäre, damit ich mit einem Makro den Text für ein Makro bearbeiten kann. Wenigstens habe ich aber inzwischen eine gute Notlösung gefunden, die ich im folgenden erklären möchte. Als Beispiel hier ein Auszug aus dem Ursprungstext:

Code:
adjusted - eingestellt/er/e/es/en, stellte/st/n/t ein, justiert/er/e/es/en/est/et
adjusting - einstellend/er/e/es/en, justierend/er/e/es/en
adjusts -  er/sie/es stellt ein, justiert
adjust - einstellen, stell/e/st/en/t ein, justier/en/e/st/t
Ein Makro hat bereits diesen Text teilweise umgewandelt in diese Form. Wie man sieht, kann man anstatt des Slash / auch fast jedes andere Zeichen verwenden. Ich habe mir eines erwählt, dass ich im Windows-Notepad mit <Alt> und einer drei bis vierstelligen Ziffer gebildet habe, in diesem Fall <Alt> 180.

Code:
:%s¦adjusted¦eingestellt/er/e/es/en, stellte/st/n/t ein, justiert/er/e/es/en/est/et¦g
:%s¦adjusting¦einstellend/er/e/es/en, justierend/er/e/es/en¦g
:%s¦adjusts¦er/sie/es stellt ein, justiert¦g
:%s¦adjust¦einstellen, stell/e/st/en/t ein, justier/en/e/st/t¦
Am Ende der Zeile soll dieses blaue ^M eingefügt werden. Danach müssen dann noch alle Zeilenumbrüche entfernt werden, indem mit der Ersetzen-Funktion alle \n gelöscht werden. Seltsam; beim Setzen von Returns muss \r verwendet werden. Sucht man sie aber, findet man sie nicht mit \r, sondern mit \n . Übrigens werde ich mit Makros noch eine ganze Reihe weiterer Umformungen machen; aber als Beispiel zur Demonstration reicht es erst mal. Auch werden die Makros am Schluss alle zu einem einzigen zusammengefasst.

  • Um dieses blaue ^M an jedes Ende der Zeilen anzufügen,
  • drücke erst mal <Esc> um sicherzustellen, dass Du Dich im Befehlsmodus befindest!
  • Gehe mit G ans Ende des Dokuments und eröffne eine neue Zeile mit o !
  • Dann drücke <Esc> um in den Befehls-Modus zurückzukehren!
  • Dann füge den Script-Text irgendeines Makros ein. Bspw. für das Makro a wäre das der Befehl "ap .

In dieser Zeile wird dann hoffentlich an irgendeiner Stelle so ein blaues ^M sein. Alle anderen Zeichen dieser Zeile löschen! Sollte noch kein Makro vorhanden sein, erstelle bspw. das Makro a mit qa (Aufzeichnung läuft), <Enter> und mit q die Aufzeichnung stoppen. Das ist ein Makro, dass nur diesen Return-Befehl <Enter> bzw. <Return> enthält. Anschließend kann man den Inhalt wie schon beschrieben in die letzte Zeile aus dem Makro-Register einfügen.

Man achte darauf, dass nur dieses blaue Steuerzeichen ^M als einziges Zeichen in der letzten Zeile ist. Dieses Zeichen muss dann für alle Zeit an dieser Position im Dokument bleiben, auch wenn dieses überarbeitet bzw. ergänzt wird. Wenn also dieses Steuerzeichen ^M ganz am Ende des Dokuments ist, wird der Teil des Makros, es soll in diesem Fall das Makro mit der Bezeichnung a sein, um am Ende jeder Zeile dieses Steuerzeichen einzufügen, so erzeugt:

  • Drücke <Esc> um sicherzustellen, dass Du Dich im Befehlsmodus befindest!
  • Bewege den Cursor mit gg an den Anfang des Dokuments!
  • Starte die Videoaufzeichnung mit qa !
  • Gehe mit G ans Ende des Dokuments!
  • Gehe mit v in den Visual-Modus!
  • Gehe mit (klein) l einen Schritt nach rechts und markiere dadurch das blaue Steuerzeichen!
  • Kopiere mit y dieses Steuerzeichen in das Vim-Register!
  • Suche mit dem Befehl /g$ <Return> (bzw. <Enter>) nach dem Buchstaben g, wenn er genau am Ende der Zeile ist!
  • Füge mit p das Steuerzeichen ^M ans Ende der Zeile an!
  • Drücke n (next) um zum nächsten kleinen g am Zeilenende zu springen und drücke wieder p, um erneut das blaue Steuerzeichen ^M einzufügen!

Wenn Du möchtest, kannst Du noch einige male abwechselnd n und p drücken, Du musst aber nicht so das gesamte Dokument durcharbeiten. Beende die Makroaufzeichnung mit q !

  • Eröffne an irgendeiner Position des Dokumentes eine leere Zeile mit o ! Diese Zeile wird nur vorübergehend gebraucht. Am zweckmäßigsten erstellst Du diese Zeile als vorletzte Zeile des Dokuments; es darf aber nicht die letzte sein, weil diese für das Steuerzeichen ^M reserviert ist.
  • Füge den Inhalt des Makros a in diese leere Zeile ein mit dem Befehl "ap ! Wie Du siehst, besteht der rechte Teil nur aus den jeweils abwechselnd folgenden Buchstaben n und p.
  • Kopiere diese abwechselnd aufeinanderfolgenden Buchstabenfolge (mit v und den Bewegungstasten h und l) und füge sie am Ende jeweils mit Dauerdruck von Taste p so oft wieder an, bis die Anzahl der Buchstaben p erheblich größer ist, als die Anzahl der Zeilen im Dokument, an die jeweils das Steuerzeichen angefügt werden soll. Schließlich könnte das Dokument in Zukunft noch erheblich umfangreicher werden.
  • Bewege dann den Cursor mit ^ an den Anfang der Zeile und ersetze den Inhalt des Makro-Registers a mit dem Befehl "ay$ oder "aY !

Übrigens wird der Inhalt des Makroregisters (a) beim ersten Befehl nur durch den Teil der Zeile von aktueller Cursorposition bis Zeilenende ersetzt; während der zweite stets die ganze Zeile ins Makroregister schreibt. Im zweiten Fall ist es also nicht unbedingt nötig mit ^ an den Zeilenanfang zu gehen. Dieses Makro kann nun zum Test mit <Alt Gr> @ ausgeführt werden.

Natürlich kann man es den anderen Makros anfügen, indem man jeweils alle Makros nacheinander auf die beschriebene Weise aus den jeweiligen Makro-Registern in eine leere Zeile einfügt und dann diese wie beschrieben als ganzes in ein Makro schreibt.

Übersichtlicher ist dieser Vorgang aber, indem man jedes Makro wie beschrieben mit "ap, "bp, "cp . . . u.s.w. jeweils in eine andere Leerzeile im Dokument einfügt. Nacheinander fügt man dann die Inhalte der Zeilen mit "NY in das Register ein, das in diesem Fall n ist. Der Registername als Großbuchstabe (in diesem Fall N) bewirkt also, dass der Inhalt zum bereits vorhandenen Registerinhalt n hinzugefügt wird.

Edit: Zumindest müsste es der englischsprachigen Anleitung zufolge so funktionieren; tut es aber nicht. Die einzelnen Zeilen werden zwar in das Makro-Register geschrieben; aber der Zeilenumbruch jeweils dazwischen bewirkt, dass nur die erste abgespeicherte Makrozeile funktioniert. Also muss man vorher alle Makrozeilen zu einer zusammenfassen, indem man die Zeilenumbrüche (nicht die Steuerzeichen ^M) entfernt; und diese Zeile dann komplett ins gewünschte Makroregister abspeichert.

Wird der Registername aber kleingeschrieben angegeben, wird jeweils der komplette Inhalt durch den neuen ersetzt. Das bedeutet also, dass (ggf.) die erste Zeile mit kleingeschriebenem Registernamen, in diesem Fall also mit "nY , in das Register n eingefügt werden soll, damit der ggf. zuvor vorhandene Inhalt dabei gelöscht wird.

Zusammenfassend möchte ich sagen, dass es meines bisherigen Erkenntnisstands zufolge anscheinend nicht möglich zu sein scheint, mit dem Ersetzungsbefehl :%s/altes Wort/neues Wort/g (% - für das gesamte Dokument und g für alle Treffer in der/den Zeilen) ein blaues Steuerzeichen in einen Text (automatisch) einzufügen. Statt dessen benutzte ich nur die Suchfunktion / mit anschließendem manuellen Einfügen des Steuerzeichens aus dem Vim-Speicher.

Diesen Vorgang als Makro abgespeichert, kann man dann leicht dieses Makro so bearbeiten, dass man eine beliebige Anzahl von Einfügungen realisieren kann. Auch hier kann man ein genaues Suchmuster mit regulären Ausdrücken angeben, wie diese insbesondere auf nachfolgender Webseite beschrieben sind. Dieses Suchmuster ist übrigens im obigen Fall so gemacht, dass es nicht möglich ist, dass der Prozess nach Erreichen des Dateiendes wieder von Anfang an beginnt und das gewünschte Zeichen doppelt eingefügt wird.

Übrigens kann man eine Makroaufzeichnung auch mit dem Befehl qN starten und dann diejenigen Vorgänge ausführen, die diesem Makro hinzugefügt werden sollen. Der bisherige Inhalt wird dabei nicht gelöscht; im Gegensatz dazu, wenn man den Makronamen klein schreibt.

2. Edit: Inzwischen habe ich dieses Problem gelöst. Im Befehlsmodus, wenn ich den Ersetzungsbefehl schreibe, füge ich mit <Strg> + V so ein blaues ^M einfach ein, das ich zuvor im Einfüge- oder Überschreibe-Modus kopierte. Wenn ich es cancele, indem ich davor ein Backslash \ setze, wird dann tatsächlich ein blaues ^M eingefügt.

Übrigens hatte ich jetzt das Problem, dass eine Makroausführung leider dann stoppt, wenn bei einem Ersetzungsbefehl das Suchmuster nicht gefunden wird. Dieses Problem kann man umgehen, indem man stattdessen die bedingte Ersetzung verwendet. Beispiel:

:g/der/s/die/das/g

Ersetze 'die' durch 'das' in jeder Zeile, in der sich das Wort 'der' befindet. Wenn es im gesamten Text das Wort 'der' nicht gibt; oder wenn es dieses in einer Zeile vorhanden ist, dort aber das Wort 'die' nicht existiert, gibt es trotzdem keine Meldung, dass das Wort nicht gefunden wurde, die ein Makro stoppen könnte. 2.Beispiel:

:v/der/s/die/das/g

Ersetze in jeder Zeile, in dem es das Wort 'der' nicht gibt; das Wort 'die' durch das Wort 'das'! 3. Beispiel:

:v/der/d

Lösche alle Zeilen, in das Wort 'der' nicht vorkommt! 4. Beispiel:

:g/der/d

Lösche alle Zeilen, in denen das Wort 'der' vorkommt!

3. Edit: Auf dieser Webseite: Klick! habe ich einen Tip gefunden, wie man die verschiedensten Zeichen, u.a. auch das Return-Zeichen, in einen Text einfügen kann. Nämlich mit :digraph alle verfügbaren Zeichen anzeigen lassen. Zur Einfügung in den Einfügemodus mit a oder i wechseln! Mit <Strg-K> bzw. <CTRL-K> (Fragezeichen erscheint) und der nachfolgenden Eingabe der entsprechenden Zeichenfolge wird das gewünschte Symbol eingefügt.

Symbole (außer Steuerzeichen) können auch so eingefügt werden:

<Alt> + Taste:
Þ±²³´µ¶·¸¹°ß´«üïéõúôòñæçêëìöä£*®¬íîâöãöãøù¼
´´ `
<Alt Gr> + Taste:
²³{[]}\~€@µ| @€~|µ

<Alt> + <Umschalt> + Taste:
°¡¢§¤¥¦¯¨©½¿ààÑÒÔÚÕÉÏܪÆÇÊËÌÖħ¾ÙØÃÖÂÎÍ»º

Siehe dazu auch diesen Thread meines (alten) Forums: Klick!
 
Zuletzt bearbeitet: