Vim:在不同行上打开多个文件

19

我想知道是否有一种方法可以使用Vim打开多个文件,并且每个文件都指定特定的行号。我解释一下:

我经常使用这种语法:vim my/way/too/far/file +120,以便在120行编辑此文件,因为gcc告诉我要这样做。

现在我正在寻找的是一种同时对多个文件进行操作的方法!

当然,vim file1 +xx file2 +xx ... 是不起作用的(+选项仅对第一个文件有效...别问我为什么)

所以,如果有人知道如何解决这个问题,请告诉我吧?我在man页面里没有找到答案...

顺便说一句,有时候,file1可能与file2是同一个文件...

7个回答

13

这里有一种方式:vim +6 file1 +"sp +3 file2"。 如果你喜欢使用标签页,可以将sp改为tabnew

但是只有当有人能够制作一个脚本时,它才会真正有用...


那很好!现在我只需要想办法使用xargs从文件列表中转换为vim +10 file1 +"tabnew +14 file2" +"tabnew +...(是的,我更喜欢tabnew :) 如果我有足够的信心编写命令行,我会发布它的。谢谢! - claf
事实上,不好的一点是这个解决方案一次最多只能允许大约10个文件。 我正在使用一个命令获取文件名和行数,并使用xargs将它们传递给vim。 我希望能够启动尽可能多的文件,但很失望vim无法同时处理超过10个要打开的文件... - claf
也许你可以在ViM命令中使用一个for,其中包含文件名列表和另一个用于光标位置的for - Pik'

5

我刚写了这个:https://gist.github.com/xim/6123691

感谢Pikrass提供的思路=)

编辑:

如claferri所说,使用“+tabnew...”将限制您的文件数量为10个。更新了gist以使用-S。

vim函数将构建一个字符串($script),其中包含打开文件的vim脚本,在适当的行中,以选项卡形式打开。举个例子,这是通过将“vim -R file1:42 file2 file3:1337”更改为“vim -S <script> -R file1 file2 file3”来实现的-该字符串包含vim脚本,例如:

tab all
tablast
1337
tabprev
tabprev
42

所以:我们正常打开文件,然后执行脚本:跳转到最后一个标签,然后向第一个文件移动时为每个文件跳转到相应的行。这个技巧只经过了适度的测试,请在出现任何错误时进行评论。
重新编辑:
修复了脚本,因此即使像vim -R 1:3 "a file" foo -- -- "some other file":34 -R这样的疯狂示例也能按预期工作。

如果您在 SO 上提供了代码解释(例如对于像我这样的 Vim 新手),那将非常有帮助。 - Enigmadan

3

vim可以读取你的gcc输出,并创建一个快速修复列表,使你能够轻松地浏览代码中的所有错误。你可以使用vim -q读取现有的错误文件,或者如果你的项目使用Makefile,则可以使用:make命令从vim中执行make并捕获其输出。


1

要跳转到file1.txt的第3行和file2.txt的第4行,我这样做:

vim -c ":e file1.txt|:3|:e file2.txt|:4"

2
不错!我认为分屏可能会更好:vim -c“:e file1.txt |:3 |:vsplit file2.txt |:4” - Narcélio Filho

1
有一个名为file-line的vim插件,可以轻松实现此功能,但是目前打开多个文件到特定行时存在一些问题。我喜欢上面的一些解决方法,但如果您想获得一个包含文件及其相应行号的缓冲区列表:ls,则file-line可以起作用,然后您可以使用类似于bufdo的东西将它们全部打开分割。

https://github.com/bogado/file-line


1
另一个选择是使用类似utl的脚本,根据gcc的输出自动创建一个包含文件/行号超链接的文件(这应该很容易用sed实现)。
使用utl格式化的链接如下所示:<url:error.c#line=10> 编辑:链接到更合适的vim链接脚本。

Neil的建议是这个问题的更好版本。 - Justin Smith

1
这是一个仅限命令行的解决方案(无需插件),也适用于“:n”和“:prev”(而“:e”解决方案不适用),不需要选项卡或分割。
vim filea fileb filec -c ':10|:bu 2|:100|:bu 3|:200|:rewind'

这将使用文件a,文件b,文件c的缓冲区打开,并从文件a的第10行开始,然后“:n”将转到文件b的第100行,最后转到文件c的第200行。唯一的缺点是它会在打开所有文件时将所有缓冲区名称打印为消息,并且您需要按“Enter”键继续(尽管设置“shortmsg = a”可能会有所帮助)。

我试过使用“:badd”(添加缓冲区),它允许指定行号,但然后缓冲区没有被加载,似乎没有办法强制它们加载以便“:n”可以使用而不仅仅是“bu<num>”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接