web-dev-qa-db-de.com

vi - wie wird eine nummerfolge generiert?

Gibt es eine Möglichkeit, eine Zahlenfolge in vi (m) zu generieren? 

Beispiel: Von einer zufälligen Zeile in einer Datei (in vim geöffnet) sagen Sie Row-i - zu einer zufälligen Zeile, beispielsweise Row-j, wobei Row-i <Row-j eine Möglichkeit ist, eine Zahlenfolge aus Row zu erzeugen -i bis Zeile-j beginnend mit der Nummer 1 bis der Nummer j-i + 1 mit Schrittschritt als 1?

Angenommen, ich habe die folgenden Zeilen in einer Datei.

this is line #1
this is line #2
this is line #3
this is line #4
this is line #5
this is line #6
this is line #7
this is line #8
this is line #9
this is line #10

Ich möchte die Nummernfolge von Zeile 4 bis Zeile 8 voranstellen, beginnend mit Nummer 1 bis Nummer 5. Nach der Operation sollte die folgende Datei wie folgt aussehen:

this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #10

Gibt es eine Möglichkeit, die Schrittzahl zu erhöhen, wenn dies möglich ist? Zum Beispiel sollte die Sequenz 2, 4, 6, 8, 10 sein, d. h. mit Schrittzahl 2. 

Bitte beachten Sie: 

Dieser SO Beitrag ist ähnlich, aber nicht gleich.

39

Wybierz kilka linii za pomocąV(Shift-v), ein następnie wpisz polecenie poniżej:

:let i=1 | '<,'>g/^/ s//\=i . " "/ | let i+=2

Wpisz :help sub-replace-expression, aby przeczytać więcej.

46
kev

Anstelle eines komplizierten Konstrukts können Sie auch einfach ein Makro mit dem Befehl verwenden CTRL-a Funktion zum Erhöhen einer führenden Nummer. Beispieldaten:

aaa
bbb
ccc

geben Sie zuerst eine Startnummer ein nd ein Leerzeichen:

1 aaa
bbb
ccc

zeichnen Sie dann dieses Makro in Zeile 1 auf (<C-a> bedeutet drücken Sie CTRL-a):

qq0yf 0j0P0<C-a>q

Erläuterung:

  1. qq: Makro in Register aufnehmen q
  2. 0: gehe zur ersten Spalte.
  3. yf: Ziehen Sie alles bis einschließlich des ersten Leerzeichens (denken Sie daran, dass Ihre erste Zeile 1 und ein Leerzeichen enthält).
  4. 0jP: Gehen Sie nach unten und fügen Sie das Muster am Anfang der Zeile ein.
  5. 0<C-a>: Gehe zur ersten Spalte und erhöhe die Zahl um eins.
  6. q: Makroaufzeichnung beenden.

das gibt:

1 aaa
2 bbb
ccc

jetzt können Sie dieses Makro mit @q so lange anwenden, wie Sie möchten. Wenn Sie eine Erhöhung von zwei benötigen, verwenden Sie einfach CTRL-aCTRL-a statt nur einmal. Jetzt können Sie dieses Makro auf aufeinanderfolgende Zeilen anwenden, zum Beispiel:

:.,$norm @q

fügt führende Zeilennummern für den Rest Ihrer Datei hinzu.

27
hochl

Mit Vim 8.0 kann man verwenden g Ctrl-a, siehe :help v_g_CTRL-A

Gehe zu Zeile 4 und benutze Ctrl-v Um das erste Zeichen blockweise auszuwählen, drücken Sie Shift i, gib 1 ein (das ist 1, gefolgt von Space) und Esc um den Einfügemodus zu verlassen. Das Ergebnis sieht dann so aus:

this is line #1
this is line #2
this is line #3
1 this is line #4
1 this is line #5
1 this is line #6
1 this is line #7
1 this is line #8
this is line #9
this is line #10

