طرفيتي كانت اختبار ذاكرة فاشل: كيف أنقذتني أداة ‘fzf’ من جحيم نسيان المسارات والأوامر؟

السلام عليكم ورحمة الله وبركاته، معكم أخوكم أبو عمر.

قبل عدة سنوات، كنت في مكالمة مباشرة مع فريق العميل، والشاشة معروضة أمام الجميع. طلبوا مني تعديلاً “بسيطاً” على ملف تهيئة (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

وافق على كل الخيارات المقترحة، ثم أعد تشغيل الطرفية. الآن أنت جاهز للانطلاق.

أول لقاء مع السحر: الاستخدامات الفورية

بمجرد التثبيت، ستحصل على ثلاث قدرات خارقة فورًا:

  1. البحث في تاريخ الأوامر (Ctrl+R): هذا هو التغيير الأكبر. جرب الآن الضغط على Ctrl+R. بدلًا من واجهة البحث العكسي القديمة، ستظهر لك واجهة fzf تعرض كل تاريخ أوامرك. ابدأ بكتابة أي جزء من أمر استخدمته سابقًا (مثل “docker compose” أو “git commit”) وشاهد السحر يحدث.
  2. البحث عن الملفات والمجلدات (Ctrl+T): أثناء كتابتك لأمر ما (مثل vim أو cd)، اضغط على Ctrl+T. ستفتح fzf واجهة بحث عن كل الملفات والمجلدات في المسار الحالي وتفرعاته. ابحث عن ملفك، اضغط Enter، وسيتم إدراج مساره الكامل في سطر الأوامر. وداعًا لكتابة المسارات الطويلة يدويًا!
  3. التنقل بين المجلدات (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 💡

  1. ابدأ بالأساسيات: لا تغرق نفسك في الإعدادات المتقدمة من اليوم الأول. ركز على إتقان Ctrl+R، Ctrl+T، و Alt+C. هذه الثلاثة وحدها ستغير طريقة عملك بالكامل.
  2. ابنِ وظائفك الخاصة: فكر في أكثر الأوامر التي تكررها يوميًا. هل تبحث كثيرًا في سجلات (logs)؟ هل تتصل بخوادم مختلفة عبر SSH؟ قم بإنشاء دالة بسيطة تستخدم cat my_servers.txt | fzf لتسهيل هذه المهام.
  3. لا تخف من التجربة: خصص مظهر 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'
  4. ادمجها مع كل شيء: fzf لديها إضافات لمحررات مثل Vim/Neovim (تعتبر أساسية هناك) و Emacs. إذا كنت تستخدم هذه الأدوات، فالبحث عن كيفية دمج fzf معها سيفتح لك مستوى جديدًا من الإنتاجية.

الخلاصة: استثمر في أدواتك، فهي استثمار في وقتك 🚀

في النهاية يا جماعة الخير، الطرفية ليست عدوًا. إنها واحدة من أقوى الأدوات المتاحة لنا كمطورين. المشكلة ليست في الطرفية، بل في اعتمادنا على ذاكرتنا المحدودة للتعامل معها. أدوات مثل fzf لا تجعلنا “أكثر ذكاءً”، بل تجعلنا “أكثر فعالية” عن طريق تحرير عقولنا من المهام الغبية والمتكررة.

ذاكرتنا أثمن من أن نهدرها في حفظ مسار ملف أو أمر معقد. دعوا الأدوات الذكية تقوم بالعمل الشاق، وركزوا أنتم على الإبداع، حل المشاكل الحقيقية، وبناء الأشياء العظيمة.

جربوها اليوم، صدقوني، بعد أسبوع واحد فقط من استخدامها، ستتساءلون كيف كنتم تعملون بدونها. يلا، شدوا حيلكم، وادعوا لأبو عمر. 😉

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

البنية التحتية وإدارة السيرفرات

مراقبة السيرفرات: كيف أنقذنا Prometheus و Grafana من جحيم ‘لماذا تعطل كل شيء فجأة؟’

في إحدى الليالي، بينما كان الجميع نائمين، توقف كل شيء. كانت تلك الليلة نقطة التحول التي نقلتنا من عالم إطفاء الحرائق الفوضوي إلى عالم المراقبة...

10 أبريل، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

مراجعات الكود: كيف حولنا ساحة المعركة إلى ورشة عمل إبداعية بفضل “السلامة النفسية”؟

أشارككم تجربتي كأبو عمر، مطور برمجيات فلسطيني، وكيف أنقذنا مفهوم "السلامة النفسية" من مراجعات الكود التي تحولت إلى معارك شخصية. اكتشفوا معنا كيف يمكن بناء...

10 أبريل، 2026 قراءة المزيد
اختبارات الاداء والجودة

بنيتنا التحتية كانت بيتًا من ورق: كيف أنقذتنا ‘هندسة الفوضى’ من جحيم الأعطال المفاجئة؟

أشارككم قصة حقيقية عن انهيار كاد أن يدمر مشروعنا، وكيف اكتشفنا أن القوة الحقيقية للنظام لا تكمن في تجنب الفشل، بل في احتضانه بشكل مدروس....

10 أبريل، 2026 قراءة المزيد
ذكاء اصطناعي

بحثنا كان لا يفهم المعنى: كيف أنقذتنا ‘قواعد البيانات المتجهية’ (Vector Databases) من جحيم البحث الحرفي؟

أشارككم قصة من واقع عملي كمبرمج، وكيف انتقلنا من أنظمة البحث الحرفية "الغبية" التي لا تفهم السياق، إلى عالم البحث الدلالي الذكي بفضل قواعد البيانات...

10 أبريل، 2026 قراءة المزيد
تسويق رقمي

عملاؤنا المحتملون كانوا أشباحًا: كيف أنقذتنا “نمذجة الإحالة القائمة على البيانات” من جحيم تتبع الإعلانات الأعمى؟

أشارككم قصة حقيقية من قلب المعركة التقنية، كيف كنا نحرق ميزانيات التسويق على أشباح لا نراها، وكيف استطعنا باستخدام الذكاء الاصطناعي ونمذجة الإحالة القائمة على...

10 أبريل، 2026 قراءة المزيد
البودكاست