Wie kann ich eine Liste von fortlaufenden Nummern erstellen, eine pro Zeile?

38

Wie kann ich ausgehend von einer leeren Tafel ein Dokument erhalten, das Folgendes enthält?

1
2
3
4
5
6
7
8
9
10
…
100

Ich möchte nicht, dass diese Zahlen am Rand angezeigt werden. Ich möchte, dass sie in das Dokument selbst eingefügt werden.

200_erfolg
quelle

Antworten:

51

Verwenden :putund range():

:put =range(1,100)

Um die Leerzeile oben zu vermeiden ( Kudos zu Romainl ), verwenden Sie :0put:

:0put =range(1,100)
Rückgängig machen
quelle
1
Oder im Einfügemodus mit <C-r>=range(1,100).
Hotschke
18

Zusätzlich zu Undos pure-vim :put =range(1,100)(was Sie tatsächlich mit einem leeren Zeilenumbruch belässt) können Sie abhängig von Ihrem Betriebssystem einen seiner Befehle verwenden. ZB auf einer Unix / Linux-Box:

%!seq 1 100

Das obige funktioniert, indem der gesamte (leere) Puffer an weitergeleitet wird seq, der seine Eingabe ignoriert und nur die Zahlen 1 bis 100 ausgibt. Vim ersetzt dann den gesamten Puffer durch seqdie Ausgabe des Puffers .

Dies ist nützlich, wenn Sie bereits mit einer Befehlszeilenmethode vertraut sind, mit der Sie das Gewünschte erreichen können.

derobert
quelle
Dies "entlarvt" die Frage, weshalb ich denke, dass es besser ist als die akzeptierte. Ja, Sie können vim dazu bringen, die Arbeit zu erledigen, genauso wie Sie einen Gabelschlüssel zum Rühren der Suppe verwenden können. Vim ist ein Texteditor, kein beliebiger Textgenerator. Dafür gibt es viel offensichtlichere Werkzeuge.
msw
16

Für die Aufzeichnung und definitiv nicht der kürzeste Weg (siehe @ Undos großartige Lösung), aber eine Folge von Tastenanschlägen wird es auch tun:

i1EscqaYpCtrl+aq98@a

Lassen Sie mich das für Sie aufschlüsseln:

  1. i1<Esc> - Geben Sie die Nummer 1 ein und kehren Sie in den Befehlsmodus zurück
  2. qa - Aufzeichnung eines Makros im Register "a" starten
  3. Y - kopiere die aktuelle Zeile
  4. p - füge die aktuelle Zeile ein (der Cursor bewegt sich auch auf die eingefügte Zeile)
  5. <Ctrl>a - Inkrementiere die nächste Zahl in der Zeile und mache es 2
  6. q - Aufzeichnung des Makros beenden (war Register "a")
  7. 98@a - Das Makro in Register "a" 98 mal abspielen
Hör auf, Monica weiter zu schaden
quelle
4

Hier ist ein anderer Ansatz, der ein neueres Vim benötigt (so etwas wie 7.4.800)

Dies setzt einen leeren Puffer und '1' in Register a voraus. Geben Sie zuerst 100 1 in Ihren Puffer ein "a100P.

Wählen Sie dann visuell die Zeilen 2 bis 100 aus :2EnterVG.

Drücken Sie jetzt gCtrl+ A.

Lesen Sie die Hilfe unter :h v_g_CTRL-A

Christian Brabandt
quelle
Sie müssen let @ a = "1" in Ihre Antwort einfügen. Anfänger könnten stecken bleiben, um herauszufinden, wie Wert 1 in Register a gespeichert wird.
SibiCoder
Ich habe die Strg + A-Kombination in anderen ähnlichen Lösungen gesehen. Ich konnte jedoch keine Erklärung dafür finden, was es tut / wie es funktioniert. Haben Sie einen Verweis in der Dokumentation, der erklärt, was g tut? Vielen Dank! Wenn ich eine Erklärung finde, werde ich sie posten.
CodingFoo
1
Dokumentation ist um:h g_CTRL-A
Christian Brabandt
Ich hatte den Link zum Abschnitt v_g_CTRL-A verpasst.
CodingFoo
2

Ich weiß, diese Frage ist wirklich alt, aber es gibt auch eine andere Möglichkeit, dies zu tun. Versuche dies:

99o<esc>:%s/^/\=line('.')<cr>

99o<esc>öffnet nur 100 Leerzeilen. Dann führen wir einen Ersatzbefehl aus:

:%                  " On every line
  s/                " substitute
    ^/              " the start of the line. (This will always match no matter what)
      \=            " Evaluate:
        line('.')   " The current line.
DJMcMayhem
quelle