سؤال سطر الأوامر الانتهاء من الحجج من المجلد


هل من الممكن إنشاء قائمة من الإكمالات لأمر يستند إلى بعض ملفات المجلد؟

قل أرغب في تشغيل Sublime Text 2 على أحد مشروعاتي ، والتي يتم حفظها كـ ~/sublime_projects/*.sublime-project. السلوك المرغوب:

 subl<tab><tab>
   foo bar project2

في حال وجودها foo.sublime-project, bar.sublime-project, project2.sublime-project الملفات في ~/sublime_projects.


4
2017-08-24 09:06


الأصل




الأجوبة:


يمكنك استخدام وظيفة bash التالية وإضافتها إليك .bashrc

لاحظ مسار الدليل لمتغير PROJECTS_DIR

# bash completion for sublime projects in ~/projects
_subl()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    PROJECTS_DIR="/home/mreq/projects/"
    LOOK_FOR="*.sublime-project"
    cd ${PROJECTS_DIR}
    PROJECTS=$(ls ${LOOK_FOR})
    COMPREPLY=( $(compgen -W "${PROJECTS}" -- $cur) )
}
complete -F _subl subl

ماذا يفعل:

  • عندما تكتب subl TAB TAB TAB يسرد جميع المشاريع في دليل المشاريع

  • عندما تكتب subl ANY_LETTER TAB يكمل تلقائيا اسم المشروع إذا كان ANY_LETTER_TAB يتطابق مع أول شخصية للمشروع.

على سبيل المثال إذا كان لديك في الداخل ~/projects الأتى: test.sublime-project و foo.sublime-project واكتب subl t TAB في المحطة ستحصل subl test.sublime-project

تحديث النصي لا يغير PWD سأترك كلاهما للرجوع إليها في المستقبل.

# bash completion for sublime projects in ~/projects
_subl()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    PROJECTS_DIR="/home/mreq/projects/"
    LOOK_FOR=".sublime-project"
    # cd ${PROJECTS_DIR}
    PROJECTS=$(ls ${PROJECTS_DIR} | grep "^${cur}.*${LOOK_FOR}")
    COMPREPLY=${PROJECTS_DIR}${PROJECTS}
}
complete -F _subl subl

يبحث النص الثاني عن حرف مكتوب بعد subl ويستبدلها بالمسار الكامل لاسم الملف المتطابق. على سبيل المثال إذا كان هناك test.sublime-project في ~/projects عن طريق كتابة subl t سيتم استبداله subl /home/USERNAME/projects/test.sublime-project


4
2017-08-24 11:32



مذهلة ، بالضبط ما كنت أبحث عنه. شكر. - mreq
شيء واحد: هذا يغير الخاص بك $PWD إلى $PROJECTS_DIR. هل هناك طريقة للحفاظ على التيار الحالي؟ حاولت حفظه واستعادته بعد COMPREPLY مهمة ، ولكن هذا لم ينجح. - mreq
شكرا للتحرير! لسوء الحظ ، لا يعمل البرنامج النصي الثاني مع فارغ <tab> اكتمال المشاريع. باستخدام أول واحد - من الغريب ، أن الكتابة cd - بعد $PWD تم التغيير لم يعيدك إلى حيث كنت. - mreq
لن يعيدك ذلك لأن البرنامج النصي يعود. أما بالنسبة للبرنامج النصي الثاني ، فيمكنك تمريره إلى subl wildcard * و TAB لسرد المشاريع ولكن ليس بطريقة جيدة المظهر. شخصيا أنا أفضل السيناريو الأول. - Stef K