Jannah Theme License is not validated, Go to the theme options page to validate the license, You need a single license for each domain name.

كيف تجعل Terminal يكمل أوامر تطبيقات سطر الأوامر تلقائيًا

كيفية إضافة ميزة إكمال Terminal إلى تطبيقات سطر الأوامر

كتابة الأوامر يدويًا في Terminal قد تكون متعبة خاصة مع التطبيقات التي تعتمد على سطر الأوامر وتحتاج إلى خيارات متعددة. الأخطاء البسيطة في الكتابة تعطل العملية وتبطئ سير العمل. هنا يأتي دور ميزة إكمال الأوامر التلقائي التي توفر وقتك وتقلل من الأخطاء. تفعيل هذه الميزة يتيح لك تنفيذ الأوامر بسرعة أكبر، حيث يقترح Terminal الخيارات المتاحة ويكملها نيابة عنك بمجرد ضغط زر واحد.

terminal-window-showing-the-manual-page-for-the-mutt-email-client-on-linux كيف تجعل Terminal يكمل أوامر تطبيقات سطر الأوامر تلقائيًا

يُعد الإكمال التلقائي طريقة رائعة لجعل أدواتك الخاصة أكثر سهولة في الوصول. اكتشف كيفية اتخاذ الخطوات الأولى من خلال إنشاء نص برمجي بسيط للإكمال التلقائي في Bash وzsh.

كيف يعمل الإكمال التلقائي لعلامات التبويب

قد يبدو الإكمال التلقائي – الموجود في كل مكان، من تطبيقات الرسائل النصية إلى بيئات التطوير المتكاملة – ابتكارًا حديثًا نسبيًا، ولكنه موجود في مختلف أنظمة يونكس منذ أوائل الثمانينيات، إن لم يكن قبل ذلك. تدعم واجهات لينكس، مثل bash وzsh، نظامًا إكمالًا أقوى مما تتوقع.

غالبًا ما تستخدم الإكمال التلقائي لعلامات التبويب مع الأوامر وأسماء الملفات. يعمل الإكمال التلقائي لعلامات التبويب من خلال فحص متغير بيئة PATH لتحديد الأوامر المتاحة التي تبدأ بالأحرف التي كتبتها. يوفر الإكمال التلقائي لأسماء الملفات بقية مسار الملف (مطلق أو نسبي) ويساعدك على تضييق خياراتك، وحل أي غموض أثناء الكتابة. كلاهما يوفر عليك الكثير من الوقت والكتابة اليدوية.

ولكن هناك نوع ثالث من الإكمال، ربما أقل شيوعًا، ولكنه ربما أقوى من الأنواع الأكثر شيوعًا. ينطبق الإكمال التلقائي للوسيطات على كل ما يلي اسم الأمر، مثل الخيارات أو الأوامر الفرعية.

linux-git-check-tab-complete كيف تجعل Terminal يكمل أوامر تطبيقات سطر الأوامر تلقائيًا

كيفية إضافة إكمال إلى نصوصك البرمجية

سأشرح أولاً كيفية إضافة إكمال مخصص لـ zsh، ثم أصف ما يعادله في bash.

مثال على أمر

سأشرح إكمال وسيطة أمر مخصص باستخدام نص برمجي بسيط أستخدمه لإدارة قائمة مهامي. النص الكامل ليس معقدًا جدًا، لكن هذا المقتطف يركز على الأجزاء الأكثر أهمية:

#!/usr/bin/env zsh

FILE="$HOME/.local/state/todos/data"

if [ "$#" -eq "1" ] && [ "$1" = "edit" ] ; then
    "${EDITOR:-vi}" "$FILE"
elif [ "$#" -eq "1" ] && [ "$1" = "help" ] ; then
    echo "Usage: $(basename $0) [ edit | help ]"
else
    <"$FILE" grep -v ^~
fi

لقد حفظتُ هذا النص البرمجي في ملف باسم todos، لذا تعمل الأوامر التالية الآن على نظامي:

  • todos: إخراج محتويات ملف البيانات، مع تجاهل الأسطر التي تبدأ بـ ~
  • todos help: إظهار الاستخدام
  • todos edit: فتح ملف البيانات في المحرر
اقرأ أيضا:  اختصارات لوحة المفاتيح Zathura

