Объединить строки внутри абзацев в vim

13

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

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

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

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

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

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks
dggoldst
источник
Эй, не стучите, если ваше решение работает, и ваше решение работает.
pdwalker

Ответы:

12

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

G:a

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

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

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

Жиль "ТАК - перестань быть злым"
источник
Благодарю. Это очень близко для меня, однако, это удаление пустых строк между абзацами. (Я попробовал файловый формат Unix и DOS, чтобы увидеть, если это было для Windows). Кроме того, не могли бы вы немного перевести команды? G идет к последней строке. : согласно справке «добавить», но я не уверен, что это делает. Также g / pattern / cmd у вас там потерял меня. Какая команда?
dggoldst
@dggoldst: я изменил команду, чтобы сохранить пустые строки. Первые три строки просто для добавления пустой строки в конец файла (иначе последний абзац не будет совпадать). Последняя команда :g, которая применяет команду ко всем совпадающим строкам; Посмотрите :help :gи, возможно, этот поток о том, как :gведет себя, когда вы удаляете разрывы строк .
Жиль "ТАК - перестань быть злым"
:$pu _ в конце поставить регистр черной дыры, в результате чего в конце появится пустая строка.
SergioAraujo,
12

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

:set tw=99999
gggqG

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

garyjohn
источник
5
  1. Установите курсор внутри нужного абзаца

  2. Тип: vipJ

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

Juan
источник
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"
goldPseudo
источник
Это работает для меня. Было бы хорошо добавить «gg» в начале, чтобы поместить курсор вверху файла. Кроме того, использование J вместо gJ не приводит к тому, что отдельные слова объединяются в одно. Это может иметь место только для моих значений «форматирования», которые в настоящее время меня озадачивают.
dggoldst