为什么 **/* 用于在 :vimgrep vim 命令中递归搜索当前目录?

Stu*_*ick 5 regex vim glob vimgrep

为什么他们使用双星号?

我读过Vim的帮助上vimgrep,我看了看周围的堆栈溢出和vimcasts并同时我发现很多人说这是怎么你在当前目录中递归搜索,我还没有找到一个解释,为什么

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

:vim[grep][!] /{pattern}/[g][j] {file}
Run Code Online (Sandbox Code Playgroud)

这样就变成

:vimgrep /foo/ **/*
Run Code Online (Sandbox Code Playgroud)

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

  • 我知道这是一个文件路径。
  • 我知道星号 ( *) 是通配符。
  • 我知道正斜杠充当目录分隔符。

我的具体问题是为什么它以

**/*

并不是

*/*

我已经尝试在几种不同的情况下使用/进行搜索,这似乎是在距我当前目录正好 1 深的任何目录中搜索任何文件,我认为这就是使用双星号的原因。

即为什么它是一个双星号?这是否通过一些我不完全理解的巧妙机制表示“我希望您递归搜索”,或者这只是一个用于表示“递归搜索”的关键字?我是否完全关闭,这不是 vim 的内置部分,而是外壳的一部分?(这些部分不是我的实际问题,而是有助于理解我的困惑,我的实际问题在上面)。

如果有什么方法可以改进我的问题,请告诉我,这是我第一次提问。

rkt*_*kta 3

简短回答:

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

更长的答案:

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

Vim 帮助对此做了很好的解释。

对于“其余”,请参阅:help wildcard:help starstar-wildcard

:help wildcard

** 匹配任何内容,包括什么都不匹配,递归到目录中

:help starstar-wildcard指定:

在 Unix、Win32、Mac OS/X 和一些其他系统上可以扩展“**”。这允许搜索目录树。这最多可达 100 个目录。


对于文件搜索,请参阅:help **:help starstar

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

文件搜索当前用于 finddir() 和 findfile() 的“path”、“cdpath”和“tags”选项。其他命令使用通配符,略有不同。

[...]

向下搜索使用通配符“*”、“**”以及
操作系统可能支持的其他通配符。'*' 和 '**' 在Vim内部处理,
因此它们适用于所有操作系统。

[...]

'**' 更复杂:
- 它仅匹配目录。
- 默认情况下,它最多匹配 30 个目录,因此您可以使用它来搜索整个目录树
- 可以通过在“**”后附加一个数字来给出匹配的最大级别数。