ZSH 在命令行参数中自动完成目录?

dco*_*eau 4 osx zsh autocomplete

从常规 StackOverflow 转移...

我是 OSX 上的新 ZSH 转换程序(提示中的 git status 是我实现飞跃的主要驱动力)。一切似乎都很顺利,但我在 BASH 中遗漏了一些东西..

在 BASH 中,我将开始运行围绕 Symfony 的 CLI 工具构建的 CLI PHP 脚本。

通常我会像这样运行命令:

$> php doctrine --configuration=../conf/doctrine.xml migrations:migrate
Run Code Online (Sandbox Code Playgroud)

在 BASH 中,我可以TAB在键入../conf/doctrine.xml部分以完成目录时使用密钥。

在 ZSH 中,TAB在键入目录时按下键会导致......什么都没有。

ZSH 中是否有设置或我可以设置的配置来启用这种尝试完成几乎所有看起来像目录的行为的行为?

Gil*_*il' 5

Zsh 试图巧妙地选择补全,但它不够聪明,无法知道 afterdoctrine --configuration=应该补全文件名。Bash 要么足够聪明,可以正确解析此命令,要么太愚蠢,无法在此处完成除文件名之外的任何内容。

您可以为doctrine. 不过,这有点高级——完成功能往往有点神秘。您可能会发现使用 zsh 的替代、更旧、更简单但功能较弱的完成系统compctl(在zshcompctl手册页中记录)编写完成程序更容易。

如果您有 bash 完成功能doctrine,您可以通过autoload bashcompinit; bashcompinit~/.zshrc. 请参阅zsh wiki 上的从 bash 切换

您可能会发现将几个键绑定到_bash_complete-word. 此小部件(交互式命令)根据调用小部件的键序列中的最后一个字符执行一些内置类型的补全:/用于目录、$用于参数名称等。例如,包含bindkey '^X/' _bash_complete-word在您的 中~/.zshrc,然后按Ctrl+X /以在任何上下文中完成文件名(如果文件名前面是不是 shell 中的单词分隔符的标点符号,则您可能需要在文件名前临时插入一个空格)。