क्या बाश टैब-पूर्ण स्क्रिप्ट का उपयोग zsh में किया जा सकता है?


87

मेरे पास Apache's Hadoop की बैश टैब-पूर्ण स्क्रिप्ट है। आम तौर पर, मैं अपने दिन-प्रतिदिन के खोल के रूप में zsh का उपयोग करता हूं। जब मुझे इसकी आवश्यकता होती है, तो यह बहुत ही हरा-भरा हो जाता है, लेकिन ऐसा लगता है कि टैब पूरा करने वाले सिस्टम उनके बीच मौलिक रूप से भिन्न हैं। क्या zash में काम करने के लिए मौजूदा बैश-टैब-पूर्ण परिभाषाओं को "परिवर्तित" करने का एक सरल तरीका है? मैं इसमें एक टन भी निवेश नहीं करना चाहता, लेकिन अगर यह आसान है तो मैं मध्यम मात्रा में प्रयास करूंगा।

जवाबों:


39

से यह पेज (2010/01/05 दिनांकित):

Zsh काम को पूरा कर सकते हैं। Zsh के लेटेस्ट डेवलपमेंट वर्जन में एक फंक्शन bashcompinit है, जो रन होने पर zsh को बैश कम्प्लीशन स्पेसिफिकेशन्स और फंक्शन को पढ़ने की अनुमति देगा। यह zshcompsys मैन पेज में प्रलेखित है। इसका उपयोग करने के लिए आपको सभी कंपैशिट के बाद किसी भी समय bashcompinit चलाना होगा। यह बाश बिल्डिंस के अनुरूप पूर्ण और कम्पेन कार्यों को परिभाषित करेगा।


अच्छी खबर: मुझे लगता है कि यह काम करना चाहिए, इसलिए बहुत धन्यवाद। बुरी खबर: किसी कारण से, मैं जिस सिस्टम को पूरा करने की कोशिश कर रहा हूं, वह एसएसएच के माध्यम से लॉग इन करने पर लोड / आदि / zshrc नहीं लगता है। मुझे यह बताने के लिए लॉगिन प्रक्रिया के बारे में पर्याप्त नहीं पता है कि ऐसा क्यों है। शायद एक और सवाल पूछने का समय ...
कोडर

1
@ कोडर: सबसे पहले, आप "/ etc / zshrc" कहते हैं। मेरे सिस्टम पर, यह है /etc/zsh/zshrc। इसके अलावा, उलटे क्रम (क्रम में वे zsh स्टार्टअप के दौरान sourced रहे हैं में सूचीबद्ध) में निम्न फ़ाइलों की जाँच करें: /etc/zsh/zshenv, $ZDOTDIR/.zshenv, /etc/zsh/zprofileऔर $ZDOTDIR/.zprofile(शायद ~/.zprofile) देखने के लिए RCSचर सेट नहीं की जाती। यदि ऐसा है, तो यह उस फ़ाइल के बाद आने वाली फ़ाइलों को रोक देगा जिसमें यह खट्टा होने से परेशान है। अंत में, उपयोगकर्ता के लिए शेल की जाँच करें /etc/passwdऔर यह सुनिश्चित करें कि यह zshसुनिश्चित करें कि इसमें कोई -fतर्क नहीं है ।
अगली सूचना तक रोक दिया गया।

सभी प्रतिक्रिया के लिए धन्यवाद - मैंने # 1 क्लासिक प्रोग्रामर हैक, "स्टडआउट डीबगिंग" (प्रत्येक स्टार्टअप स्क्रिप्ट में इको स्टेटमेंट) का सहारा लिया और इस मुद्दे को पाया। किसी कारण के लिए, हमारी / etc / zprofile विभिन्न /etc/profile.d स्क्रिप्ट है, जो तब sourced हो रहे थे सोर्सिंग गया था फिर में / etc / zshrc। बस / etc / zprofile के शीर्ष पर autoload स्टेटमेंट को ले जाने से समस्या ठीक हो गई।
कोडर जूल

157
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file

10
यह बेहतर उत्तर है क्योंकि यह आपको बताता है कि कैसे bashcompinit का उपयोग करें। अच्छी नौकरी।
प्योरस्पेड

5
धन्यवाद, महान जवाब, दुर्भाग्य से यह काम नहीं करता है अगर स्क्रिप्ट _init_completion bash कमांड का उपयोग करता है।
एफटी

6
यह मेरे लिए काम नहीं किया। मुझे अभी भी complete:13: command not found: compdefत्रुटि हो रही थी।
जतिन कुमार

यदि यह काम नहीं करता है, तो स्क्रिप्ट की जाँच करें (doh :)) - इसमें if is-bashसबसे ऊपर एक चेक हो सकता है ।
olejorgenb

