更新:

更新:

我的自定义脚本有 zsh 完成规则h

#compdef h

_arguments -S : \
    '-A+:' \
    '-B+:' \
    '-C+:' \
    '-i' \
    '-w'

我的自定义脚本采用上面显示的选项,以及一个或多个任意字符串。当没有给出字符串时,完成工作有效:

h <TAB>
-A  -B  -C  -i  -w  

但是一旦我提供了字符串,完成就不再有效:

h foo -<TAB>

没有什么。

即使我提供了一个或多个字符串,如何使用补全功能?

更新:

'*:string:'我已按照@Gilles 的建议添加

#compdef h

_arguments -S : \
    '*:string:' \
    '-A+:' \
    '-B+:' \
    '-C+:' \
    '-i' \
    '--color' \
    '-w'

但完成的行为很奇怪。当我做:

h some text -<TAB>

它实际上列出了我可用的选项,但没有完成它们。

当我做:

h some text --co<TAB>

它显示可用的 --color 选项,但没有完成其余部分,即使该选项并不含糊。

答案1

在一个人内心深处的某个地方zshcompsys(1)可能会找到一种-A 选择_arguments

-A pat Do not complete options after the first non-option argument
       on the line. pat is a pattern matching all strings which are
       not to be taken as arguments. For example, to make _arguments
       stop completing options after the first normal argument, but
       ignoring all strings starting with a hyphen even if they are
       not described by one of the optspecs, the form is `-A "-*"'.

否定无助于此。无论如何,该模式*似乎意味着“一切都不被视为参数”,因此选项应该在非选项参数之后完成:

#compdef h
local ret=1
_arguments -A "*" -S : \
    '-A+:' \
    '-B+:' \
    '-C+:' \
    '-i' \
    '-w' \
    && ret=0
return $ret

用法,假设_h完成脚本位于~/.zsh/functions

% zsh -f
lion% print $fpath
lion% fpath=( ~/.zsh/functions $fpath )
lion% autoload -U compinit
lion% compinit
lion% h -w foo -
-A  -B  -C  -i

-ZSH 完成可用选项后立即使用光标。确认完成脚本已启动(在命令上按 Tab 键)通过:

lion% which _h
_h () {
        local ret=1
        _arguments -A "*" -S : '-A+:' '-B+:' '-C+:' '-i' '-w' && ret=0
        return $ret
}

相关内容