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

أبو عمر

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

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

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

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

آخر المدونات

ذكاء اصطناعي

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

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

13 أبريل، 2026 قراءة المزيد
تجربة المستخدم والابداع البصري

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

بتذكر مرة كُنا نبني لوحة تحكم معقدة، وصارت زي قمرة قيادة طائرة حربية من كثرة الأزرار والمؤشرات. في هذه المقالة، بحكي لكم كيف اكتشفنا مفهوم...

13 أبريل، 2026 قراءة المزيد
برمجة وقواعد بيانات

بحثنا كان يزحف كالسلحفاة: كيف أنقذتنا ‘فهارس قاعدة البيانات’ (Database Indexing) من جحيم المسح الكامل للجدول؟

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

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

بنيتنا التحتية كانت قصورًا من رمال: كيف أنقذتنا ‘البنية التحتية كشيفرة’ (IaC) من جحيم الانحراف في الإعدادات؟

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

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

ملفي الشخصي على GitHub كان مدينة أشباح: كيف أنقذتني ‘المشاريع المثبتة والـ READMEs’ من جحيم التجاهل؟

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

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

خادمنا الوحيد كان على وشك الانهيار: كيف أنقذنا ‘موازن الأحمال’ من جحيم نقطة الفشل الواحدة؟

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

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