如何在vim文件结束前执行命令?

时间:2014-04-04 17:04:19

标签: vim

我有一些看起来像:

{
hey1
},
{
you2
},
{
hey3
},
{
you4
}

我想将其更改为: {hey1}, {you2}, {hey3}, {you4}

我知道我可以创建一个像qa 3Jj q那样的宏然后做103@a但是我正在寻找一个不需要我的解决方案1)创建一个宏并且2)知道行数。所以我尝试的是:3J . G.,但这不起作用。如何在每3行执行3J命令直到文件结束?

4 个答案:

答案 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