カスタムスクリプト用の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つの動作モードが必要です。
- と入力すると、オプションのパラメータ
foo -<TAB>
()を指定する必要があります-d
-w
-l
-i
。次に、選択したオプションのパラメータに応じて、次の操作を行います。
1a)foo -d <TAB>
パスの完全なディレクトリのみ
1b)foo -w / -l / -i <TAB>
パスの一般ファイルの完成
これは期待どおりに機能します。
- と入力すると、
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