【问题标题】:ZSH file completions from 2 path来自 2 个路径的 ZSH 文件完成
【发布时间】:2016-07-28 16:23:00
【问题描述】:

我有 2 个文件夹,其中包含文件夹

/me/foo/: 
  a/
  b/
  c/

/me/bar/:
  c/
  d/
  e/

我想为命令 baz 创建完成函数,以便

$ baz [tab]

给出如下完成参数

a b c d e

注意重复的c 只写了一次,它不包括尾部斜杠。

我知道如何使用 _files 完成补全,但这只会给我来自单个目录的文件。

我该怎么做?

【问题讨论】:

    标签: zsh oh-my-zsh zsh-completion


    【解决方案1】:

    我发现这对我有用

    local services
    services=$(ls -d /me/foo/*/ /me/bar/*/ | xargs basename| uniq)
    _alternative "dirs:some directories:($services)"
    

    【讨论】:

    • 这看起来不像services 将每个名称只包含一次。它还取决于basename 的实现,并非所有默认情况下都允许多个参数。我建议使用local -U services=((foo|bar)/*(/:t))。对于-U,数组只保留第一次出现的相同值。 (foo|bar)/* 匹配目录foobar 的任何子目录。限定符 (/) 将其限制为仅目录,(:t) 删除所有前导路径组件,即 basename。它还消除了对任何外部命令的需要。
    • 嗯,我在尝试 local -U services((foo|bar)/*(/:t)echo $service 时遇到了错误的模式,错误是 a.zsh:1: bad pattern: services((foo|bar)/*(/:t)\necho \n 在哪里可以找到该模式的文档?
    • 看起来= 不见了。但是,当我尝试在版本为 5.0.6 的旧 zsh 上运行它时,我收到了相同的错误消息(即使是 =)。我目前使用 5.2。似乎能够在单个命令中排版和分配数组was added in 5.1。将其分隔为 local -U servicesservices=(…) 应该可以。至于文档:请查看 ZSH 手册中关于Filename Generation 的部分。
    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多