5

为什么他们使用双星号?

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

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

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

这样就变成了

:vimgrep /foo/ **/*

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

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

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

**/*

并不是

*/*

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

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

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

4

1 回答 1

1

简短的回答:

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

更长的答案:

有两种不同的情况,**用在哪里:文件搜索和其他。

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

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

来自:help wildcard

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

:help starstar-wildcard指定:

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


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

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

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

[...]

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

[...]

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

于 2018-08-09T17:43:02.953 回答