如何让 git flow 完成 zsh 的工作?

如何让 git flow 完成 zsh 的工作?

我已经通过 Homebrew 安装gitgit-flow。我在 Mac 上。

我有zsh 5.0.2 (x86_64-apple-darwin12.4.0)

git完成工作正在进行。git-flow完成工作未完成。

我无法git flow完成工作。

我尝试了两种方法来安装这些功能。

方法 1

git-flow使用 Homebrew 安装,它将功能添加到此目录/usr/local/share/zsh/site-functions

这条路在我的$fpath

> echo $fpath
/usr/local/share/zsh/site-functions /usr/local/Cellar/zsh/5.0.2/share/zsh/functions

方法 2

git-flowhttps://github.com/zsh-users/zsh-completions并将文件放入~/.zsh/completions

然后我将目录添加到我的~/.zshrc

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

> echo $fpath
/Users/jord/.zsh/completions /usr/local/share/zsh/site-functions /usr/local/Cellar/zsh/5.0.2/share/zsh/functions

这两种方法都不起作用。

我究竟做错了什么?

更新

的输出git-flow [CTRL+X] [h]是:

> git flow
tags in context :completion::complete:git::
    all-files  (_files _default _git (eval))

更新2

正在起作用!

我把_git函数从@mpy 提供的 URL~/.zsh/completions/添加~/.zsh/completions到我$fpath~/.zshrc

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

然后我git-flow-completion.zshhttps://github.com/bobthecow/git-flow-completion并将其放入~/.zsh/completions并从我的文件中获取该文件.zshrc

git并且git flow完成工作现在正在进行,但我不知道为什么?!

答案1

该文件$fpath/_git-flow提供了(带破折号)的补全git-flow,见其第一行:

#compdef git-flow

因此,使用git-flow [CTRL+X] [h]我得到

$ git-flow [CTRL+X] [h]
tags in context :completion::complete:git-flow::
    argument-1  (_arguments _git-flow)
tags in context :completion::complete:git-flow:argument-1:
    commands  (_describe _git-flow)

显示zsh检测到提示现在位于的第一个参数git-flow

的完成函数git非常强大(说实话,我无法“读完”它),因此git flow(无破折号)也提供了git-flow完成,但上下文不同:

$ git flow [CTRL+X] [h]
tags in context :completion::complete:git::
    argument-rest  (_arguments _git)
tags in context :completion::complete:git-flow::
    argument-1  (_arguments _git-flow _call_function _git)
tags in context :completion::complete:git-flow:argument-1:
    commands  (_describe _git-flow _call_function _git)

如果使用不存在的 git 模块,我最终会得到

$ git foo [CTRL+X] [h]
tags in context :completion::complete:git::
    argument-rest  (_arguments _git)
tags in context :completion::complete:git-foo::
    directories    (_files _git) 
    globbed-files  (_files _git) 
    all-files      (_files _git)

看起来与您的结果最接近。

因此我的建议是:

  • 检查你的_git-flow完成文件是否损坏,有正确的行尾(EOL)
  • 使用例如触发 git-flow 的完成git-flow [CTRL+X] [h]并查看输出which _git-flow

    • 如果无法读取完成函数,则会导致

      $ which _git-flow
      _git-flow () {
              # undefined
              builtin autoload -XUz
      }
      
    • 如果读得正确,你将得到打印的函数:

      $ which _git-flow
      _git-flow () {
          local curcontext="$curcontext" state line
          typeset -A opt_args
          _arguments -C ':command:->command' '*::options:->options'
          ...
      
  • 尝试用 编译_git-flow函数文件,zcompile _git-flow看看是否会出错。(然后_git-flow.zwc应该在自动加载时读取生成的文件。)

  • 检查~/.zcompdump是否_git-flow列出了完成情况。

答案2

我认为你可以尝试这个: https://github.com/Homebrew/homebrew-core/commit/f710a1395f44224e4bcc3518ee9c13a0dc850be1#r30789420

你运行的是 macOS 吗?Homebrew git 自带的自动完成功能与 git-flow 自动完成脚本冲突。

尝试删除 zsh 文件夹/usr/local/Cellar/git/x.xx.x/share/并重新加载 zsh。

参考文献:
1.https://github.com/Homebrew/homebrew-core/commit/f710a1395f44224e4bcc3518ee9c13a0dc850be1
2.https://github.com/bobthecow/git-flow-completion/issues/50
3.https://github.com/robbyrussell/oh-my-zsh/issues/1717

相关内容