كم عدد الطرق التي يمكنني من خلالها إكمال الاسم المستعار لـ Bash على سلسلة فرعية جزئية؟
-
21-08-2019 - |
سؤال
سؤال: عندي سؤال وهو يبدو أنه لم يتم الرد عليه من خلال سؤال إكمال Bash الذي تم طرحه بالفعل على تجاوز سعة المكدس.السؤال هو، كيفية الحصول على إكمال الاسم المستعار Bash (لأي اسم مستعار) على سلسلة فرعية جزئية.
مثال:على سبيل المثال، لنفترض أن لدي الأسماء المستعارة التالية:
open.alicehome="cd /usr/home/alice"
open.bakerhome="cd /usr/home/baker"
open.charliehome="cd /usr/home/charlie"
gohomenow="shutdown -now"
أود أن أكتب بتكاسل "baker{{TAB}}" لاستدعاء الاسم المستعار الثاني.
أود أن أكتب بتكاسل "home{{TAB}}" للحصول على قائمة بجميع الأسماء المستعارة المذكورة أعلاه والتي يمكنني بعد ذلك الاختيار من بينها باستخدام لوحة المفاتيح (الأمثل) أو الاختيار عن طريق كتابة سلسلة فرعية لا لبس فيها تميز بين الخيارات الثلاثة (أقل من الأمثل).
..أو ..
أود أن أكتب بتكاسل "الصفحة الرئيسية" ثم اضغط بشكل متكرر على {{TAB}} حتى يظهر الاسم المستعار المحدد الذي أريده، ثم اضغط على {{ENTER}} لتنفيذه.
كن حرا للابتكار:إذا كانت لديك طريقة للقيام بذلك، حتى لو كانت تتطلب اللجوء إلى قرصنة المعلم المتطرفة، فلا تتردد في مشاركتها ولا تتردد في شرح قرصنة المعلم الخاصة بك إلى مستوى طفل يبلغ من العمر خمس سنوات والذي سيتعين عليه محاولة التنفيذ فكرتك لنفسه.
نرحب بالارتباطات بصفحات الويب الحالية أو RTFMs.
المحلول
يمكنك إنشاء المطابقات لسلسلة فرعية محددة باستخدام compgen -c -X'!*substring*'
لتضمين هذا في الإكمال التلقائي لـ bash، يمكنك إنشاء ملف .bash_completion في دليلك الرئيسي الذي يحتوي على شيء مثل هذا:
_comp() {
local cur
cur=${COMP_WORDS[$COMP_CWORD]}
COMPREPLY=( $( compgen -c -X '!*'$cur'*' ) )
}
complete -F _comp $nospace eval
سيتم تشغيل وظيفة المطابقة هذه عند الضغط <TAB>
على الحجج ل eval
يأمر.لم أجد طريقة لتضمين وظيفة مطابقة جديدة للبحث عن الأمر الأول في bash، لقد وجدت فقط وثائق حول كيفية إضافة إكمالات مخصصة لأمر معين، مثل eval
فوق.
لكنني متشكك قليلاً في مدى فائدة هذا ...لا توجد طريقة سهلة لتحديد المطابقة التي تريدها من القائمة.
نصائح أخرى
إذا كنت تريد التغيير حقاً bash
سلوك علامة التبويب،
# ~/.inputrc
# The default binding for [Tab] is ``complete'', which is what we're used to.
# ``menu-complete'' gives you irssi-like behavior: cycle through completions.
"\t": menu-complete
وقد تم توثيق ذلك في مكتبة GNU Readline # السماح بكتابة خط القراءة نيابةً عنك.
ربما يمكنك تحقيق ما تريد باستخدام إعدادات bash_completion المخصصة، لكنني لن أقوم بهذه المهمة نيابةً عنك، حسنًا؟:-)
إذا كنت لا تعرف ما أتحدث عنه، انظر هنا و هنا للتفاصيل.بالمناسبة، سأجد هذا الأمر مزعجًا جدًا
أرغب في اكتب فقط "الصفحة الرئيسية" ، ثم اضغط مرارًا وتكرارًا على {tab}} حتى يظهر الاسم المستعار المحدد الذي أريده ، ثم اضغط {{enter}} لتنفيذه.
الذي أعتقد أنه نمط M$ لـ "الإكمال" (هل أنت قادم لبيئة DOS/windows؟)