我一直在做一些自定义补全,但遇到了问题。它使用一些自定义选项扩展了现有的完成脚本。完整文件可在此处找到https://github.com/rothgar/k/blob/zsh-completion/completions/zsh/k
我有一个名为__k_handle_kspace
的自定义函数,它查看当前单词并执行基本的大小写语句,然后调用另一个函数。(在此处粘贴没有注释和额外选项的代码(
__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_*
功能可以在这里找到
默认情况下,完成使用调用__k_handle_word
的__start_k
,然后调用我的__k_handle_kspace
函数。
当我设置compdef __start_k k
时,我可以看到我的函数被调用(使用set -x
进行调试(,compadd
是最后调用的东西,但没有显示选项卡完成。
当我使用默认完成时,我还必须在__k_handle_kspace
函数中将cur变量更改为cur="${words[$(($CURRENT -1))]}"
。
我不知道是否有一个变量需要我从函数中设置/返回,或者何时可以调用compadd
返回完成值的规则。
您正在扩展的完成代码是基于bashcompinit
的。因此,您需要将代码编写为Bash完成函数。这意味着您应该将完成匹配项添加到数组COMPREPLY
中。因为函数返回时该数组为空,所以_bash_complete
会向Zsh的_main_complete
报告它失败了。
因此,简而言之:将您的完成匹配项添加到COMPREPLY
,而不是使用compadd
,这样应该可以修复它