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

أبو عمر

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

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

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

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

آخر المدونات

البنية التحتية وإدارة السيرفرات

كانت بنيتنا التحتية تتغير من وراء ظهورنا: كيف أنقذنا Terraform من جحيم ‘الانجراف التكويني’؟

في هذه المقالة، أشارككم قصة حقيقية عن معاناة فريقنا مع "الانجراف التكويني" (Configuration Drift) وكيف كانت التغييرات اليدوية تتسبب في كوارث صامتة. سنغوص في عالم...

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

من وهم الـ 100% إلى جودة حقيقية: كيف أنقذتنا اختبارات الطفرات (Mutation Testing) من جحيم المقاييس الخادعة؟

كنا نحتفل بنسبة تغطية اختبارات 100%، لكن الكود كان مليئًا بالعلل الخفية. هذه قصتي كـ"أبو عمر" وكيف كشفت "اختبارات الطفرات" (Mutation Testing) ضعف اختباراتنا وقادتنا...

27 أبريل، 2026 قراءة المزيد
ذكاء اصطناعي

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

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

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

كنا نحرق الذاكرة لحساب المستخدمين الفريدين: كيف أنقذتنا خوارزمية HyperLogLog من جحيم استهلاك الموارد؟

أشارككم قصة حقيقية من الميدان، عندما كادت خوادمنا أن تنهار بسبب عد المستخدمين بالطريقة الساذجة. اكتشفوا معنا خوارزمية HyperLogLog السحرية التي وفرت 99% من الذاكرة...

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

كنا نلاحق الكلمات الطويلة يدوياً: كيف أنقذنا التحسين البرمجي لمحركات البحث (Programmatic SEO) من جحيم الفرص الضائعة؟

أتذكر جيداً أيام الملاحقة اليدوية للكلمات المفتاحية الطويلة، جهدٌ ضائع ووقتٌ مهدر. في هذه المقالة، أشارككم قصة كيف غيّر "التحسين البرمجي لمحركات البحث" (Programmatic SEO)...

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