উপকরণের সাথে কাজ করার জন্য আমি কীভাবে বাশ সম্পূর্ণ করতে পারি?


195

বিন্দু ক্ষেত্রে:

আমি ব্যাশ v3.2.17 এর সাথে একটি ম্যাক করছি, আমি ব্যাশ_কম্প্লেশন বৈকল্পিক সহ ম্যাকপোর্টগুলির মাধ্যমে ইনস্টল করা গিট ব্যবহার করছি।

যখন আমি টাইপ git checkout m<tab>। উদাহরণস্বরূপ, আমি এটি সম্পন্ন করি master

যাইহোক, আমি একটি ওরফে পেয়েছেন git checkout, gco। আমি যখন টাইপ করি gco m<tab>, তখন আমি শাখার নামটি স্বয়ংক্রিয়ভাবে পূর্ণ হয় না।

আদর্শভাবে আমি কেবলমাত্র আমার সমস্ত এলিয়াসের জন্য যাদুগতভাবে কাজ করতে স্বতঃপূরণ চাই। এটা কি সম্ভব? এটি ব্যর্থ হয়ে, আমি প্রতিটি এ্যান্সের জন্য এটি নিজেই কাস্টমাইজ করতে চাই। সুতরাং, আমি কিভাবে সম্পর্কে যেতে হবে?


3
সম্পূর্ণ-ডিফল্ট -o নোস্পেস -এফ আজকাল কাজ করে না
eightyes

5
শীর্ষের উত্তরের চেয়ে বেশি উত্সাহযুক্ত প্রশ্নগুলি প্রায়শই দুর্দান্ত বৈশিষ্ট্যের অনুরোধগুলি
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

2
সুপারভাইজারের আর একটি উত্তর যখন কেউ আমাকে দেখিয়েছিল যে আমার প্রশ্নটি এইটির একটি ডুপ ছিল। superuser.com/questions/436314/…
ডিসেম্বর

উত্তর:


183

উপরের মন্তব্যে যেমন বলা হয়েছে,

complete -o default -o nospace -F _git_checkout gco

আর কাজ করবে না। যাইহোক, __git_completeগিট-সমাপ্তির একটি ফাংশন রয়েছে ash ব্যাশ যা এর মতো উপাধিকারের জন্য সম্পূর্ণতা সেট আপ করতে ব্যবহার করা যেতে পারে:

__git_complete gco _git_checkout

6
এটি অনেকগুলি ভুলের মধ্যে একমাত্র সঠিক উত্তর আমি দেখেছি।
আইটিয়েজ

45
আপনি যদি গিটের জন্য গ্লোবাল ওরফে "জি" ব্যবহার করেন, আপনি __git_complete g __git_mainসমস্ত গিট কমান্ডে কোড পরিপূর্ণতা কাজ করতে যোগ করতে পারেন।
ওন্দ্রেজ মাচুলদা

5
Those নতুন যারা গিট / শেল / ব্যাশে তাদের জন্য। উপরের মন্তব্যটি বিশ্বব্যাপী শেল ওরফে উল্লেখ করে, নেটিভ গিট ওরফে নয়।
ইলিয়াস লিন

14
আমি এটা কোথায় রাখা উচিত?
benregn

15
অবশেষে ঠিক করলেন কীভাবে এটি করা যায়! ধাপ 1) কপি git-completion.bashথেকে <your git install folder>/etc/bash-completion.d/থেকে ~/.git-completion.bash পদক্ষেপ 2) যোগ source ~/.git-completion.bashআপনার টু .bash_profile ধাপ 3) জুড়ুন __git_complete gco _git_checkoutযে কোন জায়গায় আপনার .bash_profile উপরে লাইন পরে। পদক্ষেপ 4) শেলটি পুনরায় বুট করুন এবং আপনার ওরফে অটো সম্পূর্ণরূপে উপভোগ করুন! :)
কেপিএসফু

54

আমিও এই সমস্যায় পড়েছি এবং এই কোড স্নিপেট নিয়ে এসেছি। এটি আপনাকে স্বয়ংক্রিয়ভাবে সমস্ত উপস্বের জন্য সম্পূর্ণ করবে give সমস্ত (বা কোনও) উপন্যাস ঘোষণার পরে এটি চালান।

