zsh完了:無効なオプションを使用すると完了が停止します。

zsh完了:無効なオプションを使用すると完了が停止します。

私のスクリプトはfoo与えられたパスのディレクトリを/foo/path引数として使用し、オプションの引数も持っています-l

次の完了ファイルがあります。

#compdef foo

 _arguments : \
    '-l' \
    '*: :->directory'

 case $state in
    directory)
        _directories -W /foo/path
 ;;
 esac

完了中に、次の問題が発生します。

たとえば、無効な(存在しない)オプションのパラメータを使用して-cTabキーを押すと、

foo -c <TAB>

-lその後、存在しないオプションに対してディレクトリ補完機能が削除されたかのように、存在するオプションに対して自動補完されます-c

少なくともディレクトリと-l

しかし、とにかく間違った/存在しないオプションが提供されている場合は、間違ったオプションで続行できないことを明確にするために完了を完全に停止するにはどうすればよいですか?

ベストアンサー1

このコードでは、説明した動作を再現できません。以降をfoo -c 押すと、Tab完成した目次が表示されます。

とともに状態を使用する場合は、関数が_argumentsローカル変数として使用する変数を宣言する必要があります。この単純なケースでは、同じ名前のグローバル変数がなくても問題にならないと思います。


で始まるすべてのパラメータの動作を指定する方法はないと思います-。認識できないオプションがあるときに完了を無効にするには、パラメータ(つまり、words1(コマンド名、除く)と$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

おすすめ記事