without هل يمكن استخدام برنامج نصي لإكمال علامة التبويب Bash في zsh؟




zsh default without chsh (5)

أنا على التوالي Antigen باعتباره مدير المساعد يا My-Zsh. كان لدي بعض مخطوطات إكمال البكالوريا التي كتبها زملاء العمل التي أردت تحميلها في Zsh source /path/to/completion بسيط source /path/to/completion .

لقد واجهت بعض المشاكل ، لأنه يبدو أن Antigen أو OMZ (من الصعب معرفة ذلك) يهتمون فقط باستخدام البرامج النصية لاستكمال التحميل من المكونات الإضافية الخاصة بهم. أنا حصلت أخيرا حول هذا عن طريق autoloading bashcompinit و compinit بعد antigen apply . ببساطة bashcompinit autoloading لم يكن كافيا.

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

ينشئ Antigen ملف .zcompdump الخاص به في $ANTIGEN_COMPDUMP الذي كان بالنسبة لي ~/.antigen/.zcompdump

إعادة استدعاء compinit و bashcompinit إنشاء .zcompdump الثانية في $HOME/.zcompdump

يبدو أن هذا كله /path/to/bash_completion ، لأنني قادر على استخدام الإكمالات التي تم إعدادها بواسطة /path/to/bash_completion . لقد قمت بحذف ملفي .zcompdump عدة مرات للتأكد من أنهما تم تجديدهما ويبدو أنهما يعملان.

لقد اضطررت إلى إعادة تشغيل ملفات .zcompdump عدة مرات بعد إعادة تشغيل الجهاز بسبب أخطاء تم إلقائها عند محاولة إكمال علامة التبويب ، لكنني غير متأكد إذا كان هذا بسبب إعداد أو شيء آخر. rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP وقذيفة جديدة تقوم بإصلاح ذلك بالنسبة لي.

الإصدارات المستخدمة في وقت الكتابة:

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

https://code.i-harness.com

لدي برنامج نصي لإكمال علامة التبويب Bash لـ Hadoop من Apache. عادةً ما أستخدم zsh كصدفة يومي. تميل إلى أن تكون شبيهة بالباش عندما أكون بحاجة إلى ذلك ، ولكن يبدو أن أنظمة إكمال علامات التبويب تختلف جذريًا فيما بينها. هل هناك طريقة بسيطة "لتحويل" تعريفات bash-tab الموجودة بالفعل للعمل في zsh؟ لا أريد أن أستثمر الكثير من الوقت في هذا ، ولكن إذا كان من السهل عليّ أن أنقذ قدراً معتدلاً من الجهد.


لاستخدام 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


من هذه الصفحة (بتاريخ 2010/01/05):

يمكن معالجة Zsh وظائف الإكمال bash. أحدث إصدار تطوير zsh يحتوي على bashcompinit وظيفة ، أنه عند تشغيل سيسمح zsh لقراءة مواصفات bash اكتمال ووظائف. هذا موثق في صفحة رجل zshcompsys. لاستخدام كل ما عليك القيام به هو تشغيل bashcompinit في أي وقت بعد compinit. وسوف تحدد وظائف كاملة و compgen المقابلة لبين باينز.


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

أنا أقوم بتشغيل zsh zsh 5.0.2 (x86_64-apple-darwin13.0) دون أي ~ / .zshrc والتسلسل أعلاه عملت في قذيفة zsh انتجت طازجة.

بفضل برنامج git-completion.bash النصي للتلميح: D

قراءة لمزيد من التفاصيل حول خطوط 3 أعلاه:

يتمتع Bash بروعة في دعم الإكمال التلقائي المدمج ولكن لا تعمل البرامج النصية autocomplete authomts مباشرة مع zsh لأن بيئة zsh لا تحتوي على وظائف المساعد الأساسية autocomplete compgen مثل compgen ، complete . يفعل ذلك في محاولة للحفاظ على جلسة zsh بسرعة.

يتم شحن zsh هذه الأيام بنصوص إكمال مناسبة مثل compinit و bashcompinit اللذان bashcompinit على الوظائف المطلوبة لدعم نصوص bash autocomplete.

autoload <func_name> : لاحظ أنه تم تعريف autoload في zsh وليس bash. يبحث autoload عن ملف مسمى في مسارات الدليل التي يتم إرجاعها بواسطة الأمر fpath علامة دالة لتحميلها عند استدعائها لأول مرة.

  • -U: تجاهل أي أسماء مستعارة عند تحميل دالة مثل compinit أو bashcompinit
  • + X: ما عليك سوى تحميل الدالة المسماة fow الآن وعدم تنفيذها

على سبيل المثال ، في 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 مطلوب autoload -U +X bashcompinit && bashcompinit لأن بعض البرامج النصية الأخرى مثل الإكمال autoload -U +X compinit && compinit git أو الخاصة بهم ~/.zshrc قد يكون autoload -U +X compinit && compinit ، ولكن من الآمن فقط تشغيل كلا منهم.


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






tab-completion