Docker 动态应用完成选项
我对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-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
不管输出如何都有一个参数。干杯:)