我已经构建了命令行工具,并且需要使用zsh来完成参数。我从未编写过zsh完成函数,因此我查看了zsh随附的脚本,但是错过了一些东西,以便它可以正常工作。
因此, mytool 可以采用可变数量的值和两个选项。 以下是一些通话示例:
mytool ONE
mytool ONE TWO
mytool AAA BBB CCC DDD EEE --info
为了完成这些值,我有另一个可执行文件,它将所有可能的行输出到stdout,例如名为 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来完成,因为整行不存在,它必须是2或2。
由于此脚本非常耗时,因此我想使用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
选项似乎也没有完成...因此,将不胜感激任何帮助。
答案 0 :(得分:0)
感谢freenode zsh频道上的okdana对我有很大帮助。
因此,解决方案是:
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]'
}