如何完成可变数量的包含空格的参数

时间:2019-02-01 11:19:26

标签: zsh zsh-completion

我已经构建了命令行工具,并且需要使用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

选项似乎也没有完成...因此,将不胜感激任何帮助。

1 个答案:

答案 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]'
}