# wrap_alias takes three arguments:
# $1: The name of the alias
# $2: The command used in the alias
# $3: The arguments in the alias all in one string
# Generate a wrapper completion function (completer) for an alias
# based on the command and the given arguments, if there is a
# completer for the command, and set the wrapper as the completer for
# the alias.
function wrap_alias() {
  [[ "$#" == 3 ]] || return 1

  local alias_name="$1"
  local aliased_command="$2"
  local alias_arguments="$3"
  local num_alias_arguments=$(echo "$alias_arguments" | wc -w)

  # The completion currently being used for the aliased command.
  local completion=$(complete -p $aliased_command 2> /dev/null)

  # Only a completer based on a function can be wrapped so look for -F
  # in the current completion. This check will also catch commands
  # with no completer for which $completion will be empty.
  echo $completion | grep -q -- -F || return 0

  local namespace=alias_completion::

  # Extract the name of the completion function from a string that
  # looks like: something -F function_name something
  # First strip the beginning of the string up to the function name by
  # removing "* -F " from the front.
  local completion_function=${completion##* -F }
  # Then strip " *" from the end, leaving only the function name.
  completion_function=${completion_function%% *}

  # Try to prevent an infinite loop by not wrapping a function
  # generated by this function. This can happen when the user runs
  # this twice for an alias like ls='ls --color=auto' or alias l='ls'
  # and alias ls='l foo'
  [[ "${completion_function#$namespace}" != $completion_function ]] && return 0

  local wrapper_name="${namespace}${alias_name}"

  eval "
function ${wrapper_name}() {
  let COMP_CWORD+=$num_alias_arguments
  args=( \"${alias_arguments}\" )
  COMP_WORDS=( $aliased_command \${args[@]} \${COMP_WORDS[@]:1} )
  $completion_function
  }
"

  # To create the new completion we use the old one with two
  # replacements:
  # 1) Replace the function with the wrapper.
  local new_completion=${completion/-F * /-F $wrapper_name }
  # 2) Replace the command being completed with the alias.
  new_completion="${new_completion% *} $alias_name"

  eval "$new_completion"
}

# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *\(.*\)'\''/wrap_alias \1 \2 '\''\3'\'' /')"

unset wrap_alias

6
লাইনটি let COMP_CWORD+=$num_alias_argumentsকোনও কারণে ম্যাক ওএস এক্সে কাজ করে নি। এটির পরিবর্তে এটি ((COMP_CWORD+=$num_alias_arguments))স্থির করে যদিও
মারিও এফ

5
বাহ, দারুণ - ধন্যবাদ! wrap_aliasওরফে সংজ্ঞায় ডাবল উক্তিগুলি দমন করে এবং আমি অনুমান করি যে এটি মাল্টি-কমান্ড অ্যালিয়াস ( alias 'foo=bar; baz') এর জন্য খুব বেশি অর্থবোধ করে না , তাই আমি এর | grep -v '[";|&]'পরে একটি অতিরিক্ত রাখছি alias -p। এছাড়াও, কয়েকশো উরফ সংজ্ঞাগুলির জন্য এটি কিছুটা ধীর হয়ে যায়, তবে আমি নিশ্চিত হয়ে খুশি যে echoপরিবর্তনের পরিবর্তে evalএবং ক্যাশে ফাইলে আউটপুটটি পাইপ করা (যা তারপরে evalএকসাথে এডি হতে পারে) ভাল কাজ করে এবং অতি দ্রুত ।
জো লিস

2
অন্য একটি ইঙ্গিত: wrap_aliasসম্পূর্ণগুলি সেট আপ করা দরকার, সুতরাং আমাকে কোডের source /etc/bash_completionসামনে যেতে হয়েছিল wrap_alias
জো লিস

2
এটি আমার জন্য ওএস এক্স 10.7.2 এ লাইনটি পরিবর্তন করার পরে কাজ let COMP_CWORD+=$num_alias_argumentsকরেছিল let \"COMP_CWORD+=$num_alias_arguments\"
irh

7
এই স্ক্রিপ্টটির আপডেট হওয়া সংস্করণটি superuser.com/a/437508/102281 এ দেখুন (উদাহরণস্বরূপ, আমি COMP_LINE এবং COMP_POINT এর জন্য সমর্থন যোগ করেছি যা কিছু গিট সম্পূর্ণকরণের জন্য প্রয়োজনীয়)।
জন মেলর

18

ইন git-completion.bashএকটি লাইন থাকে:

complete -o default -o nospace -F _git git

এই লাইনটি (এবং _git ফাংশন) দেখে আপনি এই লাইনটি আপনার যুক্ত করতে পারেন .bash_profile:

complete -o default -o nospace -F _git_checkout gco

4
কিছু গিট * বাশ ফাংশন এই পদ্ধতিটি ব্যবহার করে আর কাজ করে না
সে.এম.সিগিন্টি

হ্যাঁ এটি গিটার_কম্পলশন.বাশের কোনও পরিবর্তন না হওয়া অবধি দুর্দান্ত কাজ করত ... এখন এটি পুরো কমান্ড দিয়ে কাজ করে তবে ওরফে দিয়ে নয়।
মাইকেল স্মিথ

আধুনিক গিটে কাজ করে এমন উত্তরগুলির জন্য এই পৃষ্ঠার শেষটি দেখুন।
আইটেমিস

আমরা কি এইটির গৃহীত উত্তরকে "সঠিক উত্তর" হিসাবে পরিবর্তন করব না, বা পরিবর্তনটি প্রতিফলিত করার জন্য কমপক্ষে স্বীকৃত উত্তরটি আপডেট করব?
টনি কে।

এটি ভালভাবে কাজ করে - এটি আমার .বাশ_প্রফাইলে যুক্ত করেছে, এবং এফেসহীন
ল্যারি

15

আমি g = 'গিট' এলিয়াস রেখেছি এবং আমার গিট এলিয়াসের সাথে একত্রিত করেছি যা আমি পছন্দ করি

$ g co <branchname>

আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রে সহজ সমাধানটি ছিল গিট-সমাপ্তির জন্য একটি একক লাইন যুক্ত করা।

এই লাইনের ঠিক নীচে:

__git_complete git _git

আমি আমার একক 'জি' ওরফে হ্যান্ডেল করতে এই লাইনটি যুক্ত করেছি:

__git_complete g _git

2
(আমি সাইগউইন ব্যবহার করছি)) আমি ফাইলটি git-completionবা সেই লাইনটি খুঁজে /etc/bash_completion.d/gitপাইনি, তবে আমি complete -o default -o nospace -F _git gআমার উরফের পরে যুক্ত করেছি .bash_aliasesএবং এটি কার্যকর হয়েছে!
ইডব্রি

সতর্কতা অবলম্বন করুন যে আপনি যদি কোনও ফাইল সম্পাদনা করে থাকেন /etc/bash-completion.d/বা সদ্য সাইন ইন করেন /usr/share/bash-completion/, যখনই আপনার প্যাকেজ ম্যানেজার ব্যবহার করে সেই ফাইলটি আপডেট হয়ে যায় আপনি নিজের পরিবর্তনগুলি হারাবেন।
kub1x

14

আদর্শভাবে আমি কেবলমাত্র আমার সমস্ত এলিয়াসের জন্য যাদুগতভাবে কাজ করতে স্বতঃপূরণ চাই। এটা কি সম্ভব?

হ্যাঁ, সম্পূর্ণ-ওরফে প্রকল্পের মাধ্যমে (লিনাক্সে) এটি সম্ভব । ম্যাকের জন্য সমর্থন পরীক্ষামূলক তবে ব্যবহারকারীরা সাফল্যের কথা জানিয়েছেন।


4
অনেক অনেক ধন্যবাদ, বিশ্বের প্রতিটি ইউটিলিটি কীভাবে ব্যাশ সমাপ্তি প্রয়োগ করে তা নির্ধারণের চেয়ে এটি আরও ভাল।
আর্টম

2
প্রকৃতপক্ষে, এলিয়াসগুলির সম্পূর্ণকরণ কনফিগার করার জন্য আমাকে কিছু সময় বাঁচিয়েছে।
সমীর আলাজমোভিচ

2
লিনাক্সে মন্ত্রের মতো কাজ করে (ম্যাকের উপর পরীক্ষিত নয়)। এটি লেখার জন্য ধন্যবাদ!
বিটমাস্ক

1
এটি প্লেইন দুর্দান্ত! এটি ঠিক কাজ করে, আশেপাশে কোনও গোলমাল নেই, আরও ভাল! ধন্যবাদ!
ইমি

5

আপনি গিট এলিয়াস ব্যবহার করার চেষ্টা করতে পারেন। উদাহরণস্বরূপ, আমার ~/.gitconfigফাইলে আমার একটি বিভাগ রয়েছে যা দেখতে এরকম দেখাচ্ছে:

[alias]
        co = checkout

সুতরাং আপনি টাইপ করতে পারেন git co m<TAB>, এবং এটি প্রসারিত করা উচিত git co master, যা git checkoutআদেশ।


5

এই ফোরাম পৃষ্ঠাটি একটি সমাধান দেখায়।

এই লাইনগুলি আপনার .bashrcবা .bash_profile:

# Author.: Ole J
# Date...: 23.03.2008
# License: Whatever

# Wraps a completion function
# 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"
    return 0
}"
    eval "$function"
}

