У меня довольно большой текстовый файл, состоящий из блоков, таких как
Short line.
Really long line.
Short line.
разделены пустыми строками, и я хотел бы использовать vim (в Linux) для разбиения длинных строк и получения блоков, таких как
Short line.
This was
part of
a long line.
Short line.
Моя проблема с gq
(и gw
) состоит в том, что он перекомпоновывает каждый блок как целый абзац, то есть он не сохраняет двух разрывов строк в каждом блоке, и в соответствии с :help fo-table
ни одним из gq
параметров форматирования не позволил бы мне делать то, что я хочу. Я также подумал, что смог бы достичь своей цели, если бы мог определить символы новой строки в качестве разделителей абзацев, но в соответствии с ними :help paragraph
они жестко закодированы.
Изменить: я знаю, что я мог бы использовать gq
или gw
форматировать каждую длинную строку по очереди, но так как мой файл занимает несколько тысяч строк, я ищу способ достичь этого автоматически.
gq
иgw
. Я также рад, что не остановился на этом, иначе я бы не узнал о:g
команде. :)Ответы:
Это применяет
normal
командуgww
(которая форматирует текущую строку как сgw
) ко всему буферу, не принимая во внимание настроенные отображения (чтобы избежать проблем, если, напримерgw
, был сопоставлен с чем-то еще).Видеть
:help :%
:help :norm
:help gww
Эта альтернатива соответствует предложению Бена в комментариях и является более простой, чем оригинальное решение, которое сохранено ниже, поскольку оно может лучше соответствовать другим подобным обстоятельствам из-за возможности сопоставления регулярных выражений. В случае «сопоставить все линии», однако, это излишне грубо.
Применение
gww
к каждой отдельной строке в буфере программно:Смотрите
:help :g
и:help norm
.^
соответствует началу строки, что на практике делает это совпадением для каждой строки.Можно также выбрать только строки длиной более 60 символов с
(см.
:help \%<
), но на практикеgww
будут переформатировать только строки длиннее, чем вtextwidth
любом случае, поэтому это может не иметь большого значения ни для скорости, ни для результата.(Я использую
v
для «виртуального столбца» вместоc
«столбца», поскольку последний действительно вычисляет определенное количество байтов в строке. Это может привести к неожиданным результатам при использовании многобайтовых кодировок, что часто является причиной для осторожности. На практике это не является реальной проблемой по той же причине, что и выше, посколькуgww
она не будет переформатировать строки короче, чем вtextwidth
любом случае.)источник
:g
не работает без шаблона, поэтому:g//norm gww
не работает, но:g/.*/norm gww
работает.:g//
повторно использует последний шаблон поиска; если его нет, он терпит неудачу. Используйте:g/^/
для применения ко всем линиям.:help last-pattern
для обычного поиска, относится и к:global
команде.Так как вы уже прочитали руководство для
gq
иgw
команд, я полагаю , вы , вероятно , хотите что - то более удобное , чем вручную перемещение в длинные очереди , а затем использоватьgw0
,gw$
или другуюgw
команду только форматировать текущую строку.Я не знаю простой способ разбить длинные строки в Vim над блоком текста. Однако, поскольку вы упомянули, что вы используете Vim в системе GNU / Linux, я бы предложил отфильтровать текст с помощью команды GNU
fmt
.Для всего файла:
Для текущего абзаца (используя короткие опции):
Пояснения к соответствующим
fmt
опциям:-w, --width=WIDTH
- максимальная ширина линии (по умолчанию 75 столбцов). Опция-WIDTH
является сокращенной формой--width=DIGITS
(если используется эта сокращенная версия, она должна быть первой опцией).-s, --split-only
- разбивать длинные строки, но не пополнять; эта опция сохраняет ваши существующие жесткие разрывы строк.источник
fmt
. Я предпочел принять другой ответ, потому что он требует только vim.Из:
Поместить маркер на линию «lorem ipsum» и нажать кнопку
gww
(textwidth=40
для наглядности):что мне кажется, что вы просите. Если нет, пожалуйста, не стесняйтесь уточнить.
источник