vim:加入段落中的所有行

时间:2011-04-13 15:08:01

标签: vim join lines

我正在尝试使用vimscript加入段落(文本块)中的所有行,但没有成功 我想为每个段落(文本块)执行此操作,并希望在它们之间保留空行 (我不想使用宏)

当我使用}w命令转到下一段中的第一个单词时,我注意到它不能识别空行或空白行之间的多个空行。 那不是我想要的。

所以我试过这个:
搜索:
\(^.*\S\+.*\n\)\{2,}
这样做:
normal vipgJ
再上面搜索等。

手动操作时效果很好,但我不能把它放在脚本中。

我试过这个剧本:

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,})"
但这样可以将所有行连接在一起(不保留空行)。

我错了什么?

5 个答案:

答案 0 :(得分:23)

只需found this answer

:set tw=1000000
gggqG

哪个是绝对的赢家恕我直言。

gg来自G(开始)到{{1}}(文档末尾)的动作,使用1000000的文字宽度。

答案 1 :(得分:15)

使用第二个匹配的字符替换所有换行符,后跟除换行符之外的其他内容:

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

另一种方法:

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

答案 2 :(得分:4)

点击:Pragmatic approach added

被低估的命令模式和:global

更新在正确评论后修复。它只发生在包含 Tab -character(s)的空白行... sry bout that。

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

这对你有什么用? (如果您愿意,可能会替换vipJ - &gt; vipgJ

更新这是一个不使用普通模式的人(灵感来自Peter的评论)

最大的好处是它在消极和积极的意义上重复使用相同的模式;这样它就可以通用化了

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

现在第二行显示了这种方法的简单性(对于每个不匹配的行,连接到下一个匹配行)。最好的是你可以使用任何奇怪的搜索模式

当然你可以把这个特定的任务写成一行,但它不会那么优雅:

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

答案 3 :(得分:3)

自从Berkeley UNIX出现之后的另一种方法,在vim存在之前......如果你在linux / unix系统上,你可以像这样调用fmt命令:

:%!fmt -w 9999

这将在整个文件中执行,这可能搞乱编号列表之类的东西。你可以用以下段落来完成:

!}fmt -w 9999

或者从vi:

之外的命令行执行此操作

$ fmt -w 9999 file.txt

我喜欢这种方法,因为我不必记得重置textwidth = 80

答案 4 :(得分:1)

该功能中最简单的方法就是使用

vipJ

视觉选择内部段落连接