在zsh中的选项卡完成时运行命令


1

我正在尝试建立一个zsh函数,它将带我回到顶层git目录,并带有一个可选参数来相对于该目录移动。我目前有这个可行的:

alias gitdir='git rev-parse --show-toplevel'
cdgit() { cd $(gitdir)/$1 }

问题是,制表符补全无法正常工作,它将在运行时从我所在的任何目录自动完成cdgit,但我希望从中完成$(gitdir)。如果我在运行之前输入以下行cdgit,则补全将正常运行(从$(gitdir)):

compctl -W $(gitdir) -/ cdgit

但是,我不想每次键入cdgit仅获得制表符完成之前都键入该命令。有什么办法可以使我完成功能cdgit,以某种方式运行该命令,使我的完成正确吗?


为什么要下票?
Josh Sherick

您为什么不想坚持使用compctl解决方案?这可以转到您在其中定义cdgit函数的rc文件,对吗?
mpy

1
不,因为我不希望外壳启动时运行它。那将把cdgit <path>完成的目录更改$(gitdir)为运行我的.zshrc时评估的目录。但是,我希望它能够自动完成,直到$(gitdir)我输入时得到的任何结果cdgit <path>。因此,我想输入cdgit并按Tab键,然后从需要的位置获取完成信息cd,该位置可能与启动Shell时的位置不同。
Josh Sherick

我猜它可能会在每次目录更改时运行。这不是最干净的解决方案,但这是一个快速的命令。
Josh Sherick

当然,我不好的$(gitdir)是那时没有意识到那将是静态的。看到我的答案的建议。
mpy

Answers:


2

我建议为您的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 [TAB] 
本地目录
i386 / x86_64 /

/ usr / src / linux-git / Documentation / x86> cdgit [TAB] 
git顶级目录
文档/ crypto / include / lib /脚本/ usr /                          
拱/驱动程序/初始化/毫米/安全性/病毒/                         
块/固件/ ipc /网络/声音/                                      
证书/ fs /内核/样本/工具/                                      
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.