السلام عليكم ورحمة الله وبركاته، معكم أخوكم أبو عمر.
قبل عدة سنوات، كنت في مكالمة مباشرة مع فريق العميل، والشاشة معروضة أمام الجميع. طلبوا مني تعديلاً “بسيطاً” على ملف تهيئة (configuration file) مدفون في خمسة أو ستة مجلدات متداخلة داخل المشروع على الخادم. شعرت بالثقة، وفتحت الطرفية بكل هيبة. كتبت cd /var/www/vhosts/project-name/httpdocs/src/… وهنا تجمدت أصابعي على لوحة المفاتيح.
هل كان المجلد config أم core/config؟ أم ربما app/config؟ يا زلمة، شعرت بالعرق البارد يتصبب على جبيني. بدأت أضغط على زر Tab بشكل عشوائي لإكمال المسار، وبدا الأمر وكأني أعزف مقطوعة موسيقية فاشلة. لجأت بعدها إلى الخطة “ب”: الضغط على Ctrl+R للبحث في تاريخ الأوامر، وبدأت أبحث بيأس عن أمر cd أو vim استخدمته سابقاً للوصول إلى ذلك الملف اللعين. كل ثانية كانت تمر كأنها دهر، وصمت الفريق على الطرف الآخر من المكالمة كان يصم الآذان.
في تلك اللحظة المحرجة، قررت أن هذا العذاب يجب أن ينتهي. ذاكرتي ليست قرصاً صلباً، وأنا مبرمج لأحل المشاكل، لا لأحفظ مسارات الملفات. وهنا بدأت رحلتي الحقيقية مع أداة صغيرة غيرت علاقتي بالطرفية إلى الأبد: fzf.
ما هي أداة ‘fzf’؟ ولماذا هي “إشي بجنن”؟
بكل بساطة، fzf هي أداة “بحث ضبابي” (Fuzzy Finder) تعمل في سطر الأوامر. فكر فيها كأنها محرك بحث Google خاص بطرفيتك. بدلًا من كتابة اسم الملف أو الأمر بدقة، يمكنك كتابة أجزاء منه، حتى لو كانت غير متتالية، وستقوم fzf بعرض كل النتائج المطابقة بشكل فوري وتفاعلي.
لماذا هي أفضل من الطرق التقليدية؟
- السرعة: إنها سريعة بشكل لا يصدق. تبحث في آلاف الأسطر في أجزاء من الثانية.
- التفاعلية: لا تنتظر منك الضغط على Enter. النتائج تتحدث وتتغير مع كل حرف تكتبه.
- الذكاء (الضبابي): لا تحتاج لتذكر الاسم بالضبط. لو أردت البحث عن
src/app/components/user-profile.js، يمكنك فقط كتابةsacupوستجدها لك! - التكامل: يمكن دمجها مع أي أمر تقريبًا في نظامك، مما يفتح أبوابًا لا حصر لها من الإنتاجية.
لنبدأ الحكاية: التثبيت والاستخدام الأساسي
جمال fzf يبدأ من سهولة تثبيتها. لن تحتاج إلى خطوات معقدة.
التثبيت (بسيط وسريع)
يمكنك تثبيتها باستخدام مدير الحزم المفضل لديك:
# لمستخدمي macOS باستخدام Homebrew
brew install fzf
# لمستخدمي Debian/Ubuntu
sudo apt-get install fzf
# لمستخدمي Arch Linux
sudo pacman -S fzf
بعد التثبيت، وهذه خطوة مهمة جدًا، قم بتشغيل الأمر التالي لتثبيت سكربتات التكامل مع الـ shell الخاص بك (مثل Bash أو Zsh):
$(brew --prefix)/opt/fzf/install
أو إذا قمت بالتثبيت من مصدر آخر، قد يكون الأمر ببساطة:
/path/to/fzf/install
وافق على كل الخيارات المقترحة، ثم أعد تشغيل الطرفية. الآن أنت جاهز للانطلاق.
أول لقاء مع السحر: الاستخدامات الفورية
بمجرد التثبيت، ستحصل على ثلاث قدرات خارقة فورًا:
- البحث في تاريخ الأوامر (
Ctrl+R): هذا هو التغيير الأكبر. جرب الآن الضغط علىCtrl+R. بدلًا من واجهة البحث العكسي القديمة، ستظهر لك واجهة fzf تعرض كل تاريخ أوامرك. ابدأ بكتابة أي جزء من أمر استخدمته سابقًا (مثل “docker compose” أو “git commit”) وشاهد السحر يحدث. - البحث عن الملفات والمجلدات (
Ctrl+T): أثناء كتابتك لأمر ما (مثلvimأوcd)، اضغط علىCtrl+T. ستفتح fzf واجهة بحث عن كل الملفات والمجلدات في المسار الحالي وتفرعاته. ابحث عن ملفك، اضغط Enter، وسيتم إدراج مساره الكامل في سطر الأوامر. وداعًا لكتابة المسارات الطويلة يدويًا! - التنقل بين المجلدات (
Alt+C): هل تريد الانتقال إلى مجلد مشروع معين لكنك لا تتذكر المسار الكامل؟ اضغطAlt+C(قد يكونEsc+Cفي بعض الطرفيات)، ابدأ بكتابة اسم المجلد، اختره من القائمة، وسيتم نقلك إليه فورًا. هذه وحدها توفر دقائق ثمينة كل يوم.
من “مستخدم عادي” إلى “ساحر طرفية”: حيل متقدمة مع fzf
الجمال الحقيقي لـ fzf يكمن في قدرتها على العمل مع الأوامر الأخرى باستخدام الـ “pipe” (|). هنا تبدأ المتعة الحقيقية.
حيلة 1: البحث داخل محتوى الملفات (دمج fzf مع ripgrep)
أحيانًا، أنت لا تتذكر اسم الملف، بل تتذكر دالة أو متغيرًا بداخله. هنا يأتي دور ripgrep (أو rg)، وهي أداة بحث سريعة جدًا. بدمجها مع fzf، يمكننا إنشاء باحث كود فعال جدًا.
نصيحة أبو عمر: قم بتثبيت
ripgrep. إنها أسرع بكثير منgrepالتقليدية. (sudo apt install ripgrepأوbrew install ripgrep).
الآن، أضف هذه الدالة إلى ملف الإعدادات الخاص بالـ shell (~/.bashrc أو ~/.zshrc):
# fzf-rg: دالة للبحث عن محتوى في الملفات وفتح الملف المختار في محرر الكود
# الاستخدام: fzfrg "النص المراد البحث عنه"
fzfrg() {
local file
file=$(rg --no-messages --files-with-matches --line-number "$1" | fzf --preview "bat --color=always --highlight-line {2} {1}" --preview-window=up:50%)
if [[ -n $file ]]; then
# قم بتغيير 'code' إلى المحرر المفضل لديك مثل 'vim' أو 'subl'
code "$(echo "$file" | cut -d: -f1)":"$(echo "$file" | cut -d: -f2)"
fi
}
شرح الكود:
rg ... "$1": يبحث عن النص الذي مررته للدالة.| fzf ...: يمرر النتائج (ملف:رقم السطر) إلى fzf.--preview "bat ... {}": هذه هي اللمسة السحرية. تستخدم أداةbat(بديل محسن لأمرcat) لعرض محتوى الملف مع تمييز السطر الذي يحتوي على نتيجة البحث. (قم بتثبيتbatللاستفادة منها).code ...: يفتح الملف المختار في محرر VS Code مباشرة عند السطر الصحيح.
حيلة 2: إدارة عمليات النظام (Processes) كالمحترفين
هل سئمت من كتابة ps aux | grep 'some-process' ثم نسخ الـ PID لقتله باستخدام kill؟ لنقم بأتمتة هذا.
أضف هذه الدالة إلى ملف الإعدادات الخاص بك:
# fkill - البحث التفاعلي عن عملية وقتلها
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 في الطرفية. ستظهر لك قائمة بكل العمليات الجارية. ابحث عن العملية التي تريد قتلها (يمكنك تحديد عدة عمليات باستخدام Tab)، ثم اضغط Enter. سيتم قتلها فورًا. هذا كل شيء!
حيلة 3: التبديل بين فروع Git بلمح البصر
إذا كنت تعمل مع Git، فأنت تعلم مدى تكرار عملية التبديل بين الفروع. لنجعلها أسهل.
# gbr - (Git Branch) التبديل التفاعلي بين فروع Git
gbr() {
local branches branch
branches=$(git branch --all | grep -v HEAD | sed 's/^[ *]*//' | sed 's#remotes/[^/]*/##')
branch=$(echo "$branches" | fzf-tmux -d 20% -- --height 40% --reverse --multi)
if [[ "$branch" = "" ]]; then
return
fi
git checkout $(echo "$branch" | sed "s/.* //" | sed "s#remotes/[^/]*/##")
}
الآن، عندما تكون داخل أي مستودع Git، فقط اكتب gbr وستظهر لك قائمة بكل فروعك المحلية والبعيدة. اختر الفرع الذي تريده واضغط Enter للانتقال إليه.
نصائح من “أبو عمر” لترويض fzf 💡
- ابدأ بالأساسيات: لا تغرق نفسك في الإعدادات المتقدمة من اليوم الأول. ركز على إتقان
Ctrl+R،Ctrl+T، وAlt+C. هذه الثلاثة وحدها ستغير طريقة عملك بالكامل. - ابنِ وظائفك الخاصة: فكر في أكثر الأوامر التي تكررها يوميًا. هل تبحث كثيرًا في سجلات (logs)؟ هل تتصل بخوادم مختلفة عبر SSH؟ قم بإنشاء دالة بسيطة تستخدم
cat my_servers.txt | fzfلتسهيل هذه المهام. - لا تخف من التجربة: خصص مظهر fzf باستخدام متغير البيئة
FZF_DEFAULT_OPTS. يمكنك تغيير الألوان، إضافة نافذة المعاينة، وتغيير التخطيط. جرب هذا المثال (بعد تثبيتbat):export FZF_DEFAULT_OPTS='--height 50% --layout=reverse --border --preview "bat --color=always --style=numbers --line-range=:500 {}" --color=fg:#f8f8f2,bg:#282a36,hl:#bd93f9 --color=fg+:#f8f8f2,bg+:#44475a,hl+:#bd93f9 --color=info:#ffb86c,prompt:#50fa7b,pointer:#ff79c6,marker:#ff79c6,spinner:#ffb86c' - ادمجها مع كل شيء: fzf لديها إضافات لمحررات مثل Vim/Neovim (تعتبر أساسية هناك) و Emacs. إذا كنت تستخدم هذه الأدوات، فالبحث عن كيفية دمج fzf معها سيفتح لك مستوى جديدًا من الإنتاجية.
الخلاصة: استثمر في أدواتك، فهي استثمار في وقتك 🚀
في النهاية يا جماعة الخير، الطرفية ليست عدوًا. إنها واحدة من أقوى الأدوات المتاحة لنا كمطورين. المشكلة ليست في الطرفية، بل في اعتمادنا على ذاكرتنا المحدودة للتعامل معها. أدوات مثل fzf لا تجعلنا “أكثر ذكاءً”، بل تجعلنا “أكثر فعالية” عن طريق تحرير عقولنا من المهام الغبية والمتكررة.
ذاكرتنا أثمن من أن نهدرها في حفظ مسار ملف أو أمر معقد. دعوا الأدوات الذكية تقوم بالعمل الشاق، وركزوا أنتم على الإبداع، حل المشاكل الحقيقية، وبناء الأشياء العظيمة.
جربوها اليوم، صدقوني، بعد أسبوع واحد فقط من استخدامها، ستتساءلون كيف كنتم تعملون بدونها. يلا، شدوا حيلكم، وادعوا لأبو عمر. 😉