বাশ ট্যাব-সমাপ্তির স্ক্রিপ্টটি zsh এ ব্যবহার করা যেতে পারে?


87

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

উত্তর:


39

এই পৃষ্ঠা থেকে (তারিখ 2010/01/05):

Zsh বাশ সম্পূর্ণকরণের কার্যাদি পরিচালনা করতে পারে। Zsh এর সর্বশেষতম বিকাশের সংস্করণটিতে একটি ফাংশন বাশকম্পিনিটি রয়েছে, যা রান করার সময় zsh বাশ সম্পূর্ণ হওয়ার স্পেসিফিকেশন এবং ফাংশনগুলি পড়তে দেয়। এটি zshcompsys ম্যান পৃষ্ঠাতে নথিভুক্ত করা হয়েছে। এটি ব্যবহারের জন্য আপনাকে কমপিউনিটের পরে যে কোনও সময় বাশকম্পিনিটি চালাতে হবে। এটি ব্যাশ বিল্টিনগুলির সাথে সম্পর্কিত সম্পূর্ণ এবং কমপেজ ফাংশনগুলি সংজ্ঞায়িত করবে।


সুসংবাদ: আমি মনে করি এটি কাজ করা উচিত, তাই অনেক ধন্যবাদ। খারাপ খবর: কোন কারণে, যে সিস্টেমে আমি এটি সম্পাদন করার চেষ্টা করছি তা যখন আমি এসএসএইচ দিয়ে লগ ইন করব তখন / ইত্যাদি / zshrc লোড হবে না। আমি কেন লগইন প্রক্রিয়া সম্পর্কে যথেষ্ট তা জানি না কেন এটি কেস। অন্য সময় জিজ্ঞাসা করার সময় হতে পারে ...
কোডার

4
@ কোডার: প্রথমত, আপনি "/ etc / zshrc" বলবেন। আমার সিস্টেমে, এটি /etc/zsh/zshrc। এছাড়াও, বিপরীত ক্রম (ক্রম তারা zsh সূচনার সময় sourced হয় তালিকাভুক্ত) নিম্নলিখিত ফাইল চেক: /etc/zsh/zshenv, $ZDOTDIR/.zshenv, /etc/zsh/zprofileএবং $ZDOTDIR/.zprofile(সম্ভবত ~/.zprofile) কিনা তা দেখতে RCSপরিবর্তনশীল সেট করা থাকে না। যদি এটি হয় তবে এটি সেই ফাইলের পরে পরবর্তী ফাইলগুলিকে আটকাবে না যার মধ্যে এটি আনসেট করা হয়নি। অবশেষে, ব্যবহারকারীর জন্য শেলটি পরীক্ষা করুন /etc/passwdএবং এটি নিশ্চিত করুন zshএবং নিশ্চিত করুন যে এটির কোনও -fযুক্তি নেই।
ডেনিস উইলিয়ামসন

সমস্ত প্রতিক্রিয়ার জন্য ধন্যবাদ - আমি # 1 ক্লাসিক প্রোগ্রামার হ্যাক, "স্টাডআউট ডিবাগিং" (প্রতিটি স্টার্টআপ স্ক্রিপ্টে প্রতিধ্বনি বিবৃতি) অবলম্বন করে সমস্যাটি পেয়েছি। কোনও কারণে, আমাদের / ইত্যাদি / zprofile বিভিন্ন /etc/profile.d স্ক্রিপ্টগুলিতে সোর্সিং করছিল, যেগুলি আবার / etc / zshrc এ পুনরায় উত্স প্রাপ্ত হয়েছিল। কেবল অটোল্যাডের বিবৃতিগুলি / etc / zprofile এর শীর্ষে সরিয়ে নেওয়া সমস্যার সমাধান করে।
কোডার

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

10
এটি আরও ভাল উত্তর যেহেতু এটি আপনাকে কীভাবে ব্যাশকম্পিনিটি ব্যবহার করবেন তা বলে । চমৎকার কাজ.
পাইরোস্পেড

4
ধন্যবাদ, দুর্দান্ত উত্তর, দুর্ভাগ্যক্রমে স্ক্রিপ্টটি _init_completion bash কমান্ড ব্যবহার করলে এটি কাজ করে না।
0fnt

6
এটি আমার পক্ষে কাজ করে না। আমি তখনও complete:13: command not found: compdefত্রুটি পাচ্ছিলাম ।
যতীন কুমার

যদি এটি কাজ না করে তবে স্ক্রিপ্টটি পরীক্ষা করুন (দোহ :)) - এটি if is-bashশীর্ষে একটি চেক থাকতে পারে ।
ওলেজোরেনব

এটি কিছু স্ক্রিপ্ট ব্যবহার করে কাজ করে না _get_comp_words_by_refযা দ্বারা সংজ্ঞায়িত হয় না bashcompinit। যদিও বেশিরভাগ পরিপূর্ণতা এই ফাংশনটি ব্যবহার করে না।
ফ্র্যাংকলিন ইউ

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

আমি কোনও ~ / .zshrc ছাড়াই zsh zsh 5.0.2 (x86_64-apple-darwin13.0) চালাচ্ছি এবং উপরের সিকোয়েন্সটি সদ্য zsh শেলটিতে কাজ করেছে।

ইঙ্গিতটির জন্য গিট-সমাপ্তি.বাশ স্ক্রিপ্টকে ধন্যবাদ: ডি


উপরের 3 লাইনে আরও বিশদ জানতে পঠন করুন:

