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

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

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

17

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

$ fmt myfile

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

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>


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

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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.