كانت طرفيتي سجناً: كيف أنقذنا ‘الباحث التقريبي’ (Fuzzy Finder) من جحيم البحث في الـ History؟

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

بدأت رحلة العذاب المعتادة. ضغطت `Ctrl+R` وبدأت أكتب `scp`… لا فائدة، ظهرت لي عشرات الأوامر المشابهة. جربت `history | grep scp`، فكانت النتيجة قائمة طويلة لا أول لها ولا آخر. شعرت حينها أن طرفيتي (Terminal) التي من المفترض أن تكون أداتي للسيطرة والإنتاجية، قد تحولت إلى سجن، جدرانه هي سجل الأوامر (History) الذي لا ينتهي. قلت لنفسي وقتها بنبرة يائسة: “يا زلمة، مش معقول هيك! لازم يكون في حل أحسن!”.

وهذا الموقف، يا أصدقائي، كان نقطة التحول التي قادتني لاكتشاف منقذي: الباحث التقريبي أو الـ “Fuzzy Finder”. في هذه المقالة، سآخذكم في رحلتي من ذلك الجحيم إلى نعيم الإنتاجية.

ما هو الجحيم الذي كنا نعيش فيه؟

قبل أن نصل إلى الحل، دعونا نعترف بالمشكلة. معظمنا يعتمد على طريقتين أساسيتين للبحث في سجل الأوامر:

  1. البحث العكسي (Ctrl+R): هي أداة جيدة للبحث عن آخر أمر استخدمته، لكنها تصبح كابوساً عندما يكون لديك أوامر متشابهة. تضغط `Ctrl+R` مراراً وتكراراً لعلّك تجد ضالتك، وفي كل مرة تتجاوز الأمر المطلوب عن طريق الخطأ، عليك أن تبدأ من جديد.
  2. الأمر `history` مع `grep`: هذه الطريقة أفضل قليلاً، حيث يمكنك فلترة النتائج. على سبيل المثال: `history | grep ‘docker-compose’`. لكنها لا تزال غير عملية، فهي تعرض لك قائمة ثابتة، ولا يمكنك التفاعل معها أو اختيار الأمر مباشرة لتنفيذه.

المشكلة الجوهرية في هذه الأدوات أنها تتطلب منك أن تتذكر جزءاً دقيقاً ومتتالياً من الأمر. لكن ماذا لو كنت تتذكر كلمتين مفتاحيتين غير متجاورتين، مثل `docker` و `prod` في أمر طويل؟ هنا تفشل الأدوات التقليدية ويبدأ الإحباط.

المنقذ: الباحث التقريبي (Fuzzy Finder) وأشهر أبطاله `fzf`

الباحث التقريبي هو ببساطة أداة بحث ذكية لا تتطلب تطابقاً تاماً. يمكنك كتابة أجزاء متفرقة من الكلمة أو الجملة التي تبحث عنها، وسيقوم هو بفلترة النتائج بشكل فوري ليعرض لك كل ما يطابق بحثك “بشكل تقريبي”.

وهنا يأتي دور البطل في قصتنا: `fzf`. هي أداة سطر أوامر خفيفة وسريعة جداً ومكتوبة بلغة Go، يمكنها أن تقرأ أي قائمة من المدخلات (أسماء ملفات، أسطر من سجل الأوامر، أسماء فروع git، أي شيء!) وتوفر لك واجهة تفاعلية للبحث فيها وتنفيذ إجراء بناءً على اختيارك.

تثبيت وتجهيز المنقذ `fzf`

التثبيت بسيط جداً على معظم الأنظمة. افتح طرفيتك ونفذ الأمر المناسب لنظامك:

# على macOS باستخدام Homebrew
brew install fzf

# على Debian/Ubuntu
sudo apt install fzf

# على Arch Linux
sudo pacman -S fzf

# على Fedora
sudo dnf install fzf

بعد التثبيت، الخطوة الأهم هي ربطه مع الـ “Shell” الخاص بك (مثل bash أو zsh). `fzf` يأتي مع سكربت يقوم بذلك تلقائياً. كل ما عليك فعله هو تنفيذ الأمر التالي:

$(brew --prefix)/opt/fzf/install # لمستخدمي Homebrew على macOS
/usr/share/fzf/install # لمستخدمي apt على Debian/Ubuntu (قد يختلف المسار)
# بشكل عام، ابحث عن سكربت install الخاص بالحزمة ونفذه

سيقوم هذا السكربت بسؤالك إذا كنت تريد تفعيل الاختصارات التلقائية، وافق عليها (بالضغط على `y`). بعد ذلك، أعد تشغيل الطرفية أو نفّذ `source ~/.bashrc` (أو `~/.zshrc`).

وداعاً `Ctrl+R`، أهلاً بالبحث السحري!

الآن، وبكل بساطة، اضغط `Ctrl+R` في طرفيتك. بدلاً من الواجهة القديمة، ستظهر لك واجهة `fzf` التفاعلية التي تعرض لك كامل سجل الأوامر. ابدأ الآن بكتابة أي شيء تتذكره من الأمر الذي تبحث عنه.

لنفترض أنني أبحث عن أمر `scp` اللعين من قصتي السابقة. كل ما علي فعله هو كتابة `scp tar gz`.

ستقوم `fzf` فوراً بفلترة آلاف الأوامر لتُظهر لي فقط الأوامر التي تحتوي على هذه الكلمات الثلاث، وبأي ترتيب! يمكنني التنقل بين النتائج بالأسهم، وبمجرد أن أجد الأمر المطلوب، أضغط `Enter` ليظهر في سطر الأوامر جاهزاً للتنفيذ أو التعديل.

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

