Как заполнить переменное число аргументов, содержащих пробелы
Я построил инструмент командной строки, и мне нужно завершить аргументы с Zsh. Я никогда не писал функцию завершения zsh, поэтому я посмотрел скрипты, поставляемые с zsh, но что-то упустил, чтобы она могла работать должным образом.
Таким образом, mytool может принимать переменное количество значений и два параметра. Вот несколько примеров вызовов:
mytool ONE
mytool ONE TWO
mytool AAA BBB CCC DDD EEE --info
Чтобы завершить значения, у меня есть еще один исполняемый файл, который выводит все возможные строки в стандартный вывод, как этот упрощенный скрипт с именем getdata:
#!/usr/local/bin/zsh
echo ONE
echo TWO ONE
echo TWO TWO
# ... a lot of lines
echo OTHER ONE
echo ONE ANOTHER LINE
echo AAA BBB CCC DDD EEE
Каждое завершение должно соответствовать целой строке, поэтому в моем примере с getdata невозможно просто завершить значением TWO, потому что всей этой строки не существует, она должна быть TWO ONE или TWO TWO.
Поскольку этот скрипт занимает много времени, я бы хотел использовать функцию кэширования zsh. Итак, вот мой полный скрипт zsh:
compdef _complete_mytool mytool
__mytool_caching_policy() {
oldp=( "$1"(Nmh+1) ) # 1 hour
(( $#oldp ))
}
__mytool_deployments() {
local cache_policy
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
if [[ -z "$cache_policy" ]]; then
zstyle ":completion:${curcontext}:" cache-policy __mytool_caching_policy
fi
if ( [[ ${+_mytool_values} -eq 0 ]] || _cache_invalid mytool_deployments ) \
&& ! _retrieve_cache mytool_deployments;
then
local -a lines
_mytool_values=(${(f)"$(_call_program values getdata)"})
_store_cache mytool_deployments _mytool_values
fi
_describe "mytool values" _mytool_values
}
_complete_mytool() {
integer ret=1
local -a context expl line state state_descr args
typeset -A opt_args
args+=(
'*:values:->values'
'--help[show this help message and exit]'
'(-i --info)'{-i,--info}'[display info about values and exit]'
'(-v --version)'{-v,--version}'[display version about values and exit]'
)
_call_function res __mytool_deployments
return ret
}
Но когда я пытаюсь завершить, пробелы освобождаются от обратной косой черты, и я не хочу такого поведения.
mytool OTHER\ ONE
Опции, похоже, тоже не завершены... Поэтому любая помощь будет принята с благодарностью.
1 ответ
Благодаря okdana на канале freenode zsh, который мне очень помог.
Итак, решение:
compdef _complete_mytool mytool
__mytool_caching_policy() {
oldp=( "$1"(Nmh+1) ) # 1 hour
(( $#oldp ))
}
__mytool_deployments() {
local cache_policy
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
if [[ -z "$cache_policy" ]]; then
zstyle ":completion:${curcontext}:" cache-policy __mytool_caching_policy
fi
if ( [[ ${+_mytool_values} -eq 0 ]] || _cache_invalid mytool_deployments ) \
&& ! _retrieve_cache mytool_deployments;
then
local -a lines
_mytool_values=(${(f)"$(_call_program values getdata)"})
_store_cache mytool_deployments _mytool_values
fi
_describe "mytool values" _mytool_values -Q
}
_complete_mytool() {
_arguments : \
': :__mytool_deployments' \
'--help[show this help message and exit]' \
'(-i --info)'{-i,--info}'[display info about values and exit]' \
'(-v --version)'{-v,--version}'[display version about values and exit]'
}