11

Предположим, вы набрали длинный документ в vim с автоматическим разрывом строки, поэтому все строки были разбиты, скажем, на 79 символов. Возможно, вы даже применили форматирование ко всему документу, чтобы разбить все строки на эту длину.

Абзацы размечены в вашем документе пустыми строками.

Теперь вы решаете, что вообще не хотите разрывов строк в абзацах.

Как вы можете удалить все разрывы строк в абзацах, не удаляя при этом границы абзацев в целом?

Я сделал этот быстрый и идиотский взлом, но ищу правильный путь.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks

4 ответа4

11

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

G:a

.
:g/^./ .,/^$/-1 join

Объяснение: сначала перейдите в конец файла и добавьте дополнительную пустую строку с помощью :a (возможно, есть более элегантный способ сделать это; в интерактивном режиме вы можете заменить первые три строки на o<ESC>). Затем для каждой непустой строки, которая еще не была рассмотрена (:g/^./), примените команду join к диапазону, начиная с выбранной строки (.) И заканчивая одной строкой перед следующей пустой строкой (/^$/-1).

При желании :g/^$/d если вы не хотите, чтобы оставалась пустая строка (тогда вы можете снять -1).

10

Это должно сделать это:

:set tw=99999
gggqG

tw устанавливается на какое-то значение, по крайней мере такое же большое, как количество символов в самом длинном абзаце. gg перемещает курсор на первую строку; gq - команда для переформатирования; G перемещает курсор на последнюю строку, сообщая gq о необходимости переформатирования из текущей позиции курсора в последнюю строку.

3

1) Установите курсор внутри нужного абзаца

2) Тип: "vipJ"

("vip" выделяет текущий абзац, "J" объединяет все строки)

2

Возможно, это не самый чистый способ сделать это, но вот что я бы использовал:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

(Работает в VIM 7.2.)

В зависимости от того, как именно абзацы были разделены при первоначальном форматировании, вы можете заменить команду gJ (объединить без пробелов) командой J (объединить с пробелами).

Произвольное число 999 должно быть не меньше количества абзацев в файле - вы можете выбрать большее число, если хотите, и ничего не потерять, кроме циклов процессора. Предполагая одну и только одну пустую строку между абзацами, вы можете получить более точное количество абзацев, используя:

:%s/^$//gn     # returns "999 matches on 999 lines"

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