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

أذكرها وكأنها البارحة، ليلة شتوية باردة في مكتبي الصغير، وأنا أحاول إصلاح علّة (bug) مستعصية في نظام معقد نعمل عليه. كان الضغط عالياً، والموعد النهائي للتسليم يقترب بسرعة “زي الصاروخ”. كنت أعرف أنني كتبت دالة معينة تحل جزءاً من المشكلة في ملف ما… لكن أي ملف؟ هل كان اسمه `utils/helpers.js` أم `lib/auth_utils.js`؟ أم ربما شيء آخر تماماً؟

بدأت رحلة العذاب. جربت الأمر find . -name "*util*.js"، فظهرت لي قائمة طويلة من الملفات. ثم جربت grep -r "functionName" . ولكنني لم أكن متأكداً من اسم الدالة بالضبط. قضيت دقائق ثمينة، بدت وكأنها ساعات، وأنا أتنقل بين الملفات وأفتحها وأغلقها. ثم انتقلت إلى سجل الأوامر (history) باستخدام Ctrl+R لأبحث عن أمر docker معقد كنت قد استخدمته قبل يومين. يا زلمة، شو هالإحباط! كلما كتبت جزءاً من الأمر، كان يظهر لي أمر آخر لا علاقة له بما أريد. شعرت حينها أن محطتي الطرفية (Terminal) ليست نافذتي إلى النظام، بل هي مقبرة حقيقية أدفن فيها وقتي وإنتاجيتي.

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

ما هو البحث الضبابي (Fuzzy Finding)؟

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

فكر في الأمر بهذه الطريقة:

  • البحث التقليدي (مثل grep): إذا بحثت عن “abc”، فإنه سيبحث عن التسلسل “abc” بالضبط.
  • البحث الضبابي: إذا بحثت عن “abc”، فإنه سيبحث عن الملفات أو الأسطر التي تحتوي على “a”، ثم “b” بعدها (ليس بالضرورة مباشرة)، ثم “c” بعدها.

على سبيل المثال، البحث عن "fzf" باستخدام البحث الضبابي قد يطابق:

  • **f**iles/my**z**ip/**f**ile.txt
  • **f**ind-**z**en-**f**ormat.sh
  • **fzf**_is_awesome.md

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

تقديم الأداة السحرية: fzf

fzf هي أداة سطر أوامر مفتوحة المصدر، مكتوبة بلغة Go (وهذا سر سرعتها الفائقة)، تقوم بتطبيق مفهوم البحث الضبابي على أي قائمة من المدخلات. يمكنها أن تقرأ من مخرجات أمر آخر (pipe)، وتعرض لك واجهة تفاعلية للبحث، ثم تطبع السطر الذي اخترته كخرج لها.

هذا يعني أنه يمكنك دمجها مع أي أداة سطر أوامر تقريباً: find, ls, git, ps, history… أي شيء يخطر ببالك!

تثبيت fzf: خطوتك الأولى نحو الإنتاجية

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

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

# لمستخدمي Homebrew على macOS أو Linux
$(brew --prefix)/opt/fzf/install

# لمستخدمي Linux (إذا لم يعمل تلقائياً)
/usr/share/fzf/install

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

كيف غيرت fzf طريقة عملي اليومية؟

هنا يبدأ السحر الحقيقي. لم تعد fzf مجرد أداة، بل أصبحت جزءاً لا يتجزأ من ذاكرتي العضلية. إليك بعض الأمثلة العملية التي أستخدمها يومياً.

1. البحث في سجل الأوامر (History) كالمحترفين

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

هل تبحث عن أمر docker run طويل ومعقد استخدمته الأسبوع الماضي؟ فقط اضغط Ctrl+R واكتب "dckr run my-image". ستجد الأمر في لمح البصر.

2. البحث عن الملفات وفتحها بسرعة البرق

هل تذكر قصتي في البداية؟ الآن، بدلاً من استخدام find و grep، كل ما أفعله هو كتابة أمر بسيط في محطتي الطرفية:

# لفتح ملف باستخدام محرر Vim
vim $(fzf)

# أو باستخدام VS Code
code $(fzf)

بمجرد تنفيذ الأمر، تظهر واجهة fzf التي تبحث في كل الملفات والمجلدات الفرعية. أكتب بضعة أحرف مثل "auth util"، وسيظهر الملف lib/auth_utils.js فوراً. أضغط Enter، ويتم فتحه مباشرة في المحرر.

نصيحة أبو عمر: قم بإنشاء اختصارات (aliases) لهذه الأوامر الشائعة في ملف الإعدادات الخاص بالـ shell (مثل ~/.zshrc أو ~/.bashrc) لتوفير المزيد من الوقت.

# اختصار لفتح ملف في Vim
alias vf="vim $(fzf)"

# اختصار لفتح ملف في VS Code
alias cf="code $(fzf)"

3. التنقل بين المجلدات بذكاء

الأمر cd أصبح أكثر ذكاءً. بدلاً من كتابة cd ../../long/path/to/something، يمكنك استخدام fzf للبحث عن المجلد الذي تريده.

يمكنك إنشاء دالة بسيطة لهذا الغرض:

# أضف هذه الدالة إلى ملف .zshrc أو .bashrc
fcd() {
  local dir
  dir=$(find ${1:-.} -path '*/.*' -prune 
                  -o -type d -print 2> /dev/null | fzf +m) &&
  cd "$dir"
}

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

