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?


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.


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

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

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

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.


2
To uratowało mi dzień podczas wskrzeszania certyfikatu OpenSSL. Dziękuję
Cengiz Can
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.