Могу ли я обосновать текст в Vim?

38

Единственной причиной, по которой я когда-либо редактировал текстовый файл в Pico или Nano, а не в Vim, была его команда «Justify» ^J. Было бы переформатировать абзац текста, создавая разрывы строк при разрыве слов, чтобы текст плавно перемещался на экране фиксированной ширины - форматируйте текст так, чтобы он соответствовал заранее заданным 80 столбцам, создавая разрывы строк только между словами. Ограниченность функции была очень полезной, будь то форматирование длинных блоков комментариев, файлов документации или просто замена бесконечной строки параметров чем-то более читабельным.

Могу ли я сделать что-то подобное в Vim?

Научная фантастика
источник

Ответы:

37

Вы можете использовать операторы gqили в gwсочетании с командой движения. По умолчанию он использует fmtпрограмму (в Linux) для форматирования заданного текста. Однако, насколько мне известно, это не оправдывает линии, поэтому вы получите неровные поля.

Я использую его в gwipобычном режиме с курсором на абзаце. Это отформатирует текущий абзац, удерживая курсор в той же позиции. Я использую его таким образом, чтобы убедиться, что форматируется только текущий абзац. При редактировании текстового файла, выдача gwG(нормальный режим) в начале файла отформатирует весь текст. В качестве хорошей практики не забудьте оставить хотя бы одну пустую строку между абзацами.

Существует много настроек, которые можно сделать. Для начала, вот некоторые важные справки: :h gq, :h gw, :h fo(параметры формата), :h fp(программа формата), :h fo-table(объяснение возможных вариантов).

Guillem
источник
1
GQ / GW, безусловно, путь. чтобы добавить к этому сообщению, вы можете изменить формат программы на par, чтобы иметь больше опций. Оформить заказ vimcasts.org/episodes/formatting-text-with-par
Бамбу
3
По умолчанию Vim не использует никакие внешние программы, хотя вы можете выбрать одну из них, установив 'formatprg'опцию.
Jamessan
15

На эту тему есть отличный VimCast.

http://vimcasts.org/episodes/formatting-text-with-par/

По сути, вам необходимо установить par:

$ brew install par
# or
$ sudo apt-get install par

И затем, поскольку вы хотите, чтобы столбцы были обернуты в 80 столбцов:

:set formatprg=par\ -w80

Теперь вы можете использовать gqоператор, как в других ответах (например gqip), и он будет использовать Par вместо встроенного форматера Vim.

Par довольно продвинут, и он будет красиво форматировать комментарии:

/* This is a long */
/* multiline comment */
Янко-м
источник
11

От :help usr_25:

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

Итак, все, что вам нужно сделать, это запустить

:ru macros/justify.vim

а затем введите

_j

чтобы оправдать текст во всем файле.

(Конечно, вы также можете добавить ru macros/justify.vimв свой .vimrc, чтобы вам не приходилось вводить его каждый раз.)

Примечание : это не добавляет разрывов строк для вас. Вы должны добавить их вручную с помощью gq. Для этого вы также должны установить textwidth(по умолчанию 0) желаемое значение с помощью

set textwidth=80

и - если хотите - автоматическое перенос текста, установив t-flag через

set formatoptions+=t

Если вы хотите, вы можете установить отображение в вашем .vimrc, чтобы сделать все это за вас:

nnoremap <C-j> gggqG_j

Это перемещает в начало файла ( gg), переносит все строки ( gqдо G), а затем _jдобавляет текст.

Дверная ручка
источник
Я только что нашел очень полезную :set fo+=aопцию для автоматического переформатирования всего абзаца. Посмотрите на :help fo-tableдругие варианты. Там также хорошие видео - учебник здесь .
Suuuehgi
+1 за полностью встроенное решение. _jОтображение добавлен макрос , кажется, оправдывает весь файл для меня, или он может быть ограничен с помощью визуального выбора построчно.
ches
5

Хотя помощь nano вызывает ^Jкоманду «Justify», она на самом деле не оправдывает текст, она переформатирует текст, разбивая строки перед правым полем экрана (или, думаю, в каком-то настраиваемом столбце).

Вы можете сделать то же самое в VIM, установив переменную textwidthиз :help 'textwidth':

Максимальная ширина текста, который вставляется. Более длинная линия будет разбита после пробела, чтобы получить эту ширину. Нулевое значение отключает это.

То есть: пока вы печатаете, если строка длиннее textwidthсимволов, VIM обернет строку первым пробелом, чтобы длина строки была меньше или равна textwidth.

Для этого опция formatoptionsдолжна содержать букву t. Смотрите :help 'formatoptions'и :help fo-tableдля доступных опций, например, вас может заинтересовать cвариант, чтобы форматирование работало с комментариями.

Edit : Вы можете выполнить ту же самую операцию, без необходимости положить tв formatoptions, используя команду gw{motion}, он форматирует текст между текущим положением курсора и положением курсора после {motion}. Команда gwдоступна также в визуальном режиме, она форматирует выделенный текст.

toro2k
источник
1
Это хорошо для печати. Могу ли я применить это для уже существующего текста?
SF.
3

Вот два простых варианта:

  1. с выделенным блоком текста введите !fmt
  2. с помощью курсора в начале блока введите !}fmt

Оба из них отправляют блок текста в Unix fmt, см. man fmtВарианты. Вы можете передать аргументы опции из vim. Например, чтобы отформатировать блок шириной 50 символов, введите !}fmt -w 50.

Каан
источник
извините за это, исправлено сейчас
Каан
Вы также можете отформатировать весь файл, набрав :%!fmtи отменить один, uесли вам не нравится результат.
Wildcard
-1

Отметьте текст с помощью визуальной команды и затем используйте:

:!par 40j 

где 40 - ширина столбца и jозначает выравнивание.

user16937
источник
2
Добро пожаловать на наш сайт! В настоящее время ваш вопрос низкого качества, так как в нем отсутствуют пояснения об используемом вами инструменте ( par) и о том, почему ваше решение работает. Возможно, вы захотите добавить больше деталей, чтобы улучшить качество своего ответа и сделать его более полезным для будущих читателей.
statox