我已经阅读了一些关于 zsh 完成的指南,但我仍然感到困惑。在我们的开发环境中,我们有一个名为git new-branch
. 我希望 zsh 在输入 justgit ne
和 a后自动为我完成它Tab。我怎样才能做到这一点?
2 回答
默认的 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 完成将在需要时自动使用它。
使用 Git 2.18(2018 年第 2 季度),您有了一种新的可能性,它不仅适用于 zsh:命令行完成机制(在 中)已经学会为最终用户的“ ”哪里是自定义的“ ”contrib/
加载自定义完成文件使用较新版本的 bash 时在 $PATH 上。git $command
$command
git-$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-completion
v1.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
。
原来有两种不同的补全函数:
- 一个带有 zsh,并且
- 其他随 Git 一起发布。
大学补充道:
- zsh 提供的功能是 Debian(以及 Ubuntu、Mint 等)的默认功能,并且
- git 提供的功能是 macOS 上自制安装的 git 的默认功能。
超级混乱。不确定哪个更好。
此特定答案仅适用于 git 提供的功能,而接受的答案仅适用于 zsh 提供的功能。