কমান্ড এলিয়াসগুলির জন্য আমি কীভাবে বাশ সম্পূর্ণ করতে পারি?


57

আমি আমার কমান্ড লাইন উপাধিতে ট্যাব-সমাপ্তি পেতে চাইছি, উদাহরণস্বরূপ, বলুন যে আমি নীচের নামটি সংজ্ঞায়িত করেছি:

alias apt-inst='sudo aptitude install'

আমি যখন ট্যাব কী টিপব তখন প্রবণতা দ্বারা সরবরাহগুলি সম্পূর্ণ করার কোনও উপায় আছে? উদাহরণস্বরূপ, যখন আমি 'sudo অ্যাপিটিচুড ইনস্টল gnumer' লিখি এবং ট্যাবটি হিট করি, প্রবণতাটি gnumeric এ সম্পূর্ণ করে, বা যদি অনিশ্চয়তা থাকে তবে জেনুমার দিয়ে শুরু হওয়া সমস্ত উপলব্ধ প্যাকেজগুলির তালিকা তৈরি করে। যদি আমি এটি আমার উপনামটি ব্যবহার করে করি তবে কিছুই - সম্পূর্ণ নয়।


1
আরও দেখুন stackoverflow.com/questions/342969/...
nschum

উত্তর:


30

নেই উবুন্টু ফোরামে এই সম্পর্কে একটি মহান থ্রেড । ওলে জে নীচের উপন্যাস সমাপ্তির সংজ্ঞা ফাংশনটি প্রস্তাব করেছেন:

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      ((COMP_CWORD+=$arg_count))
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}

আপনার উরফটির জন্য একটি সমাপ্তি ফাংশন সংজ্ঞায়িত করতে এটি ব্যবহার করুন, তারপরে উক্তটির জন্য পরিপূর্ণরূপ হিসাবে সেই ফাংশনটি নির্দিষ্ট করুন:

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

বিদ্যমান প্রোগ্রামগুলিতে সর্বদা-ব্যবহৃত যুক্তি যুক্ত করার জন্য আমি এলিয়াস ব্যবহার করতে পছন্দ করি। উদাহরণস্বরূপ, এর সাথে grepআমি সর্বদা ডিভাইস এবং বাইনারি ফাইলগুলি এড়িয়ে যেতে চাই তাই আমি এর জন্য একটি উপাধি তৈরি করি grep। নতুন কমান্ড যুক্ত করার জন্য grepbin, আমি আমার ~/binফোল্ডারে শেল স্ক্রিপ্ট ব্যবহার করি । যদি সেই ফোল্ডারটি আপনার পথে থাকে তবে এটি স্বয়ংক্রিয়ভাবে পূর্ণ হবে।


2
আশ্চর্যজনক, আমি ভয় পেয়েছিলাম যে এটি সম্ভব হবে না।
লেভেস্ক

নোট করুন এই কোডটিতে কিছু সমস্যা রয়েছে। তাদের ব্যাখ্যা এবং সমাধানের জন্য আমার উত্তর দেখুন।
টম হেল

দ্রষ্টব্য: আমি অন্য কমান্ড এই কৌশল ব্যবহার করছিলেন, এবং আমি ব্যবহার ছিল complete -o default -F ...পরিবর্তে complete -F ...সঠিকভাবে কাজ যখন args (ব্যাশ 4.3.46) ক্ষণস্থায়ী ফাইলের নাম স্বয়ং-সম্পূর্ণতে ভালো জিনিস পেতে।
joelittlejohn

28

ব্যবহার করে দেখুন সম্পূর্ণ-ওরফে , যা ঠিক এই সমস্যা solves।

এটি ইনস্টল করার পরে আপনি এর মতো অনেক উপকরণ সম্পূর্ণ করতে একটি জেনেরিক ফাংশন ব্যবহার করতে পারেন:

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

আপনি প্রতিটি বাশ ইনস্ট্যান্সের মাধ্যমে .bash_profileবা অনুরূপ সম্পূর্ণ_লিয়াস ফাইলটি উত্স করতে চাইতে পারেন ।

স্থাপন

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/bash_completion.sh \
     > ~/.bash_completion.d/complete_alias

আবেদন

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

containerআসল _docker()সমাপ্তি হ্যান্ডলার দ্বারা এখন স্বয়ংক্রিয়ভাবে সম্পন্ন করা যেতে পারে ;

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   

2
এই সফ্টওয়্যারটি আপনার বলে মনে হচ্ছে, আপনি এর চেয়ে আরও ভাল করতে পারবেন। এটি ইনস্টল করার জন্য নির্দেশাবলী যুক্ত করুন। এটি কী করে এবং কীভাবে এটি ব্যবহার করবে তা বর্ণনা করুন। অন্যথায় এটি কেবল স্প্যাম।
মুড়ু

@ মুরু আমি এখানে কিছু কোড পেস্ট করার কথা ভাবছিলাম তবে এটি সম্ভবত এখানে গৃহীত হওয়ার চেয়ে বেশি দীর্ঘ। আমি ধরে নেব একটি README ফাইলে ইনস্টল বিভাগটি পড়তে কোনও সমস্যা নেই এবং এই ক্ষেত্রে এটি কেবল বেশ কয়েকটি লাইন।
সাইকেল 12

2
পয়েন্টটি কেবল উত্তর থেকে README বলা সার্থক কিনা তা বিচার করতে সক্ষম হবেন।
মুড়ু

