Komenda vim do zmiany / wymuszenia tekstu do 80 kolumn

240

Wiem, że istnieją sposoby automatycznego ustawiania szerokości tekstu w vimie set textwidth(np. Problemy z układem kolumn Vima 80 ). To, czego szukam, to coś podobnego do =(polecenie wcięcia wiersza), ale zawijanie do 80. Przypadkiem użycia jest czasem edytowanie tekstu z szerokością tekstu, a po dołączeniu linii lub usunięciu / dodaniu tekstu wychodzi ono źle opakowane.

Najlepiej byłoby, gdyby to polecenie całkowicie zreorganizowało wybrane linie i odciąło długie linie, dodając je do krótkich. Przykład:

long line is long!  
short

Po uruchomieniu polecenia (przy założeniu, że wrap był 13 cols):

long line is  
long! short

Jeśli nie jest to możliwe przy użyciu prawdziwego polecenia vim, być może istnieje program wiersza poleceń, który robi to, do czego mogę przesyłać dane wejściowe?

Po przeszukaniu znalazłem to odniesienie, które ma kilka dodatkowych opcji: http://www.cs.swarthmore.edu/help/vim/reformatting.html

niegodziwy
źródło
9
Być może zainteresuje Cię również to, że Vim może delegować formatowanie tekstu do zewnętrznego programu, takiego jak par . Zrobiłem screencast, który pokazuje, jak sformatować tekst za pomocą par .
nelstrom
@nelstrom dzięki, TIL około par. To jest fantastyczne!
Steven Lu,
2
Jeśli chcesz, aby tekst wyglądał na cienki i przycięty (dobrze przycięty?), Zawsze pomyśl o gq- Kwartalnik dżentelmena . (Przepraszamy za antropomorfizującego mężczyznę, ale mnemonik działa.)
ruffin

Odpowiedzi:

372

Ustaw textwidthna 80 ( :set textwidth=80), przejdź na początek pliku (można to zrobić za pomocą Ctrl- Homelub gg) i wpisz gqG.

gqGformatuje tekst, zaczynając od bieżącej pozycji aż do końca pliku. Jeśli to możliwe, automatycznie połączy kolejne linie. Możesz umieścić pustą linię między dwiema liniami, jeśli nie chcesz, aby te dwie były ze sobą połączone.

Michael Madsen
źródło
14
Działa również z opcjami wizualnymi. Czyli coś takiego: V}gq. W ten sposób zobaczysz, co zamierzasz sformatować przed faktycznym formatowaniem.
Plouff,
6
Nawiasem mówiąc, co dokładnie robi qsamo z siebie?
Richard-Degenne,
1
Czy można to zrobić za pomocą wierszy zawierających tylko jeden długi ciąg znaków bez spacji? EDYCJA: Odkryłem narzędzie „fold”. Nadal zastanawiam się nad zrobieniem tego w vi.
Donald Smith
7
użyj set tw=80zamiast set textwidth=80oszczędzać czas
Yibo Yang,
4
@dmranck Po tym, jak set textwidth=76linie będą się automatycznie zawijać podczas pisania. Moja skarga polega na tym, że nie ma to żadnego wpływu na edytowanie istniejących linii. Ale V}gqjest pod tym względem niezwykle przydatny. Vwchodzi w tryb selekcji wizualnej, }wybiera do następnego podziału akapitu i gqwykonuje na nim bieżący formatyzator (lub służy gwdo jawnego wywołania formatera vi). Również {wybierze w górę. Możesz wybrać cały dokument i format, ggVGgqchociaż może istnieje łatwiejszy sposób. Zapisz to jako makro, @aby ułatwić. Służy vipgqdo fmt bieżącego akapitu.
ktbiz
94

Kluczem jest rozwiązanie Michaela, ale najczęściej stwierdzam, że chcę sformatować resztę bieżącego akapitu; do tego zachowania użyj gq}.

Alex Hirzel
źródło
17
rozwijając to - możesz użyć gq <motion>, aby sformatować, co chcesz.
Dan Schnau
1
Ponadto opcja „nojoinspaces”, która zapobiega pojawianiu się dwóch spacji po okresach łączenia linii na granicy zdania. Dobrze, gdy stylem typograficznym są pojedyncze spacje między zdaniami w języku angielskim.
Alex Hirzel
36

Możesz używać gqz dowolnymi operatorami ruchu. Na przykład, jeśli chcesz sformatować tylko do końca bieżącej linii (tj. Aby owinąć linię, na której znajduje się kursor), możesz użyćgq$

Możesz także sformatować, zaznaczając tekst w trybie wizualnym (używając `v i poruszając się), a następnie wpisując gq.

Istnieją również inne opcje wymuszania zawijania linii.

Jeśli chcesz, aby vim zawijał twoje linie podczas wstawiania w nich tekstu, zamiast czekać na koniec, aby zmienić tekst, te opcje będą przydatne:

:set textwidth=80
:set wrapmargin=2

(Nie poddawaj się śledzeniu przez wrapi linebreak, które tylko formatują tekst wyświetlany na ekranie i nie zmieniają tekstu w buforze)

JohnGH
źródło
9
Z wrapmarginpomocy: Gdy „szerokość tekstu” jest różna od zera, ta opcja nie jest używana.
mmoya
21

Dzięki komentarzowi DonaldSmith znalazłem to, ponieważ textwidthopcja nie sformatowała mojego długiego wiersza tekstu (konwertowałem grę z konwersjami szesnastkowymi na bajtowe):

:%!fold -w 60

To przekształciło cały plik (który był dla mnie jedną linią) w linie o długości 60.

shearn89
źródło
1
To jest bardzo miłe. Wszystkie odpowiedzi koncentrują się na ograniczeniu szerokości linii, gdy linia jest podzielona spacjami na słowa. To rozwiązanie działa na bardzo długie słowa (sekwencje DNA).
pedrosaurio
1
W przypadku długich adresów URL jest to jedyna rzecz, którą znalazłem, która działa. Już wiem o przepustowości tekstu, ale nie będzie on przerywał nieprzerwanych ciągów (co zwykle jest dobrą rzeczą)
SkyLeach
13

Jeśli szukasz sposobu innego niż Vim , zawsze znajdziesz komendy UNIX fmt i par .

Uwagi:

  • Nie mogę komentować Unicode, może zachowywać się inaczej.
  • @nelstrom wspomniał już o użyciu parw swoim webcastie.

Oto, jak wykorzystalibyśmy oba w twoim przykładzie.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Aby korzystać z wewnątrz Vima:

:%! fmt -w 13
:%! par 13gr

Możesz także ustawić :formatprgna par lub fmt i przesłonić gq. Aby uzyskać więcej informacji, zadzwoń :help formatprgdo Vima.

Ehtesh Choudhury
źródło
9

Prawie zawsze używam gqw trybie wizualnym. Mówię moim uczniom, że to „Gentlemens 'Quarterly”, magazyn dla wybrednych ludzi.

ncmathsadist
źródło