كنت أبحث في محطتي الطرفية كالأعمى: كيف أنقذني الباحث الضبابي (fzf) من جحيم البحث اليدوي البطيء؟

يا جماعة الخير، السلام عليكم ورحمة الله وبركاته. معكم أخوكم أبو عمر.

خلوني أحكيلكم قصة صارت معي قبل كم سنة. كانت ليلة من ليالي الشتاء الباردة في مكتبي، والساعة تجاوزت منتصف الليل. كنت شغال على تعديل عاجل في نظام كبير لعميل مهم، وفجأة “علّق” النظام. رسالة خطأ غامضة ظهرت في سجلات النظام (logs)، وأنا متأكد إني شفت مثلها قبل أسابيع بس مش متذكر وين بالضبط.

بلّشت رحلة العذاب. فتحت المحطة الطرفية (Terminal) وبدأت أبحث. جرّبت grep مع كل الكلمات اللي ممكن تكون في رسالة الخطأ. بعدين استخدمت find عشان أدوّر على ملفات السجلات اللي تعدلت في آخر شهر. الشاشة السودا قدامي صارت عبارة عن بحر من النصوص اللي بتمر بسرعة، وأنا زي الأعمى اللي بتحسس طريقه في غرفة مظلمة. كل شوي أكتب أمر، أستنى النتيجة، أرجع أعدّل الأمر… ومرّت ساعة وأنا لسا مش لاقي الملف الصح. وقتها حسيت بإحباط شديد، وصرت أحكي لحالي: “يا زلمة معقول ما في طريقة أذكى من هيك؟ معقول في 2024 لسا بنبحث بهاي الطريقة البدائية؟”

وفي عز يأسي، تذكرت مقالة قرأتها زمان عن أداة اسمها “fzf” أو “fuzzy finder”. قلت لحالي، خلص، خربانة خربانة، خليني أجرّبها. بعد تثبيت سريع وتفعيل بسيط، كتبت أمر بسيط يدمج find مع fzf. وفجأة… ظهرت واجهة تفاعلية بسيطة. بلشت أكتب أي جزء من اسم الملف أو المسار اللي بتذكره بشكل “ضبابي”… “api”…”log”…”error”… ومع كل حرف بكتبه، القائمة قدامي بتتقلص بشكل فوري وذكي لتورجيني أفضل النتائج. في أقل من 10 ثواني، كنت لقيت الملف المطلوب وفتحت عليه. شعور الإنجاز والدهشة في هذيك اللحظة لا يوصف. حسيت إني كنت أمتلك سيارة قديمة وبطيئة، وفجأة حدا أعطاني مفتاح سيارة سباق حديثة. من هذاك اليوم، صارت أداة fzf جزء لا يتجزأ من سير عملي اليومي.

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

ما هو الباحث الضبابي (fzf)؟ وليش “ضبابي”؟

ببساطة، fzf (fuzzy finder) هو باحث تفاعلي فائق السرعة يعمل داخل المحطة الطرفية. فكرته الأساسية هي إنه بياخذ أي قائمة من النصوص (أسماء ملفات، أوامر سابقة، أسطر في ملف، أي شي!) وبعرضها في واجهة تفاعلية تسمح لك بالبحث والتصفية بشكل فوري.

كلمة “ضبابي” (Fuzzy) هي سر قوته. أنت مش محتاج تكتب الكلمة أو الجملة بشكل دقيق 100%. يكفي إنك تكتب أجزاء منها، حتى لو مش بالترتيب، وهو رح يستخدم خوارزميات ذكية عشان يلاقي أفضل التطابقات. هذا يشبه تماماً طريقة بحثنا في جوجل، نكتب كلمات متفرقة ونحصل على نتائج دقيقة.

تخيل أنك في مكتبة ضخمة. البحث التقليدي يتطلب منك معرفة اسم الكتاب الدقيق ورمز الرف. البحث الضبابي يسمح لك بأن تقول لأمين المكتبة: “أعطني الكتاب الأحمر اللي فيه كلمة تنين على الغلاف”، وهو سيفهم قصدك ويحضره لك.

البداية: كيف تثبّت fzf وتخلّيه جزء من محطتك الطرفية

التثبيت أسهل مما تتخيل، وهو خطوة واحدة ستغير طريقة استخدامك للطرفية إلى الأبد.

التثبيت على مختلف الأنظمة

افتح الطرفية الخاصة بك ونفذ الأمر المناسب لنظامك:

  • macOS (باستخدام Homebrew):
    brew install fzf
  • Debian / Ubuntu:
    sudo apt-get install fzf
  • Arch Linux:
    sudo pacman -S fzf
  • Fedora:
    sudo dnf install fzf

