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

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. )


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, 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 

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


-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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.