修正する:

修正する:

カスタムスクリプト用のzshコンプリートファイルがありますfoo

次の場所で一般ファイルを完了する必要があります$HOME/foo

#compdef foo

_arguments -S : \
    '-i' \
    '1:thing:_path_files -W $HOME/foo -g "*(.)"'

修正すべき内容は次のとおりです。

オプションのパラメータを追加します--dir

と入力すると、foo --dir<TAB>ディレクトリの補完機能を提供する必要があります。$HOME/foo

foo --dir=<TAB>

また、ファイル完了パス($HOME/fooデフォルト)をに変更する必要があります$HOME/foo/my_dir。ここでmy_dir指定された名前はです--dir=my_dir

修正する:

デフォルトでは、完了ルールには2つの動作モードが必要です。

  1. と入力すると、オプションのパラメータfoo -<TAB>()を指定する必要があります-d -w -l -i。次に、選択したオプションのパラメータに応じて、次の操作を行います。

1a)foo -d <TAB>パスの完全なディレクトリのみ

1b)foo -w / -l / -i <TAB>パスの一般ファイルの完成

これは期待どおりに機能します。

  1. と入力すると、foo <TAB>補完規則はパスに通常のファイルを提供する必要があります。現在、期待どおりに動作しません。それでもオプションのパラメータが提供されているので、ディレクトリ/ファイルを完了する前に1つを選択する必要があります。

foo <TAB>(なし)を入力すると、-オプションパラメータのみが提供されます。補完ルールは、オプションのパラメータの1つを選択した場合にのみパスにディレクトリ/ファイルを提供します。

オプションの引数なしで動作し、この場合、パス内の通常のファイルのみを完了するようにスクリプトを変更するにはどうすればよいですか?

完成ルールは次のとおりです。

#compdef foo

local -A opt_args

_arguments -S -C \
    '-i[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
    '-l[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
    '-w[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
    '-d[select directory]:directory_file:_path_files -/ -W $HOME/manuals' \
     && return 0

最後に、小さな質問が1つあります。完了ルールでは、1つのオプションのパラメータのみが予想(完了)します。

入力すると、foo -i -<TAB>残りのオプションパラメータは提供されません。これらのパラメータは相互に排他的ではありません。以下を使用して動作する必要があります。

foo -i -l -w <TAB>

ベストアンサー1

そう:

#compdef foo

local -A opt_args

_arguments -S -C \
    '-i[select file]:thing_file:_path_files -W $HOME/foo/${opt_args[-d]} -g "*(.)"' \
    '-d[select directory]:directory_file:_path_files -/ -W $HOME/foo' \
     && return 0

その機能がどのように機能するかを説明してください。

~/foo 生成:

mkdir ~/foo

~/foo に 10 個のディレクトリを作成します。

mkdir ~/foo/DIR{1..10}

4番ディレクトリにファイルを作成します。

$ touch ~/foo/DIR4/FILE4

そして〜/ fooのファイル:

touch ~/foo/FILE-IN-FOO

タイプ

食べ物

そしてを押してくださいTab。示す:

$foo -d DIR1/
DIR1/   DIR10/  DIR2/   DIR3/   DIR4/   DIR5/   DIR6/   DIR7/   DIR8/   DIR9/

ディレクトリのみが表示されるため、FILE-IN-FOOはありません。

DIR4を選択し、-iを追加します。

foo -d DIR4 -i

そしてを押してくださいTab。示す:

foo -d DIR4 -i FILE4

おすすめ記事