如何为ZSH自定义函数mycmd编写参数依赖的自动补全并复用现有补全?
解决ZSH自定义函数
mycmd的二级参数补全问题 直接替换你现有的_mycmd补全函数为以下代码即可实现需求:
_mycmd() { if (( CURRENT == 2 )); then compadd foo ssh ls elif (( CURRENT == 3 )); then case $words[2] in ssh) _ssh ;; ls) _ls ;; foo) # foo无需第二个参数,不提供补全 ;; esac fi } compdef _mycmd mycmd
代码逻辑说明
- 判断补全位置:
CURRENT是ZSH补全系统提供的变量,表示当前光标所在的参数索引(从1开始计数,words[1]是命令本身mycmd)。- 当
CURRENT == 2时,补全第一个参数,保留你原来的compadd foo ssh ls逻辑。
- 二级参数补全分支:
- 当
CURRENT == 3时,根据已输入的第一个参数(words[2])执行不同逻辑:- 若第一个参数是
ssh,直接调用系统内置的_ssh补全函数,它会自动复用SSH的主机补全规则(包括读取~/.ssh/config、known_hosts等文件的内容)。 - 若第一个参数是
ls,调用系统内置的_ls补全函数,自动补全文件、目录等符合ls参数的内容。 - 若第一个参数是
foo,不执行任何补全操作,符合“无需第二个参数”的要求。
- 若第一个参数是
- 当
内容的提问来源于stack exchange,提问作者doca
相关产品推荐
相关产品推荐

