Применять параметры завершения динамически - PullRequest
1 голос
/ 19 мая 2019

У меня есть fish shell завершение, подобное этому для docker:

# 'docker-subcommands.txt' is an exhaustive list derived from the "Usage" message.
set -l subcoms (cat /etc/fish/completions/docker-subcommands.txt)

# Found '__fish_seen_subcommand_from' in the completion for `systemctl`
# (in /usr/share/fish/completions/...).
complete -f -c docker -n "not __fish_seen_subcommand_from $subcoms" -a "$subcoms"

function _docker_container_action
# The placeholder is needed here because fish will choke on an empty completion list.
        echo (docker ps -aq) '{z-placeholder}'
end

function _docker_image_action
        echo (docker images -q) '{z-placeholder}'
end

for sc in cp exec inspect restart rm start stop
        complete -c docker -n "contains $sc (commandline -poc)" -x -a (_docker_container_action)
end

for sc in rmi run
        complete -c docker -n "contains $sc (commandline -poc)" -x -a (_docker_image_action)
end

Проблема заключается в том, что завершение для идентификатора изображения и контейнера должно быть динамическим (например, завершение файла), в то время как вышеприведенное, кажется, запускает команду -a, когда файл завершения (ре) получен.

Как я могу сделать так, чтобы это обновляло опции, когда завершение фактически применяется?

Я должен упомянуть, что я пытался процитировать команду -a, что, как представляется, является обычной практикой.Но тогда вместо опции для каждого идентификатора я получаю только одну опцию завершения, в которой скрывается длинная строка с пробелом (\), содержащая идентификаторы и \{z-placeholder} в конце.: (


[...] Цитирование команды -a работает до тех пор, пока ее вывод не производится с помощью echo (который его преобразует). Получается -a 's'проблема "задыхаться" не в аргументе, что и происходит, если вы положите туда docker ps -aq напрямую, и в списке нет идентификаторов контейнеров. Таким образом, этот шаблон работает:

function _docker_container_action
    docker ps -aq
end

complete -c docker -n "contains $sc (commandline -poc)" -x -a "(_docker_container_action)"

И нет необходимости в моем заполнителелибо.

1 Ответ

4 голосов
/ 19 мая 2019

в то время как приведенное выше, похоже, запускает команду -a, когда файл завершения (из исходного кода).

Это потому, что вы включили его здесь в качестве подстановки команд, поэтому, когда файл равен source d, он расширяется, и система завершения не имеет представления о том, что было раньше.

Но опция -a знает, как расширить аргумент во время завершения, поэтому все, что вам нужно сделать, это заключить его в кавычки:

complete -c docker -n "contains $sc (commandline -poc)" -x -a "(_docker_container_action)"
...