我正在尝试为经常访问的目录编写一个快捷方式,以便我可以消除cd
(我知道,我知道,但是我很懒)。
因此我在 .zshrc 中编写了一个函数来执行以下操作:
progs () {
if [[ -z $1 ]]; then
cd /Volumes/data/progs
else
cd /Volumes/data/progs/$1
fi
}
目的是如果我只输入,progs
我会转到顶层目录,但如果我输入progs foo
cd,则会转到'.../progs/foo'
目录。但是,我希望自动完成系统允许我执行<tab>
afterprogs
操作来模拟 cd 的行为。
我写了一个辅助函数:
function _progs() {
_alternative "dirs:user directory:($(ls /Volumes/data/progs/$1))"
}
然后使用:
compdef _progs progs
在我创建包含空格的目录之前,它一直运行良好。现在,它会列出每个单词作为选项,而不是每个目录。
我如何告诉自动完成子系统列出所有文件/目录,就像我完成“cd”一样?
顺便说一句,我确实知道cdpath
,这很好,但我仍然必须输入cd progs <tab>
。我也尝试了_files
内置函数而不是ls
在我的辅助函数中运行,但我无法让_files
内置函数接受不同的目录。
答案1
您可以使用 转义字符"dirs:user directory:($(ls -b /Volumes/data/progs/$1))"
。
这解决了补全的空格问题,但经过一些测试后,我发现当遇到包含字符的目录时'
,它会出错unmatched '
。
通常我会将其通过管道传输到sed
,但您还需要处理两级字符转义,因此这可能会有点困难。
如果您知道您永远不会创建名称中带有引号的任何目录,那么您可能很好,否则您必须弄清楚如何转义它们。
不过,对于您想要实现的目标,我确实有一个(更简单的)解决方案:目录别名。
只需将其添加到您的别名文件中:
if [[ -r /Volumes/data/progs ]]; then
progs=/Volumes/data/progs
: ~progs
fi
现在,您将能够通过键入来访问您的目录,~progs
就像您可以使用 进入您的主目录一样~
。只需额外按一次键,即可使用开箱即用的补全功能。
或者直接安装autojump
。
答案2
_files
如果您通过 传递它,将接受不同的目录-W
,例如:
compdef '_files -W /Volumes/data/progs' progs