You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

代码逻辑说明

  1. 判断补全位置:
    • CURRENT是ZSH补全系统提供的变量,表示当前光标所在的参数索引(从1开始计数,words[1]是命令本身mycmd)。
    • 当CURRENT == 2时,补全第一个参数,保留你原来的compadd foo ssh ls逻辑。
  2. 二级参数补全分支:
    • 当CURRENT == 3时,根据已输入的第一个参数(words[2])执行不同逻辑:
      • 若第一个参数是ssh,直接调用系统内置的_ssh补全函数,它会自动复用SSH的主机补全规则(包括读取~/.ssh/config、known_hosts等文件的内容)。
      • 若第一个参数是ls,调用系统内置的_ls补全函数,自动补全文件、目录等符合ls参数的内容。
      • 若第一个参数是foo,不执行任何补全操作,符合“无需第二个参数”的要求。

内容的提问来源于stack exchange,提问作者doca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:36:19