我有一个像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)"
而且也不需要我的占位符。
最佳答案
这是因为您已在此处将其作为命令替换包括在内,因此,当文件为source
d时,它会扩展,并且完成系统也不知道以前的状态。
但是-a
选项知道在完成时扩展其参数,因此您所需要做的就是引用它:
complete -c docker -n "contains $sc (commandline -poc)" -x -a "(_docker_container_action)"
关于docker - 动态应用完成选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56210560/