У меня есть 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)"
И нет необходимости в моем заполнителелибо.