15

我已经阅读了一些关于 zsh 完成的指南,但我仍然感到困惑。在我们的开发环境中,我们有一个名为git new-branch. 我希望 zsh 在输入 justgit ne和 a后自动为我完成它Tab。我怎样才能做到这一点?

4

2 回答 2

10

默认的 git 完成是可扩展的

假设你有自己的 git 子命令(当你运行“git foo”时,git 会运行一个程序“git-foo”)并且你希望“git f”为你完成那个子命令名称。您可以通过用户命令样式使该子命令知道完成:

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

`user-commands' 是一种列表样式,因此您可以在其中添加任意数量的程序。:description 部分是可选的,因此您可以从 $path 中添加所有 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 完成将在需要时自动使用它。

于 2016-08-09T12:18:58.170 回答
3

使用 Git 2.18(2018 年第 2 季度),您有了一种新的可能性,它不仅适用于 zsh:命令行完成机制(在 中)已经学会为最终用户的“ ”哪里是自定义的“ ”contrib/加载自定义完成文件使用较新版本的 bash 时在 $PATH 上。git $command$commandgit-$command

请参阅Florian Gamböck ( ) 的提交 085e2ee(2018 年 4 月 29 日(由Junio C Hamano 合并 -- --提交 fb3a0ca中,2018 年 5 月 23 日)FloGa
gitster

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

向 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-completionv1.90 定义的函数,即_completion_loader.
如果存在,它将负责加载正确的脚本。
之后,git 完成脚本的行为与往常一样。

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


univerio在评论中添加:

原来有两种不同的补全函数:

  • 一个带有 zsh,并且
  • 其他随 Git 一起发布。

大学补充道:

  • zsh 提供的功能是 Debian(以及 Ubuntu、Mint 等)的默认功能,并且
  • git 提供的功能是 macOS 上自制安装的 git 的默认功能。

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

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

于 2018-06-03T16:49:43.153 回答