Verwenden Sie nun ab Zeile 5 Ctrl-v erneut, um alle eingefügten 1 außer dem ersten auszuwählen. Drücken Sie g Ctrl-a um eine Sequenz zu erstellen.

this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5                                                                     
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #1

Benutzen 2g Ctrl-a eine Schrittzahl von 2 verwenden.


Inspiriert vom Benutzer soulthym : Sie können einige Tastenanschläge speichern, indem Sie die visuelle Auswahl in Zeile 8 starten. Wählen Sie das erste Zeichen aus, geben Sie den 1 ein und drücken Sie gv Um die vorherige visuelle Auswahl erneut anzuwenden, drücken Sie j um die erste 1 auszulassen und drücken Sie g Ctrl-a um eine Sequenz zu erstellen.

18
rkta
:4,8s/^/\=line(".")-3." "    

wird tun was du willst

wenn du count = 2 brauchst:

:4,8s/^/\=2*(line(".")-3)." " 

dadurch erhalten Sie 2,4,6,8,10

zeilennummern sind in meinem Beispiel hart codiert. Sie können mit V die Zeilen auswählen, die Sie ändern möchten.

9
Kent

Wählen Sie die Zielzeilen im visuellen Modus aus und führen Sie den Ex-Befehl aus

:'<,'>s/^/\=(line('.')-line("'<")+1).' '
2
ib.

Hier ist ein schmutziger Trick, aber dann setzt sich das Leben daraus zusammen. :)

ESC :r! for i in $(seq 1 10); do echo "This is line \#${i}"; done

Nicht plattformübergreifend. 

1
Noufal Ibrahim

Das Nexus plugin enthält den Series-Typ und ein Objekt (s1) dieses Typs, das folgendermaßen verwendet wird:

:4,8s/^/\=s1.next().' '/

Nexus enthält auch ein s0 Series-Objekt, das als erstes .next () - Ergebnis 0 ergibt. Sowohl s0 als auch s1 verwenden ein schrittweises Inkrement. Alle Series-Objekte verfügen über eine .reset () -Methode, die sie auf ihren initiierten Wert zurückstellt. Neue Serienobjekte können wie folgt erstellt werden:

let s2 = Series(0, 2)

dadurch wird ein Objekt in 2 Schritten erstellt, das Ihrer zweiten Anforderung entspricht (2, 4, 6, 8 ...).

1
dahu

Ich denke, dass alle vorgeschlagenen Lösungen zu schwer zu merken sind. Sie können sie einmal verwenden, müssen dann jedoch bei jeder Verwendung alle Details beschreiben (wenn Sie sie weniger als einmal täglich verwenden).

Ich fand das visuelle Inkrementierungsskript sehr einfach zu installieren und zu verwenden. Nach der Installation in vim müssen Sie nur eine Spalte von 0 generieren, diese mit Strg-V auswählen und den Befehl schreiben: I. Es werden dann automatisch steigende Zahlen in jeder Zeile generiert. Es gibt auch andere Funktionen:

  • beginnen Sie mit einer anderen Zahl als 0
  • linke oder rechte Pad-Nummern mit 0 (wie 001, ..., 015)
  • abnehmende oder steigende Zahlen
  • um mehr als 1 erhöhen
  • datumsangaben (aber Sie benötigen ein zusätzliches Plugin), Buchstaben des Alphabets, Tagesnamen

Dies löst ein allgemeineres Problem, da es auch an einer anderen Position als Spalte 0 funktioniert. Die Spalte muss nur mit Strg-V auswählbar sein.

Der Vimball des Plugins ist hier oder hier .

1
Gismo Ranas

(Wenn Ihr vim Perl-Unterstützung hat - standardmäßig in vielen Linux-Distributionen): Wählen Sie die Zeilen im visuellen Modus (V) aus und bestätigen Sie

:perldo s/^/++$z . " "/e
0
JJoao