gpt4 book ai didi

zsh: 完成 `command1` 与 `command2 ARG` 相同

转载 作者:行者123 更新时间:2023-12-05 02:43:35 24 4
gpt4 key购买 nike

给定两个命令:

  • command1 - 已为其设置完成
  • commmand2 - 这是一个包装函数,最终调用 command1 ARG

如何使 command2 以与 command1 ARG1 相同的方式完成,无需为 command1 编写自定义完成 em>?

这是一个例子:

alias command1="git ls-files"

command2() {
echo "I'm a wrapper for git ls-files" >&2
git ls-files $@
}

可以执行 compdef command2=command1 - 但是这将使 command2 以与 git 相同的方式完成,而不是 git ls-files.

编辑:我正在寻找一个广泛而通用的解决方案,该解决方案也适用于不定义单独完成功能的命令,例如 git。对于这些,您可以按照下面 Marlon Richert 的建议进行操作。

这是一个更好的例子:

alias command1="kubectl get pod"

command2() {
echo "I'm a wrapper for kubectl get pod" >&2
kubectl get pod $@
}

最佳答案

执行此操作以找出需要调用的函数的名称:

% git ls-files ^Xh  # That is, press Ctrl-X, then H.
tags in context :completion::complete:git-ls-files::
argument-rest options (_arguments _git-ls-files _git)
tags in context :completion::complete:git-ls-files:argument-rest:
globbed-files (_files _arguments _git-ls-files _git)
tags in context :completion::complete:git::
argument-rest (_arguments _git)

如您所见,它是 _git-ls-files

然后,丢弃前导 _ 并将余数用作 compdef$service 参数:

compdef _git command2=git-ls-files

现在它可以正常工作了:

% command2 ^Xh
tags in context :completion::complete:command2::
argument-rest options (_arguments _git-ls-files _git)
tags in context :completion::complete:command2:argument-rest:
globbed-files (_files _arguments _git-ls-files _git)

更新

对于您的 kubectl 示例,事情稍微不那么简单,因为它的完成不是 Zsh 原生的。 相反,它只是一个围绕 的薄 Zsh 包装器Bash 完成函数。在这种情况下,您必须编写自己的完成函数,但值得庆幸的是,它只是一个非常短的函数:

_command2 () {
# Fake having `kubectl get pod` on the line instead of `command2`.
local -a words=( kubectl get pod $words[2,-1] )
local -i CURRENT=$(( CURRENT + 2 ))

# Restart completion with our new, simulated command line.
_normal
}
compdef _command2 command2

完成!

关于zsh: 完成 `command1` 与 `command2 ARG` 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66865442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com