Visão geral
Tenho que definir um autocompletar de valores no zsh para um comando (no exemplo mínimo a seguir, mostrarei com testcmd
). Então meu código atual funciona muito bem com valores codificados:
Código de autocompletar atual (aquele que funciona)
function testcmd()
{
echo "Nothing to do, just a test command"
}
_test_complete() {
_values \
"Possible values" \
foo'[Foo]' \
bar'[Bar baz]' \
}
compdef _test_complete testcmd
Comportamento atual de preenchimento automático
Quando digito testcmd <tab>
, obtenho corretamente a seguinte renderização desejada:
$ testcmd
Possible values
bar -- Bar baz
foo -- Foo
Qual é o objetivo que busco alcançar
Mas, como você pode ver, os valores são codificados dentro da função. O ideal é que a função os recupere de uma variável.
O que eu já tentei
Então, naturalmente, coloquei os valores dentro da variável values_variable
da seguinte forma:
O código testado (aquele que não funciona)
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
O comportamento do código testado
Mas então, quando tento, testcmd <tab>
falha completamente:
$ 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
O que eu também fiz
- Tentei escapar dos espaços com
echo ${values_variable} | sed "s/ /\\ /g"
; - Tentei usar
$values_variable
oeval
comando para fingir que o conteúdo foi digitado diretamente dentro da_values
definição; - Eu tentei os dois
eval
e escapei comeval $(echo ${values_variable} | sed "s/ /\\ /g")
; - Tentei revelar linha por linha com um loop:
echo "$values_variable" | while read -r line; do
eval "$line"
done
- Expansão com
${(@f)values_variable}̀
; - Muitas outras ideias. Mas também falhou.
A solução mais próxima que encontrei
Em Como passar o conteúdo de um arquivo usando cat
to _values
(zsh conclusion) tread, encontrei uma solução para valores importados de um arquivo externo, mas o usuário parece estar enfrentando o mesmo problema de escape de espaço. No entanto, não consigo ajustá-lo ao caso com a $values_variables
variável interna.
Eu naturalmente tentei este, que também não funciona:
_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
}
A questão
Como posso carregar os valores para fornecer _values
dentro da função de preenchimento automático de uma variável?
Você pode usar uma variável de matriz:
Então
testcmd
TABmostrará: