Docker 动态应用完成选项

Docker 动态应用完成选项,docker,fish,Docker,Fish,我对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

我对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
问题是图像和容器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)"
也不需要我的占位符

而上面的代码似乎在完成文件(重新来源)时运行-a命令

这是因为您将其作为命令替换包含在这里,因此当文件是
source
d时,它会展开,并且完成系统不知道它以前是什么

但是
-a
选项知道在完成时展开它的参数,所以您所需要做的就是引用它:

complete -c docker -n "contains $sc (commandline -poc)" -x -a "(_docker_container_action)"
而上面的代码似乎在完成文件(重新来源)时运行-a命令

这是因为您将其作为命令替换包含在这里,因此当文件是
source
d时,它会展开,并且完成系统不知道它以前是什么

但是
-a
选项知道在完成时展开它的参数,所以您所需要做的就是引用它:

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

问题是(我之前尝试过,应该在中编辑过),它将输出转换成一个长字符串,其中包含转义符。因此,如果有一个ID由
docker ps-aq
输出,我的一个完成选项是,例如,
25e6809f6fab\\{z-placeholder\}
。更多的ID,仍然只有一个选项,更长的无用字符串。让它成为每行一件事-在这种情况下,这很可能意味着只需丢弃
echo
-
docker ps-aq
,而不是
echo(docker ps-aq)
。占位符是不必要的,因为fish不会在一个空的完成时阻塞,但是
-a
确实需要一个参数。好的,所以阻塞发生在
完成-a
行中有回声时;我将它移动到一个函数中,看看我是否可以在那里进行计算。只需使用普通的
docker ps-aq
就可以了,并且在函数调用中,这意味着无论输出如何,都有一个参数。Cheers:)问题是(我之前尝试过,应该在中编辑过),它将输出转换为一个长字符串,其中包含转义符。因此,如果有一个ID由
docker ps-aq
输出,我的一个完成选项是,例如,
25e6809f6fab\\{z-placeholder\}
。更多的ID,仍然只有一个选项,更长的无用字符串。使它成为每行一件事-在这种情况下,这很可能意味着只需丢弃
echo
-
docker ps-aq
,而不是
echo(docker ps-aq)
。占位符是不必要的,因为fish不会在一个空的完成时阻塞,但是
-a
确实需要一个参数;我把它移到一个函数,看看我是否能在那里工作。只使用普通的
docker ps-aq
就可以了,把它放在函数调用中意味着
-a
不管输出如何都有一个参数。干杯:)