كنا نغرق في تاريخ الأوامر: كيف أنقذنا ‘البحث المضبب’ (Fuzzy Finder) من جحيم التيرمينال؟

“وين راح هاد الأمر؟”: قصة بدأت بمعاناة وانتهت بحل سحري

يا جماعة الخير، بتذكر قبل كم سنة، كنت شغال على مشروع ضخم ومعقد. كنا بنستخدم Kubernetes لإدارة الحاويات، وكانت الأوامر اللي بكتبها في التيرمينال (سطر الأوامر) طويلة ومعقدة بشكل مش طبيعي. أوامر مثل kubectl logs -f pod-name-xyz-123 -c container-name --since=1h | grep "ERROR" كانت جزء من روتيني اليومي.

في يوم من الأيام، ظهرت مشكلة عويصة في بيئة الاختبار (Staging Environment)، وكنت متأكد إني حليت مشكلة شبيهة إلها قبل أسبوعين باستخدام أمر معين. المشكلة إني مش متذكر الأمر بالضبط. وهون بلشت رحلة العذاب…

قعدت يمكن ربع ساعة وأنا بكبس Ctrl+R بشكل هستيري، بحاول أتذكر أي كلمة من الأمر الطويل هداك. كتبت “kubectl”، “grep”، “logs”… كل مرة كان يطلعلي عشرات الأوامر غير اللي بدي إياه. جربت history | grep kubectl، وطلعتلي قائمة طويلة عريضة، قعدت أقلّب فيها زي المجنون. الوقت بمشي، والضغط بزيد، وأنا حاسس حالي بغرق في بحر من الأوامر القديمة.

زميلي في الفريق، شب أصغر مني بالعمر، شافني “بتشقلب” على الكيبورد. ابتسم وقلي: “أبو عمر، شكلك بتعاني. جربت الـ Fuzzy Finder؟”. بصراحة، وقتها ما كنت بعرف شو هو. شرحلي الفكرة بسرعة، ونزّلنا أداة اسمها fzf. خلال دقيقتين، ربطناها مع تاريخ الأوامر. ضغطت Ctrl+R مرة تانية، وبدل البحث العكسي القديم، طلعتلي واجهة تفاعلية جميلة، فيها كل تاريخ الأوامر تاعي. كتبت كلمتين مش متصلات حتى: “kube err”، وفجأة، وبشكل سحري، ظهر الأمر اللي بدور عليه قدامي!

هداك اليوم، حسيت إني اكتشفت كنز. مش بس حليت المشكلة بسرعة، بل اكتشفت أداة غيرت علاقتي مع سطر الأوامر للأبد. ومن يومها، صرت “أبشّر” فيها لكل مطور بقابله.

ما هو “البحث المضبب” أو الـ Fuzzy Finding؟

قبل ما نغوص في التفاصيل التقنية، خلينا نبسّط المفهوم. البحث التقليدي (مثل grep أو Ctrl+F) يبحث عن تطابق دقيق. لو بحثت عن “أبو عمر”، ما رح يلاقي “ابو عمر” (بدون همزة).

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

باختصار، البحث المضبب يجد ما “تقصده”، وليس فقط ما “تكتبه”.

fzf: بطل الحكاية في عالم سطر الأوامر

fzf هي أشهر وأقوى أداة لتطبيق مفهوم البحث المضبب في سطر الأوامر. هي أداة مكتوبة بلغة Go، سريعة جداً، وتعمل على كل أنظمة التشغيل تقريباً (Linux, macOS, Windows). جمالها يكمن في بساطتها وقدرتها على الاندماج مع أي شيء تقريباً.

تثبيت الأداة (شغلة دقيقتين)

تثبيت fzf سهل جداً. افتح التيرمينال واستخدم مدير الحزم الخاص بنظامك:

  • macOS (باستخدام Homebrew):
brew install fzf

# لتثبيت إضافات الربط التلقائي
$(brew --prefix)/opt/fzf/install
  • Linux (Debian/Ubuntu):
sudo apt-get install fzf
  • Linux (Arch):
sudo pacman -S fzf

