يا جماعة الخير، السلام عليكم ورحمة الله وبركاته. معكم أخوكم أبو عمر.
قبل كم سنة، كنت شغال على مشروع ضخم ومعقد لأحد العملاء. كانت الساعة تقارب الثانية صباحاً، وأنا بحاول أحل مشكلة عويصة في واحد من السيرفرات. متذكر إني كتبت أمر `docker` معقد قبل كم يوم، فيه سلسلة طويلة من الـ parameters والـ volumes… أمر من اللي بياخذوا وقت لتكتبهم صح. قلت لحالي بسيطة، بنلاقيها في الـ `history`.
وبلشت رحلة العذاب. كتبت `history | grep docker`. طلعلي مئات الأسطر. طيب، خليني أكون أدق شوي. `history | grep docker-compose`. برضه قائمة طويلة. صرت أمرر بعيوني على الشاشة سطر سطر، وأنا حاسس بالإحباط بزيد مع كل ثانية بتمر. القهوة اللي جنبي بردت، وتركيزي بلش يضيع. حسيت حالي بدور على إبرة في كومة قش، أو زي ما بحكوها عنا في فلسطين “بدور على جمل إبره”.
نفس السيناريو تكرر لما كنت بدي أبحث عن ملف إعدادات معين اسمه غريب شوي. استخدمت الأمر التقليدي `find . -name “*db-config*.yml”`. والمشروع كان كبير جداً، فالأمر أخذ وقت طويل لدرجة إني رحت عملت كاسة شاي ورجعت ولسه ببحث. في هذيك اللحظة، قلت لحالي: “مستحيل! لازم يكون في طريقة أحسن من هيك”. ومن هنا بدأت رحلتي مع منقذي، أداة `fzf`.
ما هي fzf؟ السحر في سطر الأوامر
fzf هي اختصار لـ “Fuzzy Finder”، وهي أداة سطر أوامر تفاعلية وخارقة السرعة. فكرتها بسيطة لكن عبقرية: بدل ما تبحث عن تطابق كامل ودقيق للنص، هي بتبحث “بشكل تقريبي” أو “ضبابي” (Fuzzy). يعني لو بدك تبحث عن ملف اسمه `docker-compose.prod.yml`، بكفي تكتب `dckrprod` وهي راح تلاقيه فوراً!
الأداة بتشتغل كـ “فلتر” تفاعلي. بتعطيها أي قائمة من الأسطر (سجل الأوامر، أسماء ملفات، فروع git، أي شي)، وهي بتفتح واجهة بحث بسيطة وسريعة جداً، بتفلتر النتائج وأنت بتكتب، وبتخليك تختار اللي بدك ياه بسهولة.
ثورة في سجل الأوامر: وداعاً `history | grep`
أول وأهم استخدام غير حياتي هو البحث في سجل الأوامر. بعد تثبيت `fzf` وإعدادها مع الـ shell تبعك (سواء Bash أو Zsh)، كل اللي عليك تعمله هو تضغط `Ctrl+R`.
بدل واجهة البحث العكسي القديمة والمحدودة، راح تظهر لك قائمة بكل سجل الأوامر تبعك، مع شريط بحث في الأسفل. ابدأ اكتب أي جزء من الأمر اللي بتتذكره، وشوف السحر!
# فقط اضغط Ctrl+R في الـ Terminal
# وابدأ بالكتابة... مثلاً: "k get pods"
# ستظهر لك كل الأوامر التي تحتوي على هذه الكلمات، حتى لو لم تكن بالترتيب
> kubectl get pods --all-namespaces
> kubectl logs -f my-pod-12345 -c my-container
> helm get values my-release
الجميل في الموضوع أنك ترى النتائج تتغير مباشرة مع كل حرف تكتبه. وجدت الأمر الذي تريده؟ ببساطة تحرك بالأسهم واختره واضغط `Enter` لتنفيذه فوراً.
نصيحة من أبو عمر
الـ `Ctrl+R` هي الحركة اللي بستخدمها مئات المرات في اليوم. صارت جزء من ذاكرتي العضلية. لا تستهين بقوتها، فهي توفر دقائق ثمينة كل يوم، وهذه الدقائق تتراكم لساعات على مدار الشهر.
البحث عن الملفات بسرعة البرق: بديل `find` التفاعلي
هل تذكرون معاناتي مع الأمر `find` البطيء؟ `fzf` تقدم حلاً عبقرياً لهذه المشكلة أيضاً. بالضغط على `Ctrl+T`، تفتح `fzf` واجهة بحث لكل الملفات والمجلدات في مسارك الحالي (بشكل recursive).
بمجرد ما تبدأ تكتب اسم الملف، حتى لو بشكل متقطع، ستظهر لك النتائج فوراً. عند اختيار الملف والضغط على `Enter`، سيتم إدراج مسار الملف مباشرة في سطر الأوامر مكان المؤشر.
مثلاً، لو أردت فتح ملف في محرر النصوص `vim`:
- اكتب `vim ` (مع مسافة).
- اضغط `Ctrl+T`.
- ستظهر واجهة `fzf`. ابدأ بكتابة جزء من اسم الملف، مثلاً `serv conf`.
- ستجد `fzf` ملفاً مثل `src/api/services/user_service_config.json`.
- اختره واضغط `Enter`.
سيصبح الأمر في الـ terminal هكذا، جاهزاً للتنفيذ:
$ vim src/api/services/user_service_config.json
هذا أسرع بكثير من كتابة المسار يدوياً أو استخدام `Tab` completion عدة مرات.
قدرات خارقة مع الأنابيب (Pipes) والبرامج الأخرى
هنا تكمن القوة الحقيقية لـ `fzf`. كونها تعمل كفلتر، يمكنك دمجها مع أي أمر آخر باستخدام الأنابيب (`|`). الاحتمالات لا حصر لها، وهذه بعض الأمثلة التي أستخدمها يومياً:
إدارة عمليات النظام (`kill`) بذكاء
بدلاً من `ps aux | grep node` ثم نسخ الـ PID يدوياً، يمكننا عمل التالي:
# ابحث عن عملية، اخترها، ثم اقتلها
ps -ef | fzf | awk '{print $2}' | xargs kill -9
شرح الأمر:
- `ps -ef`: يعرض كل العمليات الجارية.
- `| fzf`: يمرر هذه القائمة إلى `fzf` لتختار منها سطراً (العملية التي تريدها).
- `| awk ‘{print $2}’`: يأخذ السطر الذي اخترته ويستخرج منه الحقل الثاني فقط (وهو الـ PID).
- `| xargs kill -9`: يمرر الـ PID إلى الأمر `kill` لإغلاق العملية.
التنقل بين فروع `git` كالمحترفين
إذا كنت تعمل في مشروع فيه الكثير من فروع `git`، فإن تذكر أسمائها كاملة متعب. `fzf` تحل هذه المشكلة:
# اعرض كل الفروع، اختر واحداً، وانتقل إليه
git branch | fzf | xargs git checkout
يمكنك حتى إنشاء `alias` في ملف `.zshrc` أو `.bashrc` لتسهيل الأمر:
alias gco_f="git branch | fzf | xargs git checkout"
الآن، فقط اكتب `gco_f` وستحصل على قائمة تفاعلية لاختيار الفرع. خلصنا!
البحث داخل محتوى الملفات مع ميزة المعاينة (Preview)
هذه من أروع الميزات. يمكنك إعداد `fzf` لعرض معاينة للنتيجة التي تقف عليها. عند دمجها مع أدوات مثل `ripgrep` (بديل `grep` السريع) و `bat` (بديل `cat` الملون)، تحصل على أداة بحث في محتوى الملفات لا تقدر بثمن.
# ابحث عن كلمة "database_url" في كل الملفات، واعرض معاينة للملف
rg --line-number "database_url" | fzf --preview "bat --color=always {+1} --highlight-line {2}"
هذا الأمر قد يبدو معقداً، لكنه يفتح لك واجهة `fzf` تعرض الملفات والأسطر التي تحتوي على “database_url”، وعلى يمين الشاشة، ترى محتوى الملف نفسه مع تظليل للسطر الذي يهمك. هذا يغير قواعد اللعبة تماماً عند تصحيح الأخطاء أو استكشاف الكود.
التثبيت والإعداد: خطوات بسيطة لنتائج عظيمة
تثبيت `fzf` سهل جداً على معظم الأنظمة:
- macOS (باستخدام Homebrew):
brew install fzf - Debian/Ubuntu:
sudo apt-get install fzf - Arch Linux:
sudo pacman -S fzf
بعد التثبيت، يجب أن تشغل سكربت الإعداد ليقوم بربط الأداة مع الـ shell لديك:
$(brew --prefix)/opt/fzf/install
# أو
/usr/share/fzf/install.sh # حسب نظامك
سيقوم هذا السكربت بسؤالك إذا كنت تريد تفعيل الاختصارات (`Ctrl+R`, `Ctrl+T`, etc.) وإضافة الإعدادات اللازمة لملف `.bashrc` أو `.zshrc` الخاص بك. وافق على كل شيء، ثم أعد تشغيل الـ terminal أو نفّذ `source ~/.bashrc`.
خلاصة القول: `fzf` ليست مجرد أداة، بل عقلية جديدة 💡
في النهاية، `fzf` غيرت علاقتي مع سطر الأوامر. حولته من مكان مخيف وبطيء إلى بيئة عمل سريعة، تفاعلية، ومنتجة. لم أعد أخشى نسيان الأوامر المعقدة أو البحث عن ملفات ضائعة في مشاريع عملاقة.
نصيحتي الأخيرة لك: لا تنظر إلى `fzf` على أنها مجرد أداة أخرى لتتعلمها. انظر إليها كاستثمار صغير في وقتك سيعود عليك بإنتاجية هائلة وراحة بال لا تقدر بثمن. استثمر ساعة واحدة في تعلم أساسياتها ودمجها في سير عملك، وصدقني، ستشكرني لاحقاً.
والله ولي التوفيق. في أمان الله. 😉