यह कुछ लिपियों के लिए काम नहीं करता है _get_comp_words_by_refजिनके उपयोग से परिभाषित नहीं किया जाता है bashcompinit। अधिकांश कार्य हालांकि इस फ़ंक्शन का उपयोग नहीं करते हैं।
फ्रैंकलिन यू

39
autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
source /path/to/your/bash_completion_script

मैं बिना किसी ~ / .shshrc के zsh चला रहा हूंzsh 5.0.2 (x86_64-apple-darwin13.0) और ऊपर के सीक्वेंस ने एक ताज़ा स्पशेड zsh शेल में काम किया है।

संकेत के लिए git-complete.bash स्क्रिप्ट के लिए धन्यवाद: D


उपरोक्त 3 पंक्तियों के बारे में अधिक जानकारी के लिए पढ़ें:

बैश में बिल्ट ऑटो सपोर्ट का कमाल है, लेकिन बैश ऑटोकॉम्पलीट स्क्रिप्ट्स सीधे zsh काम नहीं करती हैं क्योंकि zsh एनवायरनमेंट में आवश्यक बैश ऑटोकॉम्पल हेल्पर फंक्शन नहीं होते हैं compgen, जैसेcomplete । यह ऐसा करने के प्रयास में zsh सत्र उपवास रखने के लिए।

इन दिनों zsh को उपयुक्त पूर्ण स्क्रिप्ट जैसे compinitऔर के साथ भेज दिया जाता हैbashcompinit जिनके पास bash स्वतः पूर्ण लिपियों का समर्थन करने के लिए आवश्यक कार्य होते हैं।

autoload <func_name>: ध्यान दें कि ऑटोलैड को zsh में परिभाषित किया गया है और बैश नहीं। autoloadनिर्देशिका पथों में नामित फ़ाइल के लिए fpathकमांड द्वारा लौटाया जाता है और जब इसे पहली बार लाया जाता है तो इसे लोड करने के लिए एक फ़ंक्शन को चिह्नित करता है।

  • -U: कंपिनिट या बैशंपिनिट जैसे फंक्शन को लोड करते समय किसी भी एलियास को इग्नोर करें
  • + X: नामांकित फाउड को अभी लोड करें और इसे निष्पादित न करें

अपने सिस्टम पर उदाहरण के लिए echo $fpathरिटर्न /usr/share/zsh/site-functionsऔर /usr/share/zsh/5.0.5/functionsऔर दोनों compinitऔर bashcompinitपर उपलब्ध हैं /usr/share/zsh/5.0.5/functions

इसके अलावा अधिकांश लोगों के लिए केवल autoload -U +X bashcompinit && bashcompinitआवश्यक हो सकता है क्योंकि कुछ अन्य स्क्रिप्ट जैसे git स्वतः पूर्ण या अपने स्वयं के ~/.zshrcहो सकते हैं autoload -U +X compinit && compinit, लेकिन यह केवल उन दोनों को चलाने के लिए सुरक्षित है।


क्या -Uऔर किस +Xलिए हैं?
jmk

अधिक विवरण के साथ अद्यतित उत्तर।
जतिन कुमार

6
यह अभी भी थोड़ा समझ में आता है; मैनपेज का वर्णन +X fooउसी ऑटो-लोडिंग को करने के रूप में किया गया fooहै, जो केवल चालान करता है, लेकिन तुरंत इसे क्रियान्वित किए बिना ... इसलिए autoload +X foo && fooपूरी तरह से बेमानी लगता है। क्या आप बता सकते हैं कि आपने इस पैटर्न को क्यों चुना?
ELLIOTTCABLE

2
@ELLIOTTCABLE करने का बिंदु यह autoload -U +X bashcompinit && bashcompinitहै कि (के कारण &&) यह bashcompinitIFF को निष्पादित करेगा मॉड्यूल वास्तव में पाया जाता है। सामान्य autoload fooहमेशा सच लौटाता है। बाद में, जब आप चलाने की कोशिश करते हैं foo, तो zsh अंत में आपको "फ़ंक्शन परिभाषा फ़ाइल नहीं मिली" बताता है। autoload +Xआप के साथ त्रुटि तुरंत मिलता है।
FeRD

1
मैन पेज अभी भी उस बिंदु पर कुछ अस्पष्ट है, यह मुझे प्रतीत होता है: autoload +Xइसे निष्पादित किए बिना फ़ंक्शन को लोड करता है - जो कि इससे अधिक autoloadहै, बिना +X। बिना +X, ऑटोलॉड फंक्शन को लोड नहीं करता है; यह केवल बाद में लोड किए जाने वाले फ़ंक्शन को संदर्भित करने के रूप में नाम को चिह्नित करता है। वास्तविक लोडिंग का प्रयास तब तक नहीं किया जाता है जब तक कि फ़ंक्शन को पहले ही लागू नहीं किया जाता है। यदि आप यह निर्धारित करना चाहते हैं कि नामित फ़ंक्शन सफलतापूर्वक लोड होता है, तो आपको +Xलोडिंग चरण को तुरंत निष्पादित करने के लिए उपयोग करने की आवश्यकता है ।
22

