Saya mencoba menulis fungsi penyelesaian untuk beberapa fungsi khusus yang saya tulis, tetapi tampaknya sangat sulit bahkan dengan yang paling dasar sekalipun.
Contoh fungsi adalah:
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"
}
Ini memiliki dua argumen posisi, <aws profile name>
dan <environment name>
Saya ingin opsi penyelesaian untuk <aws profile name>
tersedia secara dinamis dengan menjalankansed -n -E 's/[([a-zA-Z0-9_-]+)]/1/p' ~/.aws/credentials | tr \n ' '
, dan kelengkapan untuk <environment name>
agar tersedia secara dinamis dengan menjalankan fungsi lain yang saya panggil eb_names
.
Saya menemukan dokumentasinya cukup jarang dan sulit untuk diikuti. Saya juga telah melihat repo zsh-completions untuk perintah serupa tetapi sepertinya tidak dapat menemukan sesuatu yang mirip dengan yang saya butuhkan.
Bantuan apa pun untuk memulai akan sangat dihargai!
Perbarui
Berdasarkan jawaban @cuonglm, saya menggunakan:
#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]"
Apa yang saya lupa sebutkan dalam pertanyaan awal adalah, bahwa saya juga ingin penyelesaian argumen kedua bergantung pada argumen pertama (keduanya berbasis dinamis mengeksekusi beberapa kode), misalnya:
$ eb_instances <cursor>TAB
cuonglm test
mendapatkan penyelesaian yang saya inginkan. Setelah saya pilih ucapkan yang pertama, dan coba selesaikan otomatis:
$ eb_instances cuonglm <cursor>TAB
Saya ingin membuat opsi penyelesaian dengan menjalankan eb_names cuonglm
, dan jika memungkinkan, juga menelusuri penyelesaian misalnya jika kandidat yang benar adalah foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
Saya ingin membuat opsi penyelesaian dengan menjalankan eb_names cuonglm foo
Jawaban yang Diterima:
Pada saat pertama, Sistem Penyelesaian zsh tampaknya sangat kompleks dan sulit untuk dipahami. Mari kita coba sebuah contoh.
Hal pertama yang perlu Anda ketahui, zsh
sistem penyelesaian akan memuat fungsi penyelesaian dari $fpath
. Pastikan direktori penyelesaian Anda muncul di:
print -rl -- $fpath
(Jika Anda menggunakan oh-my-zsh, ada .oh-my-zsh/completions
ada di $fpath
, Anda bisa membuatnya dan meletakkan fungsi penyelesaian Anda di sana)
Sekarang, Anda harus membuat file penyelesaian untuk fungsi Anda, namanya harus dimulai dengan garis bawah _
, ditambah nama fungsi Anda. Dalam kasus Anda, namanya adalah _eb_instances
.
Tambahkan baris ini ke _eb_instances
berkas:
#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]"
Kamu selesai. Simpan file dan mulai sesi baru untuk menguji penyelesaian. Anda akan melihat beberapa hal seperti ini:
$ eb_instances <cursor>TAB
cuonglm test
$ eb_instances cuonglm <cursor>TAB
dev prod staging
Anda dapat membaca dokumentasi sistem penyelesaian zsh tentang _arguments
fungsi, state
variabel. Anda juga perlu mengubah (cuonglm test)
dengan sed
perintah dan ubah prod staging dev
ke eb_names
. Anda fungsi.
Jika Anda ingin membuat basis argumen ke-2 berdasarkan argumen ke-1 yang diteruskan, Anda dapat menggunakan $words[2]
variabel:
case $state in
(aws_profile) _arguments '1:profiles:(cuonglm test)' ;;
(*) compadd "[email protected]" $(echo $words[2]) ;;
esac
Ganti echo
dengan fungsi Anda yang sebenarnya, dalam kasus Anda, ini adalah $(eb_names $words[2])
.
Jika Anda masih merasa sulit untuk melakukannya, cukup tentukan _eb_instances
dan eb_instances
di .zshrc
. Anda lalu panggil penyelesaian sebagai:
compdef _eb_instances eb_instances
Anda perlu menginisialisasi sistem penyelesaian dengan:
autoload -U compinit
compinit
(Jika Anda menggunakan oh-my-zsh
, sudah dimuat)