动态应用完成选项

时间:2019-05-19 18:00:00

标签: docker fish

对于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)"

也不需要我的占位符。

1 个答案:

答案 0 :(得分:4)

  

而当完成文件被(重新获得)时,上述内容似乎在运行-a命令。

那是因为您已经在其中包含了它作为命令替换,所以当文件source d时,它会扩展,并且完成系统也不知道它以前是什么。

但是-a选项知道在完成时扩展其参数,因此您所要做的就是引用它:

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