转自常规 StackOverflow...
我是 OSX 上的新 ZSH 转换者(提示中的 git status 是我实现这一飞跃的主要驱动力)。一切似乎都进展顺利,但我错过了 BASH 的一些东西..
在 BASH 中,我将开始运行一个围绕 Symfony 的 CLI 工具构建的 CLI PHP 脚本。
通常我会运行这样的命令:
$> php doctrine --configuration=../conf/doctrine.xml migrations:migrate
在 BASH 中,我可以TAB在键入../conf/doctrine.xml
部分内容时使用该键来完成目录。
在 ZSH 中,键入TAB目录时按下按键不会产生任何结果。
ZSH 中是否有设置或我可以设置的配置来启用尝试完成几乎任何看起来像目录的内容的行为?
答案1
Zsh 试图聪明地选择补全,但它还不够聪明,无法知道在 后doctrine --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 中的单词分隔符,则可能需要在文件名前临时插入一个空格)。