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

أبو عمر

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

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

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

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

آخر المدونات

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

تحديثات قاعدة البيانات بدون توقف: كيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من جحيم التوقفات المجدولة؟

هل سئمت من إيقاف الخدمة مع كل تحديث لهيكلة قاعدة البيانات؟ أشارككم قصة حقيقية وكيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من ليالي النشر الطويلة والمُجهدة،...

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

كانت إعادة المحاولة كارثة: كيف أنقذتنا مفاتيح عدم تكرار العمليات (Idempotency Keys) من جحيم الفواتير المزدوجة؟

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

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

من التوقف التام إلى النجاة: كيف أنقذتنا استراتيجية “الضوء المرشد” (Pilot Light) يوم انقطعت السحابة؟

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

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

كانت مهمتي البرمجية للاختبار مجرد كود: كيف أنقذني توثيق القرارات من جحيم الصمت بعد المقابلة؟

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

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

من الانتظار لأيام إلى الدفع في ثوانٍ: كيف أنقذتنا شبكات الدفع الفوري من جحيم التحويلات البنكية؟

أسرد لكم من واقع تجربتي كـ "أبو عمر"، كيف عانينا من بطء وتكلفة التحويلات البنكية الدولية، وكيف جاءت شبكات الدفع الفوري ومعيار ISO 20022 لتكون...

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

كان كل خادم لدينا ‘ندفة ثلج’ فريدة: كيف أنقذنا ‘الكود كبنية تحتية’ (IaC) من جحيم الانجراف اليدوي؟

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

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

كانت تغطية الاختبارات 100% لكن الأخطاء تتسرب: كيف أنقذنا “الاختبار الطفري” من جحيم الثقة الزائفة؟

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

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