zsh 自动完成我自己的函数

zsh 自动完成我自己的函数

我正在尝试为经常访问的目录编写一个快捷方式,以便我可以消除cd(我知道,我知道,但是我很懒)。

因此我在 .zshrc 中编写了一个函数来执行以下操作:

progs () {
  if [[ -z $1 ]]; then
    cd /Volumes/data/progs
  else
    cd /Volumes/data/progs/$1
  fi
}

目的是如果我只输入,progs我会转到顶层目录,但如果我输入progs foocd,则会转到'.../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

相关内容