Команда vim для реструктуризации / форсирования текста до 80 столбцов

240

Я знаю, что есть способы автоматически устанавливать ширину текста в vim set textwidth(например, в колонках Vim 80 ). То, что я ищу, - это что-то похожее =(команда indent line), но для переноса на 80. Вариант использования: иногда вы редактируете текст с текстовой шириной, и после объединения строк или удаления / добавления текста получается плохо обернутый.

В идеале эта команда полностью реорганизует выбранные строки и отсекает длинные строки, добавляя короткие. Пример:

long line is long!  
short

После запуска команды (при условии, что упаковка была 13 столбцов):

long line is  
long! short

Если это невозможно с настоящей командой vim, возможно, есть программа командной строки, которая делает это, к которому я могу направить ввод?

После поиска я нашел эту ссылку, у которой есть еще несколько вариантов: http://www.cs.swarthmore.edu/help/vim/reformatting.html

wickedchicken
источник
9
Вам также может быть интересно узнать, что Vim может делегировать форматирование текста внешней программе, такой как пар . Я сделал скринкаст, который демонстрирует, как форматировать текст с пар .
nelstrom
@nelstrom спасибо, TIL о par. Это фантастика!
Стивен Лу
2
Если вы хотите, чтобы текст выглядел стройным и аккуратным (хорошо обрезанным?), Всегда думайте о gq- Gentleman's Quarterly . (Извиняюсь за антропоморфизацию самца, но мнемоника работает.)
ruffin

Ответы:

372

Установите textwidthзначение 80 ( :set textwidth=80), перейдите к началу файла (можно сделать с помощью Ctrl- Homeили gg) и введите gqG.

gqGформатирует текст, начиная с текущей позиции и до конца файла. Он будет автоматически соединять последовательные строки, когда это возможно. Вы можете поместить пустую строку между двумя строками, если не хотите, чтобы эти две линии были соединены вместе.

Майкл Мэдсен
источник
14
И это также работает с визуальным выбором. Т.е. что - то вроде: V}gq. Таким образом, вы видите, что вы собираетесь отформатировать перед тем, как его отформатировать.
Plouff
6
Кстати, что именно делает qсам по себе?
Ричард-Дегенн
1
Есть ли способ сделать это со строками, которые представляют собой одну длинную строку символов без пробелов? РЕДАКТИРОВАТЬ: я обнаружил "сложить" утилиту. Все еще задаюсь вопросом о том, как сделать это в vi.
Дональд Смит
7
использовать set tw=80вместо того, set textwidth=80чтобы сэкономить время
Yibo Yang
4
@dmranck После того, как set textwidth=76ваши строки будут автоматически переноситься при вводе текста. Моя жалоба состоит в том, что это ничего не делает с существующими строками, которые редактируются. Но V}gqчрезвычайно полезен в этом отношении. Vвходит в режим визуального выбора, }выбирает следующий разрыв абзаца и gqзапускает на нем текущий форматер (или использует gwдля явного вызова форматера vi). Также {выберут вверх. Вы можете выбрать весь документ и формат, ggVGgqхотя, возможно, есть более простой способ. Сохраните это как макрос, используя @для облегчения. Используйте vipgqдля поиска текущего абзаца.
ktbiz
94

Решение Майкла является ключевым, но я чаще всего нахожу, что хочу переформатировать оставшуюся часть текущего параграфа; для этого поведения используйте gq}.

Алекс Хирзель
источник
17
подробно об этом - вы можете использовать gq <motion> для форматирования того, что вы хотите.
Дэн Шнау
1
Кроме того, опция «nojoinspaces», которая предотвращает появление двух пробелов после периодов, когда строки соединяются на границе предложения. Хорошо, когда твой типографский стиль - это пробелы между предложениями на английском языке.
Алекс Хирзель
36

Вы можете использовать gqс любыми операторами движения. Например, если вы хотите переформатировать только до конца текущей строки (то есть, чтобы обернуть строку, на которой находится ваш курсор), вы можете использоватьgq$

Вы также можете переформатировать, выбрав текст в визуальном режиме (используя `v и перемещение), а затем набрав gq.

Есть и другие варианты принудительного переноса строк.

Если вы хотите, чтобы vim переносил строки во время вставки в них текста вместо того, чтобы ждать до конца, чтобы реструктурировать текст, вы найдете следующие опции полезными:

:set textwidth=80
:set wrapmargin=2

(Не отвлекайтесь на wrapи и linebreak, которые только переформатируют текст, отображаемый на экране, и не меняйте текст в буфере)

JohnGH
источник
9
Из wrapmarginсправки: Когда 'textwidth' не равен нулю, эта опция не используется.
mmoya
21

Благодаря комментарию от DonaldSmith я нашел это, поскольку textwidthопция не переформатировала мою длинную строку текста (я конвертировал игру с шестнадцатеричными преобразованиями):

:%!fold -w 60

Это переформатировало весь файл (который был для меня одной строкой) в строки длиной 60.

shearn89
источник
1
Это очень мило. Все ответы сосредоточены на ограничении ширины строки, когда строка разделена пробелами на слова. Это решение работает для очень длинных слов (последовательности ДНК).
pedrosaurio
1
Для длинных URL это единственное, что я нашел, что работает. Я уже новичок в отношении ширины текста, но он не будет разбивать непрерывные строки (что, как правило, хорошо)
SkyLeach
13

Если вы ищете способ без Vim , всегда есть команды UNIX fmt и par .

Ноты:

  • Я не могу комментировать Unicode, он может или не может вести себя по-другому.
  • @nelstrom уже упоминал об использовании parв своей веб-трансляции.

Вот как мы могли бы использовать оба для вашего примера.

$ 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

Чтобы использовать изнутри Vim:

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

Вы также можете установить :formatprgpar или fmt и переопределить gq. Для получения дополнительной информации звоните :help formatprgв Vim.

Этеш Чоудхури
источник
9

Почти всегда использую gqв визуальном режиме. Я говорю своим ученикам, что это означает «Джентльменский квартал», журнал для привередливых людей.

ncmathsadist
источник