Ответ 1
Замените все строки новой строки, за которыми следует что-то другое, кроме новой строки, со вторым совпадающим символом:
:%s/\(\S\)\n\(\S\)/\1 \2/
Другой подход:
:%s/\n\([^\n]\)/\1/
Я пытаюсь без успеха присоединить все строки в абзаце (блок текста) с помощью 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,})"
но это делает объединение всех строк вместе (не сохраняет пустые строки).
Что я не так понял?
Замените все строки новой строки, за которыми следует что-то другое, кроме новой строки, со вторым совпадающим символом:
:%s/\(\S\)\n\(\S\)/\1 \2/
Другой подход:
:%s/\n\([^\n]\)/\1/
Просто нашел этот ответ
:set tw=1000000
gggqG
Что является абсолютным победителем ИМХО.
It выполняет gq
движение от gg
(начало) до G
(конец документа), используя ширина текста 1000000.
сильно недооцененный командный режим и :global
Обновление Исправлено после правильного комментария. Это произошло с простыми пробелами, содержащими Tab -character (s)... sry bout that.
:g#\v[^\s\t]#normal vipJ
Как это работает для вас? (возможно, заменив vipJ
→ vipgJ
, если хотите)
Обновить. Здесь не используется нормальный режим (вдохновленный комментарием Питера)
Большим преимуществом является то, что он использует одну и ту же модель в отрицательном и положительном смысле; Таким образом, он может быть обобщен на
:let @/='\v^\s*$'
:v//.,//-1 join
Теперь вторая строка показывает простоту этого подхода (для каждой несимметричной линии присоединяться до следующей соответствующей строки). Лучше всего, что вы можете использовать любой нечетный шаблон поиска вместо
Конечно, вы могли бы написать эту конкретную задачу как одну строку, но это было бы не совсем так элегантно:
:v#\v^\s*$#.,//-1 join
Другой подход, который был с тех пор, как Berkeley UNIX, до того, как vim существовал... Если вы работаете в системе linux/unix, вы можете вызвать команду fmt следующим образом:
:%!fmt -w 9999
Это будет делать это во всем файле, что может испортить материал, например, нумерованные списки. Вы можете сделать это по абзацу с помощью:
!}fmt -w 9999
или сделать это из командной строки за пределами vi:
$ fmt -w 9999 file.txt
Мне нравится этот подход, потому что мне не нужно запоминать reset textwidth = 80