هذا أمرٌ بسيط، مع أن النص البرمجي الكامل يقوم ببعض العمل الإضافي للحفاظ على ملف JSON منفصل عند التحرير. ليس لديّ صفحة دليل لهذا النص البرمجي البسيط، والأمر الفرعي help مفيد، لكنني أرغب في إضافة إكمال الوسيطات حتى أتمكن من اكتشاف الأمر الفرعي edit أو الأوامر الفرعية الأخرى التي قد أضيفها مستقبلًا.

نصيحة
لا تُهم وظيفة todos في هذا العرض التوضيحي. يمكنك إنشاء نص برمجي فارغ بهذا الاسم، وطالما أنه قابل للتنفيذ وفي مسارك PATH، فستعمل اقتراحات الإكمال التلقائي.

نص برمجي للإكمال المُخصّص

يحتاج نص الإكمال التلقائي إلى أمرين: إعداد نظام الإكمال لأوامرك باستخدام الهيكل المُدمج، وإنشاء عمليات إكمال مُحتملة.

في zsh، أبسط عملية إكمال بسيطة للغاية:

_complete_todos() {
    compadd help edit
}

autoload -Uz compinit
compinit
compdef _complete_todos todos

دالة _complete_todos هي مُعالِج يستدعي دالة compadd لتحديد الاقتراحات. تنتمي دالة compadd إلى وحدة compinit في Zsh. كل كلمة تُمررها كمُعامل إلى compadd تُمثل إكمالًا مُحتملًا. بالنسبة لنص برمجي بسيط كهذا المثال، يُمكنك ترميز هذه الدالة بشكل ثابت باستخدام استدعاء ثابت لدالة compadd.

بعد تعريف الدالة، يُحمّل النص البرمجي ويُشغّل وحدة compinit قبل استدعاء compdef لربط دالة _complete_todos بالأمر todos.

يمكنك وضع النص البرمجي أعلاه في ملف .zshrc، أو أي ملف آخر مصدره. كما يُمكنك استخدام نظام fpath في zsh لتخزينه في ملف يبدأ بشرطة سفلية، في مجلد مُناسب.

اقرأ أيضا:  اختياري لنظام Linux كأفضل بيئة لجهاز الكمبيوتر الأول لأطفالي

للتطوير والاختبار، يُمكنك ببساطة تشغيل الكود أعلاه مُباشرةً على سطر الأوامر. بعد الانتهاء، جرّب كتابة todos وجرّب سلوك الإكمال التلقائي.

اختلافات Bash

يختلف Bash اختلافًا كبيرًا فيما يتعلق بالإكمال. على وجه الخصوص، لن يُساعدك Zsh كثيرًا. فبينما يُدير Zsh الاقتراحات كاملةً بنفسه، يتوقع Bash منك تحديد الاقتراحات المناسبة، بناءً على ما كُتب وموضع الضغط على Tab.

فكّر في مُعادل بسيط لنص Zsh أعلاه:

_complete_todos_bash() {
    COMPREPLY=(help edit)
}

complete -F _complete_todos_bash todos

يوفر Bash أمرًا كاملاً بدلاً من أسلوب دالة Zsh، لذا لا حاجة لتحميل أو تهيئة أي شيء. يُعيّن مُعالج الإكمال متغيرًا معروفًا – COMPREPLY – بدلاً من تكرار الاقتراحات. هذا المتغير عبارة عن مصفوفة Bash.

إذا اختبرت هذا النص البرمجي في Bash، فسترى أنه يُدرج جميع اقتراحات الأوامر الفرعية كما هو متوقع:

$ todos <TAB>
help edit

المشكلة هي أن Bash سيعتمد دائمًا على معالجك لتقديم جميع الاقتراحات ذات الصلة، دون تطبيق أيٍّ من منطقه الخاص. لذا، هذه النتائج ليست مفيدة دائمًا:

$ todos he<TAB>
help edit

تقع على عاتقك مسؤولية إخبار Bash بأنه يجب عليه فقط اقتراح “مساعدة” كإكمال محتمل. يمكنك القيام بذلك من خلال فحص بعض المتغيرات المفيدة التي يوفرها Bash عند الضغط على Tab:

  • COMP_WORDS هي مصفوفة تحتوي على سطر الأوامر كاملاً مقسمًا إلى كلمات فردية.
  • COMP_CWORD هو فهرس في COMP_WORDS يشير إلى الكلمة التي يوجد المؤشر بداخلها حاليًا.

