قبل عدة سنوات، كنت غارقاً في أحد المشاريع المعقدة. كان يوم جمعة، والقهوة لم تعد تجدي نفعاً، وأنا أحاول نشر تحديث طارئ على خوادم الإنتاج. أتذكر جيداً أنني استخدمت أمراً معقداً في `docker` قبل أسابيع، أمر يحتوي على ربط لمنافذ معينة، وربط لمجلدات محلية، مع تمرير متغيرات بيئة… باختصار، “خلطة” طويلة عريضة من الصعب تذكرها.
بدأت رحلة العذاب المعتادة. السهم العلوي… كمان مرة… كمان مرة… لا، هذا أمر مختلف. طيب، لنجرب `history | grep ‘docker’`. ظهرت أمامي قائمة طويلة من الأوامر، معظمها لا علاقة له بما أبحث عنه. شعرت بالإحباط يتسلل إليّ، ولسان حالي يقول: “يا زلمة، معقول ما في طريقة أسهل من هيك؟ معقول كل خبرتي هاي ولساتني بعاني من شغلة بسيطة زي هاي؟”. في تلك اللحظة، كانت ذاكرتي هي أملي الوحيد، وللأسف، كانت ذاكرتي تخونني.
هذه الحادثة، وغيرها الكثير، كانت الشرارة التي دفعتني للبحث عن حل جذري. لم أكن أبحث عن أداة، بل عن راحة بال. كنت أبحث عن طريقة تجعلني أركز على حل المشكلة، لا على تذكر صيغة الأمر. وهنا كان لقائي الأول مع ما يسمى بـ “الباحث الضبابي” (Fuzzy Finder)، وتحديداً أداة غيّرت علاقتي بالطرفية إلى الأبد: `fzf`.
ما هو الباحث الضبابي (Fuzzy Finder)؟ وليش بنحتاجه؟
لنبسّط الأمور. محركات البحث التقليدية (مثل `grep` أو البحث في محرر النصوص `Ctrl+F`) تبحث عن تطابق تام أو نمط محدد. إذا كتبت “start” فهي تبحث عن كلمة “start” بالضبط.
الباحث الضبابي، من ناحية أخرى، أذكى من ذلك. هو يبحث عن “شبه تطابق”. يمكنك كتابة أحرف متفرقة من الكلمة أو الجملة التي تبحث عنها، وهو سيجد كل النتائج التي تحتوي على هذه الأحرف بنفس الترتيب، حتى لو كانت بينها أحرف أخرى.
على سبيل المثال، للبحث عن الأمر `docker-compose up –build`، بدلًا من كتابة الجملة كاملة، يمكنك كتابة `dcupb`، وسيقوم الباحث الضبابي بإظهار الأمر المطلوب فورًا. هذا هو سحر “الضبابية”: أنت تعطيها تلميحاً، وهي تفهم ما تقصده.
لقاءنا الأول مع البطل: أداة `fzf`
`fzf` هي أداة سطر أوامر (CLI) مفتوحة المصدر، تعتبر أشهر وأقوى تطبيق لمفهوم الباحث الضبابي. جمالها يكمن في سرعتها الفائقة وقابليتها للتكامل مع أي شيء تقريباً في بيئة يونكس/لينكس.
تثبيت `fzf` (خطوة بخطوة)
التثبيت بسيط جداً على معظم الأنظمة. إليك الطريقة:
- على macOS باستخدام Homebrew:
brew install fzf - على Linux (Debian/Ubuntu) باستخدام apt:
sudo apt-get install fzf - على Linux (Fedora/CentOS) باستخدام dnf:
sudo dnf install fzf
خطوة مهمة جداً: بعد التثبيت، يجب أن تقوم بتشغيل السكريبت المرفق لربط `fzf` مع الـ shell الخاص بك (مثل bash أو zsh) وتفعيل الاختصارات السحرية. فقط قم بتشغيل هذا الأمر وأجب بـ ‘y’ على كل الأسئلة:
$(brew --prefix)/opt/fzf/install # لمستخدمي Homebrew على macOS
/usr/share/fzf/install # لمستخدمي apt على Linux (قد يختلف المسار)
بعد ذلك، أغلق الطرفية وافتحها من جديد، وستكون جاهزاً للانطلاق.
من النظرية للتطبيق: كيف غيّر `fzf` حياتي اليومية؟
هون بتبين القوة الحقيقية. `fzf` ليست مجرد أداة، بل هي “سكين سويسري” للطرفية. إليك بعض الأمثلة العملية من استخدامي اليومي.
استرجاع الأوامر السابقة (وداعاً لـ `Ctrl+R`)
هذا هو الاستخدام الأساسي الذي أنقذني من جحيم البحث في سجل الأوامر. بعد التثبيت، اختصار `Ctrl+R` الذي كان يفتح البحث العكسي المتواضع، سيفتح الآن واجهة `fzf` التفاعلية.
الآن، عندما أريد البحث عن أمر `docker` المعقد ذاك، كل ما أفعله هو الضغط على `Ctrl+R` ثم أبدأ بكتابة أي شيء أتذكره من الأمر، مثلاً `dock port var`. وفي لمح البصر، تتقلص قائمة الأوامر الطويلة لتظهر لي فقط الأوامر التي تطابق بحثي “الضبابي”. أختار الأمر الذي أريده وأضغط `Enter`، وها هو يظهر في الطرفية جاهزاً للتنفيذ أو التعديل.
نصيحة من أبو عمر: بعد اعتيادي على `fzf`، صرت أفكر بالمشكلة التي أريد حلها، وليس بالأمر الذي يجب أن أكتبه. `fzf` تكفّل بمهمة التذكر المملة، وحرر عقلي للتركيز على ما هو أهم.
البحث عن الملفات والمجلدات (أسرع من `find` و `ls`)
`fzf` يأتي مع اختصارات مفيدة أخرى جاهزة للاستخدام:
- `Alt+C` (أو `Option+C` على Mac): هذا الاختصار يفتح `fzf` للبحث عن المجلدات. بمجرد اختيار مجلد، ينتقل بك مباشرة إليه (`cd`). تخيل أنك في مجلد `~` وتريد الانتقال إلى `/var/www/my-project/src/components`. بدلًا من كتابة المسار الطويل، فقط اضغط `Alt+C` واكتب `proj comp`، وسيظهر لك المسار فوراً.
- `Ctrl+T`: هذا الاختصار يفتح `fzf` للبحث عن أي ملف أو مجلد بدءاً من المسار الحالي. بعد اختيار الملف، يتم إدراجه في سطر الأوامر الحالي. هذا مفيد جداً عندما تريد تحرير ملف معين. بدلًا من كتابة `vim src/some/very/long/path/to/file.js`، يمكنك كتابة `vim ` ثم الضغط على `Ctrl+T` والبحث عن `filejs` واختياره.
التكامل مع أدوات أخرى (هون القوة الحقيقية)
جمال `fzf` يكمن في أنه يتبع فلسفة يونكس: “افعل شيئًا واحدًا وأتقنه”. هو يقرأ من المدخلات القياسية (stdin) ويكتب للمخرجات القياسية (stdout). هذا يعني أنه يمكنك دمجه مع أي أداة أخرى باستخدام الأنابيب (`|`).
مثال 1: التعامل مع Git
هل تريد استعراض سجل `git` بشكل تفاعلي والعودة إلى commit معين؟ ضع هذه الدالة في ملف `~/.bashrc` أو `~/.zshrc`:
# دالة للبحث في سجل git واختيار commit معين
gco_interactive() {
git log --oneline --all | fzf --preview "git show {1}" | awk '{print $1}' | xargs git checkout
}
الآن، فقط اكتب `gco_interactive` في الطرفية. ستفتح واجهة `fzf` تعرض لك كل الـ commits، وعندما تتنقل بينها، سترى تفاصيل كل commit في نافذة المعاينة. بمجرد أن تضغط `Enter`، سيتم عمل `checkout` لذلك الـ commit. مذهل، أليس كذلك؟
مثال 2: إدارة حاويات Docker
هل تريد إيقاف حاوية Docker تعمل حالياً ولكنك لا تتذكر اسمها أو الـ ID بالضبط؟
# أمر لإيقاف حاوية Docker بشكل تفاعلي
docker ps | fzf -m | awk '{print $1}' | xargs -r docker stop
هذا الأمر يعرض لك الحاويات التي تعمل، يمررها إلى `fzf`، ثم يمكنك اختيار حاوية (أو عدة حاويات باستخدام `-m`) وإيقافها.
مثال 3: قتل العمليات (Processes)
بدلاً من استخدام `ps aux | grep ‘process_name’` ثم `kill PID`، يمكنك فعل هذا:
# أمر لقتل عملية بشكل تفاعلي
ps -ef | fzf -m | awk '{print $2}' | xargs -r kill -9
نصيحة عملية: لا تكتفِ بالأساسيات. فكر في أي عملية متكررة تقوم بها وتحتاج فيها للاختيار من قائمة (ملفات، commits، حاويات، عمليات، سجلات)، وستجد أن `fzf` غالباً هو الحل الأنيق والسريع.
الخلاصة: ذاكرة خارقة لكل مطور 🧠
في عالمنا الذي يتطلب منا تذكر مئات الأوامر والإعدادات والتفاصيل الصغيرة، تأتي أدوات مثل `fzf` لتكون بمثابة ذاكرة خارجية خارقة. هي لا تجعلك أسرع فحسب، بل تقلل من العبء الذهني (Cognitive Load) وتجعل تجربة العمل على الطرفية أكثر متعة وإنتاجية.
لقد تحولت من شخص كان يخشى نسيان الأوامر ويعتمد على ذاكرته المتقلبة، إلى شخص يثق بأن أي شيء يحتاجه على بعد بضع ضغطات “ضبابية” من أصابعه. `fzf` لم تكن مجرد أداة، بل كانت تغييراً في العقلية: من “يجب أن أتذكر” إلى “يمكنني أن أجد”.
نصيحتي الأخيرة لك: في عالم البرمجة، أفضل أداة هي التي تجعلك تنسى وجودها لأنها أصبحت جزءاً لا يتجزأ منك. `fzf` هي هذه الأداة بالنسبة لي. جرّبها اليوم، وبوعدك رح تدعيلي. 👍