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 的内置部分,而是外壳的一部分?(这些部分不是我的实际问题,而是有助于理解我的困惑,我的实际问题在上面)。
如果有什么方法可以改进我的问题,请告诉我,这是我第一次提问。
双星号是 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 个目录,因此您可以使用它来搜索整个目录树
- 可以通过在“**”后附加一个数字来给出匹配的最大级别数。