باستخدام هذه البيانات، يمكنك تحديد الكلمة التي يتم إكمالها وتقديم اقتراحات سياقية. على الرغم من وجود طرق للقيام بذلك يدويًا، يوفر Bash أمرًا مفيدًا آخر، وهو compgen. يمكن لهذا الأمر توليد العديد من أنواع الاقتراحات بناءً على عوامل مثل الدوال أو الأوامر المتاحة، والكلمة المكتوبة حتى الآن. سيبحث الخيار -W في قائمة كلمات ثابتة.

$ compgen -W "one two three" o
one
$ compgen -W "one two three" t
two
three

لذا، يمكنك إدراج مكالمة إلى compgen في معالج الاقتراح والاستمتاع باقتراحات مناسبة ومحددة للسياق باستخدام نص برمجي بسيط للغاية:

_complete_todos_bash() {
    COMPREPLY=( $( compgen -W "edit help" -- "${COMP_WORDS[$COMP_CWORD]}" ) )
}

complete -F _complete_todos_bash todos

تجميع كل شيء

بالنسبة لنصوصك البرمجية الشخصية، من المرجح أن تعمل في بيئة معروفة: إما Bash أو zsh. أما بالنسبة للنصوص البرمجية المحمولة، والتي قد ترغب في مشاركتها مع الآخرين أو استخدامها عبر أنظمة متعددة، فينبغي عليك تلخيص بعض هذه الشيفرة.

اقرأ أيضا:  تحسن تجربة الألعاب على Linux يدفع الكثيرين لإعادة التفكير في Windows

إليك نسخة كاملة من نص الإكمال الذي يعمل في zsh أو Bash، من خلال تحديد بيئة التشغيل التي يعمل فيها، وتشغيل الشيفرة ذات الصلة.

SUBCOMMANDS=(help edit halt)

_complete_todos_zsh() {
    compadd $SUBCOMMANDS
}

_complete_todos_bash() {
    COMPREPLY=( $( compgen -W "${SUBCOMMANDS[*]}" -- "${COMP_WORDS[$COMP_CWORD]}" ) )
}

if [ -n "${ZSH_VERSION:-}" ]; then
    autoload -Uz compinit
    compinit
    compdef _complete_todos_zsh todos
elif [ -n "${BASH_VERSION:-}" ]; then
    complete -F _complete_todos_bash todos
fi

يُعلن متغيرا البيئة ZSH_VERSION وBASH_VERSION عن واجهة التشغيل التي نعمل بها حاليًا. تذكر أن واجهة التشغيل التي يعمل بها أمرك غير مهمة، بل واجهة التشغيل التي تستدعي نظام الإكمال، والتي ضغط فيها المستخدم على مفتاح Tab، هي المهمة هنا.

يخزن هذا البرنامج النصي اقتراحاته في متغير SUBCOMMANDS الذي يمكن لكلا الدالتين الوصول إليه. تستخدمه كل منهما لتحديد عمليات الإكمال المدعومة: zsh عن طريق استدعاء دالة compadd، وBash عن طريق تعيين متغير COMPREPLY. لاحظ أن Bash يحتاج إلى الكثير من التعديل النحوي للأنواع للتحويل بين المصفوفات والسلاسل النصية.

يمكنك حفظ البرنامج النصي أعلاه في ملف واحد – مثل completion.sh – ثم الحصول على مصدر هذا الملف من ملفي .bashrc و/أو .zshrc كما يلي:

. /path/to/completion.sh

الخطوات التالية

لم نتطرق إلا إلى أساسيات إكمال أوامر shell المخصصة. باستخدام هذا النص البسيط، يمكنك إضافة إكمالات لمجموعة ثابتة من الأوامر الفرعية البسيطة، ولكن هناك الكثير مما يتعلق بتشغيل البرامج على سطر الأوامر والذي قد ترغب في أخذه في الاعتبار.

يجب أن يأخذ نص الإكمال القوي سطر الأوامر بأكمله في الاعتبار، لأن الوسائط الأخرى قد تؤثر على الوسيطة التي تحاول إكمالها.

إضافة ميزة إكمال الأوامر في Terminal خطوة بسيطة لكنها تحدث فارقًا كبيرًا في سهولة استخدام تطبيقات سطر الأوامر. بمجرد تفعيلها ستلاحظ كيف أصبح تنفيذ الأوامر أسرع وأكثر دقة، مما يتيح لك التركيز على ما هو أهم دون إضاعة وقت في إصلاح الأخطاء أو إعادة كتابة الأوامر.

زر الذهاب إلى الأعلى