各パラメータを異なる方法でオートコンプリートするにはどうすればよいですか?

各パラメータを異なる方法でオートコンプリートするにはどうすればよいですか?

次のように定義されたload_pgという関数があります。

load_pg () {
    pg_restore --verbose --clean --no-acl --no-owner -h localhost -U $1 -d $2 $3
}

次のコードを使用して各パラメータをオートコンプリートします。

#compdef load_pg
_arguments -s \
  "1::_ldpguser" \
  "2::_ldpgdb" \
  "3::_ldpgfile"

_ldpguser () {
  compadd $USER
}

_ldpgdb () {
  compadd $(cat config/database.yml | grep -i database | awk '{print $2}')
}

_ldpgfile () {
  compadd $(ls *.dump*)
}

残念ながら、TABを押しても何も起こりません。私は何が間違っていましたか?使ってみました。以下の回答

ベストアンサー1

_arguments最初の障害:パラメータの構文はnullを受け入れません。メッセージを追加すると、次の進行状況を確認できます。n:message:actionmessage

_arguments -s \
  "1:username:_ldpguser" \
  "2:database:_ldpgdb" \
  "3:dump file:_ldpgfile"

次の障害は、ヘルパー関数が_arguments実行後に定義されることです。したがって、最初のパラメータが完了すると、関数の1つが存在しないというエラーメッセージが表示されます。機能を使用する前に定義してください。より良い方法は、関数定義を明示的に作成し、_load_pg自動ロードファイルの最後から呼び出すことです。これは不器用なように見えるかもしれませんが、zshに付属しているほとんどの多目的完成機能を書く方法です。

#compdef load_pg

_ldpguser () {
  compadd $USER
}

_ldpgdb () {
  compadd $(cat config/database.yml | grep -i database | awk '{print $2}')
}

_ldpgfile () {
  compadd $(ls *.dump*)
}

_load_pg () {
  _arguments -s \
    "1:user:_ldpguser" \
    "2:database:_ldpgdb" \
    "3:dump file:_ldpgfile"
}

_load_pg "$@"

これは機能の中心を提供します。その後、個々の機能をクリーンアップする必要があります。最低限度から:

  • compadd $USER無意味に見えます。ユーザー名で関数を呼び出したい場合は、単にビルドしてみてはいかがでしょうか?ユーザー名を完成させるには、を呼び出します_users
  • コマンド置換はすべてのスペースを置き換えます。線を分割するには、@次を使用します。f パラメータ拡張フラグ。また、コマンドをより正確にする必要があり、grepそれと組み合わせることもできますgrep
  • compaddでジョブを呼び出すとき_argumentsのコンテキストオプションを渡します$expl
  • 完了の説明を提供する必要があるかもしれません。_describe
  • $(ls *.dump*)*.dump*「一致するものがない場合は、現在のシェル設定に従って操作してください」と書くのは複雑な方法です。出力を解析しません。ls、ええと?使用できるN グローバル予選一致するものがない場合は、空の完了リストがあります。しかし、電話をする必要があります。_files他の詳細の中でも、サブディレクトリのファイルを完成させることを担当します。
#compdef load_pg

_ldpgdb () {
  compadd $expl[@] -- "${(@f)$(<config/database.yml grep -i database | awk '{print $2}')}"
}

_load_pg () {
  _arguments -s \
    '1:user:_users' \
    '2:database:_ldpgdb' \
    '3:dump file:_files -g "*.dump*"'
}

_load_pg "$@"

おすすめ記事