Vim: присоедините все строки в параграфе

Я пытаюсь без успеха присоединить все строки в абзаце (блок текста) с помощью vimscript.
Я хочу сделать это для каждого абзаца (блок текста) и хочу сохранить пустые строки между ними.
(Я не хочу использовать макросы)

Когда я использую команду }w, чтобы перейти к первому слову в следующем абзаце, я заметил, что он не распознает пустые строки с пробелами или несколько пустых строк между параграфами. Это не то, что я хочу.

поэтому я попробовал это:
выполните поиск:
\(^.*\S\+.*\n\)\{2,}
делать:
normal vipgJ
повторите поиск и т.д.

Он отлично работает, когда я делаю это вручную, но я не могу поместить это в script.

Я пробовал этот script:

function! <SID>JoinParagraphs()
let i = 1
normal gg
while i <= 200
call search("\\(^.*\\S\\+.*\\n\\)\\{2,})", "")
normal vipgJ
let i=i+1
endwhile
endfunction

Не работает...
Я также попытался изменить строку "поиск вызова..." для
let @/ = "\\(^.*\\S\\+.*\\n\\)\\{2,})"
но это делает объединение всех строк вместе (не сохраняет пустые строки).

Что я не так понял?

Ответ 1

Замените все строки новой строки, за которыми следует что-то другое, кроме новой строки, со вторым совпадающим символом:

:%s/\(\S\)\n\(\S\)/\1 \2/

Другой подход:

:%s/\n\([^\n]\)/\1/

Ответ 2

Просто нашел этот ответ

:set tw=1000000
gggqG

Что является абсолютным победителем ИМХО.

It выполняет gq движение от gg (начало) до G (конец документа), используя ширина текста 1000000.

Ответ 3

Нажмите Добавлен прагматический подход

сильно недооцененный командный режим и :global

Обновление Исправлено после правильного комментария. Это произошло с простыми пробелами, содержащими Tab -character (s)... sry bout that.

:g#\v[^\s\t]#normal vipJ

Как это работает для вас? (возможно, заменив vipJvipgJ, если хотите)

Обновить. Здесь не используется нормальный режим (вдохновленный комментарием Питера)

Большим преимуществом является то, что он использует одну и ту же модель в отрицательном и положительном смысле; Таким образом, он может быть обобщен на

:let @/='\v^\s*$'
:v//.,//-1 join

Теперь вторая строка показывает простоту этого подхода (для каждой несимметричной линии присоединяться до следующей соответствующей строки). Лучше всего, что вы можете использовать любой нечетный шаблон поиска вместо

Конечно, вы могли бы написать эту конкретную задачу как одну строку, но это было бы не совсем так элегантно:

:v#\v^\s*$#.,//-1 join

Ответ 4

Другой подход, который был с тех пор, как Berkeley UNIX, до того, как vim существовал... Если вы работаете в системе linux/unix, вы можете вызвать команду fmt следующим образом:

:%!fmt -w 9999

Это будет делать это во всем файле, что может испортить материал, например, нумерованные списки. Вы можете сделать это по абзацу с помощью:

!}fmt -w 9999

или сделать это из командной строки за пределами vi:

$ fmt -w 9999 file.txt

Мне нравится этот подход, потому что мне не нужно запоминать reset textwidth = 80