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

4923
dggoldst

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

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

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

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

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

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

4 ответа на вопрос

11
Gilles

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

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

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

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

Благодарю. Это очень близко для меня, однако, это удаление пустых строк между абзацами. (Я попробовал файловый формат Unix и DOS, чтобы увидеть, если это было для Windows). Кроме того, не могли бы вы немного перевести команды? G идет к последней строке. : согласно справке "добавить", но я не уверен, что это делает. Также g / pattern / cmd у вас там потерял меня. Какая команда? dggoldst 13 лет назад 0
@dggoldst: я изменил команду, чтобы сохранить пустые строки. Первые три строки просто для добавления пустой строки в конец файла (иначе последний абзац не будет совпадать). Последняя команда: `: g`, которая применяет команду ко всем совпадающим строкам; смотрите `: help: g` и, возможно, [этот поток о том, как`: g` ведет себя при удалении разрывов строк] (http://unix.stackexchange.com/questions/1788/why-does-the-substitution-of- переводы строк, использующих-г-ре-р-только применить к-каждый-другой линии / 1797 # 1797). Gilles 13 лет назад 0
`:$pu _` at the end put black hole register, which results in a blank line at the end. SergioAraujo 5 лет назад 0
10
garyjohn

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

:set tw=99999 gggqG 

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

3
Juan

1) Set the cursor inside the desired paragraph

2) Type: "vipJ"

("vip" highlights the current paragraph, "J" joins all lines)

2
goldPseudo

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

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