Jak mogę zawinąć tekst do pewnej długości w Vimie?

102

Porozmawiajmy o miarach względnych. Mój Vim wygląda tak:

aaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccccccc 
etc

Chciałbym, żeby był mniejszy:

aaaaa
aaaaa
bbbbb
bbbbb
ccccc
ccccc
etc

Jak mogę to dostać? A jak sobie poradzę z ustawieniem długości takiego bloku?

Léo Léopold Hertz 준영
źródło
Czy masz na myśli zawijanie tekstu, a nie wcięcie tekstu?
lc.
lc: Nie znam różnicy. Miałem zamiar napisać okładkę tak, jak mi polecono, ale nigdy nie udało mi się.
Léo Léopold Hertz 준영

Odpowiedzi:

177

W rzeczywistości możesz zrobić dwie rzeczy:

  1. Pozwól vimowi formatować (tj. Zmieniać) twój tekst, aby miał krótsze linie, wstawiając podziały wierszy
  2. Pozostaw wiersze bez zmian, ale wyświetlaj je zawinięte

Które chcesz?

Wariant 1 zostałby osiągnięty poprzez ustawienie textwidth(na przykład :set textwidth=30(na podstawie odpowiedzi Swaaropa)). Następnie możesz zmienić format tekstu, podświetlając go (w trybie wizualnym) i wpisując gq. ( textwidthmożna skrócić jako tw, więc :set tw=30.)

Opcję 2 można przełączyć, uruchamiając :set wrap/ :set nowrap. Spowoduje to zawinięcie linii, które są zbyt długie dla okna.

Obie są niezależne.

sleske
źródło
33
+1 za kluczową komendę gq z trybu wizualnego, to jest niesamowicie przydatne
Fire Crow
3
FYI to łamie się na spacjach, a gqgq nie robi nic na linii, jak pokazano w pytaniu, nawet jeśli tw = 5.
dlamblin
2
@Dlamblin: Dobrze. Jeśli chcesz złożyć dokładnie na podaną szerokość, bez przestrzegania białych znaków, użyj foldpolecenia tak jak w odpowiedzi fgm.
sleske
O ile widzę, Twoja opcja nie działa. wrapzawinie się na granicy okna, a nie na textwidth.
DerWeh
@DerWeh: Tak, zawijanie zawija się na granicy okna. Zredagowałem, aby wyjaśnić.
sleske
60

Po ustawieniu 'textwidth' możesz wybrać tekst w trybie wizualnym i nacisnąć gq, aby ładnie go zawinąć (możesz również użyć Q w niektórych starszych / starszych konfiguracjach).

Kilka przydatnych wskazówek:

gqq (wrap the current line)
gq} (wrap this 'paragraph', i.e. until the next blank line)
:h gq
Vlad Dogaru
źródło
3
+1, przypadkowo uderzyłem gq w vimie, ostatnie pół godziny spędziłem próbując zobaczyć, w co trafiłem. To jest bardzo przydatne.
user176121
gqqrównież zawija bieżącą linię (zamiast gqgqlub gq$).
Ash,
21

Korzystanie z fold (1) to jedna z możliwości:

:%!fold -w5 

Wynik:

aaaaa
aaaaa
aaa 
bbbbb
bbbbb
bbb 
ccccc
ccccc
ccc
Fritz G. Mehner
źródło
1
To również nie uwzględnia przestrzeni do spasowania
Lionel
7
@Lionel: Tak. Aby zachować odstępy, dodaj opcję „-s” do polecenia zawinięcia.
sleske
14
:set textwidth=30
Swaroop CH
źródło
Jak radzi sobie z tym textwidth, gdy nie ma spacji, jak w przykładzie oryginalnego plakatu? Miałem grę i wydaje się, że formatuje się w oparciu o tekst tekstowy, jeśli są spacje (lub przypuszczalnie, jeśli zmienna breakat jest ustawiona na coś innego).
Andy
3
@Andy textwidthnie poradzi sobie z sytuacją bez spacji. Możesz napisać własną formatexprfunkcję, aby to zrobić.
Swaroop CH
8

Jeśli masz tekst bez spacji, który chcesz przerwać na określonej długości, nie musisz używać zewnętrznego foldani pisać własnego formatexpr.

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

złamie wszystkie linie przy 80 znakach.

kthy
źródło
2
To uratowało mi dzień podczas wskrzeszania certyfikatu OpenSSL. Dziękuję
Cengiz Can