11

У меня довольно большой текстовый файл, состоящий из блоков, таких как

Short line.
Really long line.
Short line.

разделены пустыми строками, и я хотел бы использовать vim (в Linux) для разбиения длинных строк и получения блоков, таких как

Short line.
This was
part of
a long line.
Short line.

Моя проблема с gqgw является то , что он перекомпоновкой каждого блока как весь абзац, т.е. не сохраняет два разрыва строки внутри каждый блока, и в соответствии :help fo-table ни один из вариантов формата gq «ы не позволит мне делать то, что я хочу. Я также подумал, что смог бы достичь своей цели, если бы мог определить символы новой строки в качестве разделителей абзацев, но в соответствии с :help paragraph которые жестко запрограммированы.

Изменить: я знаю, что я мог бы использовать gq или gw для форматирования каждой длинной строки одну за другой, но так как мой файл занимает несколько тысяч строк, я ищу способ достичь этого автоматически.

3 ответа3

14
:%norm! gww

Это применяет normal команду gww (которая форматирует текущую строку как gw) ко всему буферу, не принимая во внимание настроенные отображения (чтобы избежать проблем, если, например, gw был сопоставлен с чем-то другим).

Увидеть

  • :help :%
  • :help :norm
  • :help gww

Эта альтернатива соответствует предложению Бена в комментариях и является более простой, чем оригинальное решение, которое сохранено ниже, поскольку оно может лучше соответствовать другим подобным обстоятельствам из-за возможности сопоставления регулярных выражений. В случае "сопоставить все линии", однако, это излишне грубо.


Применение gww к каждой отдельной строке в буфере программно:

:g/^/norm gww

Смотрите :help :g и :help norm . ^ соответствует началу строки, что на практике делает это совпадением для каждой строки.

Можно также выбрать, чтобы выбрать только строки длиннее, например, 60 символов с

:g/\%>60v/norm gww

(см . :help \%<), но на практике gww все равно будет переформатировать строки длиннее textwidth , так что это может не иметь большого значения ни для скорости, ни для результата.

(Я использую v для "виртуального столбца" вместо c для "столбца", поскольку последний действительно вычисляет определенное количество байтов в строке. Это может привести к неожиданным результатам при использовании многобайтовых кодировок, что часто является причиной для осторожности. На практике это не является реальной проблемой по той же причине, что и выше, в связи с тем, что gww случае не будет переформатировать строки, textwidth меньше ширины текста .)

4

Поскольку вы уже прочитали руководство по командам gq и gw , я полагаю, что вам, вероятно, нужно что-то более удобное, чем переход на длинные строки вручную, а затем использование gw0 , gw$ или другой команды gw для форматирования только текущей строки.

Я не знаю простой способ разбить длинные строки в Vim на текстовый блок. Однако, поскольку вы упомянули, что вы используете Vim в системе GNU/Linux, я бы предложил отфильтровать ваш текст с помощью команды GNU fmt .

Для всего файла:

:%!fmt --width=75 --split-only

Для текущего абзаца (используя короткие варианты):

:'{,'}!fmt -75 -s

Объяснение соответствующих опций fmt :

  • -w, --width=WIDTH - максимальная ширина строки (по умолчанию 75 столбцов). Опция -WIDTH является сокращенной формой --width=DIGITS (если используется эта сокращенная версия, она должна быть первой опцией).

  • -s, --split-only - разбивать длинные строки, но не пополнять; эта опция сохраняет ваши существующие жесткие разрывы строк.

1

От:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.

Поместите маркер в строку "lorem ipsum" и нажмите gww получить (с textwidth=40 для ясности):

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.

что мне кажется, что вы просите. Если нет, пожалуйста, не стесняйтесь уточнить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .