如何将自定义git命令添加到zsh完成?

时间:2016-08-02 15:47:10

标签: git zsh-completion

我已经阅读了一些关于zsh完成的指南,但我仍然感到困惑。在我们的开发环境中,我们有一个名为git new-branch的自定义Git命令。我想zsh在键入git ne Tab 之后为我自动完成它。我怎么能这样做?

2 个答案:

答案 0 :(得分:7)

默认git完成is extendible

  

假设您有自己的git子命令(git将运行程序`git-foo'   当你运行“git foo”)并且你想要“git f”来完成那个sub   命令为你命名。您可以使该子命令完成   通过用户命令样式:

% zstyle ':completion:*:*:git:*' user-commands foo:'description for foo'
     

`user-commands'是一种列表样式,因此您可以在其中添加任意数量的程序。   :description部分是可选的,因此您可以添加所有git- *程序   你的$路径是这样的:

% zstyle ':completion:*:*:git:*' user-commands ${${(M)${(k)commands}:#git-*}/git-/}

即添加

就足够了
zstyle ':completion:*:*:git:*' user-commands new-branch:'custom new branch function'

zshrc

如果您还想处理自定义命令的参数,那么使用自定义compdef文件是更好的解决方案。上面引用的文件也有一些细节:只需创建一个定义git-<yourcommand>函数的标准定义文件,默认的git完成将在需要时自动使用它。

答案 1 :(得分:2)

使用Git 2.18(q2 2018),您有了新的可能性,它不仅适用于zsh:命令行完成机制(在contrib/中)已学会加载 &#34; git $command&#34;的自定义完成文件其中$command是一个 自定义&#34; git-$command&#34;最终用户在使用时使用$ PATH 更新版本的bash。

commit 085e2eeFlorian Gamböck (FloGa)(2018年4月29日) (由Junio C Hamano -- gitster --合并于commit fb3a0ca,2018年5月23日)

  

完成:外部子命令的加载完成文件

     

向Git添加外部子命令就像放置可执行文件一样简单   将git-foo归档到PATH   可以通过将可执行文件解压缩到用户系统的/usr/bin来实现打包Linux发行版的子命令。   为新的子命令添加系统范围的完成脚本可能有点棘手。

     

由于bash-completion开始使用动态加载完成   从v1.90(v2.0的预览版)开始的脚本,已经不够了   将子命令的完成脚本删除到标准完成中   路径/usr/share/bash-completion/completions,因为此脚本不会   如果被称为git subcommand,则加载。

     

例如,请查看https://bugs.gentoo.org/544722   简要总结:热门git-flow subcommand提供了一个完成脚本,该脚本安装为/usr/share/bash-completion/completions/git-flow

     

如果您现在键入Bash shell:

git flow <TAB>
     

你不会得到任何完成,因为bash-completion只会加载   git和git的完成并不知道git-flow的定义   另一个档案   您必须手动加载此脚本或触发   动态装载机:

`git-flow <TAB>` # Please notice the dash instead of whitespace
     

这也不会完成任何事情,因为它只定义了Bash   功能,不产生完成。
  但是现在加载了正确的完成脚本,第一个命令可以使用完成。

     

所以,现在的目标是教git完成脚本来考虑   子命令的外部完成脚本的可能性,但是   当然没有打破当前的工作流程。

如何?这就是Git 2.18提出的建议:

  

我认为最简单的方法是使用由...定义的函数   bash-completion v1.90,即_completion_loader   如果存在,它将负责加载正确的脚本   之后,git完成脚本就像往常一样。

     

_completion_loader早在2011年commit 20c05b43 scop/bash-completion(bash的可编程完成函数)中引入,因此它应该可用于更老的LTS发行版。
  此功能不仅在默认路径/usr/share/bash-completion/completions中搜索外部完成脚本,还在用户的家中搜索外部完成脚本   目录通过$XDG_DATA_HOME和用户指定的目录通过   $BASH_COMPLETION_USER_DIR

univerio添加in the comments

  

事实证明,有两种不同的完成功能:

     

univerio补充道:

  
      
  • zsh提供的函数是Debian(和Ubuntu,Mint等)的默认函数,
  •   
  • git-provided函数是macOS上homebrew-installed git的默认函数。
  •   
     

超级混乱。不确定哪一个更好。

     

此特定答案仅适用于git提供的功能,而接受的答案仅适用于zsh提供的功能。