Как заполнить переменное количество аргументов, содержащих пробелы

Я создал инструмент командной строки, и мне нужно завершить аргументы с помощью 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 будет невозможно просто завершить со значением ДВА, потому что всей этой строки не существует, это должно быть ДВА ОДИН или ДВА ДВА.

Поскольку этот скрипт требует много времени, я хотел бы использовать функцию кэширования 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

Варианты, кажется, тоже не завершены ... Так что любая помощь будет принята с благодарностью.


person matt    schedule 01.02.2019    source источник
comment
Добавление -Q в конце строки _describe, похоже, имеет дело с обратной косой чертой. Итак, остается проблема с опциями и двойным завершением, например: mytool TWO ONE TWO ONE.   -  person matt    schedule 01.02.2019


Ответы (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]'
}
person matt    schedule 01.02.2019