我是一个非常开心的zsh用户,尤其欣赏它的完成子系统。 最近我试图增强一些完成命令,特别是那些我经常使用的命令(例如rm)。 在zsh中使用以下命令:
rm <TAB>
使zsh按预期完成当前目录的文件。 我想要做的是让zsh完成以下变体:
rm -r <TAB>
只有目录。
知道如何参数完成的任何zsh Guru,以便考虑(-r) 参数β
答案 0 :(得分:5)
这可以通过将rm
的zsh完成功能编辑为所需的行为来实现。
Z-shell完成功能都在您系统的某处定义。在OSX上,它位于/usr/local/zsh/5.0.2/share/zsh/functions
之下。 Linux可能有类似的地方。
rm
的完成功能在名为_rm
的文件中定义。它相当小。 (如果您有兴趣,rmdir
的完成定义在_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]'