يا جماعة الخير، السلام عليكم ورحمة الله.
أذكرها وكأنها البارحة، كانت الساعة قد تجاوزت الثانية بعد منتصف الليل في مكتبي الصغير بمدينة رام الله. كنت غارقًا حتى أذني في تصحيح خطأ برمجي (bug) “عويص” في نظام يعتمد على حاويات دوكر (Docker). المشكلة كانت أنني قبل ثلاثة أيام، أو ربما أربعة، كتبت أمرًا طويلًا ومعقدًا لتشغيل حاوية معينة مع متغيرات بيئة (environment variables) كثيرة جدًا، وهذا الأمر هو مفتاح حل المشكلة الآن.
وبدأت رحلة العذاب. ضغطتُ Ctrl+R وبدأت أكتب “docker run”، لكن النتائج كانت كثيرة ومتشابهة. لجأتُ بعدها للسلاح التقليدي: history | grep docker. يا إلهي! مئات الأوامر، معظمها لا علاقة له بما أبحث عنه. شعرت بنفسي كمن يبحث عن إبرة في كومة قش، أو كما نقول عنا في فلسطين “بدور على جمل إبرة”. بدأت أضغط على السهم العلوي في الطرفية (Terminal) بشكل جنوني، وكل ضغطة كانت تزيد من إحباطي. وقتها قلت لنفسي: “يا زلمة، لازم يكون في طريقة أحسن من هيك! هاي مش عيشة!”.
في تلك الليلة، لم أجد الأمر. لكنني وجدت شيئًا أفضل بكثير، شيئًا أنقذني من هذا الجحيم، وكان اسمه: الباحث التقريبي أو الـ “Fuzzy Finder”.
ما هو جحيم الأوامر المنسية؟
كل مطور أو مدير أنظمة يعرف هذا الشعور جيدًا. ذاكرة سطر الأوامر (command history) تتحول مع الوقت إلى مقبرة ضخمة للأوامر. أوامر مفيدة، أوامر معقدة، أوامر تستخدم مرة في السنة… كلها تُدفن تحت طبقات من الأوامر اليومية البسيطة مثل ls و cd.
المشكلة ليست في أننا ننسى، فالنسيان طبيعة بشرية. المشكلة تكمن في أدوات البحث التقليدية:
Ctrl+R(Reverse Search): أداة جيدة، لكنها تبحث عن تطابق متسلسل. إذا كنت لا تتذكر بداية الأمر بالضبط، فلن تفيدك كثيرًا.history | grep [كلمة]: هذه الطريقة أفضل قليلًا، لكنها تظل بدائية. تعرض لك قائمة طويلة وغير تفاعلية، وعليك بعدها نسخ الأمر الذي تريده ولصقه يدويًا.
هذا الحمل المعرفي (Cognitive Load) في محاولة تذكر الصيغة الدقيقة للأوامر المعقدة (مثل git, kubectl, ffmpeg) هو مضيعة حقيقية للوقت والطاقة الذهنية التي من المفترض أن نوجهها لحل المشكلات الحقيقية.
ودخل “الباحث التقريبي” على الخط…
الباحث التقريبي، وتحديدًا أشهر أداة في هذا المجال وهي fzf، هو الحل السحري لهذه المشكلة. فكرته بسيطة وعبقرية: بدلًا من البحث عن تطابق تام، هو يبحث عن تطابق “تقريبي” أو “ضبابي” (fuzzy).
ماذا يعني ذلك؟ يعني أنك لست بحاجة لتذكر الأمر بالضبط أو ترتيب الكلمات فيه. يمكنك فقط كتابة أجزاء متفرقة من الأمر، وسيقوم fzf بعرض قائمة تفاعلية بالنتائج التي تتطابق مع هذه الأجزاء، مع ترتيب أفضل النتائج في الأعلى. كل هذا يتم في الوقت الفعلي (real-time) مع كل حرف تكتبه!
إنه أشبه بامتلاك مساعد شخصي فائق الذكاء لذاكرة سطر الأوامر الخاصة بك.
لنُشَمِّر عن سواعدنا: تثبيت وإعداد fzf
الكلام النظري جميل، لكن دعونا نرى “شغل مرتب” على أرض الواقع. تثبيت fzf سهل للغاية على معظم الأنظمة.
خطوات التثبيت
يمكنك تثبيته باستخدام مدير الحزم المفضل لديك:
# على macOS باستخدام Homebrew
brew install fzf
# على Debian/Ubuntu
sudo apt-get install fzf
# على Arch Linux
sudo pacman -S fzf
بعد التثبيت، قم بتشغيل سكربت الإعدادات التلقائية. هذا أهم جزء لأنه يربط fzf مع الطرفية الخاصة بك ويفعّل الميزات السحرية مثل Ctrl+R.
$(brew --prefix)/opt/fzf/install
أو إذا قمت بتثبيته من مصدر آخر، ابحث عن ملف install وقم بتشغيله. سيطلب منك تفعيل بعض الخيارات، وافق عليها جميعًا (y). بعد ذلك، أعد تشغيل الطرفية.
القوة الحقيقية لـ fzf: ما وراء البحث البسيط
الآن بعد أن قمنا بالتثبيت، حان وقت المرح. fzf ليس مجرد أداة، بل هو منصة يمكنك دمجها مع أي شيء تقريبًا في سطر الأوامر.
وداعًا لـ Ctrl+R التقليدية!
هذه هي الميزة القاتلة التي ستجعلك تقع في حب fzf. الآن، عندما تضغط على Ctrl+R، بدلًا من السطر الصغير في الأسفل، ستظهر لك واجهة fzf التفاعلية تعرض سجل الأوامر بالكامل.
جربها الآن. اضغط Ctrl+R وابدأ بكتابة أجزاء من أمر استخدمته سابقًا. مثلًا، لو كنت أبحث عن أمر الـ Docker المعقد ذاك، يمكنني ببساطة أن أكتب:
docker run my-app-image
ستجد أن fzf يقوم بتصفية السجل فورًا ليظهر لك كل الأوامر التي تحتوي على هذه الكلمات الثلاث، بغض النظر عن ترتيبها أو ما بينها. تجد الأمر الذي تريده، تضغط Enter، وها هو يظهر في الطرفية جاهزًا للتنفيذ أو التعديل. سحر!
التنقل بين الملفات والمجلدات بسرعة البرق
هل سئمت من كتابة ls ثم نسخ اسم الملف لفتحه؟ fzf يحل هذه المشكلة.
- للبحث عن ملف وفتحه: يمكنك استخدام
fzfلإيجاد ملف ثم تمرير اسمه إلى أمر آخر مثل محرر النصوص.
# سيبحث في كل الملفات والمجلدات ويعرضها في fzf
# عند اختيار ملف، سيتم طباعة اسمه
# يمكننا استخدامه لفتح الملف في vim أو أي محرر آخر
vim $(fzf)
نصيحة من أبو عمر: في إعدادات الطرفية (مثل
.zshrcأو.bashrc)، يمكنك عمل اختصار لهذا. أنا شخصيًا أستخدمCtrl+Tالذي يوفرهfzfتلقائيًا للبحث عن ملف ولصق مساره في سطر الأوامر الحالي.
- للانتقال إلى مجلد: يوفر
fzfاختصارًا رائعًا هوALT+C. عند ضغطه، يفتحfzfواجهة للبحث عن المجلدات. بمجرد اختيار مجلد والضغط علىEnter، ينتقل بك الأمرcdإليه مباشرة. لا مزيد منcd ../../...!
fzf واللعب مع الكبار (Git, Docker, etc.)
هنا تظهر عبقرية fzf الحقيقية: قدرته على العمل مع مخرجات أي أمر آخر. المبدأ بسيط: أي قائمة نصية يمكن تحويلها إلى قائمة تفاعلية قابلة للبحث.
أمثلة مع Git
- الانتقال بين الفروع (Branches):
# اعرض كل الفروع، ابحث فيها بـ fzf، ثم انتقل للفرع المختار
git checkout $(git branch --all | tr -d ' *' | fzf)
- استعراض سجل الـ Commits:
# اعرض سجل الـ commits بشكل جميل، ابحث فيه، ثم اعرض تفاصيل الـ commit المختار
git log --oneline --graph | fzf | cut -d ' ' -f 1 | xargs git show
أمثلة مع Docker
- إيقاف حاوية معينة:
# اعرض الحاويات الشغالة، اختر واحدة، ثم أوقفها
docker stop $(docker ps | sed 1d | fzf | awk '{print $1}')
أمثلة مع العمليات (Processes)
تحذير: استخدم هذا الأمر بحذر شديد!
- قتل عملية معينة:
# اعرض كل العمليات، ابحث فيها بـ fzf، ثم اقتل العملية المختارة
ps -ef | sed 1d | fzf | awk '{print $2}' | xargs kill -9
الأمثلة لا حصر لها. أي شيء يمكنك إخراجه كقائمة نصية، يمكنك “تَفْزِيْزُه” (من fzf-ify بالإنجليزية 😉).
نصائح من مطبخ أبو عمر
بعد سنوات من استخدام هذه الأداة يوميًا، إليك بعض النصائح العملية:
- خصّص مظهر
fzf: الألوان الافتراضية قد لا تعجبك. يمكنك تخصيص كل شيء عبر متغير البيئةFZF_DEFAULT_OPTS. ضعه في ملف.zshrcأو.bashrc. هذا ما أستخدمه شخصيًا: - اصنع دوالك الخاصة (Functions): لا تكتفِ بكتابة الأوامر الطويلة كل مرة. حوّلها إلى دوال بسيطة في ملف إعدادات الطرفية. مثلًا، دالة للبحث في سجل Git:
- استخدمه داخل محرر الأكواد: متعة
fzfلا تقتصر على الطرفية. هناك إضافات رائعة له في محررات مثل Vim/Neovim (تلسكوب هو الأفضل) و VS Code، مما يتيح لك البحث عن الملفات والكلمات داخل المشروع بنفس الطريقة السريعة والتقريبية.
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border --margin=1 --padding=1'
# دالة للبحث في سجل git
f_git_log() {
git log --oneline --graph | fzf | cut -d ' ' -f 1
}
# الآن يمكنك فقط كتابة f_git_log في الطرفية
الخلاصة: لا تترك إنتاجيتك في المقبرة
في عالم تطوير البرمجيات، نحن محاطون بأدوات معقدة وقوية. لكن أحيانًا، تكون الأدوات الصغيرة والبسيطة هي التي تحدث أكبر فرق في إنتاجيتنا اليومية وسعادتنا كمطورين.
أداة fzf هي خير مثال على ذلك. حولت تجربة استخدام سطر الأوامر من عمل روتيني محبط أحيانًا، إلى تجربة تفاعلية وسريعة وممتعة. لم يعد سجل الأوامر مقبرة، بل أصبح مكتبة حية وذكية يمكنني البحث فيها بسهولة وسرعة.
نصيحتي لك: استثمر ساعة واحدة من وقتك لتثبيت fzf وتعلم أساسياته. أعدك بأنها ستكون من أفضل الساعات التي استثمرتها في تحسين بيئة عملك. انطلق وحرر نفسك من جحيم الأوامر المنسية! 🚀