# and now the commands that are specific to this SO question

alias gco='git checkout'

# we create a _git_checkout_mine function that will do the completion for "gco"
# using the completion function "_git"
make-completion-wrapper _git _git_checkout_mine git checkout

# we tell bash to actually use _git_checkout_mine to complete "gco"
complete -o bashdefault -o default -o nospace -F _git_checkout_mine gco

এই সমাধানটি বাল্শটিজারের স্ক্রিপ্টের অনুরূপ , তবে কেবলমাত্র এটিই আমার পক্ষে কাজ করে। (বালশেৎজারের স্ক্রিপ্টটিতে আমার কিছু উপন্যাসের সমস্যা ছিল))


; এটি প্রায়শই কার্যকর - আমি বেশ কয়েকটি ত্রুটি পেয়েছি, তবে সমাপ্তির মধ্য দিয়ে যায়। আমি আর কিছু করতে পারি? -bash: eval: line 28: unexpected EOF while looking for matching ''' -bash: eval: line 29: syntax error: unexpected end of file
pforhan

@pforhan আমি উপরের বিষয়গুলি উদ্ধৃত করতে দেখতে পাচ্ছি ... স্ট্রিংয়ের "অভ্যন্তরের উদ্ধৃতিগুলি functionউদ্ধৃত হওয়া উচিত \"। এটি সম্ভবত আপনার 'কোটগুলির একটি লাইন ধরে কোথাও খায় ।
টম হেল

5

আরেকটি বিকল্প হ'ল ~/.bash_completionফাইল ব্যবহার করা । এটি এখানে রাখার জন্য gcoউপনাম তৈরি করতে git checkout:

_xfunc git __git_complete gco _git_checkout

তারপরে ~/.bashrcআপনাকে কেবল নিজের নামটি রাখতে হবে:

alias gco='git checkout'

দুটি লাইন। এটাই.

ব্যাখ্যা:

~/bash_completionপ্রধান bash_completion স্ক্রিপ্ট শেষে sourced হয়। জেন্টু আমি প্রধান স্ক্রিপ্ট পাওয়া /usr/share/bash-completion/bash_completion

_xfunc gitবিট গুন যত্ন নেয় git-completionতোমার জন্য ফাইল যাতে আপনি অন্য কিছু করা প্রয়োজন হবে না ~/.bashrc

গৃহীত উত্তরের জন্য আপনার অনুলিপিটি তৈরি করা উচিত যা .git-completion.shআপনার ~/.bashrcখোঁজ পেয়েছি file


পিএস: আমি এখনও git-completionআমার বাশ পরিবেশে পুরো স্ক্রিপ্টটি উত্স না করে তা নির্ধারণের চেষ্টা করছি । আপনি যদি কোনও উপায় খুঁজে পান তবে মন্তব্য করুন বা সম্পাদনা করুন।


কেন _xfunc gitপ্রয়োজন?
টম হেল

@ টমহেল আমি উত্তরটি উন্নত করার চেষ্টা করেছি। না করে বরং আমার জন্য এটি করা source ~/.git-completion.shযাক _xfunc। এটি সম্পূর্ণরূপে এটি করতে কেবল সুন্দর এবং ক্লিনার অনুভূত হয় ~/.bash_completion_xfunc(বা সোর্সিং) ছাড়া __git_completeফাংশনটির অস্তিত্ব নেই।
kub1x

1
~/.bash_completionফাইলের প্রয়োজন নেই - _xfuncলাইনটি আমার পক্ষে কাজ করে .bashrc
টম হেল

2

আপনাকে কেবল completeআদেশটি সন্ধান করতে হবে এবং পরিবর্তে উপনামের নামটি যুক্ত করে রেখাটি নকল করতে হবে।

আমি alias d-m="docker-machine"। কথায় কথায়, d-mউপনাম হবে docker-machine

সুতরাং ম্যাকের (ব্রিউয়ের মাধ্যমে), সমাপ্তির ফাইলগুলি রয়েছে cd `brew --prefix`/etc/bash_completion.d/
আমার মামলার জন্য আমি ফোনটি সম্পাদনা করেছি docker-machine
নীচে সমস্ত পথ ছিল:

complete -F _docker_machine docker-machine

সুতরাং আমি আমার আরস দিয়ে সবেমাত্র একটি লাইন যুক্ত করেছি:

complete -F _docker_machine docker-machine
complete -F _docker_machine d-m

এটি সরল (এক থেকে এক) এলিয়াসগুলির জন্য সেরা সমাধান, যেমন dockerএলিয়াসযুক্ত d। যদিও প্রশ্নের উদাহরণের জন্য, git checkoutএলিয়াস্ত gcoআরও জটিল।
উইসবাকি

1

প্রথমে আসল সমাপ্তি কমান্ডটি সন্ধান করুন। উদাহরণ:

$ complete | grep git

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

এখন এগুলি আপনার স্টার্টআপ স্ক্রিপ্টে যুক্ত করুন (উদাঃ ~ / .bashrc):

# copy the original statement, but replace the last command (git) with your alias (g)
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g

# load dynamically loaded completion functions (may not be required)
_completion_loader git

_completion_loaderলাইন প্রয়োজনীয় নাও হতে পারে। তবে কিছু পরিস্থিতিতে, কমান্ডটি টাইপ করার পরে এবং TABপ্রথমবার টিপানোর পরে সমাপ্তির ফাংশনটি কেবল গতিসম্পন্নভাবে লোড হয় । সুতরাং যদি আপনি আসল কমান্ডটি ব্যবহার না করে থাকেন এবং উপন্যাস + চেষ্টা করে থাকেন তবে TABআপনি "বাশ: সমাপ্তি: ফাংশন '_ ডকার' পাওয়া যায় নি" এর মতো একটি ত্রুটি পেতে পারেন।


1

এই প্রশ্নের অনেক উত্তর রয়েছে এবং নিজের মতো করে আমি প্রচুর বিভ্রান্ত পাঠককে বাজি ধরছি। আমার ক্ষেত্রে আমার গিটের বিভিন্ন সংস্করণ সহ আমার ডটফাইলে একাধিক প্ল্যাটফর্মে কাজ করার প্রয়োজনীয়তাও ছিল। আমি না alias g=gitকিন্তু পরিবর্তে gএকটি ফাংশন হিসাবে সংজ্ঞায়িত করেছি ।

এটি সম্পাদন করার জন্য আমাকে এখানে একটি সমাধানে বিভিন্ন উত্তর এক সাথে চড় মারতে হয়েছিল। যদিও এটি ইতিমধ্যে উত্তরগুলির পুনরাবৃত্তি করেছিল আমি ভেবেছিলাম আমার নৌকায় কেউ এই সংকলনটি দরকারী হিসাবে খুঁজে পাবে যখন আমি এই প্রশ্নে প্রথম এসেছি have

এটি ধরে নেয় পুরানো এবং আরও নতুন গিট সমাপ্তি, উবুন্টু ডিফল্ট এবং brew install gitম্যাকোস-এ। পরবর্তী ক্ষেত্রে বারু দ্বারা ইনস্টল করা পরিপূর্ণতা বাশ দ্বারা প্রক্রিয়াজাত করা হচ্ছিল না (এমন কিছু যা আমি পরে সনাক্ত করব)।

# Alias g to git

g() {
  if [[ $# > 0 ]]; then
    git "$@"
  else
    git status -sb
  fi
}

# Preload git completion in Ubuntu which is normally lazy loaded but we need
# the __git_wrap__git_main function available for our completion.
if [[ -e /usr/share/bash-completion/completions/git ]]; then
  source /usr/share/bash-completion/completions/git
elif [[ -e /usr/local/etc/bash_completion.d/git-completion.bash ]]; then
  source /usr/local/etc/bash_completion.d/git-completion.bash
fi

if command_exists __git_complete; then
  __git_complete g _git
elif command_exists __git_wrap__git_main; then
  complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g
fi

0

আপনি যদি ব্যবহার করেন alias g='git'তবে আমি কোডের এই লাইনটি যুক্ত করব.bash_aliases

complete -o default -o nospace -F _git g
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.