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

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

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

long line is long!  
short

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

long line is  
long! short

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

:set textwidth=80
:set wrapmargin=2

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

Ответ 4

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

Ответ 5

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

:%!fold -w 60

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

Ответ 6

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