私のスクリプトはfoo
与えられたパスのディレクトリを/foo/path
引数として使用し、オプションの引数も持っています-l
。
次の完了ファイルがあります。
#compdef foo
_arguments : \
'-l' \
'*: :->directory'
case $state in
directory)
_directories -W /foo/path
;;
esac
完了中に、次の問題が発生します。
たとえば、無効な(存在しない)オプションのパラメータを使用して-c
Tabキーを押すと、
foo -c <TAB>
-l
その後、存在しないオプションに対してディレクトリ補完機能が削除されたかのように、存在するオプションに対して自動補完されます-c
。
少なくともディレクトリと-l
。
しかし、とにかく間違った/存在しないオプションが提供されている場合は、間違ったオプションで続行できないことを明確にするために完了を完全に停止するにはどうすればよいですか?
ベストアンサー1
このコードでは、説明した動作を再現できません。以降をfoo -c
押すと、Tab完成した目次が表示されます。
とともに状態を使用する場合は、関数が_arguments
ローカル変数として使用する変数を宣言する必要があります。この単純なケースでは、同じ名前のグローバル変数がなくても問題にならないと思います。
で始まるすべてのパラメータの動作を指定する方法はないと思います-
。認識できないオプションがあるときに完了を無効にするには、パラメータ(つまり、words
1(コマンド名、除く)と$CURRENT
(完成語、除く)の間です。
local context state state_descr line
typeset -A opt_args
_arguments : \
'-l' \
'*: :->directory'
local i
for ((i = 2; i < CURRENT; i++)); do
if [[ $words[$i] = -* && $words[$i] != -l ]]; then
state=nothing
break
fi
done
case $state in
directory)
_directories -W /usr
;;
esac