カスタムコマンドの動的zshオートコンプリート

カスタムコマンドの動的zshオートコンプリート

私が書いたいくつかのユーザー定義関数の完成関数を作成しようとしていますが、最も基本的なものでさえ本当に難しいようです。

サンプル関数は次のとおりです。

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 deveb_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すでにロードされています。)

おすすめ記事