Команда vim для реструктуризации / форсирования текста до 80 столбцов - PullRequest
217 голосов
/ 13 июня 2010

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

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

long line is long!  
short

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

long line is  
long! short

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

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

Ответы [ 6 ]

345 голосов
/ 13 июня 2010

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

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

88 голосов
/ 28 марта 2012

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

32 голосов
/ 14 мая 2013

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

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

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

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

:set textwidth=80
:set wrapmargin=2

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

17 голосов
/ 24 августа 2015

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

:%!fold -w 60

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

12 голосов
/ 18 декабря 2013

Если вы ищете способ без 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

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

6 голосов
/ 29 сентября 2016

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

...