4. التكامل مع Git: قوة لا يستهان بها

هنا تتألق fzf حقاً. يمكنك دمجها مع Git لتسهيل المهام المتكررة بشكل لا يصدق.

  • الانتقال بين الفروع (Branches):

    # يعرض لك قائمة بالفروع للبحث فيها والانتقال إليها
    git checkout $(git branch | sed 's/*//' | fzf)
  • استعراض سجل التعديلات (Log) بشكل تفاعلي:

    # يعرض لك سجل التعديلات، ويمكنك اختيار تعديل معين لعرض تفاصيله
    git show $(git log --oneline | fzf | awk '{print $1}')
  • إضافة الملفات إلى الـ Staging Area بشكل انتقائي:

    # يعرض الملفات التي تم تعديلها لتختار منها ما تريد إضافته
    git add $(git status -s | fzf -m | awk '{print $2}')

5. إدارة العمليات (Processes) بسهولة

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

# يعرض العمليات الجارية، ابحث عن العملية التي تريدها، واضغط Enter لإيقافها
kill -9 $(ps -ef | fzf | awk '{print $2}')

نصائح أبو عمر الذهبية لتخصيص fzf 🏆

القوة الحقيقية لـ fzf تكمن في قابليتها للتخصيص. إليك بعض الإعدادات التي أستخدمها شخصياً والتي أنصح بها بشدة:

  1. استخدام أداة بحث أسرع:
    بشكل افتراضي، تستخدم fzf الأمر find للبحث عن الملفات. يمكنك جعلها أسرع بكثير باستخدام أدوات مثل fd أو ripgrep (rg).

    # استخدم fd للبحث عن الملفات (أسرع بكثير من find)
    export FZF_DEFAULT_COMMAND='fd --type f'
  2. تفعيل ميزة المعاينة (Preview):
    هذه الميزة “قاتلة”! يمكنك رؤية محتوى الملف الذي تحدده مباشرة داخل واجهة fzf. هذا يوفر عليك عناء فتح الملفات الخاطئة.

    # أضف هذا إلى إعداداتك لاستخدام أداة bat (بديل cat مع تلوين للكود) للمعاينة
    export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border --preview "bat --color=always --style=numbers --line-range=:500 {}"'

    الآن، أثناء تصفحك للملفات، سترى معاينة جميلة وملونة لمحتوى كل ملف على الجانب!

الخلاصة: استثمر في أدواتك، فهي تستحق!

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

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

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

أبو عمر

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

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

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

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

آخر المدونات

الشبكات والـ APIs

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

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

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

تطبيقنا كان رهينة منطقة جغرافية واحدة: كيف أنقذتنا استراتيجية ‘متعددة المناطق’ (Multi-Region) من جحيم الانقطاع الكامل؟

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

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

حسابي في GitHub كان مقبرة صامتة: كيف أنقذني ‘ملف التعريف المميّز’ من جحيم التجاهل؟

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

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

عطل خدمة واحدة كاد ينسف النظام: كيف أنقذنا نمط “قاطع الدائرة” من جحيم الأعطال المتتالية؟

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

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

بنيتنا التحتية كانت قصرًا من رمال: كيف أنقذنا Terraform من جحيم التكوين اليدوي والانحراف الصامت؟

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

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

اختبار الانحدار البصري: كيف أنقذنا واجهاتنا من جحيم الأخطاء المرئية الصامتة؟

أشارككم قصة من قلب المعركة مع الأخطاء المرئية غير المتوقعة، وكيف أصبح "اختبار الانحدار البصري" (Visual Regression Testing) درعنا الواقي. اكتشفوا معنا هذه التقنية، وأشهر...

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

تقاريرنا كانت سجينة أنظمة قديمة: كيف أنقذتنا ‘أتمتة العمليات الروبوتية’ (RPA) من جحيم الاستخراج اليدوي للبيانات؟

أشارككم قصة حقيقية من واقع عملي كمبرمج، وكيف حررنا بياناتنا من سجون الأنظمة القديمة (Legacy Systems) باستخدام أتمتة العمليات الروبوتية (RPA). اكتشفوا كيف يمكن لهذه...

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