我是一个非常高兴的 zsh 用户,特别感谢它的完成子系统。最近我正在尝试增强一些完成命令,尤其是那些我经常使用的命令(例如 rm)。在 zsh 中执行以下命令:
rm <TAB>
使 zsh 按预期完成当前目录的文件。我想要做的是让 zsh 完成以下变体:
rm -r <TAB>
只有目录。
任何知道如何参数完成以考虑(-r)参数的zsh Guru?
我是一个非常高兴的 zsh 用户,特别感谢它的完成子系统。最近我正在尝试增强一些完成命令,尤其是那些我经常使用的命令(例如 rm)。在 zsh 中执行以下命令:
rm <TAB>
使 zsh 按预期完成当前目录的文件。我想要做的是让 zsh 完成以下变体:
rm -r <TAB>
只有目录。
任何知道如何参数完成以考虑(-r)参数的zsh Guru?
这可以通过将 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]'