ما هو أكثر من مجرد بحث في الـ History؟

إذا كنت تظن أن `fzf` مخصص فقط للبحث في سجل الأوامر، فأنت لم ترَ شيئاً بعد. قوة `fzf` الحقيقية تكمن في قدرته على العمل مع أي شيء تقريباً عبر الأنابيب (Pipes `|`). إليك بعض الاستخدامات التي غيرت طريقة عملي اليومية:

البحث عن الملفات وإدراجها (`Ctrl+T`)

هل احتجت يوماً لكتابة مسار ملف طويل ومعقد في أمر ما؟ بدلاً من كتابته يدوياً أو استخدام `ls` مراراً وتكراراً، فقط اضغط `Ctrl+T`. ستفتح `fzf` واجهة للبحث في كل الملفات والمجلدات في المسار الحالي وتفرعاته. ابحث عن اسم الملف، اضغط `Enter`، وسيتم إدراج مساره الكامل في سطر الأوامر.

# اكتب vim ثم اضغط Ctrl+T وابحث عن 'settings.py'
vim [اضغط Ctrl+T هنا]

التنقل السريع بين المجلدات (`Alt+C`)

للتنقل بين المجلدات التي تعمل عليها كثيراً، بدلاً من كتابة `cd ../../project/api/utils`، اضغط `Alt+C` (قد يكون `Esc+C` في بعض الطرفيات). ستبحث `fzf` في المجلدات الفرعية وتسمح لك بالانتقال الفوري إلى المجلد الذي تختاره.

الاستخدام المتقدم: دمج `fzf` مع أوامر أخرى

هنا يبدأ المرح الحقيقي. يمكنك “توجيه” (pipe) خرج أي أمر إلى `fzf` لاختيار سطر منه، ثم توجيه هذا السطر إلى أمر آخر. اسمع مني هالشغلات اللي رح توفر عليك وقت كثير:

  • إيقاف العمليات (Processes) بشكل تفاعلي:

    ps -ef | fzf | awk '{print $2}' | xargs kill -9

    شرح الأمر: `ps -ef` يعرض كل العمليات، `fzf` يتيح لك اختيار عملية منهم، `awk` يستخرج معرّف العملية (PID)، و`xargs kill` يقوم بإيقافها.

  • التنقل بين فروع `git` بسرعة:

    git branch | fzf | xargs git checkout

    شرح الأمر: يعرض كل الفروع، تختار منها الفرع الذي تريده، ويقوم `git checkout` بالانتقال إليه. يمكنك إنشاء “alias” لهذا الأمر لتسهيل استخدامه.

  • الاتصال بخوادمك عبر SSH:

    إذا كان لديك ملف `~/.ssh/config` منظم، يمكنك استخدام هذا الأمر للاتصال السريع:

    grep '^Host ' ~/.ssh/config | awk '{print $2}' | fzf | xargs ssh

    شرح الأمر: يستخرج أسماء الـ Hosts من ملف الإعدادات، يتيح لك `fzf` اختيار واحد، ثم يتصل به عبر `ssh`.

الخلاصة: من سجين إلى قائد 🚀

العودة إلى تلك الليلة المجهدة، لو كانت أداة `fzf` مثبتة على جهازي وقتها، لكنت قد ضغطت `Ctrl+R`، كتبت `scp deploy tar`، وضغطت `Enter`، ثم ذهبت للنوم في أقل من 10 ثوانٍ.

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

نصيحتي الأخيرة لك: لا تخف من التجربة. ابدأ بدمج `fzf` مع سجل الأوامر، ثم جرب اختصارات الملفات والمجلدات. وبعد أن تعتاد عليها، انظر إلى الأوامر التي تكررها يومياً وفكر: “كيف يمكن لـ `fzf` أن يجعل هذا الأمر أسرع؟”. الإجابة ستفاجئك في كل مرة.

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

اختبارات الاداء والجودة

كانت اختباراتنا تنهار عشوائياً: كيف أنقذنا Playwright من جحيم الاختبارات المتقشرة (Flaky Tests)؟

في هذه المقالة، أشارككم قصة حقيقية من خنادق البرمجة، حيث كانت اختباراتنا الآلية تنهار بشكل عشوائي ومحبط. سأغوص معكم في الأسباب الجذرية للاختبارات المتقشرة (Flaky...

14 مايو، 2026 قراءة المزيد
أتمتة العمليات

كانت عمليات النشر كابوساً: كيف أنقذتنا “خطوط أنابيب CI/CD” من جحيم “يوم النشر” اليدوي؟

أنا أبو عمر، مبرمج فلسطيني، وأروي لكم كيف انتقلنا من ليالي النشر اليدوي المليئة بالتوتر والأخطاء إلى عالم الأتمتة والثقة باستخدام خطوط أنابيب CI/CD. هذه...

14 مايو، 2026 قراءة المزيد
خوارزميات

كان البحث عن ‘الأماكن القريبة’ يقتل الأداء: كيف أنقذتنا ‘شجرة الكواد’ (Quadtree) من جحيم البحث الخطي؟

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

14 مايو، 2026 قراءة المزيد
تجربة المستخدم والابداع البصري

كان تطبيقنا سجنًا رقميًا: كيف أنقذتنا ‘إمكانية الوصول’ (Accessibility) من جحيم استبعاد المستخدمين؟

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

14 مايو، 2026 قراءة المزيد
البودكاست