بعد التثبيت، عادةً ما يطلب منك تشغيل سكربت التثبيت لربط fzf مع الـ shell (مثل bash أو zsh). وافق على كل الخيارات المقترحة.

الارتقاء بتجربتك: من مبتدئ إلى محترف مع fzf

الآن بعد ما ثبتنا الأداة، خلينا نشوف كيف رح نحول شغلنا من معاناة لمتعة.

المستوى الأول: وداعاً لـ Ctrl+R، ومرحباً بالبحث الخارق!

هذا هو الاستخدام الأساسي اللي حكيت عنه في قصتي. إذا قمت بتشغيل سكربت التثبيت بشكل صحيح، فالمفروض إن اختصار Ctrl+R صار يفتح واجهة fzf تلقائياً.

الآن، بدل ما تكتب جزء من الأمر وتنتظر، صرت تقدر:

  • تكتب أي أجزاء متفرقة من الأمر. مثلاً، للبحث عن git commit -am "fix: a critical bug"، يمكنك فقط كتابة git fix bug.
  • تتنقل بين النتائج بالأسهم بكل سهولة.
  • تضغط Enter لتنفيذ الأمر المختار، أو Ctrl+Y لنسخه إلى سطر الأوامر للتعديل عليه.

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

المستوى الثاني: البحث عن الملفات والمجلدات بسرعة البرق

fzf لا يقتصر على تاريخ الأوامر. يمكن استخدامه للبحث عن أي شيء. افتراضياً، اختصار Ctrl+T يقوم بالبحث عن الملفات والمجلدات في المسار الحالي وإدراج المسار المختار في سطر الأوامر.

جرب الآن: اكتب vim ثم مسافة، ثم اضغط Ctrl+T. ستظهر لك واجهة fzf للبحث عن ملف. ابحث عن اسم الملف، اضغط Enter، وسيتم لصق مسار الملف بعد كلمة vim. إشي خرافي!

نصيحة من أبو عمر: التنقل بين المجلدات بلمح البصر

أمر cd هو من أكثر الأوامر استخداماً. يمكننا إنشاء دالة (function) مخصصة في ملف الإعدادات الخاص بالـ shell (مثل .zshrc أو .bashrc) لتغيير المجلد باستخدام fzf.

# دالة للبحث عن مجلد والتنقل إليه
cdf() {
  local dir
  dir=$(find ${1:-.} -path '*/.*' -prune 
                  -o -type d -print 2> /dev/null | fzf +m) &&
  cd "$dir"
}

بعد إضافة هذا الكود وعمل source ~/.zshrc، يمكنك الآن كتابة cdf في أي مكان، وستظهر لك قائمة بجميع المجلدات الفرعية. اختر المجلد الذي تريده، وسيتم نقلك إليه مباشرة.

المستوى الثالث (الاحترافي): سحر الأنابيب (Pipes) ودمج fzf مع كل شيء

هنا تكمن القوة الحقيقية لـ fzf. يمكن استخدامه كـ “فلتر” تفاعلي لأي خرج (output) من أي أمر آخر باستخدام الأنبوب |.

مثال 1: إدارة فروع Git

بدلاً من كتابة git branch ثم نسخ اسم الفرع ثم كتابة git checkout <branch-name>، يمكننا اختصار كل هذا بأمر واحد. أضف هذا الـ alias إلى ملف الإعدادات:

# alias للانتقال بين فروع git باستخدام fzf
gco() {
  local branches branch
  branches=$(git branch --all | grep -v HEAD) &&
  branch=$(echo "$branches" | fzf-tmux -d 20% -- --reverse) &&
  git checkout "$(echo "$branch" | sed "s/.* //" | sed "s#remotes/[^/]*/##")"
}

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

مثال 2: إيقاف العمليات (Processes)

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

# alias لإيقاف عملية تم اختيارها عبر fzf
fkill() {
    local pid
    pid=$(ps -ef | sed 1d | fzf -m | awk '{print $2}')

    if [ "x$pid" != "x" ]
    then
        echo $pid | xargs kill -${1:-9}
    fi
}

اكتب fkill، ابحث عن اسم العملية التي تريد إيقافها، اخترها، وسيتم قتلها. شغلة مرتبة ونظيفة.