বিল্ট স্বয়ংক্রিয় সমাপ্তির সমর্থনে বাশের দুর্দান্ত কাজ রয়েছে তবে ব্যাশ স্বতঃসিদ্ধ স্ক্রিপ্টগুলি সরাসরি zsh কাজ করে না কারণ zsh পরিবেশের মতো প্রয়োজনীয় বাশ স্বতঃপূরণ সহায়ক ফাংশন নেই compgen,complete । এটি zsh সেশনটি দ্রুত রাখার প্রয়াসে এটি করে।

এই দিনগুলিতে zsh যথাযথ সমাপ্তি স্ক্রিপ্টগুলির সাথে প্রেরণ করা হয় compinitএবং bashcompinitযার সাথে ব্যাশ স্বতঃপূরণ স্ক্রিপ্টগুলি সমর্থন করার জন্য প্রয়োজনীয় ফাংশন রয়েছে।

autoload <func_name>: দ্রষ্টব্য যে অটোল্যাড zsh এ সংজ্ঞায়িত করা হয়েছে তবে বাশ নয়। কমান্ড autoloadদ্বারা ফিরে ডিরেক্টরি পাথের নামের একটি ফাইল সন্ধান করে fpathএবং এটি প্রথম অনুরোধ করা হলে একই লোড করার জন্য একটি ফাংশন চিহ্নিত করে।

  • -U: কমপিটি বা বাশকম্পিনিটির মতো কোনও ফাংশন লোড করার সময় কোনও উপকরণ উপেক্ষা করুন
  • + এক্স: কেবলমাত্র নামকৃত ফাংশনটি এখন লোড করুন এবং এটি সম্পাদন করবেন না

উদাহরণস্বরূপ আমার সিস্টেমে 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প্রয়োজন হতে পারে কারণ গিট স্বতঃসম্পূর্ণ বা তাদের নিজস্ব মতো কিছু অন্যান্য স্ক্রিপ্টও ~/.zshrcকরছে autoload -U +X compinit && compinitতবে এটি উভয়টি চালানো নিরাপদ।


কি -Uএবং কি +Xজন্য?
জেএমকে

আরও বিশদ সহ আপডেট উত্তর।
যতীন কুমার

6
এটি এখনও সামান্য অর্থ দেয়; ম্যানপেজটি অনুরোধ +X fooকরে একই অটো-লোডিংয়ের বিন্দুটিকে বর্ণনা করে fooতবে অবিলম্বে এটি সম্পাদন না করে ... তাই autoload +X foo && fooসম্পূর্ণ অপ্রয়োজনীয় বলে মনে হয়। আপনি কেন এই প্যাটার্নটি বেছে নিয়েছেন তা ব্যাখ্যা করতে পারেন?
এলিওটিটিসিএবল

4
@ এললিওটিটিসিএল করার বিষয়টি autoload -U +X bashcompinit && bashcompinitহ'ল (এর কারণে &&) এটি কার্যকর করবে bashcompinitআইএফএফের মডিউলটি আসলে পাওয়া গেল। সাধারণ autoload fooসর্বদা সত্য ফিরে আসে returns পরে, আপনি যখন চালানোর চেষ্টা করবেন foo, তখন zsh অবশেষে আপনাকে "ফাংশন সংজ্ঞা ফাইলটি পাওয়া যায় নি" বলে দেয়। সঙ্গে autoload +Xআপনি ত্রুটি অবিলম্বে পেতে।
এফআরডি

4
সেই পৃষ্ঠাটির পৃষ্ঠাটি এখনও কিছুটা অস্পষ্ট, এটি আমার কাছে মনে হয়: autoload +Xএটি কার্যকর না করেই ফাংশনটি লোড করে - যা তার চেয়ে বেশি autoload, ছাড়াই +X। ছাড়া +X, অটোল্যাড এমনকি ফাংশন লোড করে না ; এটি কেবল পরে লোড হওয়ার জন্য একটি ক্রিয়াকলাপটিকে রেফারেন্স হিসাবে নাম চিহ্নিত করে। ফাংশনটি প্রথম চালিত না হওয়া পর্যন্ত আসল লোডিংয়ের চেষ্টা করা হয় না। যদি আপনি নির্ধারণ করতে চান যে নামযুক্ত ফাংশনটি সফলভাবে লোড হচ্ছে কিনা , আপনার +Xতত্ক্ষণাত লোডিং পদক্ষেপটি সম্পাদন করতে হবে।
FeRD

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


4
আপনি প্রকাশ করা উচিত যে আপনি লিঙ্কযুক্ত বাশাক্স কাঠামোর লেখক।
বেন

4

আমি দৌরাচ্ছি ওহ-মাই-জেডএস প্লাগইন ম্যানেজার হিসাবে অ্যান্টিজেন । আমার সহকর্মীদের দ্বারা লিখিত কয়েকটি ব্যাশ সমাপ্তির স্ক্রিপ্ট ছিল যা আমি একটি সাধারণ সাথে 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

কমপিনেট এবং বাশকম্পিনিতের পুনরায় অনুরোধ একটি দ্বিতীয় .zcompdump এ তৈরি করে $HOME/.zcompdump

মনে হচ্ছে সকলের হয় না, কারণ আমি নির্ধারিত পরিপূর্ণতাগুলি ব্যবহার করতে সক্ষম/path/to/bash_completion । উভয় .zcompdump ফাইলগুলি পুনরায় জেনারেট হয়েছে এবং কাজ করছে বলে মনে হচ্ছে তা কয়েকবার মুছে ফেলেছি।

ট্যাব সম্পূর্ণ করার চেষ্টা করার সময় নষ্ট হওয়া ত্রুটির কারণে মেশিন পুনরায় বুট করার পরে আমাকে কয়েকবার .zcompdump ফাইলগুলি rm করতে হয়েছিল, তবে আমি নিশ্চিত না যে এটি সেট আপ বা অন্য কোনও কারণে হয়েছে to 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.