如何将 shell 的完成推迟到 bash 和 zsh 中的另一个命令?
How do I defer shell completion to another command in bash and zsh?
我正在尝试编写一个 shell 脚本实用程序,将其他 shell 实用程序包装到一个 CLI 中,并试图让 shell 完成以在 zsh 和 bash.
例如,假设 CLI 名为 util
:
util aws [...args] #=> runs aws
util docker [...args] #=> runs docker
util terraform [...args] #=> runs terraform
理想情况下,我想要的是 zsh 和 bash 完成中的一种方式,能够独立于包装脚本的完成实现说 "complete this subcommand X like other command Y"。
类似于:
compdef 'util aws'='aws'
compdef 'util docker'='docker'
compdef 'util terraform'='terraform'
一个扩展目标是允许将任意子命令完成到另一个二进制文件中的子命令:
util aws [...args] #=> completes against `aws`
util ecr [...args] #=> completes against `aws ecr`
这有可能吗?我一直在尝试模拟各个二进制文件的完成脚本,但是其他完成脚本的编写方式存在很大差异。
我对 zsh 一无所知,但我可以提供 bash 的解决方案。它使用 _complete
函数进行委托(我在 之后发现 - 好电话!)。
函数的第二部分为 util
命令本身提供补全,我假设这里只是一个子命令列表。当然,您可以根据自己的需要进行定制。
第一部分处理在键入完整子命令的情况下的委托,并根据子命令的完成情况选择完成目标。
函数
_delegate() {
local cur subs
cur="${COMP_WORDS[COMP_CWORD]}" # partial word, if any
subs="ssh aws docker terraform"
if [[ $COMP_CWORD == 2 ]]; then
# Two whole words before the cursor - delegate to the second arg
_command
else
# complete with the list of subcommands
COMPREPLY=( $(compgen -W "${subs}" -- ${cur}) )
fi
}
安装
njv@pandion:~$ complete -F _delegate util
演示
1d [njv@eidolon:~] $ util
aws docker ssh terraform
1d [njv@eidolon:~] $ util ssh
::1 gh ip6-localhost ubuntu.members.linode.com
eidolon github.com ip6-loopback
ff02::1 ip6-allnodes localhost
ff02::2 ip6-allrouters ubuntu
1d [njv@eidolon:~] $ util ssh ip6-
ip6-allnodes ip6-allrouters ip6-localhost ip6-loopback
我正在尝试编写一个 shell 脚本实用程序,将其他 shell 实用程序包装到一个 CLI 中,并试图让 shell 完成以在 zsh 和 bash.
例如,假设 CLI 名为 util
:
util aws [...args] #=> runs aws
util docker [...args] #=> runs docker
util terraform [...args] #=> runs terraform
理想情况下,我想要的是 zsh 和 bash 完成中的一种方式,能够独立于包装脚本的完成实现说 "complete this subcommand X like other command Y"。
类似于:
compdef 'util aws'='aws'
compdef 'util docker'='docker'
compdef 'util terraform'='terraform'
一个扩展目标是允许将任意子命令完成到另一个二进制文件中的子命令:
util aws [...args] #=> completes against `aws`
util ecr [...args] #=> completes against `aws ecr`
这有可能吗?我一直在尝试模拟各个二进制文件的完成脚本,但是其他完成脚本的编写方式存在很大差异。
我对 zsh 一无所知,但我可以提供 bash 的解决方案。它使用 _complete
函数进行委托(我在
函数的第二部分为 util
命令本身提供补全,我假设这里只是一个子命令列表。当然,您可以根据自己的需要进行定制。
第一部分处理在键入完整子命令的情况下的委托,并根据子命令的完成情况选择完成目标。
函数
_delegate() {
local cur subs
cur="${COMP_WORDS[COMP_CWORD]}" # partial word, if any
subs="ssh aws docker terraform"
if [[ $COMP_CWORD == 2 ]]; then
# Two whole words before the cursor - delegate to the second arg
_command
else
# complete with the list of subcommands
COMPREPLY=( $(compgen -W "${subs}" -- ${cur}) )
fi
}
安装
njv@pandion:~$ complete -F _delegate util
演示
1d [njv@eidolon:~] $ util
aws docker ssh terraform
1d [njv@eidolon:~] $ util ssh
::1 gh ip6-localhost ubuntu.members.linode.com
eidolon github.com ip6-loopback
ff02::1 ip6-allnodes localhost
ff02::2 ip6-allrouters ubuntu
1d [njv@eidolon:~] $ util ssh ip6-
ip6-allnodes ip6-allrouters ip6-localhost ip6-loopback