【问题标题】:zsh completion according to a parameterzsh 根据一个参数补全
【发布时间】:2013-09-12 12:52:47
【问题描述】:

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

rm <TAB>

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

rm -r <TAB>

只有目录。

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

【问题讨论】:

  • 我不是大师,但我会注意到 rmdir 已经在 zsh 中以这种方式设置。 :-)
  • @mjk: 但 AFIAK rmdir 仅删除空目录,这与 rm -r 提供的功能不同。

标签: shell zsh zsh-completion


【解决方案1】:

这可以通过将 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]'

【讨论】:

  • +1 和赏金以获得非常详细的答案。它在 gentoo linux 上运行良好(文件位于 /usr/share/zsh/5.0.2/functions/Completion/Unix/_rm 下)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
相关资源
最近更新 更多