التفعيل السحري: ربط fzf مع الـ Shell

بعد التثبيت، يجب أن تقوم بتشغيل سكربت الإعداد لربط fzf مع الـ shell الخاص بك (مثل Bash أو Zsh). هذه الخطوة ستضيف لك الاختصارات السحرية تلقائياً.

# إذا كنت تستخدم Homebrew على macOS
$(brew --prefix)/opt/fzf/install

# على معظم أنظمة لينكس
/usr/share/fzf/install # قد يختلف المسار قليلاً

سيقوم هذا السكربت بسؤالك إذا كنت ترغب في تفعيل الاختصارات وإضافة الإعدادات اللازمة لملف الإعداد الخاص بالـ shell (مثل .bashrc أو .zshrc). وافق على كل الخيارات (بالضغط على ‘y’). بعد ذلك، أغلق الطرفية وافتحها من جديد، أو نفّذ الأمر source ~/.bashrc (أو source ~/.zshrc) لتفعيل الإعدادات.

مبروك! أنت الآن جاهز للانطلاق.

الاستخدامات اليومية اللي غيّرت حياتي كمبرمج

هنا تكمن القوة الحقيقية. fzf ليس مجرد أمر، بل هو تكامل يندمج في سير عملك.

البحث في تاريخ الأوامر (CTRL-R): وداعاً للـ reverse-i-search التقليدي!

كلنا نستخدم CTRL-R للبحث في الأوامر السابقة. لكن الطريقة التقليدية كانت محدودة ومتعبة. الآن، فقط اضغط CTRL-R. بدلاً من سطر واحد صغير، ستظهر لك قائمة تفاعلية بكل تاريخ أوامرك. ابدأ بكتابة أي جزء من الأمر الذي تبحث عنه:

  • هل تبحث عن أمر docker-compose طويل استخدمته الأسبوع الماضي؟ فقط اكتب doco up وستجده فوراً.
  • هل تبحث عن أمر scp لنسخ ملف إلى سيرفر معين؟ اكتب اسم السيرفر أو جزء من مسار الملف.

هذه الميزة وحدها توفر دقائق ثمينة كل يوم.

البحث عن الملفات والمجلدات (CTRL-T): أسرع من الضوء

هل تريد فتح ملف للتعديل باستخدام vim أو code؟ بدلاً من كتابة المسار الطويل أو استخدام ls مراراً وتكراراً، ببساطة اكتب محرر النصوص الذي تستخدمه ثم اضغط CTRL-T.

vim [اضغط CTRL+T هنا]

ستظهر لك واجهة fzf تبحث في كل الملفات والمجلدات في المسار الحالي وتفرعاته. ابدأ بكتابة اسم الملف، اختره، واضغط Enter. سيتم إدراج المسار الكامل للملف تلقائياً في سطر الأوامر.

نصيحة من أبو عمر: أنا شخصياً لم أعد أستخدم ls -R أو tree تقريباً. عندما أريد فتح ملف، أكتب nvim وأضغط CTRL-T مباشرة. إنه أسرع وأكثر فعالية.

التنقل السريع بين المجلدات (ALT-C): الـ `cd` الخارق

التنقل بين المجلدات المتداخلة باستخدام cd ../../... يمكن أن يكون مملاً. اختصار ALT-C يحل هذه المشكلة. عند ضغطه، يفتح fzf ليبحث عن المجلدات فقط. اختر المجلد الذي تريده، وسيتم تنفيذ أمر cd إليه مباشرة.

هذا الاختصار لا يقدر بثمن في المشاريع الكبيرة (monorepos) التي تحتوي على بنية مجلدات معقدة.

القوة الحقيقية: استخدام الأنابيب (Pipes) مع fzf

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

مثال 1: التعامل مع Git

هل تريد الانتقال إلى فرع (branch) معين؟ بدلاً من كتابة git checkout branch-name، يمكنك عرض كل الفروع والاختيار منها:

git branch | fzf | xargs git checkout

شرح الأمر:

  1. git branch: يعرض قائمة بكل الفروع المحلية.
  2. | fzf: يمرر هذه القائمة إلى fzf لتختار منها بشكل تفاعلي.
  3. | xargs git checkout: يأخذ الفرع الذي اخترته ويمرره كمعامل لأمر git checkout.

مثال 2: إدارة حاويات Docker

هل تريد إيقاف حاوية معينة لكنك لا تحفظ الـ ID الخاص بها؟

docker ps | fzf | awk '{print $1}' | xargs docker stop

شرح الأمر:

  1. docker ps: يعرض الحاويات قيد التشغيل.
  2. | fzf: تختار الحاوية التي تريدها من القائمة.
  3. | awk '{print $1}': يستخرج فقط الجزء الأول من السطر الذي اخترته (وهو Container ID).
  4. | xargs docker stop: يمرر الـ ID إلى أمر docker stop.

