6

我是一个非常高兴的 zsh 用户,特别感谢它的完成子系统。最近我正在尝试增强一些完成命令,尤其是那些我经常使用的命令(例如 rm)。在 zsh 中执行以下命令:

rm <TAB>

使 zsh 按预期完成当前目录的文件。我想要做的是让 zsh 完成以下变体:

rm -r <TAB>

只有目录。

任何知道如何参数完成以考虑(-r)参数的zsh Guru?

4

1 回答 1

5

这可以通过将 zsh 完成功能编辑为rm所需的行为来实现。

Z-shell 补全函数都定义在系统的某个地方。在 OSX 上,它位于/usr/local/zsh/5.0.2/share/zsh/functions. Linux 可能有类似的地方。

的完成函数rm在一个名为_rm. 它相当小。(如果您有兴趣,完成 forrmdir定义在 中_directories)。

要为 设置完成rm -r,我们需要修改如下所示的行:

'(-r -R --recursive)'{-r,-R,--recursive}'[remove directories and their contents recursively]'

我们添加到这一行的末尾,在引号内:

:*:file:_directories

我很确定zsh表明给出参数时的完成-r应该由 组成files,而我们获得这些的方式files是使用_directories函数(它只返回目录)。

(我不是100%确定,因为zsh它是一头野兽,我还在纠结我的小脑袋)。

这是一个示例用法:

在此处输入图像描述


这是更改的差异,以使其更加清晰:)

<   '(-r -R --recursive)'{-r,-R,--recursive}'[remove directories and their contents recursively]:*:file:_directories'
---
>   '(-r -R --recursive)'{-r,-R,--recursive}'[remove directories and their contents recursively]'
于 2013-09-21T15:13:56.840 回答