我正在尝试设置一个 zsh 函数,该函数将带我返回到顶层 git 目录,并使用可选参数相对于该目录移动。我目前有这个可以工作:
alias gitdir='git rev-parse --show-toplevel'
cdgit() { cd $(gitdir)/$1 }
问题是,制表符补全功能无法正常工作,当我运行 时cdgit
,它会从我所在的任何目录自动完成,但我希望它从 完成$(gitdir)
。如果我在运行 之前输入以下行cdgit
,则补全将正常工作(从$(gitdir)
):
compctl -W $(gitdir) -/ cdgit
但是,我不想每次输入之前都输入该命令cdgit
以获得制表符补全。有什么方法可以创建一个补全函数,以cdgit
某种方式运行该命令,以便我的补全正确吗?
答案1
我建议为你的cdgit
函数编写一个完成函数。
将此文件_cdgit
放入您的目录中$fpath
,例如/usr/share/zsh/site-functions
,然后启动一个新的 shell 实例:
#compdef cdgit
local expl
local ret=1
[[ CURRENT -eq 2 ]] && _wanted directories expl 'git toplevel directory' \
_path_files -/ -W $(git rev-parse --show-toplevel) && ret=0
return ret
这是从完成函数本身的最后一行中借用的_cd
,当然它要复杂得多。
演示:
/usr/src/linux-git/Documentation/x86> cd[标签] 本地目录 i386/ x86_64/ /usr/src/linux-git/Documentation/x86> cdgit[标签] git 顶层目录 文档/ crypto / include / lib / 脚本/ usr / arch/ 驱动程序/ init/ mm/ 安全/ virt/ 块/固件/ipc/网络/声音/ 证书/ fs/ 内核/ 样本/ 工具/