zsh 文件制表符补全:路径以非空格字符开头

sam*_*ers 2 zsh autocomplete

我想不出一种方法来搜索这个,看看它是否已经在互联网上解释过了。

我在命令行中有以下内容,我想<TAB>在最后点击以开始文件完成:

   mycmd process file=data/old/1/
Run Code Online (Sandbox Code Playgroud)

当我使用 Bash 时,该 TAB 会向我显示文件夹中的文件,1/但使用 Zsh 时不会发生这种情况,除非我在=符号后输入一个空格。我可以重新配置 Zsh 来做到这一点吗?

Gil*_*il' 5

setopt magic_equal_subst
Run Code Online (Sandbox Code Playgroud)

这适用于旧式和新式完成,即有或没有compinit.

完成文件名之后=是该magic_equal_subst选项的一个模糊且未记录的副作用。此选项的文件效果是使文件名扩展=

大多数情况下,如果您完全注意到此选项的效果,则它是理想的效果,例如

somecommand --option=~/file
Run Code Online (Sandbox Code Playgroud)

将主目录下的路径传递给somecommand,而不是名为~. 然而,这也有通常不受欢迎的效果,即参数==触发文件名扩展:

somecommand foo==bar
Run Code Online (Sandbox Code Playgroud)

foo=/bin/bar如果bar$PATHat 中找到命令,则通过/bin/bar。如果你想==从字面上传递给命令,至少需要引用一个等号,例如

somecommand foo=\=bar
somecommand foo\==bar
Run Code Online (Sandbox Code Playgroud)

在新式完成系统中,这是在_default. 如果您想在=不启用后获得文件名完成magic_equal_subst,则需要覆盖或环绕_default以获得相同的效果。例如:

autoload +X -U _default
functions[_default]="setopt local_options magic_equal_subst; $functions[_default]"
Run Code Online (Sandbox Code Playgroud)