私のカスタムスクリプトがあります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