बैश उपनामों में स्वतः पूर्ण?


84

मैं के लिए goएक साधारण बैश उपनाम के रूप में उपयोग कर रहा हूं git checkout branchname। जो चीज मुझे याद आती है वह स्वतः पूर्ण विशेषता है जो पूर्ण git checkout branchna...आदेश के साथ काम करती है , लेकिन उपनाम में नहीं।

क्या बैश को एक अन्य कमांड के लिए ऑटोकॉम्पटेड "ड्राइवर" को "इनहेरिट" करने का निर्देश देने का एक तरीका है?


1
डुप्लिकेट के साथ: unix.stackexchange.com/questions/4219/…
अरनौद एफ।


संबंधित: यदि उपनाम किसी रिवाज को सेट करता है git-dirतो इसका उपयोग करें
user202729

जवाबों:


47

यदि आप मूल कमांड द्वारा उपयोग किए जाने वाले पूर्ण फ़ंक्शन का पता लगा सकते हैं, तो आप इसका उपयोग करके उपनाम के लिए असाइन कर सकते हैं complete -F

उदाहरण के लिए, मेरे ubuntu बॉक्स पर, उपयोग किया जाने git checkoutवाला पूरा कार्य _git_checkout(पाया जाता है /etc/bash_complete.d/git) है।

उदाहरण

दौड़ने से पहले complete -F:

[me@home]$ git checkout <TAB><TAB>
HEAD            master          origin/HEAD     origin/master

[me@home]$ alias go="git checkout"

[me@home]$$ go <TAB><TAB>
.git/                precommit_config.py  README.md            SvnSentinel/         
.gitignore           precommit.py         startcommit.py       tests/ 

उपरांत:

[me@home]$$ complete -F _git_checkout go

[me@home]$$ go <TAB><TAB>
HEAD            master          origin/HEAD     origin/master 

1
ubuntu 12.04 पर पूर्णताएं रहने लगती हैं: /etc/bash_completion.d/git और /etc/bash_complete.d/git
Maks

8
यदि complete -Fआप के लिए काम नहीं करता है, तो __git_completeनीचे stackoverflow.com/a/24665529/3779 के
स्टीव क्ले

100

उपयोग करने के बाद complete -F:

complete -F _git_checkout go

goपरिणाम के बाद टैबिंग :

