GNU/Linux >> Linux の 問題 >  >> Linux

カスタムコマンドの動的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"
}

これには、<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に 機能。

関連:Linux –オペレーティングシステムの名前を確実に取得するにはどうすればよいですか?

最初に渡された引数に基づいて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を使用した場合 、ロードされました)


Linux
  1. 一般的なLinuxコマンドのチートシート

  2. ネットワーク診断用の10のLinuxコマンド

  3. カスタムコマンド

  1. 特定のコマンドにカスタムオートコンプリートを指定するにはどうすればよいですか?

  2. Linuxコマンドのチートシート

  3. 画面に名前を付けるには?

  1. Zshで、完了をキャンセルしますが、完了のみですか?

  2. 専用サーバー用のカスタムネームサーバーを作成する方法

  3. Fedora 11 リリース名 – 投票してください