vim :grep 使用 bash 'globstar' 选项

ner*_*ist 3 grep bash vim

我正在(慢慢地)切换到 Vim 进行日常 Ruby on Rails 编码(Linux Cinnamon 64 位)。作为一个新手,我最近遇到了一些我不明白的事情。

我想使用 :vimgrep 和 :grep 命令在 Vim 的文件树中搜索模式。我可以使用 :vimgrep 命令来做到这一点:

:vimgrep /User/gj **/*.rb
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将相同的命令与 :grep (应该使用系统 grep)一起使用时,没有返回任何结果:

:grep User **/*.rb
Run Code Online (Sandbox Code Playgroud)

谷歌搜索,我发现我的 bash shell的globstar选项没有启用:

$shopt globstar
globstar        off
Run Code Online (Sandbox Code Playgroud)

很容易开启:

$shopt -s globstar
Run Code Online (Sandbox Code Playgroud)

我将上述行添加到我的 .vimrc 文件中,并确保该选项在我的 bash 中永久启用。

使用新选项,我可以通过这种方式执行 grep 并获得所需的结果:

$grep User **/*.rb
Run Code Online (Sandbox Code Playgroud)

不幸的是,来自 Vim 内部的 :grep 命令仍然不能使用 '**'。并执行:

!shopt globstar
Run Code Online (Sandbox Code Playgroud)

从 Vim 内部,结果仍然是off

所以问题是:我可以将我的 bash 的globstar选项传播到我的 Vim 外部命令环境吗?否则,我能否以某种方式在 Vim 中设置我的grepprg选项,以允许我正确使用 globstar?

提前感谢任何愿意提供帮助的人

Ing*_*kat 5

shell 选项不会继承分叉的 shell,但这就是 Vim 在您使用:!命令时所做的:它启动一个新的 shell。

您可以通过以下'shell'选项影响 Vim 中的那些分叉 shell :

:set shell+=\ -O\ globstar
Run Code Online (Sandbox Code Playgroud)

或者

:set shell=/bin/bash\ -O\ globstar
Run Code Online (Sandbox Code Playgroud)