![如何将(函数)第二个参数的 Zsh 自动完成规则设置为现有命令的规则?](https://linux22.com/image/36225/%E5%A6%82%E4%BD%95%E5%B0%86%EF%BC%88%E5%87%BD%E6%95%B0%EF%BC%89%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%8F%82%E6%95%B0%E7%9A%84%20Zsh%20%E8%87%AA%E5%8A%A8%E5%AE%8C%E6%88%90%E8%A7%84%E5%88%99%E8%AE%BE%E7%BD%AE%E4%B8%BA%E7%8E%B0%E6%9C%89%E5%91%BD%E4%BB%A4%E7%9A%84%E8%A7%84%E5%88%99%EF%BC%9F.png)
我有自定义 Zsh 函数g
:
function g() {
# Handle arguments [...]
}
在其中,我处理执行 Git 命令的短参数。例如:
g ls # Executes git ls-files ...
g g # Executes git grep ...
我需要能够将自动完成规则设置为 Git 的短参数规则,但我不确定如何做到这一点。
例如,我需要g ls <TAB>
用制表符补全规则,git ls-files <TAB>
这将为我提供以下参数git ls-files
:
$ g ls --<TAB>
--abbrev -- set minimum SHA1 display-length
--cached -- show cached files in output
--deleted -- show deleted files in output
# Etc...
这不仅仅是设置g
为自动完成,因为git
我将自定义短命令映射到 Git 命令。
答案1
我发现/usr/share/zsh/functions/Completion/Unix/_git
其中有一些关于像这样的别名的提示,并最终为别名定义了这些函数:
_git-ls () {
# Just return the _git-ls-files autocomplete function
_git-ls-files
}
然后,我做了一个顺子compdef g=git
。例如,自动完成系统会看到您正在运行,g ls
并使用_git-ls
自动完成功能。
感谢 user67060 引导我走向正确的方向。
答案2
我必须做一些非常类似的事情,所以这大致应该可以解决您的问题。
_g () {
case "${words[2]}" in
ls) words[1,2]=(git ls-files);;
g) words[1,2]=(git grep);;
*) return 1;;
esac
_git # Delegate to completion
}
compdef _g g
需要注意的一件事是,如果更改参数数量,则需要调整$CURRENT
变量。
答案3
这就是我要做的:
_tg () {
local _ret=1
local cur cword prev
cur=${words[CURRENT]}
prev=${words[CURRENT-1]}
cmd=${words[2]}
let cword=CURRENT-1
case "$cmd" in
ls)
emulate ksh -c _git_ls_files
;;
g)
emulate ksh -c _git_grep
;;
esac
let _ret && _default && _ret=0
return _ret
}
compdef _tg tg
但是,这是使用 Git 的补全,而不是 zsh 的补全:
https://git.kernel.org/cgit/git/git.git/tree/contrib/completion/git-completion.zsh