خليني أحكيلكم قصة صارت معي قبل كم سنة، قصة بتلخص معاناة كل مبرمج مع ذاكرته اللي بتخونه وقت الحاجة. كانت الساعة حوالي 2 بعد منتصف الليل، وأنا غرقان في كود مشروع مهم، وبحاول أحل مشكلة “عويصة” في واحد من السيرفرات. متذكر تماماً إني قبل يومين أو ثلاثة كتبت أمر `rsync` طويل ومعقد، فيه استثناءات لملفات معينة وفلاتر خاصة، عشان أنقل ملفات المشروع بطريقة صحيحة.
بدأت رحلة العذاب. ضغطت Ctrl+R وبدأت أكتب `rsync`… لا نتيجة. طيب `grep` يمكن؟ history | grep rsync. طلعتلي قائمة طويلة من أوامر `rsync` البسيطة اللي بستخدمها كل يوم، بس مش الأمر الأسطوري اللي بدور عليه. صرت أرجع في الـ history سطر سطر، عيوني بتزوغ والشاشة صارت ضبابية. شعور الإحباط بدأ يتسلل لقلبي، يا زلمة معقول أمر استخدمته قبل 48 ساعة يختفي هيك؟ حسيت كأن سجل الأوامر (history) تحول لمقبرة حقيقية، كل أمر بنكتبه بيندفن فيها وبصير إخراجه أصعب من إخراج الكنز.
بعد حوالي نصف ساعة من البحث اليائس، والقهوة اللي بردت جنبي، استسلمت. بعثت رسالة لزميلي في الفريق اللي كان لسا صاحي، وحكيتله عن مأساتي. ضحك وقلي: “يا أبو عمر، شكلك لسا عايش في العصر الحجري! جرب إشي اسمه fzf وادعيلي”. في تلك الليلة، لم أحل المشكلة فقط، بل اكتشفت أداة غيرت طريقة تعاملي مع سطر الأوامر للأبد. وهذا اللي جاي أحكيلكم عنه اليوم.
ما هو الـ fzf؟ وليش هو “إشي بجنن”؟
بكل بساطة، fzf هو اختصار لـ “fuzzy finder” أو “الباحث التقريبي”. هو أداة سطر أوامر صغيرة وخفيفة، وظيفتها الأساسية إنها تبحث عن أي إشي بشكل تفاعلي وسريع. كلمة “fuzzy” (تقريبي) هي سر قوته. أنت مش مضطر تكتب الكلمة أو الجملة بالضبط زي ما هي عشان تلاقيها. يكفي تكتب أجزاء منها، حتى لو مش بالترتيب، وهو بذكاء رح يفهم عليك ويجيبلك النتائج المحتملة.
إذا بدنا نقارنه بالطرق التقليدية:
- Ctrl+R (reverse-i-search): بيبحث للخلف عن آخر أمر يطابق اللي كتبته. لو غلطت بحرف واحد، أو بدك أمر أقدم شوي، بتبدأ المعاناة.
- history | grep “command”: طريقة كويسة، بس بتعطيك قائمة ثابتة. ما بتقدر تتفاعل معها أو تعدل بحثك بسهولة.
أما مع fzf، فالموضوع مختلف تماماً. أنت بتكتب، والنتائج بتتفلتر قدام عيونك لحظة بلحظة. هو مش مجرد أداة بحث، هو حوار بينك وبين سطر الأوامر.
التثبيت والإعداد الأولي: يلا نشمّر عن إيدينا
تثبيت fzf أسهل من شرب المي. الطريقة اللي بنصح فيها دايماً هي استخدام Git عشان يكون عندك دايماً آخر نسخة.
افتح الطرفية (Terminal) واكتب الأوامر التالية:
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
بعد ما تشغل سكربت التثبيت، رح يسألك كم سؤال بسيط:
- هل تريد تفعيل key bindings (اختصارات لوحة المفاتيح)؟ جاوب y (نعم).
- هل تريد تفعيل الإكمال التلقائي (command completion)؟ جاوب y (نعم).
- هل تريد تحديث ملفات الإعدادات الخاصة بك؟ جاوب y (نعم).
هذا السكربت الذكي رح يضيف سطر صغير لملف الإعدادات الخاص بالـ shell اللي بتستخدمه (سواء كان .bashrc أو .zshrc أو غيره). سكر الطرفية وافتحها من جديد، وهيك بتكون جاهز للانطلاق.
سحر الـ fzf في سطر الأوامر: كيف غير حياتي اليومية
بعد التثبيت، رح تلاحظ إن بعض الاختصارات اللي كنت متعود عليها صارت خارقة. خلينا نشوف أهمها.
البحث في سجل الأوامر (Ctrl+R): وداعاً للذاكرة المثقوبة
هذا هو الاستخدام اللي أنقذني في قصتي. الآن، لما تضغط Ctrl+R، بدل ما يظهرلك سطر البحث الصغير القديم، رح تفتح واجهة fzf التفاعلية اللي بتعرضلك كل سجل الأوامر تبعك.
تخيل معي السيناريو الأول: بدي ألاقي أمر الـ `rsync` المعقد. كل اللي بعمله هو إني أضغط Ctrl+R وأبدأ أكتب أي إشي بتذكره من الأمر، مثلاً: `rsync exclude project`. رح تشوف كيف القائمة بتتفلتر فوراً وبتعرضلي الأمر المطلوب. بضغط Enter، والأمر بكون جاهز للتنفيذ أو التعديل.
نصيحة من أبو عمر: لا تخاف تجرب كلمات مبعثرة. لو الأمر كان
docker-compose -f dev.yml logs -f web، بتقدر تبحث عنه بكتابةdckr dev log. الـ fuzzy search رح يفهمك!
البحث عن الملفات والمجلدات (Ctrl+T): أسرع من البرق
كم مرة كنت بدك تفتح ملف للتعديل وصرت تكتب المسار الطويل تبعه؟ مثلاً vim src/app/Http/Controllers/Api/V1/UserController.php. مع fzf، الموضوع صار أسهل بكثير.
اكتب vim (أو أي محرر نصوص آخر)، بعدين اضغط Ctrl+T. رح تفتح واجهة fzf وتبدأ تبحث عن كل الملفات في المجلد الحالي والمجلدات الفرعية. اكتب بس كم حرف من اسم الملف، مثلاً `userctrl` أو `usrconphp`. بمجرد ما تلاقيه، اضغط Enter، والمسار الكامل للملف رح ينكتبلك تلقائياً في سطر الأوامر.
تغيير المجلدات بسرعة الصاروخ (Alt+C): تنقل بين المشاريع “ع السريع”
هذا الاختصار مفيد جداً للمبرمجين اللي بيشتغلوا على أكثر من مشروع. لو كنت في مسار عميق جداً داخل مشروعك، وبدك تنتقل لمجلد ثاني في مكان مختلف تماماً، بدل ما تكتب cd ../../../projectB/src، اعمل الآتي:
اضغط Alt+C (أو Esc ثم C إذا Alt+C ما اشتغلت معك). رح تفتح واجهة fzf وتعرضلك المجلدات الفرعية. ابدأ بكتابة اسم المجلد اللي بدك تروح عليه، اضغط Enter، وهيك بتكون وصلت “ع السريع”.
تطبيقات متقدمة ونصائح من “أبو عمر”
جمال fzf الحقيقي بيظهر لما تدمجه مع أدوات سطر الأوامر الأخرى. هو مش أداة منعزلة، هو “لاصق سحري” بيربط كل أدواتك مع بعض.
الدمج مع أدوات أخرى: fzf مش لحاله
بتقدر تستخدم fzf مع أي أمر بيطلع نتائج نصية (output) عن طريق الـ pipe `|`. خلينا نشوف أمثلة عملية من شغلي اليومي.
1. التعامل مع Git بشكل تفاعلي
بدل ما أستخدم الأوامر التقليدية، عملت لنفسي كم alias (اختصار) في ملف .zshrc أو .bashrc بخلي حياتي أسهل.
- الانتقال بين الفروع (Branches) بشكل مرئي:
# alias لـ git checkout branch gb() { git branch --all | grep -v HEAD | fzf --height 50% --preview "git log --oneline --graph --date=short --pretty='format:%C(auto)%h %d %s (%an, %ar)' $(echo {} | sed 's/.* //')" | xargs git checkout }الآن، بدل ما أكتب
git branchعشان أشوف الفروع بعدينgit checkout feature/new-login، بكتب بسgb، بتطلعلي قائمة بكل الفروع، وبقدر أشوف preview لآخر commits في كل فرع قبل ما أختاره. - تصفح سجل الـ commits بشكل احترافي:
# alias لـ git log gl() { git log --graph --color=always --format="%C(auto)%h%d %s %C(green)(%cr) %C(bold blue)%Creset" "$@" | 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" }هذا الـ alias المعقد شوي (اسمه
gl) بيحولgit logلتجربة خرافية. بقدر أتصفح الـ commits، ولما أضغط Enter على أي واحد، بيفتحليgit showعشان أشوف تفاصيل التغييرات.
2. إيقاف العمليات (Killing Processes) بأمان
بدل ما تعمل ps aux | grep "process" وتنسخ الـ PID وتعمله kill، جرب هذا:
# ابحث عن العملية واقتلها
fkill() {
local pid
pid=$(ps -ef | sed 1d | fzf -m | awk '{print $2}')
if [ "x$pid" != "x" ]
then
echo $pid | xargs kill -${1:-9}
fi
}
الآن اكتب fkill، اختار العملية اللي بدك توقفها من القائمة، واضغط Enter. خلصنا!
3. الاتصال بسيرفرات SSH
إذا كان عندك سيرفرات كثيرة في ملف ~/.ssh/config، هذا الأمر رح يوفر عليك وقت:
# اختر Host من ملف الكونفيج واتصل به
sshm() {
local host
host=$(grep '^Host' ~/.ssh/config | awk '{print $2}' | fzf)
if [ "x$host" != "x" ]; then
ssh "$host"
fi
}
اكتب sshm، اختر السيرفر، وهو رح يشبك عليه مباشرة.
تخصيص fzf: خليها على ذوقك
بتقدر تخصص شكل وأداء fzf عن طريق متغيرات البيئة (Environment Variables). أشهر متغيرين هما FZF_DEFAULT_COMMAND و FZF_DEFAULT_OPTS.
FZF_DEFAULT_COMMAND: هذا الأمر اللي fzf بيستخدمه عشان يجيب قائمة الملفات (لما تضغطCtrl+Tمثلاً). بنصح بشدة تستخدم أدوات أسرع منfindالتقليدي، مثلfdأوripgrep.# استخدم 'fd' للبحث عن الملفات (أسرع بكثير) # تأكد من تثبيت fd أولاً: brew install fd / apt install fd-find export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'FZF_DEFAULT_OPTS: هنا بتقدر تغير الألوان، شكل الواجهة، وتضيف preview وغيره.# مثال لتغيير الألوان وإضافة preview للملفات export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border --preview "bat --color=always {}" --preview-window "right:50%:wrap"'في هذا المثال، استخدمت أداة
bat(بديل محسن لأمرcat) عشان أعرض محتوى الملفات بشكل ملون وجميل في شاشة الـ preview.
الخلاصة: لا ترجع للماضي يا صديقي 🚀
أداة fzf بالنسبة لي ما كانت مجرد أداة جديدة تعلمتها، بل كانت نقلة نوعية في تفكيري وإنتاجيتي على سطر الأوامر. حولت عملية البحث من مهمة مملة ومحبطة إلى تجربة سريعة وممتعة. بطلت أخاف أنسى الأوامر المعقدة، لأني بعرف إني بقدر ألاقيها بثواني. صرت أستكشف الملفات والمشاريع بسرعة ما كنت أحلم فيها.
إذا كنت لسا بتعتمد على Ctrl+R القديمة أو history | grep، فإنت حرفياً بضيع جزء كبير من وقتك وطاقتك كل يوم. جرب fzf اليوم، أعطيه فرصة، وخصص فيه شوي ليناسب أسلوبك. بوعدك، بعد أسبوع واحد من استخدامه، رح تسأل حالك نفس السؤال اللي سألته لنفسي في هذيك الليلة: “كيف كنت عايش بدونه؟”.