vim: объединить все строки в абзаце - PullRequest
12 голосов
/ 13 апреля 2011

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

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

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

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

Я попробовал этот скрипт:

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

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

Что я не так сделал?

Ответы [ 4 ]

23 голосов
/ 13 апреля 2011

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

:set tw=1000000
gggqG

Какой абсолютный победитель ИМХО.

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

15 голосов
/ 13 апреля 2011

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

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

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

:%s/\n\([^\n]\)/\1/
4 голосов
/ 13 апреля 2011

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

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

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

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

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

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

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

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

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

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

:v#\v^\s*$#.,//-1 join
3 голосов
/ 17 февраля 2012

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

:%!fmt -w 9999

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

!}fmt -w 9999

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

$ fmt -w 9999 file.txt

Мне нравится этот подход, потому что мне не нужно помнить, чтобы сбросить текстовую ширину = 80

...