次のように定義された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:action
message
_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 "$@"