我正在尝试使用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,})"
但这样可以将所有行连接在一起(不保留空行)。
我错了什么?
答案 0 :(得分:23)
答案 1 :(得分:15)
使用第二个匹配的字符替换所有换行符,后跟除换行符之外的其他内容:
:%s/\(\S\)\n\(\S\)/\1 \2/
另一种方法:
:%s/\n\([^\n]\)/\1/
答案 2 :(得分:4)
被低估的命令模式和: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
视觉选择内部段落连接