总体概述
我必须在 zsh 中为命令设置值自动完成(在下面的最小示例中,我将使用 进行展示testcmd
)。因此,我当前的代码可以很好地处理硬编码值:
当前自动完成代码(起作用的代码)
function testcmd()
{
echo "Nothing to do, just a test command"
}
_test_complete() {
_values \
"Possible values" \
foo'[Foo]' \
bar'[Bar baz]' \
}
compdef _test_complete testcmd
当前的自动完成行为
当我输入时testcmd <tab>
,我正确地得到了以下所需的渲染:
$ testcmd
Possible values
bar -- Bar baz
foo -- Foo
我想要达到的目标是什么
但是正如您所看到的,这些值在函数内部是硬编码的,理想情况下,函数应该从变量中检索它们。
我已经尝试过
因此很自然地,我将值放入变量中,values_variable
如下所示:
已尝试的代码(无效的代码)
function testcmd()
{
echo "Nothing to do, just a test command"
}
_test_complete() {
local values_variable
values_variable="foo'[Foo]' \
bar'[Bar baz]' \ "
_values \
"Possible values" \
${values_variable}
}
compdef _test_complete testcmd
已尝试代码的行为
但是当我尝试时testcmd <tab>
它完全失败了:
$ testcmd
_values:compvalues:11: invalid value definition: foo'[Foo]' \t\tbar'[Bar baz]' \
_values:compvalues:11: invalid value definition: foo'[Foo]' \t\tbar'[Bar baz]' \
_values:compvalues:11: invalid value definition: foo'[Foo]' \t\tbar'[Bar baz]' \
$ testcmd
我还做了什么
- 我试图用 来逃避这些空间
echo ${values_variable} | sed "s/ /\\ /g"
; - 我尝试使用
$values_variable
命令eval
来假装它的内容直接在定义中输入_values
; - 我尝试了两者
eval
并逃脱eval $(echo ${values_variable} | sed "s/ /\\ /g")
; - 我尝试用循环逐行显示:
echo "$values_variable" | while read -r line; do
eval "$line"
done
- 扩展与
${(@f)values_variable}̀
; - 还有很多其他的想法。但是都失败了。
我找到的最接近的解决方案
在 如何使用to (zsh 补全) tread传递文件内容cat
_values
中,我找到了从外部文件导入值的解决方案,但用户似乎面临着相同的空格转义问题。但是,我无法将其调整为内部变量的情况$values_variables
。
我自然尝试了这个,但它也不起作用:
_test_complete() {
local values_variable
values_variable="foo'[Foo]' \
bar'[Bar baz]' \ "
OLD_IFS=$IFS
IFS=$'\n'
_values \
"Possible values" \
${values_variable}
IFS=$OLD_IFS
}
问题
_values
如何从变量加载要提供给自动完成函数内部的值?