我已经阅读了一些关于zsh完成的指南,但我仍然感到困惑。在我们的开发环境中,我们有一个名为git new-branch
的自定义Git命令。我想zsh在键入git ne
和 Tab 之后为我自动完成它。我怎么能这样做?
答案 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 085e2ee见Florian 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 20c05b43scop/bash-completion
(bash的可编程完成函数)中引入,因此它应该可用于更老的LTS发行版。
此功能不仅在默认路径/usr/share/bash-completion/completions
中搜索外部完成脚本,还在用户的家中搜索外部完成脚本 目录通过$XDG_DATA_HOME
和用户指定的目录通过$BASH_COMPLETION_USER_DIR
。
事实证明,有两种不同的完成功能:
- 一个ships with zsh和
- 其他船只与Git。
univerio补充道:
- zsh提供的函数是Debian(和Ubuntu,Mint等)的默认函数,
- git-provided函数是macOS上homebrew-installed git的默认函数。
超级混乱。不确定哪一个更好。
此特定答案仅适用于git提供的功能,而接受的答案仅适用于zsh提供的功能。