bash: [: 1: unary operator expected

इसके बजाय complete, उपयोग करें__git_complete

यह इस उद्देश्य के लिए जीआईटी बैश पूरा होने का फंक्शन है।

अपना उपनाम घोषित करने के बाद, सही ऑटो-फंक्शन को उसमें बांधें:

alias g="git"
__git_complete g _git

alias go="git checkout"
__git_complete go _git_checkout

alias gp="git push"
__git_complete gp _git_push

4
@ LưuV LnhPhúc मैं एक ही मुद्दा रहा था। इसकी वजह यह थी कि __git_completeमेरे बैश-कम्पलीट पैकेज (होमब्रे विद थ्रू brew install bash-completion) में फंक्शन था, जो कि फिलहाल मेरे बैश प्रोफाइल में मौजूद नहीं था। इस लाइन को ~ / [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
.bash_profile में

1
git checkoutउपनाम के तहत __git_complete जोड़ना आकर्षण की तरह काम किया !!!
राजारामन

2
यह होना चाहिए __git_main, नहीं _git। कारण _gitमौजूद है केवल पश्चगामी संगतता के लिए, यह मूल रूप से __git_mainलिपटा हुआ है।
फेलिपक

19

उबंटू 18.04 (बायोनिक) पर निम्न कार्य करता है। इस स्निपेट (अपने उपनाम के साथ) को अपनी पसंदीदा बैश कॉन्फ़िगरेशन फ़ाइल जैसे .bashrc, में जोड़ें .bash_aliases .bash_profile

# define aliases
alias gc='git checkout'
alias gp='git pull'

# setup autocompletion
if [ -f "/usr/share/bash-completion/completions/git" ]; then
  source /usr/share/bash-completion/completions/git
  __git_complete gc _git_checkout
  __git_complete gp _git_pull
else
  echo "Error loading git completions"
fi

सामान्य तौर पर __git_completeनिर्देश का प्रारूप निम्नलिखित है:

__git_complete <YOUR ALIAS> _git_<GIT COMMAND NAME>

यह एकल अप-टू-डेट उत्तर में मौजूदा उत्तरों से ज्ञान को जोड़ती है, आप सभी का धन्यवाद।


मैं केवल ssh / टर्मिनल सत्र के लिए इसे जोड़ना चाहूंगा, सब कुछ .bashrc में डालूंगा। मेरे पास .bash_profile और .bashrc में उपनामों का पूरा सामान था और इसे काम नहीं कर सका। यह तब तक नहीं था जब तक कि मैंने echo "profile"/ एक जोड़ा नहीं था echo "rc"कि मुझे लगा कि एक बाहर।
mtonc

18

Ubuntu 16.04.3 LTS में, मुझे जिस स्रोत की आवश्यकता थी वह फ़ाइल थी /usr/share/bash-completion/completions/git। तो .bash_custom(या .bashrc, जो भी हो):

[ -f /usr/share/bash-completion/completions/git ] && . /usr/share/bash-completion/completions/git
__git_complete g __git_main

1
मैनुअल लोडिंग की आवश्यकता का कारण यह है कि वर्तमान में बैश उन फाइलों को गतिशील रूप से लोड करता है। अब तक यह उनके नाम के अनुसार उन्हें लोड करता है। फ़ाइल को तब तक लोड नहीं किया जाएगा, जब तक कि आप एक Git पूर्णता को नहीं मार देते, जो कि .bashrcपढ़ने में बहुत देर हो चुकी होती है ।
फ्रैंकलिन यू

2

अन्य उत्कृष्ट उत्तरों को जोड़ने के लिए: आम तौर पर आपके पास बहुत सारे उपनाम हैं और उन सभी के लिए मैन्युअल रूप से अग्रेषित करने के लिए थकाऊ हो सकता है। यहां स्वचालित रूप से ऐसा करने के लिए एक छोटी सी चाल है:

if [ -f "/usr/share/bash-completion/completions/git" ]; then
  # Enable Git completions for aliases
  . /usr/share/bash-completion/completions/git
  for a in $(alias | sed -n 's/^alias \(g[^=]*\)=.git .*/\1/p'); do
    c=$(alias $a | sed 's/^[^=]*=.git \([a-z0-9\-]\+\).*/\1/' | tr '-' '_')
    if set | grep -q "^_git_$c *()"; then
      eval "__git_complete $a _git_$c"
    fi
  done
fi

1

लिनक्स मिंट पर, यह मेरे लिए काम नहीं किया। मुझे मिल रहा था bash: [: 1: unary operator expected

मैंने पाया कि निम्न प्रतिक्रिया ने बहुत अच्छा काम किया - समस्या निवारण अनुभाग के साथ उपयोगकर्ता को काफी मददगार बनाया गया। /superuser/436314/how-can-i-get-bash-to-perform-tab-completion-for-my-aliases


1

के लिए macOS, बैश पूर्णता स्थापित करने के लिए निम्नलिखित चलाएँ

 brew install bash-completion

फिर निम्नलिखित जोड़ें

[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh" 

अपने .bashrc या .bash_profile पर


1

उबंटू 20.04 पर मैं इसे जोड़ता हूं ~/.bashrc

source /usr/share/bash-completion/completions/git
alias g='git'
__git_complete g _git
alias go='git checkout'
__git_complete go _git_checkout

1

जैसा कि किसी और ने उत्तर दिया कि आपको उपयोग करना चाहिए __git_complete, अन्यथा स्क्रिप्ट विफल हो जाएगी।

alias g="git"
__git_complete g __git_main

alias g="gl"
__git_complete gl _git_log

लेकिन आपको _gitमुख्य कमांड के लिए उपयोग नहीं करना चाहिए , यह है __git_main

दुर्भाग्य से पूरा होने के बारे में बहुत सारी जानकारी छिपी हुई है, लेकिन आप मेरे कांटे के README पर अधिक जानकारी प्राप्त कर सकते हैं: गिट-पूरा करना


0

मुझे लगता है कि आप विशेष रूप से बैश उपनामों के बारे में पूछ रहे हैं, लेकिन उन लोगों के लिए जो जटिल गिट एलियंस के लिए बैश में स्वत: पूर्ण की तलाश में हैं, यहां देखें ।

विशेष रूप से:

# If you use complex aliases of form '!f() { ... }; f', you can use the null
# command ':' as the first command in the function body to declare the desired
# completion style.  For example '!f() { : git commit ; ... }; f' will
# tell the completion to use commit completion.  This also works with aliases
# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.