مثال 3: إنهاء العمليات (Kill Processes)

لإغلاق عملية معينة بشكل آمن:

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

نصائح من أبو عمر: كيف تطلع أقصى استفادة من fzf

الأداة قوية كما هي، لكن مع بعض التخصيص، تصبح خارقة.

خصّص fzf على كيفك

يمكنك تغيير سلوك fzf الافتراضي باستخدام متغيرات البيئة في ملف .bashrc أو .zshrc.

نصيحة 1: استخدم `ripgrep` للبحث الأسرع. أداة find جيدة، لكن ripgrep (rg) أسرع بكثير وتحترم ملف .gitignore تلقائياً.

# أولاً، تأكد من تثبيت ripgrep
# sudo apt-get install ripgrep (Ubuntu)
# brew install ripgrep (macOS)

# ثم أضف هذا السطر إلى .bashrc أو .zshrc
export FZF_DEFAULT_COMMAND='rg --files --hidden --glob "!.git/*"'

نصيحة 2: فعّل معاينة الملفات. هذه الميزة هي الأروع على الإطلاق. يمكنك رؤية محتوى الملف أثناء البحث عنه. ستحتاج لأداة مثل bat (بديل cat مع تلوين) أو less.

# أولاً، قم بتثبيت bat
# sudo apt-get install bat (Ubuntu)
# brew install bat (macOS)

# أضف هذا السطر لملف الإعدادات
# هذا سيفعل المعاينة عند استخدام CTRL-T
export FZF_CTRL_T_OPTS="--preview 'bat --color=always {}'"

الآن، عندما تبحث عن ملفات باستخدام CTRL-T، سترى نافذة معاينة لمحتوى الملف المحدد على اليمين!

اصنع اختصاراتك الخاصة (Aliases & Functions)

لا تكرر كتابة الأوامر الطويلة. حوّلها إلى دوال (functions) في ملف إعدادات الـ shell.

مثلاً، لنحول أمر الانتقال بين فروع git إلى دالة سهلة الاستخدام اسمها gco (اختصار لـ git checkout).

# أضف هذه الدالة إلى ملف .zshrc أو .bashrc
gco() {
  local branches branch
  branches=$(git branch --all | grep -v HEAD | sed 's/^[ t]*//;s/[ t]*$//')
  branch=$(echo "$branches" | fzf-tmux -p 80%,60%)
  if [[ -n "$branch" ]]; then
    git checkout "$(echo "$branch" | sed "s/.* //" | sed "s#remotes/origin/##")"
  fi
}

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

الخلاصة: من الظلام إلى النور 💡

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

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

نصيحتي الأخيرة لك: لا تخف من المحطة الطرفية، بل اجعلها صديقك. ابدأ بتثبيت fzf اليوم، وخذ 15 دقيقة فقط لتجربة الاختصارات الأساسية (CTRL-R, CTRL-T). أعدك أنك ستتساءل كيف كنت تعمل بدونها كل هذا الوقت.

ويعطيكم ألف عافية يا جماعة.

أبو عمر

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

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

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

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

آخر المدونات

أتمتة العمليات

خوادمنا كانت نسخًا مشوهة: كيف أنقذتنا ‘البنية التحتية كشيفرة’ (IaC) من جحيم الانحراف التكويني؟

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

8 أبريل، 2026 قراءة المزيد
نصائح برمجية

بياناتي كانت تتغير من حيث لا أدري: كيف أنقذتني ‘اللامتغيرية’ (Immutability) من جحيم الآثار الجانبية الخفية؟

في هذه المقالة، أشارككم قصة حقيقية من تجربتي كمبرمج عن معاناتي مع بيانات تتغير بشكل غامض، وكيف كان مفهوم "اللامتغيرية" (Immutability) هو طوق النجاة الذي...

8 أبريل، 2026 قراءة المزيد
خوارزميات

البحث في قوائمي المرتبة كان يزحف: كيف أنقذني ‘البحث الثنائي’ من جحيم البطء الخطي؟

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

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

ميزانيتنا كانت تحترق: كيف أنقذتنا ‘نماذج الإحالة’ (Attribution Models) من جحيم تخمين القنوات الرابحة؟

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

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

من فوضى المكونات إلى نظام التصميم المتكامل: قصتنا لإنقاذ واجهات المستخدم من جحيم التضارب

أشارككم تجربتي كـ "أبو عمر" في الانتقال من واجهات فوضوية ومكررة إلى بيئة عمل منظمة بفضل "نظام التصميم". سنغوص في رحلتنا لبناء هذا النظام من...

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