我有以下完成脚本来完成角色列表:
host /usr/share/zsh/vendor-completions # cat _foo
#compdef foo
local -a values=('ROLE_ADMIN[Admin]' 'ROLE_USER[User]')
_values -s , 'roles' $values
到目前为止效果很好;它将完成以下角色:
host ~ # foo ROLE_<TAB>
roles
ROLE_ADMIN -- Admin
ROLE_USER -- User
但我希望完成工作时不区分大小写,即。如果我现在键入ad
after ROLE_
,我希望它完成ROLE_ADMIN
,但这是行不通的。
我发现我需要使用compadd -M
像 这样的匹配规范'm:{[:lower:]}={[:upper:]}'
,但我不知道如何将其传递给_values
似乎不支持的-M
。
答案1
_values
确实无法做到这一点,但是通过替换_values
为_sequence _describe
手动获取值完成可以轻松规避该问题,并且_describe
确实支持该-M
选项:
host /usr/share/zsh/vendor-completions # cat _foo2
#compdef foo2
local -a values=('ROLE_ADMIN:Admin' 'ROLE_USER:User')
_sequence _describe 'roles' values -M 'm:{[:lower:]}={[:upper:]}'
请注意,这_describe
需要以稍微不同的格式进行描述 -word:desc
而不是word[desc]
.
现在它将按预期完成,不区分大小写:
host ~ # foo2 ROLE_ad<TAB>
host ~ # foo2 ROLE_ADMIN,