Jak dołączyć do co drugiej linii w Vimie?

28

Chciałbym dołączyć wiele (~ 1000) linii, ale tylko co dziwne z następną. Ręcznie mogłem zrobić

Jj

500 razy i zrób to. Jak jednak wykonać te dwie instrukcje 500 razy w jednym poleceniu? Pisanie na maszynie

500Jj

dołączy do następnych 500 linii, a następnie przejdzie w dół o jedną linię.

Przykład:

Mam:

a
b
c
d
e
f
g
h

Chcę:

a b
c d
e f
g h

Edycja: Próbowałem mapowania:

:map X Jj
500X

ale najwyraźniej powinienem ponownie przeczytać dokumentację dotyczącą mapowania. Nie działa

Boldewyn
źródło

Odpowiedzi:

30

zrobiłbym to:

  1. rozpocznij rejestrowanie makra „q”: qqJjq

  2. powtórz makro „q” 500 razy: 500@q

(w rzeczywistości nie jest to makro o nazwie „q”, jest to nazwany rejestr o nazwie „q”. zamiast interaktywnie wypełniać ten rejestr jak w 1., możesz również zrobić, :let @q = "Jj"a następnie zrobić 2.)

akira
źródło
Fajnie, dziękuję za zapamiętanie makr dla mnie!
Boldewyn
:% normalnego J było bardzo szybkie i łatwe (patrz 2. najlepsze rozwiązanie poniżej) ... w porównaniu do tego rozwiązania makr działającego na ponad 50 000 linii
ihightower 14.07.16
@hightower, dlatego też głosowałem za tą odpowiedzią. 6 lat temu :)
akira
@akira twoje makro właśnie uratowało mi dzień, ponieważ potrzebowałem właśnie tego rozwiązania makr do innych celów.
ihightower
24

Aby to zrobić w każdej linii pliku:

:%normal J

lub krócej:

:%norm J

Aby to zrobić tylko na części pliku, zaznacz linie za pomocą Vlub uzyskaj zakres w inny sposób:

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

lub krócej:

:'<,'>g/^/norm J
Kevin Panko
źródło
Kevin chce uruchomić dwa polecenia na każdym pliku, nie tylko jedno.
JNK
1
wykorzystanie :godpowiedzi wymaga PO.
Luc Hermitte
2
To rzeczywiście dołączy co drugą linię. Spróbuj!
Kevin Panko
Dzięki za globalpodstęp. W moim przypadku nagrywanie makra było łatwiejsze i szybsze.
Boldewyn
2
Tylko zgadnij - wykonuje polecenie na każdej linii w kolejności, a po wykonaniu pierwszej linii druga linia już nie ma (została połączona z pierwszą linią), więc jest zmuszona przejść do trzeciej linii.
Kevin Panko
9

A co z tym:

:g/$/j  

lub

:g/$/j!  

i grupuj co trzy linie

:g/$/j3 
Miro
źródło
1
To BARDZO fajne rozwiązanie Miro. Jest to nawet lepsze, ponieważ możesz użyć tego również w standardowym vi, chociaż, co dziwne, kiedy używasz końcowej liczby w SVR4.0 vi (jak w Solarisie) zamiast j3 tworząc 3 kolumny, to 4. (więc musisz użyć j2 do grupowania co 3 linie)
JohnGH
0

Możemy również grać z:

'<,'>g//s/.*\zs\n\ze.*/ /
Luc Hermitte
źródło
-1

Nie jestem użytkownikiem Vima, ale sprawdzam, jak wygląda dokumentacja online

500(Jj) 

może działać, ponieważ analizuje elementy wewnątrz nawiasów jako jednostkę.

JNK
źródło
Hm, dzięki za próbę, ale w mojej wersji Vim po prostu ignoruje nawiasy. Czy możesz mi powiedzieć link, w którym znalazłeś tę składnię?
Boldewyn
1
vimdoc.sourceforge.net/htmldoc/syntax.html - Przepraszamy, to nie pomogło!
JNK
Właściwie sprawdź ten link: vim.org/scripts/script.php?script_id=2136 i sprawdź, czy to spełni twoje oczekiwania.
JNK