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

问题描述

我一直在进行一些自定义补全,但遇到了困难。它使用一些自定义选项扩展了现有的完成脚本。完整文件可在此处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是最后一个调用函数,但未显示制表符完成。

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

我无法确定是否需要从函数或规则中设置/返回变量,何时可以调用compadd返回完成值。


解决方法

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

因此,简而言之:将完成匹配项添加到COMPREPLY,而不是使用compinit,这应该可以解决。