Wie verbinde ich jede zweite Zeile in Vim?

27

Ich würde gerne viele (~ 1000) Zeilen verbinden, aber nur jede ungerade mit der nächsten. Mit der Hand könnte ich tun

Jj

500 mal und habe es geschafft. Wie kann ich diese beiden Anweisungen jedoch 500-mal in einem einzigen Befehl ausführen? Tippen

500Jj

werden die nächsten 500 Zeilen verbinden und dann eine Zeile nach unten bewegt.

Beispiel:

Ich habe:

a
b
c
d
e
f
g
h

Ich möchte:

a b
c d
e f
g h

Edit: Ich habe versucht Mapping:

:map X Jj
500X

aber anscheinend sollte ich die mapping docs nochmal lesen. Funktioniert nicht

Boldewyn
quelle

Antworten:

30

ich würde das machen:

  1. starte die Aufnahme eines Makros 'q': qqJjq

  2. Spiel das Makro 'q' 500 mal ab: 500@q

(Eigentlich ist es kein Makro mit dem Namen 'q', sondern ein benanntes Register mit dem Namen 'q'. Anstatt dieses Register wie in 1. interaktiv zu füllen, können Sie auch 'q' ausführen :let @q = "Jj"und dann '2 ' ausführen. )

Akira
quelle
Cool, danke, dass du dir die Makros für mich gemerkt hast!
Boldewyn
:% normal J war sehr schnell und einfach (siehe 2. Top-Lösung unten) ... im Vergleich zu dieser
Makrolösung, die
@ihightower Deshalb habe ich diese Antwort auch positiv bewertet. Vor 6 Jahren :)
akira
@akira Ihr Makro hat gerade meinen Tag gerettet, da ich gerade diese Makrolösung für einen anderen Zweck brauchte.
Ihightower
24

Um dies in jeder Zeile der Datei zu tun:

:%normal J

oder kürzer:

:%norm J

Um dies nur für einen Teil der Datei zu tun, wählen Sie die Zeilen mit aus Voder rufen Sie einen Bereich auf eine andere Weise ab:

:'<,'>global/^/normal J

oder kürzer:

:'<,'>g/^/norm J
Kevin Panko
quelle
Kevin, er möchte zwei Befehle für jede Datei ausführen, nicht nur für eine.
JNK
1
die Verwendung von :gAntworten OP müssen.
Luc Hermitte
2
Dies wird in der Tat jede zweite Zeile verbinden. Versuch es!
Kevin Panko
Danke für den globalTrick. In meinem Fall war das Aufzeichnen des Makros jedoch einfacher und schneller.
Boldewyn
2
Nur eine Vermutung - es führt den Befehl in jeder Zeile der Reihe nach aus, und nachdem die erste Zeile ausgeführt wurde, ist die zweite Zeile jetzt weg (mit der ersten Zeile verbunden), sodass es gezwungen ist, in die dritte Zeile überzugehen.
Kevin Panko
8

Was ist damit:

:g/$/j  

oder

:g/$/j!  

und gruppiere alle drei Zeilen

:g/$/j3 
Miro
quelle
1
Dies ist eine sehr schöne Lösung, Miro. Es ist sogar noch besser, dass Sie dies auch in Standard vi verwenden können, obwohl es seltsam ist, wenn Sie die nachgestellte Nummer in SVR4.0 vi (wie unter Solaris) verwenden, anstatt in j3 3 Spalten zu erstellen j2 dort für die Gruppierung alle 3 Zeilen)
JohnGH
0

Wir können auch spielen mit:

'<,'>g//s/.*\zs\n\ze.*/ /
Luc Hermitte
quelle
-1

Ich bin kein Benutzer von Vim, aber ich überprüfe die Online-Dokumente, wie es aussieht

500(Jj) 

funktioniert möglicherweise, da die in runden Klammern gesetzten Elemente als Einheit analysiert werden.

JNK
quelle
Hm, danke für den Versuch, aber in meiner Version ignoriert Vim nur die Klammern. Können Sie mir den Link nennen, unter dem Sie diese Syntax gefunden haben?
Boldewyn
1
vimdoc.sourceforge.net/htmldoc/syntax.html - Entschuldigung, es hat nicht geholfen!
JNK
Überprüfen Sie diesen Link tatsächlich: vim.org/scripts/script.php?script_id=2136 .
JNK