我有zsh completion
我的自定义脚本。它需要 3 个可选参数--insert
, --edit
,--rm
并完成给定路径中的文件:
#compdef pass
_pass() {
local -a args
args+=(
'--insert[Create a new password entry]'
'--edit[Edit a password entry]'
'--rm[Delete a password entry]'
)
_arguments $args '1: :->directory'
case $state in
directory)
_path_files -W $HOME/passwords -g '*(/)' -S /
_path_files -W $HOME/passwords -g '*.gpg(:r)' -S ' '
;;
esac
}
我需要添加另一个选项-P
,该选项也将提供完成(当我键入-
和 时TAB),但不提供路径完成。此选项应该只接受一个字符串。因此它不应该匹配路径,并且如果-P
已指定,它也不应该提供其他选项。
如何将此新选项添加到我的完成脚本中?
更新:
完成不适用于 option -P
,即当我这样做时:
pass -P <TAB>
它什么也没完成,因为选项 -P 需要一个字符串。这很好。但是,当我这样做时
pass -P foo <TAB>
它也没有完成任何事情。但它应该完成当前路径中的目录。怎样才能做到这一点呢?
答案1
假设您提到的所有选项都是互斥的,那么解决方案如下:
#compdef pass
_pass() {
local -a args=(
# (-) makes an option mutually exclusive with all other options.
'(-)--insert[Create a new password entry]'
'(-)--edit[Edit a password entry]'
'(-)--rm[Delete a password entry]'
'(-)-P:string:'
'1:password entry:->directory'
)
_arguments $args
case $state in
directory)
_path_files -W $HOME/passwords -g '*(/)' -S /
_path_files -W $HOME/passwords -g '*.gpg(:r)' -S ' '
;;
esac
}
文档在这里:http://zsh.sourceforge.net/Doc/Release/Completion-System.html#index-_005farguments