Łącz linie w akapitach w vimie

13

Załóżmy, że wpisałeś długi dokument w vimie z automatycznym dzieleniem linii, więc wszystkie linie zostały podzielone na, powiedzmy, 79 znaków. Możliwe, że nawet zastosowałeś formatowanie do całego dokumentu, aby przerwać wszystkie linie na tej długości.

Akapity są oznaczone w dokumencie pustymi wierszami.

Teraz decydujesz, że wcale nie chcesz łamania linii w akapitach.

Jak usunąć wszystkie podziały wierszy w akapitach bez całkowitego wyeliminowania granic akapitów?

Zrobiłem ten szybki i idiotyczny hack, ale szukam właściwego sposobu.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks
dggoldst
źródło
hej, nie pukaj go, jeśli twoje rozwiązanie działa, a twoje rozwiązanie działa.
pdwalker

Odpowiedzi:

12

Myślę, że robi to, co chcesz: upewnij się, że na końcu pliku jest pusta linia, a następnie dołącz każdy akapit (zakończony pustą linią).

G:a

.
:g/^./ .,/^$/-1 join

Objaśnienie: najpierw przejdź do końca pliku i dodaj dodatkową pustą linię :a(być może jest to bardziej elegancki sposób; interaktywnie możesz zastąpić pierwsze trzy linie o<ESC>). Następnie dla każdego niepustego wiersza, który nie został jeszcze rozważony ( :g/^./), zastosuj joinpolecenie do zakresu, zaczynając od wybranej linii ( .) i kończąc jeden wiersz przed następnym pustym wierszem ( /^$/-1).

Opcjonalnie, :g/^$/djeśli nie chcesz, aby pozostała pusta linia (możesz ją zdjąć -1).

Gilles „SO- przestań być zły”
źródło
Dzięki. Zbliża się do mnie, jednak usuwa puste linie między akapitami. (Próbowałem Unix fileformat i dos, aby zobaczyć, czy to Windows.) Czy mógłbyś też trochę przetłumaczyć polecenia? G przechodzi do ostatniej linii. : według pomocy jest „dołącz”, ale nie jestem pewien, co to robi. Zgubiłem też g / pattern / cmd, który tam masz. Jakie jest polecenie?
dggoldst
@dggoldst: Zmieniłem polecenie, aby zachować puste wiersze. Pierwsze trzy wiersze służą tylko do dodania pustej linii na końcu pliku (w przeciwnym razie ostatni akapit nie zostanie dopasowany). Ostatnie polecenie to :g, które stosuje polecenie do wszystkich pasujących linii; zobacz :help :gi być może ten wątek o tym, jak się :gzachowuje po usunięciu podziałów linii .
Gilles „SO - przestań być zły”
:$pu _ na końcu umieść rejestr czarnej dziury, co powoduje powstanie pustej linii na końcu.
SergioAraujo
12

To powinno to zrobić:

:set tw=99999
gggqG

twjest ustawiony na wartość co najmniej tak dużą, jak liczba znaków w najdłuższym akapicie. ggprzesuwa kursor do pierwszego wiersza; gqto polecenie przeformatowania; Gprzesuwa kursor do ostatniego wiersza, mówiąc gqo ponownym sformatowaniu z bieżącego położenia kursora do ostatniego wiersza.

garyjohn
źródło
5
  1. Ustaw kursor w żądanym akapicie

  2. Rodzaj: vipJ

( vippodświetla bieżący akapit, Jłączy wszystkie linie)

Juan
źródło
2

Może nie jest to najczystszy sposób, aby to zrobić, ale oto, czego bym użył:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

( Działa w VIM 7.2. )

W zależności od tego, w jaki sposób akapity zostały podzielone, gdy były pierwotnie sformatowane, możesz zastąpić gJpolecenie (łączenie bez spacji) Jpoleceniem (łączenie ze spacjami).

Dowolna 999liczba musi być co najmniej liczbą akapitów w pliku - możesz wybrać większą liczbę, jeśli chcesz i stracić tylko cykle procesora. Zakładając jedną i tylko jedną pustą linię między akapitami, możesz uzyskać dokładniejszą liczbę akapitów, używając:

:%s/^$//gn     # returns "999 matches on 999 lines"
goldPseudo
źródło
To działa dla mnie. Dobrze byłoby dodać „gg” na początku, aby umieścić kursor na górze pliku. Ponadto użycie J zamiast gJ nie powoduje, że oddzielne słowa łączą się w jedno. Może tak być tylko w przypadku moich wartości „formatoptions”, które mnie obecnie zastanawiają.
dggoldst 18.10.10