بحث
لينكس: حول التيرمينال إلى محرك بحث خارق باستخدام fzf
البرمجة #لينكس #برمجة

لينكس: حول التيرمينال إلى محرك بحث خارق باستخدام fzf

منذ 6 ساعات 3 مشاهدة 0 تعليق 3 دقائق قراءة
3 مشاهدة
0 إعجاب
0 تعليق
موثوق 95%

هل تقضي معظم وقتك داخل التيرمينال (Terminal)؟ إذا كانت إجابتك نعم، فمن المحتمل أنك تعتمد بشكل يومي على أوامر كلاسيكية مثل find وgrep وcat للبحث عن الملفات واستعراضها. لكن دعنا نكون صرحاء، هذه الأدوات قد تبدو عقيمة أحياناً وتفتقر للمرونة الحديثة. ماذا لو أخبرتك أن هناك طريقة لبناء تجربة بحث أكثر تطوراً وسرعة؟

المعادلة السرية: دمج fzf مع ripgrep وbat

الفكرة الأساسية هنا هي الجمع بين ثلاث أدوات قوية لإنشاء واجهة بحث حديثة وتفاعلية. سنستخدم fzf للبحث الضبابي (Fuzzy finding)، وripgrep للسرعة الهائلة في البحث داخل النصوص، وbat لمعاينة الملفات مع تلوين النصوص البرمجية (Syntax Highlighting).

إليك الكود الكامل للدالة s() التي سنقوم بشرحها، والتي يمكنك إضافتها لملف إعدادات الشيل الخاص بك:

s() { : | fzf \ --ansi \ --disabled \ --bind "change:reload:sleep 0.1; \ command rg --line-number \ --column \ --no-heading \ --color=always \ --smart-case {q} \ $* \ || :" \ --bind "enter:execute:nano +{2},{3} {1}" \ --bind "ctrl-o:become:nano +{2},{3} {1}" \ --delimiter ":" \ --preview "command bat --style=full \ --color=always \ --highlight-line {2} \ {1}" \ --preview-window 'up:80%,border-bottom,~4,+{2}+4/3' }

كيف يعمل هذا السحر البرمجي؟

لنقم بتفكيك الأمر لفهم آلية عمله. يعتمد الأمر بشكل أساسي على خيار --bind في fzf لربط الأحداث بأوامر خارجية.

1. البحث الفوري مع ripgrep

نستخدم الحدث "change" لإعادة تحميل (reload) الأمر كلما تغير استعلام البحث الذي تكتبه. الأمر command rg يقوم بتشغيل ripgrep مع عدة خيارات:

  • --column: لإدراج رقم العمود في النتائج (مهم لفتح المحرر في المكان الدقيق).
  • --line-number: لإظهار رقم السطر.
  • --no-heading: لإزالة العناوين وجعل النتائج قابلة للمعالجة.
  • --smart-case: للبحث الذكي الذي يتجاهل حالة الأحرف إلا إذا كتبت أحرفاً كبيرة.

كما نستخدم --disabled لمنع fzf من تطبيق الفلترة الخاصة به، وترك مهمة البحث بالكامل لـ ripgrep، مما يسمح باستخدام رموز خاصة مثل "^" في البحث.

التكامل مع محررات النصوص

عند العثور على النتيجة المطلوبة، ستحتاج لفتحها. الكود أعلاه معد مسبقاً لمحرر Nano. عند الضغط على Enter، يتم تنفيذ الأمر execute الذي يفتح الملف ويعود لقائمة البحث عند الإغلاق. أما الضغط على Ctrl+O فيستخدم become الذي يستبدل عملية البحث بالمحرر ويخرج للشيل عند الانتهاء.

الصيغة +{2},{3} {1} تخبر المحرر بفتح الملف (1) عند السطر (2) والعمود (3).

تخصيص الأمر لمستخدمي Vim وNeovim

إذا كنت تفضل Vim أو Neovim، استبدل أسطر الربط (bind) بما يلي:

--bind "enter:execute:nvim '+call cursor({2},{3})' {1}" \ --bind "ctrl-o:become:nvim '+call cursor({2},{3})' {1}"

لمستخدمي Emacs

ولعشاق Emacs، يمكنكم استخدام الصيغة التالية:

--bind "enter:execute:emacs +{2}:{3} {1}" \ --bind "ctrl-o:become:emacs +{2}:{3} {1}"

معاينة الملفات بأسلوب عصري

الجزء الأخير والأكثر جمالية هو نافذة المعاينة (Preview Window). نستخدم هنا أداة bat بدلاً من cat العادية. الخيار --style=full يعرض كل شيء بما في ذلك أرقام الأسطر والحدود، بينما يقوم --highlight-line {2} بتمييز السطر الذي تم العثور على نتيجة البحث فيه.

أما تعقيدات --preview-window فهي تضبط مكان وحجم النافذة، وتضمن أن يظهر السطر المميز في منتصف نافذة المعاينة تقريباً لتسهيل القراءة.

لتجربة هذه الأداة، ضع الكود في ملف .bashrc أو ملف إعدادات الشيل الخاص بك، أعد تحميله، ثم اكتب s وابدأ الطباعة. ستحصل على تجربة بحث لا تضاهى.

الأسئلة الشائعة

الدمج يوفر واجهة بحث تفاعلية (fzf) مع سرعة بحث هائلة داخل النصوص (ripgrep)، مما يسمح بالفلترة الحية والمعاينة الفورية للنتائج.

تستخدم الأداة خيارات `--line-number` و `--column` من ripgrep لتمرير إحداثيات السطر والعمود إلى محرر النصوص (مثل Nano أو Vim) لفتحه في المكان الدقيق.

الأمر `execute` يشغل العملية (مثل المحرر) ثم يعود لقائمة البحث عند إغلاقها، بينما `become` يستبدل عملية البحث تماماً ويخرج إلى الشيل عند الانتهاء.

التعليقات 0

سجل دخولك لإضافة تعليق

لا توجد تعليقات بعد. كن أول من يعلق!