W VIM, jak podzielić jedną naprawdę długą linię na wiele linii?

169

Powiedzmy, że mam bardzo długą linię w edytorze VIM (powiedzmy około 300+ znaków). Jak rozbiłbym to na wiele wierszy, tak aby granice słów z grubsza przekraczały 80 znaków?

Przykład:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

do

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...
Jordan Parmer
źródło

Odpowiedzi:

254

Vim robi to bardzo łatwo (łamanie linii na granicach słów).

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

Proponuję sprawdzić :help gqi :help gw.

Również ustawienie textwidth ( tw) spowoduje automatyczne łamanie linii, gdy zostanie przekroczone podczas pisania. Jest również używany w programie gq, ale jeśli wyłączone gqpowoduje przerwanie rozmiaru okna lub 79 w zależności od tego, co nastąpi wcześniej.

:set tw=80

Ustawiając opcje formatu tak, aby zawierały szerokość tekstu, vim automatycznie przerwie przy ustawieniu tw.

:set fo+=t
he_the_great
źródło
5
Tak więc w twoim przypadku gqpolecenie byłoby <ESC>(wyjdź z trybu Insert / Replace / etc), a następniegq80l
MidnightLightning
6
Jest to przeciwieństwo Ctrl + j (łączy wiele linii w jedną).
Yzmir Ramirez
9
Vim nigdy nie przestaje mnie zadziwiać. To jest czyste złoto.
Jondlm
10
tylko dla następnej osoby, która to znajdzie, gq tylko nie podzieli wiersza pełnego tekstu, potrzebuje spacji, aby zrobić swoje
stringy05
2
[biegnie gqq] aaaahhh, jest piękny
underscore_d
85

Najpierw ustaw vim tak, aby zrozumiał, że potrzebujesz 80 znaków:

:set tw=80

następnie podświetlić linię:

V

i przeformatuj vim:

gq

źródło
17

Nie jest to tak naprawdę związane z VIM-em, ale możesz użyć programu fmt jak w

$ fmt myfile
Wernsey
źródło
38
:%! fmt% "Może sprawić, że będzie to związane z
vimem
2
Przydatne dla vi, chociaż wolałbym gqq na vimie.
WhyNotHugo
13

W przypadku ciągłych linii tekstu zaznacz obszar za pomocą v w trybie normalnym, a następnie naciśnij

:s/\v(.{80})/\1\r/g

Spowoduje to dodanie nowej linii na końcu każdego 80-tego znaku.

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline
wędzony
źródło
To jedyne rozwiązanie, które działało w przypadku długiego ciągu base64.
jviotti
6

Jeśli korzystasz z * nix, prawdopodobnie masz folddostępne.

Wybierz region, którego chcesz użyć v, a następnie możesz rozbić spacje o szerokości 80 za pomocą:

!fold --spaces --width=80

Zasadniczo jest to to samo, co używanie gq.

Jeśli jednak chcesz po prostu przerwać znak 80 i nie ograniczać się do białych znaków, możesz użyć:

!fold --width=80

Jeśli chcesz to jednym naciśnięciem klawisza, po prostu ustaw mapowanie - użyłem

vmap <f1> !fold --width=80<CR>

Michael Anderson
źródło
To jest odpowiedź, która działa dla długich ciągów nie oddzielonych białymi znakami. Jednak w systemie MacOS może być konieczne użycie gfold zamiast fold.
Aaron D
na Mac OS, musiałem zrobić! fold -w 80
user674669
5

Aby podzielić długie wiersze w całym dokumencie bez usuwania już istniejących podziałów wierszy, użyj:

:set formatoptions+=w
:set tw=80
gggqG
Olivier Faucheux
źródło
4

Musiałem sformatować cały plik zamiast jednej linii. Jak wskazuje Wernsey, mogłem użyć 'fmt', ale następująca sekwencja w vimie również załatwiła sprawę (zapożyczając z różnych odpowiedzi tutaj):

<ESC>
:setl tw=80 fo=t
1GVGgq
John Rix
źródło
3

Jako szybki i nieprzyjemny, może spróbuj następującej mapy:

map q 080lwbels<CR><ESC>

który mówi:

  • rozpocząć zerową pozycję wiersza,
  • przejdź do 80. znaku w prawo,
  • przejdź na początek następnego słowa,
  • wróć do poprzedniego słowa,
  • idź na koniec bieżącego słowa,
  • idź jeden znak w prawo i
  • zastąp CR dla tego znaku.

Następnie naciśnięcie q i CR podzieli linię na kawałki na granicy słowa.

Rob Wells
źródło
0

Ręcznie wstawiłem „\” (a następnie CR / tab do sformatowania) w każdym LONGLINE po ostatniej spacji, ale przed kolumną 80. To jest do powiedzenia:

1 this is a long, long, line

teraz wygląda

1 this is a long, \
        long line

i kompiluje się normalnie.

808
źródło