Ich möchte folgenden Text einfügen:
similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...
Ich weiß, dass ich den Text viele Male einfügen und dann die Ersetzung verwenden kann, um ein einzelnes Wort für jede Zeile zu ändern, aber ich finde diese Methode immer noch sehr unpraktisch.
Gibt es eine Möglichkeit, ein Wort oder eine Wortliste in einer "Variablen" zu speichern und diese Variable dann zu verwenden, um ähnlichen Text zu generieren?
BEARBEITEN Ich habe in der ursprünglichen Frage etwas Unklares gemacht. Tatsächlich versuche ich, einige sehr ähnliche Funktionsdefinitionen zu erstellen. wordA
wordB
Daher kann ... in jedem Textklon viele Male vorkommen und der Text kann viele Zeilen enthalten. Das Muster ist genau so:
similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...
(Text kann neue Zeilen enthalten und WortA, WortB ... kann viele Male existieren)
2. BEARBEITUNG Die Teile "ähnlich_text" können jedes Mal anders sein, wenn ich einen solchen Job mache. Daher ist es besser, die Lösung für diesen Job wiederverwendbar zu machen. Weil ich versuche, sehr ähnliche Funktionsdefinitionen oder eine Zeichenfolge zur Funktionszuordnungstabelle zu erstellen.
Nach dem Lesen von Antworten und einigen Übungen finde ich es bequemer, diesen Job als eine Art Substitution zu betrachten, da es schwierig ist, separate "part1", "part2" ... "partN" zu schreiben, die möglicherweise Zeilenumbrüche enthalten. Schreiben Sie also eine Vorlage zuerst:
similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )
Dann ist der Versuch, Klone des Textes zu platzieren, aber $ WORD durch eine Liste von Wörtern zu ersetzen, klarer.
Mein Problem scheint sich also dahingehend geändert zu haben, "wie man einen Textblock viele Male klont, aber jedes Mal, indem man ein Schlüsselwort darin durch ein Wort aus einer Liste ersetzt".
quelle
Antworten:
Sie können die folgende Funktion verwenden:
Geben Sie in die Variablen
firstpart
undsecondpart
den Text, der vor und nach den Wörtern wiederholt werden soll, und in die Listewords
die Wörter ein, die sich ändern sollen.Dann erstellt die Schleife den Inhalt der Zeile für jedes Wort der Liste, fügt die Zeile in den Puffer ein und wechselt zu dieser neuen Zeile.
Sie können dann einfach die Funktion aufrufen :
call GenerateLines()
.Bearbeiten Um die Manipulation zu vereinfachen, können Sie die verschiedenen Teile auch als Argumente übergeben. Die Funktion sollte folgendermaßen aussehen:
Und Sie können es so nennen:
quelle
call map(a:words, 'a:firstpart . v:val . a:secondpart')
und vermeidencall append(line('.'), a:words)
.Meine Strategie in solchen Fällen variiert, folgt jedoch häufig den folgenden Schritten:
Schreiben Sie die eindeutigen Wörter, z
Entweder
a) Suchen und Ersetzen, z
b) oder verwenden Sie den visuellen Blockmodus, siehe
:h blockwise-visual
. Insbesondere werde ich die Wörter auswählen und verwendenI
, um ähnlichen Text vorne einzufügen oderA
ähnlichen Text danach anzuhängen.Ich würde argumentieren, dass diese Strategie sinnvoll ist, wenn Sie diese Art von Bearbeitungsaufgabe relativ selten ausführen. Wenn Sie jedoch feststellen, dass Sie dies häufig tun müssen, sollten Sie dem Vorschlag von @ statox mit einer Funktion folgen, die die Liste der Wörter erweitert.
quelle
:read
ist es sehr sinnvoll , gefolgt von Ihrer Ersetzung.Ich werde argumentieren, dass dies ein Job für den visuellen Block ist ( Ctrl+ v). Zuerst würde ich alle unterschiedlichen Wörter schreiben:
Beginnend mit dem Cursor auf dem ersten
w
würde ich dann ausführen:Ich kann steuern, wie viele Spalten ich benötige, indem ich
A <esc>p
so oft drücke, wie ich möchte. Nehmen wir an, ich brauchte drei Spalten, wie der obige Befehl zeigt. Jetzt haben wir folgendes:Und der Cursor steht am Anfang des 3.
wordA
in der ersten Zeile. Als nächstes würde ich die Auswahl der Leerzeichen-Spalte zwischen den rückwärts gehenden Spalten blockieren und den dazwischen liegenden Text hinzufügen. Von der aktuellen Cursorposition:Dies führt zu (das% markiert die Cursorposition):
Wiederholen Sie dies für die nächste Spalte:
Und die letzte / erste Spalte (die auf der linken Seite):
Schließlich ergibt sich:
Update: Screencast hinzugefügt
Dies scheint viel Tippen zu sein, aber es ist eigentlich sehr einfach, sich daran zu gewöhnen. Sie haben die Freiheit, die Anzahl der Wörter, die Anzahl der Spalten und sogar den Abstand zwischen den Spalten zu ändern.
Der Nachteil ist, dass Sie die Anzahl der verwendeten Wörter kennen müssen . Ich habe
5
in allen obigen Befehlen eine feste Codierung, da dies die Anzahl der Zeilen ist, mit denen die Befehle ausgeführt werden.Hinweis zum Debuggen: Alle Befehle beginnen und enden im normalen Modus. Wenn Sie sich am Ende eines Befehls im visuellen Modus oder im Einfügemodus befinden, machen Sie etwas falsch.
quelle