私が書いたいくつかのユーザー定義関数の完成関数を作成しようとしていますが、最も基本的なものでさえ本当に難しいようです。
サンプル関数は次のとおりです。
function eb_instances() {
if [ "$#" -ne 2 ]; then
echo "Usage eb_instances <aws profile name> <environment name>"
echo "e.g.:"
echo " eb_instances production kraken-prod-api"
return 1
fi
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" "Name=tag:Name,Values=$2" --profile=$1 --output=json | jq -r ".Reservations[].Instances[].PrivateIpAddress"
}
これは2つの位置パラメータを使用します<aws profile name>
。<environment name>
<aws profile name>
完了オプションを実行して動的に使用し、完了オプションを呼び出す他の関数を実行して動的に使用したいと思いますsed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
。<environment name>
eb_names
文書が非常に不足して理解しにくいことがわかりました。同様のコマンドのzsh-completionsリポジトリも見ましたが、必要なものと似たものが見つからないようです。
始めるのを手伝ってくれてありがとうございます!
修正する
に基づいて@cuonglmの返信、私は以下を使用しました:
#compdef ebinstances
_ebinstances() {
local state
_arguments \
'1: :->aws_profile'\
'*: :->eb_name'
case $state in
(aws_profile) _arguments '1:profiles:($(sed -n -E "s/\[([a-zA-Z0-9_\-]+)\]/\1/p" ~/.aws/credentials | tr \\n " "))' ;;
(*) compadd "$@" foo bar
esac
}
_ebinstances "$@"
元の質問で言及していないのは、2番目のパラメータの完成が最初のパラメータに依存することを望んでいることです(どちらもいくつかのコードを動的に実行することに基づいています)。たとえば、次のようになります。
$ eb_instances <cursor>TAB
cuonglm test
欲しい仕上がりを手に入れてください。最初の項目を選択してオートコンプリートしようとすると、次のようになります。
$ eb_instances cuonglm <cursor>TAB
実行を通じて完了オプションを生成したいと思います。eb_names cuonglm
可能であれば、完了を詳しく見てみましょう。たとえば、正しい候補が次のような場合ですfoo-bar
。
$ eb_instances cuonglm foo<cursor>TAB
実行して完了オプションを生成したいと思います。eb_names cuonglm foo
ベストアンサー1
最初は、zsh完成システム非常に複雑でマスターするのが難しいようです。たとえば、見てみましょう。
最初に知っておくべきことは、zsh
完成システムが完成機能をロードすることです$fpath
。完了ディレクトリが次に表示されることを確認します。
print -rl -- $fpath
(使用中の場合ああ、、.oh-my-zsh/completions
はにあります$fpath
。それを作成してそこに完成機能を入れるだけです。 )
これで、関数の完了ファイルを生成する必要があります。名前は_
アンダースコア()と関数名で始まる必要があります。あなたの例では、名前はです_eb_instances
。
_eb_instances
ファイルに次の行を追加します。
#compdef eb_instances
_eb_instances() {
local state
_arguments \
'1: :->aws_profile'\
'*: :->eb_name'
case $state in
(aws_profile) _arguments '1:profiles:(cuonglm test)' ;;
(*) compadd "$@" prod staging dev
esac
}
_eb_instances "$@"
これで終わりました。ファイルを保存し、新しいセッションを開始して完了をテストします。次の内容が表示されます。
$ eb_instances <cursor>TAB
cuonglm test
$ eb_instances cuonglm <cursor>TAB
dev prod staging
_arguments
関数と変数のzsh補完システム文書を読むことができますstate
。また、(cuonglm test)
コマンドを変更して機能をsed
変更する必要があります。prod staging dev
eb_names
渡された最初のパラメータに基づいて2番目のパラメータを生成するには、次の$words[2]
変数を使用できます。
case $state in
(aws_profile) _arguments '1:profiles:(cuonglm test)' ;;
(*) compadd "$@" $(echo $words[2]) ;;
esac
echo
実際の機能に置き換えてください。あなたが思う限り、それはです$(eb_names $words[2])
。
それでも問題がある場合は、呼び出し完了の合計を次の_eb_instances
ように定義してください。eb_instances
.zshrc
compdef _eb_instances eb_instances
次のコマンドを使用してシステムを初期化する必要があります。
autoload -U compinit
compinit
(ご使用の場合はoh-my-zsh
すでにロードされています。)