在 zsh 中使用 Tab 补全功能运行命令

在 zsh 中使用 Tab 补全功能运行命令

我正在尝试设置一个 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/ 内核/ 样本/ 工具/                                      

相关内容