কাস্টম কমান্ডগুলির জন্য ডায়নামিক zsh স্বতঃপূরণ


19

আমি লিখেছি এমন কিছু কাস্টম ফাংশনগুলির জন্য সমাপ্তির ফাংশনগুলি লেখার চেষ্টা করছি, তবে মনে হচ্ছে এটি বেশিরভাগ মৌলিক বিষয়গুলির সাথেই লড়াই করছে।

একটি উদাহরণ ফাংশন:

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>এবং<environment name>

আমি <aws profile name>দৌড়ের মাধ্যমে গতিময়রূপে উপলব্ধ হওয়ার জন্য সমাপ্তির বিকল্পগুলি চাই এবং আমি যে আর একটি ফাংশন আহ্বান করেছি তা চালিয়ে গতিশীলতার sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' 'জন্য সম্পূর্ণতাগুলি <environment name>পেতে চাই eb_names

আমি ডকুমেন্টেশনটি বেশ বিরল এবং অনুসরণ করা কঠিন খুঁজে পেয়েছি। আমি অনুরূপ কমান্ডের zsh- পরিপূর্ণতা রেপোও দেখেছি তবে আমার যা প্রয়োজন তা সদৃশ কিছু খুঁজে পাচ্ছে না।

যে কোনও সহায়তা শুরু করা অনেক প্রশংসা হবে!

হালনাগাদ

@ কুওগলমের উত্তরের ভিত্তিতে আমি ব্যবহার করেছি:

#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 "$@" foo bar
  esac
}

_ebinstances "$@"

মূল প্রশ্নে আমি যা উল্লেখ করতে ভুলে গেছি তা হ'ল, আমিও চেয়েছিলাম যে দ্বিতীয় যুক্তির সমাপ্তিটি প্রথমটির উপর নির্ভর করবে (যা উভয়ই কিছু কোডকে কার্যকরভাবে চালিত করে), উদাহরণস্বরূপ:

$ 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

উত্তর:


23

প্রথমবারে, zsh কমপ্লিটেশন সিস্টেমটি বোঝা খুব জটিল এবং কঠিন বলে মনে হচ্ছে। একটি উদাহরণ চেষ্টা করুন।

আপনার প্রথম জিনিসটি জানতে হবে, zshসমাপ্তির সিস্টেমটি সম্পূর্ণরূপে ফাংশনগুলি লোড করবে $fpath। আপনার সম্পূর্ণকরণ ডিরেক্টরি এতে উপস্থিত রয়েছে তা নিশ্চিত করুন:

print -rl -- $fpath

(যদি আপনি ওহ-মাই-জেডএস ব্যবহার করেন তবে সেখানে .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 "$@" prod staging dev
  esac
}

_eb_instances "$@"

তুমি পেরেছ. ফাইলটি সংরক্ষণ করুন এবং পরীক্ষা শেষ হওয়ার জন্য নতুন সেশন শুরু করুন। আপনি এই জাতীয় কিছু দেখতে পাবেন:

$ eb_instances <cursor>TAB
cuonglm  test

$ eb_instances cuonglm <cursor>TAB
dev      prod     staging

আপনি _argumentsফাংশন, stateপরিবর্তনশীল সম্পর্কে zsh সমাপ্তি সিস্টেম ডকুমেন্টেশন পড়তে পারেন । এছাড়াও আপনাকে (cuonglm test)আপনার sedকমান্ড দিয়ে পরিবর্তন prod staging devকরতে হবে এবং আপনার eb_namesফাংশনে পরিবর্তন করতে হবে।

আপনি যদি 1 তম আর্গুমেন্টটি পাস করেছেন তার উপরে 2 য় আর্গুমেন্ট বেস তৈরি করতে চান, আপনি $words[2]ভেরিয়েবল ব্যবহার করতে পারেন :

case $state in
  (aws_profile) _arguments '1:profiles:(cuonglm test)' ;;
            (*) compadd "$@" $(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এটি ব্যবহার করেন তবে এটি লোড করা হবে)


বিস্তারিত প্রতিক্রিয়া জন্য অনেক ধন্যবাদ। সমস্যাটি যেহেতু আমি কোনও ভাল নথিবদ্ধ উপায় খুঁজে পেতে পারি না বলে মনে হয় তা হল আমার সমাপ্তির বিকল্পগুলি গতিশীল হয় বা অন্য ফাংশন / স্ক্রিপ্ট থেকে আসে, উদাহরণস্বরূপ, আপনার উদাহরণস্বরূপ, আমি যদি cuonglm testআসতে চাইতাম তবেsed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
zsquare

@zsquare: শুধু প্রতিস্থাপন (cuonglm test)সঙ্গে ($(sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' ')), পরিবর্তন compadd "$@" prod staging devকরার জন্য compadd "$@" $(eb_names)
cuonglm

এটি সম্ভবত এটি কিছুটা প্রসারিত হতে পারে তবে আমি উল্লেখ করতে ভুলে গেছি, এটির eb_namesপ্রথম যুক্তিটি পাস করা দরকার , অর্থাৎ, productionবা stagingআমি কীভাবে এটি করব? অনেক ধন্যবাদ, আমি এর সাথে সাজানো বেশ কয়েকটি জিনিস পেয়েছি।
zsquare

আমি বোঝাতে চাইছি না যে আমি প্রথম যুক্তিটি ইবে_নেমে পাস করার জন্য ব্যবহার করতে চাইছিলাম। আমি রেফারেন্সিং করার চেষ্টা করেছি $1বা $2, কিন্তু কোনও ডাইস নেই।
zsquare

2
তুমি একজন উইজার্ড, হ্যারি।
অসম্পূর্ণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.