自分が書いたいくつかのカスタム関数の補完関数を書き込もうとしていますが、最も基本的な関数でさえ本当に苦労しているようです。
関数の例は次のとおりです。
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"
}
これには、<aws profile name>
という2つの位置引数があります。 および<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 "[email protected]" foo bar
esac
}
_ebinstances "[email protected]"
元の質問で言及するのを忘れたのは、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
を実行して完了オプションを生成したい
承認された回答:
当初、zsh Completion Systemは非常に複雑で、把握するのが難しいようです。例を見てみましょう。
最初に知っておく必要があるのは、zsh
完了システムは、$fpath
から完了関数をロードします 。完了ディレクトリが次の場所に表示されていることを確認してください:
print -rl -- $fpath
(oh-my-zshを使用した場合は、.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 "[email protected]" prod staging dev
esac
}
_eb_instances "[email protected]"
これで完了です。ファイルを保存し、新しいセッションを開始して完了をテストします。次のようなものが表示されます:
$ 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 "[email protected]" $(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
を使用した場合 、ロードされました)