vim:连接段落中的所有行

| 我正在尝试使用vimscript将段落(文本块)中的所有行连接起来而没有成功。 我想对每个段落(文本块)执行此操作,并希望在它们之间保持空白行。 (我不想使用宏) 当我使用“ 0”命令转到下一个段落中的第一个单词时,我注意到它无法识别带有空格或段落之间有多个空行的空行。 那不是我想要的。 所以我尝试了这个: 进行搜索:
\\(^.*\\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,})\"
但这会将所有行合并在一起(不保留空行)。 我怎么了     
已邀请:
用第二个匹配的字符替换所有换行符,然后替换换行符以外的其他内容:
:%s/\\(\\S\\)\\n\\(\\S\\)/\\1 \\2/
另一种方法:
:%s/\\n\\([^\\n]\\)/\\1/
    
刚找到这个答案
:set tw=1000000
gggqG
恕我直言,这绝对是赢家。 在从“ 9”(开始)到“ 10”(文档结束)的运动上执行“ 8”,使用的文本宽度为1000000。     
点击:增加了务实的方法 被低估的命令模式和
:global
修正正确的评论后修正。它发生在仅包含空格的行中,这些行包含Tab字符...很抱歉。
:g#\\v[^\\s\\t]#normal vipJ
如何为您工作? (如果愿意,可以替换
vipJ
->
vipgJ
) 更新这里是一种不使用普通模式的模式(受彼得的评论启发) 最大的好处是它可以在消极和积极意义上重用相同的模式。这样可以将其通用化为
:let @/=\'\\v^\\s*$\'
:v//.,//-1 join
现在,第二行显示了此方法的简单性(对于每一个不匹配的行,请连接到下一个匹配的行)。最好的是,您可以改用任何奇数搜索模式 当然,您可以将这一特定任务写成一行,但是它并不那么优雅:
:v#\\v^\\s*$#.,//-1 join
    
在vim存在之前,自Berkeley UNIX以来出现的另一种方法...如果您使用的是Linux / unix系统,则可以像下面这样调用fmt命令:
:%!fmt -w 9999
这将在整个文件上完成,这可能会弄乱编号列表之类的内容。您可以按以下段落进行操作:
!}fmt -w 9999
或从vi之外的命令行执行此操作:
$ fmt -w 9999 file.txt
我喜欢这种方法,因为我不必记住要重置textwidth = 80     

要回复问题请先登录注册