كنا نغرق في تاريخ الأوامر: كيف أنقذنا ‘البحث المضبب’ (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 وتعلم أساسياته. أعدك أنها ستكون من أفضل الساعات التي استثمرتها في تطوير مهاراتك على سطر الأوامر. ستتوقف عن “الغرق” في تاريخ الأوامر، وستبدأ “بالإبحار” بثقة وسرعة.

أبو عمر

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

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

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

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

آخر المدونات

الحوسبة السحابية

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

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

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

مقابلاتي التقنية كانت كارثة: كيف أنقذني ‘التفكير بصوت عالٍ’ من جحيم الفشل؟

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

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

كان مستخدمونا في الطرف الآخر من العالم ينتظرون إلى الأبد: كيف أنقذتنا شبكات توصيل المحتوى (CDN) من جحيم زمن الاستجابة المرتفع؟

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

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

من شبكة مثقوبة إلى حصن منيع: كيف أنقذتنا قواعد البيانات الرسومية من كابوس الاحتيال؟

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

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

ميزانيات الخطأ (Error Budgets): كيف أنهت كابوس مكالمات منتصف الليل وأنقذتنا من الإرهاق؟

كنا غارقين في مكالمات طوارئ ليلية لا تنتهي، فريق منهك والمنتج على المحك. في هذه المقالة، أشارككم قصة كيف أنقذنا مفهوم "ميزانيات الخطأ" (Error Budgets)...

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

كانت اجتماعاتنا الفردية استجواباً صامتاً: كيف حولنا الـ 1-on-1 من تقرير حالة ممل إلى محرك لنمو الفريق؟

أشارككم تجربتي كقائد فريق تقني في تحويل الاجتماعات الفردية (1-on-1s) من جلسات استجواب مملة إلى محادثات مثمرة تساهم في بناء الثقة وتطوير الفريق. هذه المقالة...

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

كانت اختباراتنا تصرخ ‘الذئب’: كيف قضينا على ‘الاختبارات المتقلبة’ (Flaky Tests) واستعدنا الثقة في خطوط الأنابيب؟

في هذه المقالة، أشارككم قصة من أرض المعركة البرمجية، وكيف تغلب فريقي على كابوس "الاختبارات المتقلبة" أو Flaky Tests. سنغوص في أسبابها الخفية، ونتعلم استراتيجيات...

30 مايو، 2026 قراءة المزيد
أدوات وانتاجية

كانت أصابعي تصرخ من التكرار: كيف أنقذتني ‘مقتطفات الشفرة’ (Code Snippets) من جحيم كتابة Boilerplate؟

أشارككم قصتي مع التكرار الممل في البرمجة وكيف غيرت "مقتطفات الشفرة" (Code Snippets) طريقة عملي تماماً. دليل عملي من مبرمج فلسطيني لزيادة إنتاجيتك والتخلص من...

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

كانت تبعياتنا قنبلة موقوتة: كيف أنقذنا ‘التحديث الآلي للتبعيات’ من جحيم الثغرات الأمنية المنسية؟

أشارككم قصة حقيقية عن ليلة كادت فيها ثغرة أمنية في إحدى المكتبات المنسية أن تدمر مشروعنا بالكامل. اكتشفوا معنا كيف تحولنا من الفوضى إلى الأمان...

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