zsh 中 bash 的替代品?

zsh 中 bash 的替代品?

我最近从 bash 转向了 zsh。

当我运行时complete -f _ssh sshrc它显示

zsh: command not found: complete
  • completezsh 中 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 之间的差异概述

相关内容