对于docker
,我的fish shell完成是这样的:
# '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
问题是图像和容器ID的完成需要动态(例如文件完成),而当(重新)获得完成文件时,上述内容似乎在运行-a
命令。
在实际应用完成功能时,如何使此刷新选项?
我应该提到,我已经尝试引用-a
命令,这似乎是很常见的做法。但是,我得到的只是一个完成选项,而不是每个ID的选项,而是在其中包含空格的长字符串(\
)末尾包含ID和\{z-placeholder}
。 :(
[...]引用-a
的命令确实有效,只要它的输出不是由echo
产生的(将其字符串化)。事实证明,-a
的“阻塞”问题没有参数,如果您直接将docker ps -aq
放在此处并且没有要列出的容器ID,则会发生这种情况。因此此模式有效:
function _docker_container_action
docker ps -aq
end
complete -c docker -n "contains $sc (commandline -poc)" -x -a "(_docker_container_action)"
也不需要我的占位符。
答案 0 :(得分:4)
而当完成文件被(重新获得)时,上述内容似乎在运行-a命令。
那是因为您已经在其中包含了它作为命令替换,所以当文件source
d时,它会扩展,并且完成系统也不知道它以前是什么。
但是-a
选项知道在完成时扩展其参数,因此您所要做的就是引用它:
complete -c docker -n "contains $sc (commandline -poc)" -x -a "(_docker_container_action)"