23

在 zsh 中,我有一个名为的函数g,其行为如下:

  • 没有参数,调用git status
  • 使用一个或多个参数,将所有给定参数委托给 git - 即调用git $@

我希望选项卡完成 forg与 for 完全相同git。我可以用 来实现这一点alias g=git,但这不允许我status默认调用(上面的第一点)。

我如何委托完成git

在 bash 中,我只是complete -F _git g重复使用了 git 的完成功能。使用 zsh,git 的完成看起来要复杂得多,我无法找到类似的解决方案。

我猜zsh中有一些功能可以说“假装我输入了命令[x],你会完成它做什么?”。如果我知道那是什么,那么使用函数委托给它应该很简单。但是我在手册中没有发现这样的功能。

4

2 回答 2

23

的文档是compdef这样说的:

该函数compdef可用于将现有完成函数与新命令相关联。例如,

compdef _pids foo

但是调整它(_gitgit通常的完成功能)并没有为我产生工作结果(即使在_git自动加载之后):

compdef _git g

我能够通过以下方式让它工作_dispatch

compdef '_dispatch git git' g
于 2010-11-19T02:35:43.897 回答
0

在更改配置后,相同的功能已停止为我工作。

# in ~/.zsh/functions/g.zsh

# # No arguments: `git status`
# # With arguments: acts like `git`
g() {
  if [[ $# > 0 ]]; then
    git "$@"
  else
    git status
  fi
}

仅将函数放入~/.zsh/functions/g.zsh并在其中创建一个 compdef实际上很重要~/.zsh/completions/_g

#compdef g
compdef g=git

然后,在.zshrc

fpath=($HOME/.zsh/completions $fpath)

# load custom executable functions
for function in ~/.zsh/functions/*.zsh; do
  source $function
done

# completion
autoload -U compinit
compinit

不确定顺序是否重要。我认为当 compdef 在单独的文件夹中时,它适用于任何顺序。

g从这里获得功能:

https://github.com/thoughtbot/dotfiles/blob/master/zsh/functions/g

https://github.com/thoughtbot/dotfiles/blob/master/zsh/completion/_g

谢谢思想机器人!

于 2021-08-20T22:29:02.520 回答