4

zshउपयोग के लिए:

  • compdef
  • compadd

मेरा उदाहरण:

# bash completion for bxrun (/home/ecuomo/projects/bashx/bxrun)
_bxrun_methods() {
    grep "^\s*\(function\s\+\)\?__.\+()\s*{.*$" "${1}" | while read line ; do
        echo "$line" | sed "s/()\s*{.*//g" | sed "s/\s*\(function\s\+\)\?__//g"
    done
}
_bxrun_lst() {
    if [ -d "/home/ecuomo/projects/bashx/src/actions" ]; then
        for f in /home/ecuomo/projects/bashx/src/actions/* ; do
            if [ -f "${f}" ]; then
                basename "${f}" | sed 's/\..*$//g'
            fi
        done
    fi
    _bxrun_methods "/home/ecuomo/projects/bashx/bxrun"
    _bxrun_methods "/home/ecuomo/projects/bashx/src/bashx.sh"
}
_bxrun() {
    local cur
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $( compgen -W '$( _bxrun_lst )' -- $cur  ) )
}
_bxrun_zsh() {
    compadd `_bxrun_lst`
}
if type complete >/dev/null 2>/dev/null; then
    # bash
    complete -F _bxrun bxrun
else if type compdef >/dev/null 2>/dev/null; then
    # zsh
    compdef _bxrun_zsh bxrun
fi; fi

स्रोत: मेरा कोड https://github.com/reduardo7/bashx


1
आपको यह बताना चाहिए कि आप लिंक किए गए बैशक्स ढांचे के लेखक हैं।
बेन

4

मैं चला रहा हूँ एंटीजन एक ओह-मेरी-Zsh प्लगइन प्रबंधक के रूप में। मेरे पास सहकर्मियों द्वारा लिखी गई कुछ बैश पूर्ण स्क्रिप्ट थीं जिन्हें मैं एक साधारण के साथ Zsh में लोड करना चाहता थाsource /path/to/completion

मुझे थोड़ी परेशानी हुई, क्योंकि ऐसा लगता है जैसे एंटीजन या ओएमजेड (बताने के लिए कठिन) केवल अपने प्लगइन्स से पूरा होने वाले स्क्रिप्ट को लोड करने के साथ चिंता करते हैं। मैं आखिरकार ऑटोलोदिंग bashcompinit और compinit उसके बाद इसके आसपास हो गया antigen apply। बस ऑटोलोदिंग bashcompinitपर्याप्त नहीं था।

source ~/.antigen/antigen.zsh
antigen use oh-my-zsh
antigen apply

autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit

source /path/to/bash_completion

एंटीजन अपनी .zcompdumpफ़ाइल बनाता है $ANTIGEN_COMPDUMPजिस पर मेरे लिए था~/.antigen/.zcompdump

Compinit और bashcompinit का पुन: आह्वान एक दूसरा .zcompdump पर बनाता है $HOME/.zcompdump

ऐसा लगता है कि सभी काम करने के लिए, क्योंकि मैं द्वारा निर्धारित पूर्णताओं का उपयोग करने में सक्षम हूं /path/to/bash_completion। मैंने दोनों .zcompdump फ़ाइलों को हटा दिया है यह सुनिश्चित करने के लिए कि उन्हें फिर से बनाने और काम करने के लिए कुछ समय मिल गया है।

मैं एक मशीन रिबूट के बाद कुछ बार .zcompdump फ़ाइलों को rm करना पड़ा है क्योंकि त्रुटियों को पूरा करने के लिए जब टैब को पूरा करने की कोशिश की जाती है, लेकिन मैं अनिश्चित हूं अगर यह इस सेट अप या कुछ और के कारण है। rm ~/.zcompdump && rm $ANTIGEN_COMPDUMPऔर एक नया खोल मेरे लिए ठीक करता है।

लेखन के समय उपयोग किए जाने वाले संस्करण:

Antigen = v2.2.3 = d3d4ee0
Oh-my-zsh = c3b072e
Zsh = 5.3

0

@ जतिनकुमार का जवाब मुझे सही रास्ते पर मिला, लेकिन मुझे completeइसके बजाय उपयोग करना था source। तो सभी एक साथ:

autoload -Uz compinit && compinit
autoload -U +X bashcompinit && bashcompinit

complete -C /usr/local/bin/terraform terraform
complete -C /usr/local/aws/bin/aws_completer aws
complete -C /usr/local/bin/az az
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.