我有一些看起来像:
{
hey1
},
{
you2
},
{
hey3
},
{
you4
}
我想将其更改为:
{hey1},
{you2},
{hey3},
{you4}
。
我知道我可以创建一个像qa 3Jj q
那样的宏然后做103@a
但是我正在寻找一个不需要我的解决方案1)创建一个宏并且2)知道行数。所以我尝试的是:3J . G.
,但这不起作用。如何在每3行执行3J命令直到文件结束?
答案 0 :(得分:5)
您可以使用j!3
命令在以{
开头的每一行上执行:global
(连接三行,从当前的一行开始,没有多余的空格):
:g/^{/j!3
如果你试图在每一行上做同样的事情(忽略第一个字符),你会得到完全相同的结果(在你的示例文本上),因为:g
知道不要试图在一行上执行命令不再存在了:
:g/^/j!3
答案 1 :(得分:3)
您可以使用以下命令加入这些行:
:%j!
更新:如果你想使用宏,你可以使用
在整个文件上运行它:%normal @a
答案 2 :(得分:1)
您可以编写一个显式循环,当它到达最后一行时停止:
:while line('.') < line('$') | exe 'normal! 3Jj' | endwhile
或者,当没有更多行时,您可以依赖命令序列中止,并创建一个足够长的序列:
:exe 'normal!' repeat('3Jj', 100)
答案 3 :(得分:0)
好吧,如果你不想制作一个宏,你仍然不需要知道行数。您可以执行999999 @ a并且它将在最后一行停止,因为转到下一行的'j'命令将错误输出并中止命令的其余部分。或者,您可以录制递归宏来执行相同的操作:http://vim.wikia.com/wiki/Record_a_recursive_macro