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

أبو عمر

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

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

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

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

آخر المدونات

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

كانت بيئاتنا جزرًا من الفوضى: كيف أنقذتنا “البنية التحتية كشفرة” (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 قراءة المزيد
البودكاست