يا جماعة الخير، السلام عليكم ورحمة الله. معكم أبو عمر.
خليني أحكيلكم قصة صارت معي قبل كم سنة، يومها كنت تقريبًا راح أكسر الكيبورد من كثر العصبية. كنت شغال على مشروع ضخم لعميل مهم، والمشروع كان بيعتمد بشكل كبير على حاويات Docker و Kubernetes. في هذاك اليوم، كنت بعمل deploy لخدمة جديدة وحساسة جدًا، واستخدمت أمر kubectl طويل ومعقد، فيه اسم ملف YAML، واسم namespace معين، وكم argument خاص… يعني سطر أوامر من اللي “بملّي العين”.
المهم، مشي الحال وعملت الـ deploy. بعد حوالي ساعة، طلب مني مدير المشروع أرجع للنسخة القديمة بشكل عاجل عشان مشكلة ظهرت فجأة. قلت في نفسي “بسيطة”، كل اللي عليّ أعمله إني ألاقي الأمر اللي استخدمته قبل شوي وأغير فيه كلمة apply لكلمة delete أو أستخدم أمر الـ rollback. فتحت الطرفية بكل ثقة وكتبت:
history | grep kubectl
وهنا بدأت المأساة. ظهرت أمامي مئات الأسطر! أنا بستخدم kubectl طول اليوم، وكل الأوامر متشابهة. صرت أدور بعيوني زي المجنون، “ولك وينه؟” “مش معقول!”، “يا زلمة هلأ كنت كاتبه!”. كل ما أتذكر جزء من الأمر، أرجع أعمل grep بشكل أدق، لكن بدون فايدة. الوقت بيمر، والضغط بيزيد، وأنا حاسس حالي بدور على إبرة في كومة قش، أو يمكن في مزرعة قش كاملة!
هذاك اليوم، وبعد ما انحلت المشكلة بطريقة أصعب وأطول، أخذت عهد على نفسي: مستحيل أرجع أوقع بنفس الحفرة. ومن هنا بدأت رحلتي مع ما يسمى بالـ “البحث التقريبي” أو الـ Fuzzy Finding.
ما هو الجحيم الذي أتحدث عنه؟ (مشكلة الـ history التقليدية)
كلنا بنعرف أمر history، وكلنا بنعرف اختصار Ctrl+R (reverse-i-search) في الطرفية. هذه الأدوات مفيدة، لكنها محدودة جدًا:
history | grep: الطريقة الكلاسيكية. المشكلة إنك لازم تتذكر كلمة دقيقة من الأمر عشان تلاقيها. لو غلطت بحرف واحد، أو نسيت الكلمة بالضبط، ما راح تلاقي شي. แถม إنها طريقة غير تفاعلية بالمرة.Ctrl+R: أحسن شوي، لكنها برضه بتعتمد على البحث عن سلسلة متطابقة (substring). لو بدك تبحث عن أمر فيه “docker” و “build” و “myapp”، ما بتقدر تكتبهم كلهم. لازم تكتب جزء متواصل من الأمر، ولو ضغطتCtrl+Rمرة ثانية بالغلط، ممكن تضيع النتيجة اللي كنت قريب منها.
باختصار، هذه الطرق بتفترض إن ذاكرتك ممتازة، وهذا إشي مش دايماً صحيح، خصوصًا لما تكون تحت ضغط الشغل.
المنقذ: البحث التقريبي (Fuzzy Finding) وأداة fzf
تخيل معي عالم ثاني. عالم بتقدر فيه تكتب كم حرف متباعد من الأمر اللي بتدور عليه، والنظام ذكي كفاية ليفهم قصدك ويعرض لك أفضل النتائج بشكل فوري وتفاعلي. هذا هو عالم الـ Fuzzy Finding.
الأداة اللي بتعمل هذا السحر اسمها fzf، وهي اختصار لـ “fuzzy finder”. هذه الأداة الصغيرة، اللي كتبها المبرمج الكوري Junegunn Choi، هي حرفيًا أفضل إشي صار للـ Command Line من سنين طويلة.
كيف يعمل السحر؟
ببساطة، fzf بتقرأ قائمة من الأسطر (من أي مصدر: ملف، أمر ثاني، …إلخ)، وبتفتح واجهة تفاعلية بتخليك تكتب أي حروف أو كلمات، وهي بتقوم بترتيب القائمة بناءً على أفضل التطابقات.
مثلاً، لو عندك أمر زي git commit -m "feat: add user authentication" وبدك تبحث عنه، ما في داعي تكتب git commit. ممكن تكتب gt cmt auth، و fzf راح تلاقيه فوراً!
تثبيت وتفعيل السحر (Ctrl+R الجديد)
تثبيت fzf سهل جدًا على معظم الأنظمة. على سبيل المثال في Ubuntu/Debian:
sudo apt install fzf
أو على macOS باستخدام Homebrew:
brew install fzf
بعد التثبيت، لازم تشغل السكربت الخاص بالتفعيل:
$(brew --prefix)/opt/fzf/install
هذا السكربت راح يسألك إذا بدك تفعل الـ key bindings (الاختصارات) والـ auto-completion. طبعًا جاوب “yes” على كل إشي!
الآن، افتح طرفية جديدة واضغط Ctrl+R. بدل الواجهة القديمة المملة، راح تظهر لك واجهة fzf الرهيبة، اللي بتعرض لك كل الـ history تبعك، مع prompt جاهزให้ك تكتب فيه وتبحث بشكل فوري. مبروك، لقد انتقلت من العصر الحجري إلى عصر الفضاء في ثانية واحدة!
fzf ليست فقط للـ history: استخدامات تغير حياتك
وهنا تكمن العبقرية الحقيقية. استخدام fzf مع Ctrl+R هو مجرد قمة جبل الجليد. هذه الأداة مصممة لتعمل مع أي شي تقريبًا في بيئة يونكس، بفضل الـ “pipes” (|).
البحث عن الملفات والمجلدات (وداعًا لأمر find)
هل سئمت من كتابة أوامر find . -name "*something*" المعقدة؟ fzf بتقدملك اختصار Ctrl+T. بمجرد الضغط عليه، fzf راح يعرض لك كل الملفات والمجلدات في المسار الحالي وتفرعاته. ابدأ بالكتابة، ولما تلاقي الملف اللي بدك اياه، اضغط Enter، وراح يتم إدراج مساره في سطر الأوامر.
مثلاً، بدك تفتح ملف معين بـ vim؟ بسيطة:
vim + <اضغط Ctrl+T وابحث عن ملفك>
نصيحة أبو عمر العملية
أنا شخصيًا بستخدم دالة (function) في ملف
.zshrcأو.bashrcتبعي عشان أعملcdبشكل أذكى. الدالة بتبحث عن المجلدات فقط وبتعملcdعليها مباشرة. هيك شكلها:# fzcd - cd into the selected directory fzcd() { local dir dir=$(find ${1:-.} -path '*/.*' -prune -o -type d -print 2> /dev/null | fzf +m) && cd "$dir" }الآن، بدل ما أكتب
cd ../../src/components/....، بكتب بسfzcdوببحث عن اسم المجلد اللي بدي أروح عليه. إنتاجية x10!
إدارة العمليات (Process Management) كالقناص المحترف
كم مرة احتجت توقف عملية (process) معينة وكتبت ps aux | grep "process_name"، وبعدين أخذت الـ PID وعملت kill -9 PID؟
مع fzf، الموضوع بصير زي لعبة فيديو. شوفوا هذا الأمر الساحر:
ps -ef | fzf | awk '{print $2}' | xargs kill -9
خليني أشرحه، لأنه تحفة فنية:
ps -ef: بيعرض كل العمليات الشغالة.| fzf: “بايب” هذه القائمة لـ fzf، اللي بتفتح واجهة البحث التفاعلية.| awk '{print $2}': بعد ما تختار العملية اللي بدك اياها بـ fzf وتضغط Enter، هذا الجزء بياخذ السطر اللي اخترته وبستخرج منه الجزء الثاني (اللي هو الـ PID).| xargs kill -9: وأخيرًا، بياخذ الـ PID اللي استخرجناه وبمرره لأمرkill -9.
بأمر واحد، صار عندك قناص عمليات احترافي. طبعًا، بنصحك تعمل alias لهذا الأمر، مثلاً تسميه fkill.
التنقل بين فروع Git (Git Branches)
إذا كنت بتشتغل مع Git وعندك فروع كثيرة، التنقل بينهم ممكن يكون مزعج. مع fzf، الموضوع بصير متعة:
git branch | fzf | xargs git checkout
هذا الأمر بيعرض لك كل فروعك في واجهة fzf، بتختار الفرع اللي بدك اياه، و xargs بتمرره لأمر git checkout. ولا أسهل!
الخلاصة… أو زي ما بنحكيها، الزبدة 📝
يا جماعة، أداة مثل fzf هي مثال حي على كيف ممكن أداة بسيطة وذكية تغير طريقة عملك بالكامل. هي مش مجرد أداة، هي “فلسفة” عمل بتعتمد على السرعة والذكاء وتقليل الحمل الذهني عليك كمبرمج.
من يوم ما اكتشفت الـ Fuzzy Finding و fzf، صرت أبحث عن أوامري القديمة بثقة وسرعة، وأتنقل بين الملفات والمجلدات كأني في فيلم The Matrix، وأدير نظامي بسهولة ما كنت أحلم فيها. بطلت أخاف من الـ history، بالعكس، صار كنز حقيقي بقدر أوصل لأي جزء منه بثواني.
نصيحتي الأخيرة: لا تستخفوا بأدوات سطر الأوامر. استثمروا شوية وقت في تعلم أداة مثل fzf، والوقت اللي راح توفروه على المدى الطويل لا يقدر بثمن. جربوها اليوم، وادعولي. 🚀