我的 .zshrc 中有这个:
# command completion
autoload -Uz compinit
compinit
通常让我浏览命令、参数和文件。
但是使用git --git-dir=<the path> --work-tree="$HOME"
(通常别名)它只适用于子命令(如添加和推送)和参数,而不是文件。我希望它也可以处理文件。
我试着把它放在这样的脚本中:
#!/usr/bin/env sh
git --git-dir=<the path> --work-tree="$HOME" "$@"
它适用于文件,但随后子命令和参数中断。
谢谢。
如果
--git-dir
出现在命令行上,完成代码会识别它并在查找要完成的内容时将其考虑在内,前提是您的 zsh 足够新(≥5.3)。它通过将参数--git-dir
作为环境变量传递给它来做到这一点GIT_DIR
。例如,要在 之后完成远程名称git fetch
,zsh 运行git remote
. 之后,git --git-dir=/some/where
zsh在环境中运行。所以这部分确实有效。git remote
GIT_DIR=/some/where
不幸的是,从当前的 zsh 版本(5.7.1+)开始,它传递了未扩展的参数。因此,如果您编写类似的东西
git --git-dir=~/repositories/foo.git
, zsh 会通过GIT_DIR=~/repositories/foo.git
,而不是GIT_DIR=/home/aaa/repositories/foo.git
.zsh 完成代码对
--work-tree
.我认为您可以通过编辑文件和替换行来解决扩展问题
--git-dir
并添加对--git-worktree
_git
经过
我没有测试过这个。
我没有足够的动力向 zsh 邮件列表发帖,但请这样做:这个(或它的工作版本,如果它不起作用)将是一个有用的补丁。
如果你把
--git-dir
or--work-tree
放在别名中,这是透明的:zsh 在完成之前扩展别名(假设你没有关闭 optioncomplete_aliases
)。如果你把它们放在一个函数或脚本中,这是不透明的:zsh 不会看到它们,甚至不知道函数或脚本调用 git,除非你告诉它。如果你不能让这个补丁工作或者你不想维护你自己的版本
_git
,你可以通过定义一个带有自定义完成功能的自定义命令来解决它。如果您有多个包装器,则每个包装器都需要一个完成功能。或者,您可以在完成函数中添加一些逻辑来确定
GIT_DIR
和GIT_WORKTREE
使用的值。该函数的名称在$service
.