【问题标题】:ZSH completion - Multiple items per argumentZSH 完成 - 每个参数多个项目
【发布时间】:2020-08-09 15:55:42
【问题描述】:

我正在尝试为 YunoHost 编写完成插件。我正在努力解决以下情况,其中一个参数,无论是否可选,都可以采用多个值:

ynh app addaccess apps [apps ...] [-u [USERS [USERS ...]]]

典型用法:

ynh app addaccess foo-app1 bar-app2 -u barfoo1 foobar2

我已经设法使用以下代码获得了对appsUSERS 这两个参数的建议,但我无法获得与命令可以处理的内容一致的行为。 (_ynh_app_list_ynh_users_list 是对 compadd 的调用)

_yunohost_app_addaccess() {
    _arguments -s -C \
        '1:apps:_ynh_app_list' \
        '*'{-u,--users}'[users]:users:_ynh_users_list'
}

上面的代码有点工作,除了:

  • 输入单个应用名称后,切换到用户。
  • -u 接受单个用户(但多个 -u 实例有效)

我试过*:apps:_ynh_app_list,但ynh app addaccess foo-app1 -u user1 <TAB>调用_ynh_app_list而不是_ynh_users_list


我想得到的是:

  • ynh app addaccess <TAB> 显示由 __ynh_app_list 提供的补全
  • ynh app addaccess foo-app1 <TAB> 仍然显示 __ynh_app_list 提供的补全
  • 只要输入-u,无论-u 后面的字数是多少,所有完成建议都应该来自__ynh_users_listyunohost app addaccess foo-app1 bar-app2 -u barfoo1 foobar2 <TAB> 仍然以用户名形式__ynh_users_list 完成

是否有可能实现这一点,至少最后一项([-u USER [USER...]])?非常感谢! :)

【问题讨论】:

    标签: autocomplete zsh tab-completion cardinality


    【解决方案1】:

    使用排除选项/参数功能列表可以挽救:

    _yunohost_app_addaccess() {
        _arguments -s -C \
            {1,'*'}:apps:_ynh_app_list \
            '(*)'{-u,--users}'[users]:*:users:_ynh_users_list'
    }
    

    ynh addaccess app [APPS ...] 部分可以由普通参数 SPEC 完成; 1:MESSAGE:ACTION*:MESSAGE:ACTION.
    用大括号展开简写:{1,'*'}:apps:_ynh_app_list

    [-u USER [USER...]] 部分可以由 OPTSPEC 使用前面的排除列表完成,:*PATTERN:MESSAGE:ACTION 可以使用空的PATTERN'(*)-OPTNAME[EXPLANATION]:*:MESSAGE:ACTION'.


    这里是排除列表的zsh手册供参考:

    _arguments ...
    ...
    上面的每一种形式都可以在选项名称和参数编号的括号中加上一个列表。如果给定选项在命令行上,则不会提供括号中指示的选项和参数。例如,(-two -three 1)-one:... 完成选项-one;如果这出现在命令行上,则选项-two-three 以及第一个普通参数将不会在它之后完成。 (-foo):... 指定一个普通的参数完成;如果该参数已经存在,-foo 将不会完成。

    其他项目可能会出现在排除选项列表中,以指示在匹配当前规范时不应应用的各种其他项目:单个星号 (*) 用于其余参数(即格式为 @ 的规范987654340@);所有正常(非选项)参数的冒号(:);以及所有选项的连字符 (-)。例如,如果(*) 出现在选项之前,并且该选项出现在命令行上,则剩余参数列表(上表中以*: 开头的参数)将不会完成。

    --- zshcompsys(1), _arguments, zshcompsys - zsh completion system

    【讨论】:

    • 谢谢!做到了:D 虽然我多次阅读文档的那部分,但我没有成功地实现它...... =/
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2012-05-28
    • 2014-03-21
    • 2011-04-28
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多