从嵌套函数调用时 compadd 不起作用

compadd doesn't work when called from nested functions

我一直在处理一些自定义完成,但卡住了。它使用一些自定义选项扩展现有的完成脚本。可以在此处找到完整文件 https://github.com/rothgar/k/blob/zsh-completion/completions/zsh/k

我有一个名为 __k_handle_kspace 的自定义函数,它查看当前单词并执行基本的 case 语句并调用另一个函数。 (在此处粘贴没有注释和额外选项的代码)

__k_handle_kspace() {
    cur="${words[$CURRENT]}"

    case $cur in
    +* )
        __k_kspace_parse_config_contexts
        ;;
    @* )
        __k_kspace_parse_config_clusters
esac

当我设置 compdef __k_handle_kspace k 时,效果很好,所有制表符补全正是我想要的。可以找到完整的 __k_kspace_parse_config_* 函数 here

默认情况下完成使用 __start_k 调用 __k_handle_word 然后调用我的 __k_handle_kspace 函数。

当我设置 compdef __start_k k 时,我可以看到我的函数被调用(使用 set -x 进行调试)并且 compadd 是最后调用的东西,但没有显示制表符完成。

当我使用默认完成时,我还必须在我的 __k_handle_kspace 函数中将 cur 变量更改为 cur="${words[$(($CURRENT -1))]}"

我无法弄清楚我的函数中是否需要 set/return 的变量,或者关于何时可以调用 compadd 以获得 return 完成值的规则。


您要扩展的完成代码基于 bashcompinit。因此,您需要将代码编写为 Bash 完成函数。这意味着您应该将完成匹配添加到 array COMPREPLY。因为当您的函数 returns、_bash_complete 向 Zsh 的 _main_complete 报告它失败时该数组为空。

所以,简而言之:将您的完成匹配添加到 COMPREPLY,而不是使用 compadd,这样应该可以解决问题。