从嵌套函数调用时 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
,这样应该可以解决问题。
我一直在处理一些自定义完成,但卡住了。它使用一些自定义选项扩展现有的完成脚本。可以在此处找到完整文件 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
,这样应该可以解决问题。