2つの完成リストから選択してください

2つの完成リストから選択してください

いくつかのtcsh完了設定をzshに移行しようとしましたが、文書内のいくつかの内容が失われました。私が望むのは、2つの方法のうちの1つで議論を完了することです。現在完成したい単語にaが含まれていない場合は、/文字列セットの1つでなければなりません。含まれている場合は/ディレクトリでなければなりません。

これ:

_foo() {
    _arguments -C '1:Name:(Name1 Name2 Name3)' '1:Directory:_path_files -/'
}

同じパラメータを2回指定できないため、機能しません。遊んでた_regex_argumentsけど意味のある行動が得られなかったから何か抜けたらしい

答え1

私は最終的に:

#compdef foo

_foo() {
     local curcontext="$curcontext" state line
     typeset -A opt_args
     _arguments -C '-a' '-b' '-c' '-d' '1: :->name'
     case $state in
         name)
             case $words[2] in
                 */*)
                     _arguments '*:directory:_path_files -/'
                     ;;
                 *)
                     _arguments '*:name:(Name1 Name2 Name3)'
                     ;;
             esac
     esac
}

_foo "$@"

しかし、これが最善の解決策であるかどうかはわかりません。具体的には、いくつかの例の使用法をコピーしましたが、$wordsドキュメントでは見つかりませんでした。

関連情報