يا جماعة الخير، السلام عليكم ورحمة الله. معكم أخوكم أبو عمر.
قبل كم سنة، كنت غرقان لشوشتي في مشروع ذكاء اصطناعي معقد. كان لازم أسلّم نسخة تجريبية للعميل، والسيرفر اللي بنشتغل عليه كان عامل فينا العجايب. في نص الليل، والقهوة صارت زي المي، اكتشفت إنه في خطأ في إحدى حاويات Docker اللي بتشغّل النموذج التدريبي. بتذكر إني كتبت أمر معقد قبل أسبوعين عشان أشغّل الحاوية بإعدادات معينة… بس شو هو الأمر؟ يا ويلي!
قعدت نص ساعة زي الأهبل وأنا أضغط `Ctrl+R` وأكتب `docker` وأقلّب في تاريخ الأوامر اللي طوله ألف ميل. فتحت ملفات الملاحظات، دورت في محادثات الفريق… فش إشي! شعور العجز والإحباط وقتها كان قاتل. حسيت إنه ذاكرتي زي “الغربال المثقوب”، كل إشي بمرق منها. في هذيك اللحظة، قررت إنه “لهون وبس”. لازم ألاقي حل يرحمني من هالمعاناة. ومن هنا بدأت رحلتي مع الأداة اللي غيرت حياتي في الطرفية: FZF.
ما هي أداة FZF؟ البحث الضبابي في أبهى صوره
بكل بساطة، FZF هي اختصار لـ “Fuzzy Finder” أو “الباحث الضبابي”. فكر فيها كأداة بحث خارقة للطرفية. “ضبابي”؟ شو يعني؟ يعني مش لازم تكتب الكلمة بالضبط عشان تلاقيها. لو بتبحث عن ملف اسمه `docker-compose.prod.yml`، بكفي تكتب `dckr prod` و FZF راح تفهم عليك وتلاقيه فوراً.
هي مش مجرد أداة للبحث عن ملفات، بل هي فلسفة كاملة للتعامل مع أي قائمة من النصوص في الطرفية: تاريخ الأوامر، أسماء الملفات، فروع Git، العمليات (processes)، أي إشي ممكن تفكر فيه.
البداية: كيف تثبّت FZF وتُطلق العنان لسحرها؟
التثبيت أسهل من شرب المي. افتح الطرفية (Terminal) وجرّب واحد من هالأوامر حسب نظامك:
التثبيت على macOS (باستخدام Homebrew)
brew install fzf
التثبيت على Linux (باستخدام APT لـ Debian/Ubuntu)
sudo apt-get install fzf
التثبيت من المصدر (لأي نظام)
هاي الطريقة اللي بفضلها شخصياً لأنها بتضمنلك آخر نسخة:
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
بعد ما تشغّل أمر التثبيت، راح يسألك السكريبت كم سؤال. جاوب “y” (نعم) على كل الأسئلة. هاي الخطوة مهمة جداً لأنها بتفعّل التكامل التلقائي مع الـ Shell تبعك (Bash أو Zsh) وبتضيف الاختصارات السحرية زي `Ctrl+R` و `Ctrl+T`.
بعدها، سكّر الطرفية وافتحها من جديد، وهيك بتكون جاهز للانطلاق.
القوة الحقيقية لـ FZF: تطبيقات غيرت حياتي كمبرمج
هون بتبلش الحفلة. FZF مش مجرد أمر بتكتبه، هي مجموعة من الأدوات اللي بتندمج مع سير عملك اليومي.
البحث في تاريخ الأوامر (Ctrl+R): وداعاً لذاكرتي المثقوبة!
هاي لحالها بتستاهل تثبيت الأداة. انسى الـ `Ctrl+R` التقليدية المملة. الآن، لما تضغط `Ctrl+R`، راح تفتحلك واجهة تفاعلية فيها كل تاريخ أوامرك. ابدأ اكتب أي جزء من الأمر اللي بدك إياه، وشوف كيف FZF بتفلتر النتائج فوراً.
تخيل الموقف اللي حكيتلكم عنه في البداية. بدل ما أضيّع نص ساعة، كان بكفي أضغط `Ctrl+R` وأكتب `docker my_image`، وخلال ثانية واحدة كان الأمر المعقد اللي نسيته راح يظهر قدامي. يا الله على الراحة النفسية!
البحث عن الملفات والمجلدات (Ctrl+T): أسرع من أي مدير ملفات
كم مرة كنت بدك تفتح ملف معين بس نسيت هو بأي مجلد؟ مع FZF، اضغط `Ctrl+T` في أي مكان في الطرفية. راح تفتحلك قائمة بكل الملفات والمجلدات في مسارك الحالي. اكتب جزء من اسم الملف، اضغط Enter، وراح يتم إدراجه مباشرة في سطر الأوامر.
مثال عملي: بدي أعدّل ملف الإعدادات في مشروعي.
# بدل ما أكتب المسار الطويل
vim src/config/production/settings.json
# الآن أكتب فقط:
vim
التنقل بين المجلدات بذكاء (ALT+C): قفزة سريعة للمجلد المطلوب
هذا الاختصار مخصص لتغيير المجلدات. اضغط `Alt+C` (أو `Esc` ثم `C` إذا كان `Alt` ما بشتغل عندك) وابدأ بكتابة اسم المجلد اللي بدك تروح عليه. FZF راح يبحث في كل المجلدات الفرعية ويسمحلك تقفز مباشرة للمجلد المطلوب بضغطة زر.
التكامل مع الأوامر الأخرى: هنا يكمن السحر الحقيقي
جمال FZF الحقيقي بيظهر لما تستخدمها مع أوامر تانية باستخدام الـ “pipe” (`|`). المبدأ بسيط: أي أمر بيطلع قائمة من الأسطر، بتقدر “ترميه” على FZF عشان تختار منه بشكل تفاعلي.
مثال 1: إدارة فروع Git بسهولة
بدك تنتقل لفرع معين بس ناسي اسمه بالضبط؟ بسيطة.
# اعرض كل الفروع، اختر واحد باستخدام fzf، ثم انتقل إليه
git branch | fzf | xargs git checkout
شرح الأمر: `git branch` بيعرض الفروع، `| fzf` بخليك تختار فرع، `| xargs git checkout` بياخد الفرع اللي اخترته وبمرره لأمر `git checkout`.
مثال 2: قتل العمليات (Processes) المزعجة
عندك عملية معلّقة وبدك توقفها؟
# اعرض كل العمليات، اختر واحدة، ثم اقتلها
ps -ef | fzf | awk '{print $2}' | xargs kill -9
شرح الأمر: `ps -ef` بيعرض العمليات، `fzf` للاختيار، `awk ‘{print $2}’` لجلب رقم العملية (PID)، و `xargs kill -9` لإرسال إشارة القتل.
مثال 3: إدارة حاويات Docker
نرجع لمثالنا الأول. لو بدي أوقف حاوية معينة:
# اعرض الحاويات الشغالة، اختر واحدة، ثم أوقفها
docker ps | fzf | awk '{print $1}' | xargs docker stop
نصائح أبو عمر الذهبية لتحقيق أقصى استفادة من FZF
بعد سنين من الاستخدام اليومي، هاي شوية أسرار ونصايح من القلب:
- استخدم المعاينات (Previews): هاي أقوى ميزة في FZF برأيي. بتقدر تخلي FZF يعرضلك محتوى الملف اللي مؤشر عليه وأنت بتبحث! ضيف هذا السطر لملف الإعدادات تبع الـ Shell (مثل `.zshrc` أو `.bashrc`):
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border --preview "bat --color=always --style=numbers --line-range=:500 {}"'(هذا المثال بيستخدم أداة `bat` لعرض الملفات بشكل جميل. لو مش مثبتة عندك، استخدم `cat` بدالها: `–preview ‘cat {}’`)
- ابنِ اختصاراتك الخاصة: لا تتقيد بالوضع الافتراضي. أنا مثلاً عملت دالة (function) في ملف `.zshrc` عشان أبحث في سجل Git وأنسخ الـ hash تبع الـ commit بضغطة زر.
# دالة للبحث في سجل git log f_git_log() { git log --graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr" "$@" | 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') << 'FZF-EOF' {} FZF-EOF" }لا تخاف من شكل الكود، الفكرة هي إنه بتقدر تخصص كل شي حسب احتياجك.
- جرّب وخبّص: أفضل طريقة للتعلم هي التجربة. أي أمر بيخطر على بالك بيطلع قائمة؟ جرّب اعمل له `pipe` لـ `fzf`.
ls -la | fzf history | fzf cat ~/.ssh/known_hosts | fzfراح تتفاجأ بكمية الأشياء اللي ممكن تعملها.
الخلاصة: ذاكرة خارجية لعقلك في الطرفية 🧠
في عالم البرمجة، عقلنا هو أهم أداة عنا، بس ذاكرتنا مش دايماً بتسعفنا. FZF بالنسبة إلي هي بمثابة “ذاكرة خارجية” بتشتغل وقت ما أحتاجها. حولت الطرفية من مكان بخاف أنسى فيه الأوامر لمساحة عمل ذكية وسريعة.
نصيحتي الأخيرة إلك: لا تترك ذاكرتك تخونك مرة أخرى في أوقات حرجة. أعطِ FZF فرصة حقيقية لمدة أسبوع واحد بس. استخدمها لكل شي. أوعدك يا صاحبي، مش بس راح تدعيلي، بل راح تصير تتساءل كيف كنت عايش من دونها. يلا، شد حيلك وثبّتها الآن!