نصائح من مطبخ أبو عمر 🤓

بعد سنوات من استخدام fzf، تعلمت بعض الحيل التي تزيد من فعاليته.

خصص fzf على كيفك

يمكنك تغيير سلوك fzf الافتراضي باستخدام متغيرات البيئة. مثلاً، إذا كان لديك أدوات بحث أسرع مثل ripgrep (rg) أو fd، يمكنك جعل fzf يستخدمها للبحث عن الملفات.

# استخدم fd للبحث عن الملفات (أسرع من find)
export FZF_DEFAULT_COMMAND='fd --type f'

# غير شكل الواجهة والألوان
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'

قوة المعاينة (Preview) التي لا تقدر بثمن

هذه هي الميزة التي تبهر الجميع. يمكنك أن تطلب من fzf عرض معاينة للعنصر الذي تحدده. مثلاً، عند البحث في سجل Git، يمكنك عرض تفاصيل الـ commit مباشرة.

# alias لعرض سجل git مع معاينة تفاعلية
glp() {
  git log --graph --color=always 
      --format="%C(auto)%h%d %s %C(green)(%cr) %C(bold blue)<%an>" "$@" |
  fzf --ansi --no-sort --reverse --tiebreak=index --bind=ctrl-s:toggle-sort 
      --bind "ctrl-m:execute:
                (grep -o '[a-f0-9]{7}' | head -1 |
                xargs -I % sh -c 'git show --color=always % | less -R') < /dev/tty"
}

عند تشغيل glp، سترى سجل Git، وعندما تتنقل بين الـ commits، سترى نافذة معاينة تظهر تفاصيل كل commit. هذا يغير طريقة تصفحك لتاريخ المشروع بالكامل.

الخلاصة: لا تسبح ضد التيار، استخدم fzf 👍

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

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

أبو عمر

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

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

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

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

آخر المدونات

برمجة وقواعد بيانات

كانت تحديثات قاعدة البيانات كابوساً: كيف أنقذتنا أدوات الترحيل (Migrations) من جحيم التعديلات اليدوية؟

هل عانيت يوماً من تحديث مخطط قاعدة البيانات يدوياً بين فريقك؟ أبو عمر يشارككم قصة حقيقية حول كيف غيّرت أدوات الترحيل (Migrations) طريقة عمل فريقه،...

17 مايو، 2026 قراءة المزيد
الشبكات والـ APIs

كانت خوادمنا تستجدي التحديثات: كيف أنقذتنا ‘خطاطيف الويب’ (Webhooks) من جحيم الاستقصاء المستمر (Polling)؟

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

17 مايو، 2026 قراءة المزيد
الحوسبة السحابية

كانت بنيتنا التحتية قصراً من رمال: كيف أنقذتنا “البنية التحتية ككود” (IaC) من جحيم البيئات المتضاربة؟

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

17 مايو، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

كان ملفي الشخصي مقبرة لمشاريع الدورات: كيف أنقذتني ‘المساهمة في المصادر المفتوحة’ من جحيم الرفض التلقائي؟

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

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

كانت قاعدة بياناتنا تتوسل الرحمة: كيف أنقذنا التخزين المؤقت (Caching) من جحيم الاستعلامات البطيئة

قصة حقيقية من واقع العمل عن كيفية انهيار نظامنا تحت ضغط الاستعلامات المتكررة، وكيف كان التخزين المؤقت (Caching) هو طوق النجاة. مقالة عملية للمطورين تشرح...

17 مايو، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

كان التحقق من هوية عملائنا يستغرق أياماً: كيف أنقذنا الذكاء الاصطناعي (eKYC) من جحيم الإجراءات اليدوية؟

بصفتي مبرمجاً فلسطينياً، سأروي لكم حكايتنا مع كابوس التحقق اليدوي من هوية العملاء (KYC) وكيف كانت رحلة الانتقال إلى التحقق الإلكتروني (eKYC) باستخدام الذكاء الاصطناعي...

17 مايو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

كانت أعطالنا تكتشف بعد فوات الأوان: كيف أنقذنا Prometheus من جحيم المراقبة التفاعلية؟

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

17 مايو، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

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

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

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