如何在vim中执行命令直到文件结束?

如何在vim中执行命令直到文件结束?,vim,Vim,我有一些东西看起来像: { hey1 }, { you2 }, { hey3 }, { you4 } 我想把它改成: {hey1}, {you2}, {hey3}, {you4} 我知道我可以做一个像qa 3Jj q这样的宏,然后再做103@a但我正在寻找一种解决方案,它不需要我1制作一个宏,2知道行数。所以我尝试了一些类似3J的东西。但是那不行。如何在文件结束前每隔3行执行3J命令?您可以使用以下命令连接这些行: :%j! Udpate:如果您想使用宏,可以使用 :%normal @a

我有一些东西看起来像:

{
hey1
},
{
you2
},
{
hey3
},
{
you4
}
我想把它改成: {hey1}, {you2}, {hey3}, {you4}


我知道我可以做一个像qa 3Jj q这样的宏,然后再做103@a但我正在寻找一种解决方案,它不需要我1制作一个宏,2知道行数。所以我尝试了一些类似3J的东西。但是那不行。如何在文件结束前每隔3行执行3J命令?

您可以使用以下命令连接这些行:

:%j! 
Udpate:如果您想使用宏,可以使用

:%normal  @a 

您可以编写一个显式循环,该循环在到达最后一行时停止:

:while line('.') < line('$') | exe 'normal! 3Jj' | endwhile
你可以执行j!3使用:global命令,从当前一行开始,连接三行,在以{开头的每一行上没有额外的空格:

如果在忽略第一个字符的情况下尝试在每一行上执行相同的操作,则在示例文本上会得到完全相同的结果,因为:g知道不需要在不再存在的行上执行命令:

:g/^/j!3

好吧,如果你不反对制作宏,你仍然不需要知道行数。你可以这样做999999@a它将在最后一行停止,因为转到下一行的“j”命令将出错并中止命令的其余部分。或者,您可以录制一个递归宏来执行相同的操作:

您说要在e上执行3J一组三行,但是你想要的输出是所有的行都连接起来了。你在找哪一行?很抱歉,我更新了问题。问题现在被编辑了;这不是OP想要的。哦!我查看了以前想要的输出并回答了这个问题。
:g/^{/j!3
:g/^/j!3