我有一个像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/

10-16 06:10