এটি পর্যাপ্ত উত্তর এবং এটি সমস্যার ঠিক সমাধান করে।
16 Рахматуллин

1
এটি একটি দুর্দান্ত এবং খুব বিস্তৃত উত্তর যা পুরোপুরি কার্যকর হয়, ধন্যবাদ! @ মুরু এর সাথে সমস্যা হওয়ার পরে এটি সম্ভবত আপডেট করা হয়েছে had
ব্রায়ান

3

2018 উত্তর

প্রোগ্রামটি 'সম্পূর্ণ' করতে আপনাকে অবশ্যই আপনার উপনাম যুক্ত করতে হবে। আপনি যে ধরণের স্বতঃপূরণ অর্জন করতে চান তার উপর নির্ভর করে আপনাকে অবশ্যই -c বা -F ব্যবহার করতে হবে।

প্যাকেজ স্বতঃপূরণ জন্য:

complete -c name_of_your_alias

কমান্ড স্বতঃপূরণ জন্য:

complete -F name_of_your_alias

আপনার নামটি সঠিকভাবে যুক্ত হয়েছে কিনা তা পরীক্ষা করতে:

complete | grep name_of_your_alias

অবশেষে, 'সম্পূর্ণ' থেকে একটি উপকরণ অপসারণ করতে:

complete -r name_of_your_alias

আপনার ক্ষেত্রে:

complete -c apt-inst

1
মন্তব্যে আপনার উত্তর অবিরত করবেন না দয়া করে। আপনার যদি বলার মতো জিনিস থাকে তবে সেগুলি উত্তরে সম্পাদনা করুন।
জি ম্যান

2
complete -F xxxওএসএক্সে কাজ করে না (এটি কেবল ব্যবহারটি দেখায় complete: usage: complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...])। আপনার কোন পয়েন্টার আছে? ধন্যবাদ।
অ্যান্টনি কং

পরিবর্তে এটি ব্যবহার করুন: unix.stackexchange.com/questions/224227/…
সমৃদ্ধ

2

কিছু উন্নতি সহ শন জে গফের উত্তর থেকে কোডটি এখানে :

  • স্থায়ী সিনট্যাক্স ত্রুটি তুলে shell-check, প্রথম উদাঃ "এর "$@"আসলে শেষ পর্যন্ত ফাংশন সংজ্ঞা পংক্তি।
  • return 0অন্তর্নিহিত ফাংশনটির রিটার্ন মানটি কলারের কাছে ফেরত দেওয়া যেতে পারে যাতে সরানো হয়েছে ।

# Wraps a completion function, eg for use with an alias.
# Usage:
# make-completion-wrapper <actual completion function> <name of new func.>
#                         <command name> <list supplied arguments>
# eg.
#   alias agi='apt-get install'
#   make-completion-wrapper _apt_get _apt_get_install apt-get install
#     # defines a function called _apt_get_install (that's $2) that will
#     # complete the 'agi' alias. 
#   complete -F _apt_get_install agi
function make-completion-wrapper {
  local function_name="$2"
  local arg_count=$(( $#-3 ))
  local comp_function_name="$1"
  shift 2
  local function="function $function_name {
      (( COMP_CWORD += $arg_count ))
      COMP_WORDS=( \"\$@\" \${COMP_WORDS[@]:1} )
      \"$comp_function_name\"
    }"
  eval "$function"
  # echo "$function"
}
export -f make-completion-wrapper

4.3.46 বাশে আমার জন্য কাজ করে না আমি ভীত। শন জে গফের এর উত্তর নেই কাজ করে।
joelittlejohn

1
"সমাপ্তি" ফাংশন সংজ্ঞা স্ট্রিং উদ্দেশ্য উপর; বিন্দুটি হ'ল বাহ্যিক ক্রিয়া থেকে অ্যারেগুলিতে যুক্তিগুলি অন্তর্ভুক্ত করা COMP_WORDS। আমরা ব্যবহার করেন তাহলে make-completion-wrapper _apt_get _apt_get_install apt-get installএকটি উদাহরণ হিসাবে, পরে shift 2, $@ধারণ করে apt-get install। ফাংশন সংজ্ঞায়িত করার সময় apt-get install(দুটি আক্ষরিক শব্দ) অন্তর্ভুক্ত থাকে COMP_WORDS
জেফারি

0

@ গিলস এর উত্তর হিসাবে একটি এক্সটেনশন হিসাবে, নিম্নলিখিত সুবিধামত কার্যকারিতাটি make-completion-wrapperএকটি লাইনে সম্পূর্ণরূপে সংজ্ঞায়িত করা সম্ভব করার জন্য তৈরি হওয়া মোড়কটিকে স্বয়ংক্রিয়ভাবে নাম দেয় :

function complete-alias  {
    # uses make-completion-wrapper: https://unix.stackexchange.com/a/4220/50978
    # example usage
    # complete-alias _pass pshow pass show
    # complete-alias _pass pgen pass generate

    EXISTING_COMPLETION_FN=${1} && shift
    ALIAS=${1} && shift
    AUTOGEN_COMPLETION_FN="__autogen_completion_${ALIAS}"
    make-completion-wrapper ${EXISTING_COMPLETION_FN} ${AUTOGEN_COMPLETION_FN} ${*}
    complete -F ${AUTOGEN_COMPLETION_FN} ${ALIAS}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.