我最近从 bash 转向了 zsh。
当我运行时complete -f _ssh sshrc
它显示
zsh: command not found: complete
complete
zsh 中 bash 的替代方案是什么?如何在 zsh shell 中添加别名命令到自动补全?
答案1
我假设您正在使用“新的完成系统”(compinit
),如果没有,请参见下文。
默认情况下,zsh 在执行补全之前会扩展别名,因此如果sshrc
是带有一些额外选项的别名ssh
,您将获得开箱即用的补全。但如果sshrc
是函数或脚本,则需要解释如何完成它。
要使命令使用特定功能,请使用compdef
功能:
compdef _ssh sshrc
大多数补全函数都不会遇到一个额外的困难_ssh
:它根据命令名称,或更准确地说根据“服务名称”(默认情况下是命令名称)而采取不同的行动。如果
_ssh
无法识别命令名称,则它不会提供任何补全。
要sshrc
像 一样完成ssh
,请直接指示 zsh 执行此操作。这不仅设置了sshrc
要完成的功能_ssh
,而且还声明了服务名称,以便正常sshrc
工作。ssh
_ssh
compdef sshrc=ssh
在引擎盖下,这执行
_comps[sshrc]=$_comps[ssh]
_services[sshrc]=ssh
zsh 中的补全系统
Zsh 具有三种完成机制:“旧式”完成compctl
,“新式”完成(这是在 20 世纪 90 年代推出的,所以它并不完全是新奇的),并且bash 完成的兼容层。
默认情况下,zsh 使用旧的完成系统,以实现向后兼容性。但任何在新的补全系统可用后开始使用 zsh 的人都应该使用它。新用户向导可以将必要的行添加到您的配置文件中。如果您没有机会运行它,或者您想重新运行它,请参阅运行 Zsh 首次使用向导,选择“使用新的完成系统。”,根据需要调整设置,然后确认更改直至保存。
如果你把bashcompinit
在你的 中.zshrc
,它定义了一个complete
与 bash 大部分兼容的函数。兼容性并不完美,但足以运行人们用自己的程序编写和分发的大多数完成功能。
PS 作为 zsh 的新用户,你可能对我的感兴趣bash 和 zsh 之间的差异概述。