يا جماعة الخير، السلام عليكم ورحمة الله وبركاته. معكم أخوكم أبو عمر.
قبل كم ليلة، كنت قاعد بشتغل على مشروع ذكاء اصطناعي معقد شوي. الساعة كانت داخلة على ٢ بعد نص الليل، عيوني صارت تزغلل، وكاسة الشاي بالمرمية اللي جنبي فضيت للمرة الثالثة. كنت بحاول أعمل deploy لنموذج تدريبي على سيرفر بعيد، وتذكرت إني استخدمت أمر `scp` طويل عريض قبل أسبوعين، فيه اسم مستخدم غريب ومسار ملف معقد ورقم بورت مش ستاندرد.
وهون بلشت المأساة… كبسة السهم العلوي… كمان كبسة… كمان… كمان… صرت زي اللي بدور على إبرة بكومة قش. كل ما أكبس، يطلعلي أمر `ls -la` أو `git status` للمرة المليون. حسيت إني دخلت في حلقة مفرغة من الأوامر التافهة، وذاكرتي، اللي المفروض تحفظ الأوامر المهمة، صارت زي “المنخل” ما بتحفظ اشي. بعد حوالي ٥ دقايق من الكبس المتواصل والشعور بالإحباط، وقفت وقلت لحالي: “خلص! أكيد في طريقة أحسن من هيك! مش معقول كل مطورين العالم بعانوا نفس المعاناة هاي!”.
وبالفعل، كانت هاي اللحظة هي نقطة التحول في علاقتي مع الطرفية (Terminal). ومن يومها، صار عندي صديق جديد اسمه `fzf`، وهو اللي رح أحكيلكم عنه اليوم.
ما هو الجحيم الذي كنا نعيش فيه؟
كل مطور أو مدير أنظمة بيستخدم سطر الأوامر بيعرف هاي القصة. سجل الأوامر (history) هو كنز، لكن الوصول للكنز هاد كان عذاب. الطرق التقليدية كانت محدودة جداً:
- السهم العلوي/السفلي: فعال لأمر استخدمته قبل دقيقة، لكن كارثي لأمر استخدمته قبل أسبوع.
- `history | grep “search_term”`: طريقة كلاسيكية، لكنها بطيئة وغير تفاعلية. بتعرضلك قائمة، بعدين لازم تاخد رقم السطر وتكتب `!رقم_السطر` عشان تنفذه. مشوار طويل.
- `Ctrl+R` (Reverse Search): الأداة المدمجة في معظم الـ shells. هي أفضل من لا شيء، لكنها بتعرض نتيجة واحدة فقط في كل مرة، وإذا كان عندك أوامر متشابهة، بتصير العملية مزعجة.
المشكلة إنه مع الوقت، سجل الأوامر بصير فيه آلاف الأوامر، والبحث فيه بالطرق هاي بصير مضيعة للوقت والطاقة الذهنية اللي احنا أولى فيها لكتابة الكود وحل المشاكل الحقيقية.
المنقذ `fzf`: الباحث الضبابي السحري
بكل بساطة، `fzf` هي أداة سطر أوامر تفاعلية للأغراض العامة، واسمها اختصار لـ (Fuzzy Finder) أو “الباحث الضبابي”.
شو يعني “ضبابي”؟ يعني مش محتاج تكتب الكلمة بالضبط عشان تلاقيها. بتقدر تكتب أجزاء متفرقة من اللي بتتذكره، وهو بذكاء بفلتر النتائج في الوقت الفعلي (real-time). تخيل إنك بتبحث عن الأمر اللي حكيتلكم عنه `scp -P 2222 -i ~/.ssh/id_rsa_special user@server:/path/to/model.tflite .`، كل اللي عليك تكتبه ممكن يكون `scp serv model` وهو رح يلاقيه فوراً!
تثبيت `fzf` وإعداده: خطوتان نحو الحرية
التثبيت أسهل من شرب المي. افتح الطرفية واكتب الأمر المناسب لنظامك:
# For macOS using Homebrew
brew install fzf
# For Debian/Ubuntu
sudo apt-get install fzf
# For Fedora
sudo dnf install fzf
# For Arch Linux
sudo pacman -S fzf
بعد التثبيت، لازم تشغل سكربت الإعداد عشان يربط `fzf` مع الـ shell تبعك ويفعّل الاختصارات السحرية. بس اكتب الأمر التالي في الطرفية ووافق على كل الخيارات بالضغط على `y`:
$(brew --prefix)/opt/fzf/install
نصيحة من أبو عمر: بعد تشغيل سكربت الإعداد، أغلق الطرفية وافتحها من جديد (أو اعمل `source ~/.bashrc` أو `source ~/.zshrc`) عشان التغييرات تتفعل. لا تكسل بهاي الخطوة!
فك شيفرة السحر: كيف تستخدم `fzf`؟
بمجرد التثبيت، حياتك رح تتغير. انسى كل الطرق القديمة، وركز معي بهاي الاختصارات:
1. `Ctrl+R`: وداعاً للبحث العكسي التقليدي
هذا هو الاستخدام الأساسي اللي حل مشكلتي. الآن لما تضغط `Ctrl+R`، بدل ما يظهر سطر واحد بائس، رح تفتح نافذة تفاعلية فيها كل سجل الأوامر تبعك. ابدأ بكتابة أي جزء من الأمر اللي بدور عليه:
- بدك أمر `docker`؟ اكتب `dckr`.
- بدك أمر `git` عملت فيه `rebase`؟ اكتب `gt rbs`.
- بدك أمر `ssh` لسيرفر معين؟ اكتب اسم السيرفر.
النتائج بتتفلتر قدام عينك بسرعة البرق. استخدم الأسهم عشان تختار الأمر اللي بدك ياه واضغط `Enter` لتنفيذه مباشرة، أو `Tab` لوضعه في سطر الأوامر للتعديل عليه.
2. `Ctrl+T`: البحث عن الملفات والمجلدات بلمح البصر
كم مرة كنت بدك تكتب مسار ملف طويل ونسيت اسمه بالضبط أو مكانه؟ الآن، بدل ما تكتب `ls` و `cd` ألف مرة، اكتب بداية الأمر (مثلاً `vim `) وبعدين اضغط `Ctrl+T`.
رح تفتح نافذة `fzf` تبحث في كل الملفات والمجلدات في المسار الحالي وتوابعه. اكتب جزء من اسم الملف (مثلاً `set py` عشان تلاقي `settings.py`) واضغط `Enter`. سيتم لصق المسار الكامل للملف في سطر الأوامر. اشي خرافي!
3. `Alt+C`: التنقل الفوري بين المجلدات
هذا الاختصار مخصص للـ `cd`. لو كنت في مجلد المشروع الرئيسي وبدك تروح على مجلد عميق مثل `src/app/api/v1/handlers`، بدل ما تكتب كل المسار، اضغط `Alt+C` (ممكن يكون `Esc+C` في بعض الطرفيات)، اكتب `hndlrs` مثلاً، واضغط `Enter`. أنت الآن في المجلد المطلوب.
المستوى المتقدم: `fzf` كأداة ربط (Piping)
هنا تكمن القوة الحقيقية لـ `fzf`. يمكنك تمرير (pipe) مخرجات أي أمر إلى `fzf` للاختيار منها بشكل تفاعلي.
مثال 1: إدارة فروع Git
بدل ما تكتب `git branch` وتنسخ اسم الفرع، جرب هذا:
# اختر فرع وانتقل إليه
git checkout $(git branch | fzf)
لكن يمكننا تحسينه. يمكن إنشاء `alias` أو دالة (function) في ملف `.zshrc` أو `.bashrc`:
# دالة لاختيار فرع git والانتقال إليه
gco() {
local branches branch
branches=$(git branch --all | grep -v HEAD | sed "s/.* //" | sed "s#remotes/[^/]*/##" | sort -u)
branch=$(echo "$branches" | fzf-tmux -d 20% --prompt="Checkout > ")
if [[ -n "$branch" ]]; then
git checkout "$branch"
fi
}
الآن، فقط اكتب `gco` في أي مكان، وستظهر لك قائمة تفاعلية بكل فروعك (المحلية والبعيدة) لتختار منها.
مثال 2: إيقاف العمليات (Killing Processes)
هل سئمت من البحث عن PID لعملية معينة؟
# ابحث عن عملية بشكل تفاعلي وأوقفها
ps -ef | fzf -m | awk '{print $2}' | xargs kill -9
مثال 3: الاتصال عبر SSH
إذا كان لديك الكثير من الاتصالات في ملف `~/.ssh/config`:
# اختر Host من ملف الكونفيج واتصل به
ssh $(cat ~/.ssh/config | grep "Host " | awk '{print $2}' | fzf)
الخلاصة: استثمر في أدواتك 💡
يا جماعة، `fzf` ليست مجرد أداة، بل هي تغيير في عقلية التعامل مع سطر الأوامر. هي تحويل العملية من “تذكُّر” إلى “بحث”. ذاكرتنا البشرية ثمينة، ولا يجب أن نضيعها في حفظ أوامر طويلة ومعقدة. دع الآلة تقوم بالعمل الشاق.
استثمار ساعة واحدة في تعلم وتخصيص أداة مثل `fzf` سيوفر عليك مئات الساعات من الإحباط والوقت الضائع على المدى الطويل. لا تستهينوا بقوة الأدوات الصغيرة التي تجعل حياتكم أسهل.
نصيحتي الأخيرة: لا تخف من تجربة وتخصيص أدواتك. اجعل الطرفية تعمل لصالحك، لا ضدك. يلا، شدّوا حيلكم وجربوها اليوم! 🚀