GNU/Linux >> Belajar Linux >  >> Linux

Pelengkapan Otomatis Zsh Dinamis Untuk Perintah Kustom?

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 menjalankan
sed -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.

Terkait:Linux – Bagaimana cara mendapatkan nama sistem operasi dengan andal?

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)


Linux
  1. Lembar contekan untuk perintah umum Linux

  2. Bagaimana Cara Menentukan Pelengkapan Otomatis Khusus Untuk Perintah Tertentu?

  3. Cara Membuat Server Nama Khusus untuk Server Khusus Anda

  1. 8 perintah Linux untuk manajemen proses yang efektif

  2. 10 Perintah Linux Untuk Diagnostik Jaringan

  3. Bagaimana cara menetapkan nama untuk layar?

  1. Perintah Kustom

  2. Batalkan Penyelesaian, Tapi Hanya Penyelesaian, Di Zsh?

  3. Lembar Cheat Perintah Linux