动态应用完成选项
Apply completion options dynamically
我有一个 fish shell 像这样完成 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
命令,这似乎是常见的做法。但是然后我没有为每个 ID 提供一个选项,而是只得到一个完成选项,一个带有 space 转义的长字符串(\
)包含 ID 和最后的 \{z-placeholder}
。 :(
[...] 引用 -a
命令确实有效,只要它的输出不是由 echo
产生(将其字符串化)。事实证明 -a
的 "choking" 问题是没有参数,如果您直接将 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)"
也不需要我的占位符。
whereas the above seems to run the -a command when the completion file is (re-sourced).
那是因为你把它作为命令替换包含在这里,所以当文件是 source
d 时,它会扩展,并且完成系统不知道它之前是什么。
但是 -a
选项知道在 completion-time 扩展它的参数,所以你需要做的就是引用它:
complete -c docker -n "contains $sc (commandline -poc)" -x -a "(_docker_container_action)"
我有一个 fish shell 像这样完成 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
命令,这似乎是常见的做法。但是然后我没有为每个 ID 提供一个选项,而是只得到一个完成选项,一个带有 space 转义的长字符串(\
)包含 ID 和最后的 \{z-placeholder}
。 :(
[...] 引用 -a
命令确实有效,只要它的输出不是由 echo
产生(将其字符串化)。事实证明 -a
的 "choking" 问题是没有参数,如果您直接将 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)"
也不需要我的占位符。
whereas the above seems to run the -a command when the completion file is (re-sourced).
那是因为你把它作为命令替换包含在这里,所以当文件是 source
d 时,它会扩展,并且完成系统不知道它之前是什么。
但是 -a
选项知道在 completion-time 扩展它的参数,所以你需要做的就是引用它:
complete -c docker -n "contains $sc (commandline -poc)" -x -a "(_docker_container_action)"