Ich habe eine Textdatei wie diese (mit gVim unter Windows)
foo bar baz quux
corge grault garply
waldo fred plugh
[...150 more lines...]
xyzzy thud
Ich möchte jeder Zeile in der Datei eine Nummer hinzufügen. Nicht verwenden :set number
, sondern wie folgt die Nummer als Text vor jeder Zeile einfügen, damit die Nummer Teil der Datei ist.
1. foo bar baz quux
2. corge grault garply
3. waldo fred plugh
[...~150 more lines...]
155. xyzzy thud
macro
text-generation
enumerate
roblogic
quelle
quelle
awk
ist wahrscheinlich das Werkzeug für diesen Job. Aber ich bin auf Windows (seufz).cat
oder zu vermeidennl
, die zwar Zahlenzeilen enthalten können, unter Windows jedoch nicht allgemein verfügbar sind (wie OP aus ihrem Kommentar zu hervorgehtawk
). Die beiden Top-Lösungen sind pure Vim. Schließlich sind alle Zeilen gegen einen Para nur eine Frage der Bereichsauswahl. Ganz klar kein großes Problem.Antworten:
In reiner Vim Mode:
Erläuterung:
Siehe
:help \=
und:help line()
.Die Verwendung eines Ausdrucks im Ersatzteil ist sehr mächtig und FWIW ein ziemlich guter Einstiegspunkt in Vimscript.
quelle
:help sub-replace-expression
Eine nette Sache an Vim-Makros ist, dass sie sich wiederverwenden können (sie können sich selbst aufrufen):
qqq
ggI1.
(Leerzeichen nicht vergessen!)0qq
yW
+P
0<c-a>
0
@q
.q
@@
Das Makro ruft sich dann selbst weiter auf, bis es das Ende der Datei erreicht.
Sie können den rekursiven Makrotrick auch für viele andere ähnliche Probleme verwenden.
Wenn Sie aus irgendeinem Grund kein rekursives Makro verwenden möchten, können Sie die Schritte 1 und 8 auslassen und einen Zähler verwenden , um das Makro mehrmals
100@q
auszuführen , z. B. wird das Makroq
100-mal ausgeführt.quelle
Ich verwende gerne den Befehl vim global, um solche Aufgaben zu erledigen. Dies gilt für das Hinzufügen einer Iteration am Anfang einer Zeile oder das Ändern eines Symbols im Text. Es sieht komplizierter aus als die anderen Lösungen, ist aber ein ziemlich flexibles Muster, das Sie verwenden können, wenn Sie es zur Hand haben, und lässt sich leicht ohne viel Nachdenken ändern.
Wählen Sie zunächst Ihren Bereich aus (welche Linien möchten Sie anwenden). Normalerweise verwende ich Markierungen (z. B.
ma
in der ersten undmb
in der zweiten Zeile , aber Sie können auch Zeilennummern oder eine visuelle Auswahl verwenden) und gebe dann eine Änderung des folgenden Befehls ein (derzeit für Ihren Anwendungsfall optimiert).Dekonstruktion
Dies setzt eine Variable
i
mit einem Startwert. Normalerweise beginnen Listen mit 1, also setze ich i auf 1.Die Leiste startet einen neuen Befehl
Dies legt den Bereich des nächsten Befehls fest. Ich gehe von Punkt
a
zu Punktb
, der in der ersten und letzten Zeile Ihrer Liste steht.Dies ist der globale Befehl. Es durchsucht die Datei (oder den Bereich) nach einem bestimmten regulären Ausdruck und führt den Rest der Befehlszeile in jeder der übereinstimmenden Zeilen aus. Ich passe jede Zeile an, indem ich nach "Zeilenanfang" suche. Wenn Sie Text mögen
und möchten diese Bezeichnungen nur vor
Item
die anderen Zeilen setzen und sie ignorieren,g/Item/
oderg/^Item/
stattdessen (unter der Annahme des wörtlichen Elementtexts)Dadurch wird der reguläre Ausdruck ausgeführt, um den Zeilenanfang durch den Wert von
i
Verkettet mit einem zu ersetzen.
. Im Allgemeinen können Sie dies für alle Fälle tun (ersetzen Sie beispielsweise das EtikettItem
durch die Nummer).Obwohl die Leiste einen neuen Befehl startet, richtet sie einen zweiten Befehl ein, der innerhalb des globalen Befehls ausgeführt wird, anstatt nach Abschluss des globalen Befehls. Das Ergebnis ist, dass wir inkrementieren,
i
bevor die nächste Zeile von g verarbeitet wird. Hier ist ein weiterer Ort der Flexibilität. Die Modifikation von i kann alles sein (inkrementiere um 2, rufe eine Funktion auf, die das nächste Element der Fibonacci-Sequenz erzeugt, was auch immer).quelle
Fügen Sie allen Zeilen Zahlen hinzu
Es können Befehle
:%!nl -ba
oder verwendet:%!cat -n
werden, die allen Zeilen Zeilennummern hinzufügen.Unter Windows muss Cygwin / MSYS / SUA installiert sein.
Hinzufügen von Zahlen zu ausgewählten Zeilen
Um Zahlen nur für ausgewählte Zeilen hinzuzufügen, wählen Sie diese im visuellen Modus ( vund mit Cursorn) aus. Führen Sie anschließend den folgenden Befehl aus:
:%!nl
(Leerzeilen ignorieren) oder:%!cat -n
(Leerzeilen eingeschlossen).Formatierung
Um zusätzliche Leerzeichen zu entfernen, markieren Sie sie im Sichtblock ( Ctrl+ v) und entfernen Sie sie ( x).
Um einige Zeichen (in
.
,:
,)
) nach den Zahlen, wählen Sie sie in der visuellen Block ( Ctrl+ v), dann fügen Sie die Zeichen ( Adie Zeichen eingeben, dann beenden Sie mit Esc).quelle
Eine Modifikation von Romainls Antwort :
Dadurch werden nicht nur Zeilennummern hinzugefügt , sondern auch vorhandene Zeilennummern ersetzt, sofern diese bereits vorhanden sind. Wenn Sie eine Zeile in der Mitte eingefügt haben, wird alles wie erwartet neu nummeriert.
Dies funktioniert, indem eine beliebige Zahl gefolgt von einem ersetzt wird. und ein Leerzeichen am Zeilenanfang mit einer neuen Nummer. Dies wird offensichtlich unterbrochen, wenn Sie eine Linie haben, die bereits mit diesem Muster beginnt. Verwenden Sie diese also mit Bedacht.
Der hinzugefügte Teil:
^
- Linienanfang\(
- Neue Untergruppe starten\d\+
- Passen Sie eine Ziffer einmal oder mehrmals an\.
- Ordne einen Punkt (
.
) und ein Leerzeichen zu.
\)
- Untergruppe beenden\?
- Machen Sie die Gruppe optional, damit es wie zuvor funktioniert, wenn in dieser Zeile noch keine Nummer steht.Bonus-Tipp:
Um die Zeilennummern zu entfernen , können Sie dasselbe Muster verwenden, wobei der Repalce-Teil leer bleibt:
quelle
Dadurch werden die ersten beiden Zeilen nummeriert, und Sie können drücken,
@q
um nachfolgende Zeilen zu nummerieren (oder beispielsweise eingeben,18@q
wenn Sie insgesamt 20 Zeilen nummerieren möchten).Erläuterung:
Dies hat den Vorteil, dass keine externen Befehle erforderlich sind. Dies ist hilfreich, wenn Sie beispielsweise mit Vim unter Windows arbeiten.
quelle
1. <esc>h
Sie sich in der zweiten Spalte, nicht in der ersten Spalte. Ich würde dash
mit ersetzen0
, wonach ich denke deine Lösung sollte sehr gut sein.^
auf ein zweites Zeichen, um Tastenkombinationen wie zuzulassen^a -> â
. Ich bin immer noch der Meinung, dass es die beste Lösung ist, aber ich denke, dies sollte auch erwähnt werden.Ich denke, die gewählte Antwort ist die beste, aber im Geiste der Vielfalt biete ich eine Alternative mit einem externen Programm an:
Dies filtert Ihren gesamten Puffer (wie durch gekennzeichnet
%
) durch das externe Programmcat
, wobei das-n
Flag jeder Eingabezeile eine Zeilennummer voranstellt.Dies setzt natürlich voraus, dass Sie
cat
installiert haben, was (wahrscheinlich) für alle Unix-ähnlichen Systeme gilt.Schauen Sie sich
:help :range!
für weitere Details zu den Filtern durch externe Programme.quelle
msysgit
und Ihrem PATH hinzugefügt haben (IIRC ist eine Installationsoption), sollte diese Lösung auch unter Windows funktionieren.cat -n
ist nicht POSIX,nl
ist es aber , daher ist es möglicherweise eine bessere Option.Eine etwas hackige Lösung könnte die folgende sein (alles, was zwischen <und> steht, muss nach dem Drücken von Ctrl+ eingefügt werden v):
Dekonstruktion
Führt den Normalmodus-Befehl in jeder durch den Bereich angegebenen Zeile aus, in diesem Fall in jeder Zeile
Leitet jede Ausgabe von ex-Befehlen in den unbenannten Puffer um.
ist ein ex-Befehl, der die aktuelle Zeilennummer ausgibt (leider mit vorangestelltem Zeilenumbruch)
beendet die Umleitung zum unbenannten Puffer
fügt den Inhalt des unbenannten Puffers mit einem ein. und einen Tabulator vor jeder Zeile, um den Einfügemodus zu verlassen.
Geht eine Zeile weiter und entfernt die neue Zeile, die das Ergebnis des Befehls:. = ist.
quelle