سجل الأوامر كان مقبرة للنسيان: كيف أنقذنا fzf من جحيم البحث اليائس؟

خليني أحكيلكم قصة صارت معي قبل كم سنة، قصة بتلخص معاناة كل مبرمج مع ذاكرته اللي بتخونه وقت الحاجة. كانت الساعة حوالي 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 اليوم، أعطيه فرصة، وخصص فيه شوي ليناسب أسلوبك. بوعدك، بعد أسبوع واحد من استخدامه، رح تسأل حالك نفس السؤال اللي سألته لنفسي في هذيك الليلة: “كيف كنت عايش بدونه؟”.

أبو عمر

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

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

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

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

آخر المدونات

برمجة وقواعد بيانات

كانت تحديثات قاعدة البيانات كابوساً: كيف أنقذتنا أدوات الترحيل (Migrations) من جحيم التعديلات اليدوية؟

هل عانيت يوماً من تحديث مخطط قاعدة البيانات يدوياً بين فريقك؟ أبو عمر يشارككم قصة حقيقية حول كيف غيّرت أدوات الترحيل (Migrations) طريقة عمل فريقه،...

17 مايو، 2026 قراءة المزيد
الشبكات والـ APIs

كانت خوادمنا تستجدي التحديثات: كيف أنقذتنا ‘خطاطيف الويب’ (Webhooks) من جحيم الاستقصاء المستمر (Polling)؟

تخيل خوادمك تلهث من كثرة الطلبات غير الضرورية. في هذه المقالة، أشارككم قصة حقيقية من الميدان حول كيفية انتقالنا من جحيم الاستقصاء المستمر (Polling) إلى...

17 مايو، 2026 قراءة المزيد
الحوسبة السحابية

كانت بنيتنا التحتية قصراً من رمال: كيف أنقذتنا “البنية التحتية ككود” (IaC) من جحيم البيئات المتضاربة؟

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

17 مايو، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

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

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

17 مايو، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

كانت قاعدة بياناتنا تتوسل الرحمة: كيف أنقذنا التخزين المؤقت (Caching) من جحيم الاستعلامات البطيئة

قصة حقيقية من واقع العمل عن كيفية انهيار نظامنا تحت ضغط الاستعلامات المتكررة، وكيف كان التخزين المؤقت (Caching) هو طوق النجاة. مقالة عملية للمطورين تشرح...

17 مايو، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

كان التحقق من هوية عملائنا يستغرق أياماً: كيف أنقذنا الذكاء الاصطناعي (eKYC) من جحيم الإجراءات اليدوية؟

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

17 مايو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

كانت أعطالنا تكتشف بعد فوات الأوان: كيف أنقذنا Prometheus من جحيم المراقبة التفاعلية؟

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

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

كانت فرقنا صامتة أمام الأخطاء: كيف أنقذتنا ‘السلامة النفسية’ من جحيم ثقافة اللوم؟

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

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