正则表达式 – 为什么** / *用于递归搜索当前目录:vimgrep vim命令?

他们为什么使用双星号?

我已经阅读了Vim对vimgrep的帮助,我已经查看了堆栈溢出和vimcasts,虽然我发现很多人说这是你在当前目录中递归搜索的方式,但我没有找到解释为什么.

让我们用一个例子来解释.如果我想在当前目录中查找所有出现的foo并向下,我可以使用

:vim[grep][!] /{pattern}/[g][j] {file}

这样就变成了

:vimgrep /foo/ **/*

所以看看这个grep的{file}部分:

>我明白这是一个文件路径.
>我知道星号(*)是一个通配符.
>我明白前锋斜线就是一个
目录分隔符.

我的具体问题是为什么它的格式为

** / *

并不是

* / *

我尝试使用/在几个不同的情况下搜索,这似乎搜索任何目录中的任何文件正好距我当前目录1深,我假设这是为什么使用双星号.

即为什么它是一个双星号?这是否表明“我希望你通过一些我不完全理解的聪明机制来递归搜索”,或者这仅仅是一个用于说“递归搜索”的关键字?我是完全关闭的,这不是vim的内置部分,而是shell的一部分吗? (这些部分不是我的实际问题,而是用来理解我所困惑的,我的实际问题在上面).

如果我有任何方法可以改进我的问题,请告诉我,这是我第一次提问.

最佳答案 简短回答:

双星号是一个vim内置关键字,简单地说是“递归搜索”.
它被使用,因为vim的创建者选择在这种情况下使用它.

更长的回答:

有两种不同的情况,使用**:文件搜索和其余的.

Vim帮助很好地解释了这一点.

对于’休息’,请参阅:help wildcard和:help starstar-wildcard:

来自:help wildcard:

** matches anything, including nothing, recurses into directories

和:help starstar-wildcard指定:

Expanding “**” is possible on Unix, Win32, Mac OS/X and a few other
systems. This allows searching a directory tree. This goes up to
100 directories deep.

有关文件搜索,请参阅:help **或:help starstar.

引用相关部分(强调我的):

The file searching is currently used for the ‘path’, ‘cdpath’ and
‘tags’ options, for finddir() and findfile(). Other commands use
wildcards which is slightly different.

[…]

Downward search uses the wildcards ‘*’, ‘**’ and possibly others
supported by your operating system. ‘*’ and ‘**’ are handled inside Vim,
so they work on all operating systems.

[…]

‘**’ is more sophisticated:
– It ONLY matches directories.
– It matches up to 30 directories deep by default, so you can use it to
search an entire directory tree
– The maximum number of levels matched can be given by appending a number
to ‘**’.

点赞