如何让vim在不同的标签页中打开所有符合模式的文件?

23

在给定的工作目录中,如果我执行以下操作:

:tabe **/test*.py

vim 报错 E77: Too many file names。如果我想让它打开每个匹配的文件并在单独的标签页中打开,该怎么办?肯定有方法可以做到,但我找不到。


相关:如何一次打开多个标签页? 在 Vim SE 上。 - kenorb
5个回答

35
你可以使用args列表和argdo来实现,例如:
:args **/test*.py
:argdo tabe %

然而,argdo 关闭了语法事件(为了加速正常使用情况),因此文件在最初加载时将没有语法。 您可以跟随 :syntax on 命令,强制对所有已加载的缓冲区开启语法事件。 将其压缩到一行中(需要在 execute 中包装 argdo,以便它不吸收后续的 |)。

:args **/test*.py | execute 'argdo tabe %' | syntax on

或者,您可以通过命令行打开vim:

vim -p **/test*.py

但是那将会最多达到10个选项卡。


2
非常感谢!现在,我该如何将这个模式设置为参数,以便我可以将脚本映射到一个新的命令上,然后可以执行 :tabeall **/test*.py 这样的操作呢? - Martin Blech
set tabpagemax=100 将允许 Vim 打开 100 个标签页。 - sixtyfootersdude
如下所述,@cooldoger的答案更快、更短、更容易。我想这里的问题是好老的vim混淆了“标签”和“缓冲区”(参见:https://dev59.com/dF8d5IYBdhLWcg3wiip9)。我认为打开100个标签页并不有用,最好使用缓冲区,并学会正确使用它们(例如:https://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/)。 - Simon C.

10

您可以使用以下内容:

:next **/test*.py

它打开了所有的文件。


1
这怎么不是正确答案呢?它简单多了! - Strudle
我同意这个答案更好、更简单、更快,但由于问题要求“不同的选项卡”,我想被采纳的答案是正确的。 - Simon C.
我不明白这个代码是如何实现所要求的功能的。如果我尝试运行它,只会打开一个缓冲区。 - Turion

1
将其映射
nmap <c-d> :args **/*.tpl<bar>execute 'argdo tabe %'<bar>syntax on<cr>

但它仍然显示文件列表,您需要按下几次回车键(取决于文件数量)。


或者 nmap <c-d> :args **/*.tpl ^M argdo tabe % ^M syntax on ^M。使用 Control-Q 来输入 ^M (换行)的字面值。但仍会显示文件列表。 - Josiah Yoder

0

这个功能可以作为一个命令包含在你的.vimrc文件中:

"open all files in seperate tabs
command -nargs=1 OpenAll call <SID>openAll(<f-args>)
function! s:openAll(dir)
    execute 'args ' . a:dir
    silent argdo tabe %
    syntax on
endfunction

使用这个函数,从vim中运行:OpenAll **/*.py将快速打开所有文件到新标签页。


0

其他答案对我都不起作用,但这个可以:

find <path> -iname <pattrn> | xargs -o vim -p

所有文件都在不同的选项卡中可见。 文件查找是递归的。
注意,vim可以限制选项卡 - 可以通过“set tabpagemax = 42”进行更改。
此外,如果你想知道如何同时关闭所有选项卡,请使用“:qa”。

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