أسبوعي الأول مع Vim Bindings في Vs Code

2020 ,May 13

الوقت المتوقع للقراءة 5 دقيقة

مرحبًا! 👋

قبل أسبوع تقريبًا شاركت هذه التغريدة في حسابي في تويتر:

قبل ما أبدأ مشاركة تجربتي, ودّي أشرح بعض المواضيع اللي قد تكون جديدة على البعض!

وشّو Vim؟ 🤔

عشان نفهم أكثر عن Vim, خلّونا ناخذ خطوة للخلف إلى بداية الستينات من القرن الماضي..

من أوائل أدوات الإدخال النصيّة

كانت هذه الآلة Teletype Model 33 هي التطوّر التقني للإنتقال من آلة الكتابة العادية (مثل اللي في مسلسل Mad Men) إلى آلة الكتابة الإلكترونية.. كان مستخدم الآلة يشوف عمليات الإدخال اللي يسويها تُطبع على شريط الورق مباشرة.. رغم هذه القفزة التقنية, لكم أن تتخيلوا أن خطأ واحد كان يتطلب العودة وطباعة الورقة من جديد! 😅

dp3300 video terminal

تطوّرت التقنية في نهاية الستينات وبدأت تظهر الأجهزة اللي تحتوي على شاشة مدمجة بدلًا من الورق المطبوع! كانت هذه المنتجات تسمّى Video Terminals لوجود شاشة تتفاعل مع عمليّات الإدخال.. 🖥 بطبيعة الحال هذه القفزة التقنيّة كانت تتطلّب وجود برامج متخصصّة لتحرير النصوص - ومن هنا بدأت رحلة تطوير هذه البرامج..

ظهر نوع من المحررات يحتوي على خاصيّة تسمّى Line Editor, من خلاله يُمكن للمستخدم - في أي مكان في النص - أن يقوم بتعديل هذا النص للإضافة أو إصلاح الأخطاء على مستوى سطر واحد أو عدة أسطر! 👍 لتوضيح الصورة بشكل أكبر: اليوم عندما نقوم بتحرير النصوص, نستفيد من الماوس للتنقل بحرية بين الأسطر والكلمات.. في ذلك الوقت لم تكن الماوس موجودة, فكان الخيار الوحيد للتنقل بين الأسطر هو استخدام اختصارات الكيبورد.. 😅 قد تبدو هذه العملية شاقّة, ولكنها - في ذلك الوقت - كانت ثورية للغاية مقارنة بإعادة التحرير وإضاعة الورق المطبوع!

Vi terminal

ظهرت في منتصف السبعينات عدّة برامج كانوا المطورين يتنافسون في جعلها أسهل للإستخدام وأصغر في استهلاك المساحة والطاقة.. ظهر أحد هذه البرامج ويسمّى vi كأحد أشهر محررات النصوص إلى اليوم, وهو مدمج تقريبًا مع أي نظام Unix...

vim

نصل الآن إلى رفيقنا vim وهو التطوّر التالي لـ vi.. يتميّز vim بقابليّة تخصيصه وتطويره حسب الرغبة من عدّة نواحي مثل الاختصارات, الإضافات, الثيمات, وغيرها.. من أشهر النكت على الإنترنت "How to exit Vim" ويشيرون هنا إلى (التوهيقة) عند الدخول لأول مرة لمحرر النصوص هذا! 😂

وش يعني Vim Bindings؟ 🤔

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

  • الوضع العادي: ومن خلاله يمكن استخدام الكيبورد للتنقل بحريّة (يعني لمّا تضغط على زر الـ J, ينزل المؤشّر للسطر التالي بدلًا من كتابة الحرف J) - هذا الوضع يسمّى NORMAL
  • وضع الكتابة: ومن خلاله يمكن استخدام الكيبورد للكتابة! 😄 - هذا الوضع يسمّى INSERT
  • وضع التحديد: ومن خلاله يمكن استخدام الكيبورد لتحديد النص (مثل لمّا نظلل النص بالماوس) - هذا الوضع يسمّى VISUAL

من هنا أتت عبارة Vim Bindings التي تعود لهذه الأوضاع واختصاراتها.. هذه الاختصارات أصبحت متاحة في العديد من محررات النصوص اليوم.. الكثير من المطورين يرغبون في استخدام محررات نصوص ذكيّة كـ VS Code أو Sublime أو منتجات JetBrain, ويرون vim كذلك كأداة لا يمكن الإستغناء عنها في عملهم اليومي, فيقومون بدمج هذه الاختصارات في محررهم المفضل!

من أحد المبادرات الرائعة لجامعة MIT, ولإيمانهم بأهمية تحقيق الاستغلال الأقصى للأدوات المتاحة لنا كبرمجين, تم تخصيص محاضرة عن Vim في برنامج The Missing Semester الموجّه لطلاب علوم الحاسب لديهم..

تجربتي في الأسبوع الأول مع Vim Bindings في VS Code! 🤖

من ٢٠١٦ وأنا أرغب (سرًا) في التحوّل إلى Vim بسبب زميلي رامي طيبة (إلى يومكم مستعجب كيف واحد متخصص UX/UI يستخدم Vim اللي هو عدو السهولة؟ 😂).. كانت عاجبتني كميّة الانتاجية حقته ولكني في نفس الوقت مستثقل أتعلّم خصوصًا إني كنت مستثمر بشكل قوي في VS Code من ناحية اتقاني لاختصاراته ووجود إضافات مسهلة شغلي كثير!

تركت الفكرة على جنب إلى قبل اسبوعين تقريبًا بعد أن انهيت مشروع لأحد العملاء واتجهت لتطوير موقعي الشخصي (هذي المدونة).. قررت أركب الـ vim bindings في محرري المفضل لأني ما كنت متقبل الانتقال الكامل وتوكّلت على الله.. المختصر؟ التجربة بطلة في النهاية!!!!! 🥳

أشوف إني توفقت ولله الحمد بطريقة دخولي وتعلّمي.. بكل بساطة - بدلًا من حفظ قائمة طويلة عريضة من الاختصارات والأوامر - جهزت قائمة فيها الأوامر الرئيسية اللي بحتاجها في عملي اليومي:

my-vim-cheat-sheet

وحرفيًا خلّيت هاللسته مفتوحة على جمب (ولا كنت أناظرها وأنا اشتغل إلا وقت الألم الشديد! 😢).. كنت مثل الطفل أول ما يبدأ يحبي, بمعنى كل شوي أنزل راسي اشوف الكيبورد وأتحرك سطر سطر وحرف حرف! خلّيت ألم هبوط الإنتاجيّة يعلمني كيف استخدم الـ vim bindings, فكنت أطل كل شوي على قائمتي الصغيرة واشوف الاختصارات اللي أحتاجها.. مثلًا اللي يخليني أتحرك كلمة كلمة بدلًا من حرف حرف هو w, اللي يخليني أنزل/أطلع عدّة أسطر بدلًا من سطر واحد هو shift+[/].. كنت كل يوم أطلع باختصارات جديدة (من ناحية اتقاني لها وعدم حاجتي للرجوع لقائمتي) وهالشيء يسمح لمخي بتقبل تعلم اختصارات أخرى تسرّع الشغل أكثر! 👍

اختصارات الأيام الـ ٣ الأولى

هذي الاختصارات الوحيدة اللي اتقنتها وانا اشتغل بنهاية الثلاث أيام الأولى:

الطلوع والنزول سطر واحد كل مرة j k

التحرك يمين ويسار حرف واحد كل مرة h l

التحرك للأمام أو للخلف كلمة كلمة w b

تظليل النص v

حذف سطر كامل dd

نسخ سطر كامل Y

نسخ المظلل فقط y

لصق p

إدخال نص i

بداية السطر 0w

نهاية السطر $

اختصارات الأيام ٤ إلى ٦

بعد ما صرت أتحرك بسهولة, صارت عندي قابلية أتعلم أشياء أكثر كنت أسويها قبل, فتعلمت هالاختصارات:

إدخال نص في سطر جديد فوق السطر الحالي O

إدخال نص في سطر جديد تحت السطر الحالي o

إدخال نص بعد المؤشر a

التحرك للأمام كلمة كلمة ويكون المؤشر في نهاية الكلمة e

حذف أي نص داخل أقواس أو علامات تنصيص والكتابة مكانه (تستبدل علامة التنصيص بأي علامة أخرى تحيط بالنص) ci"

حذف أي نص إلى حرف أو رمز معين في نفس السطر (تستبدل علامة الأكبر من بحسب الحرف أو الرمز المرغوب حذف ما قبله) dt>

استبدال الأقواس من كيرلي إلى بارانثسيز (الترتيب هو القوس الحالي ثم القوس الجديد) cs{(

الذهاب إلى سطر معيّن دون الحاجة للتحرك اليدوي طلوعًا أو نزولًا (يستبدل الرقم هنا برقم السطر المرغوب) :25

اختصارات اليوم الأخير

بعد ما صارت إنتاجيتي أفضل بكثير, سويت reflection وحدّدت بالضبط وش ودّي اشتغل عليه قبل ما أقفل فترة التجربة هذي: لقيت إني آخذ وقت طويل إذا كنت أبي اروح لكلمة معينة.. فبحثت ولقيت إضافة اسمها Easy Motion شاركها واحد مثلي يحاول يتأقلم على vim bindings, ولقيتها سهّلت علي كثيييييير التنقل بين الكلمات!!

easymotion

طريقة التنقل هو: في الـ NORMAL أضغط زر المسافة ثم ستظهر حروف عشوائية على الشاشة, أضغط على الحروف اللي تمثّل المكان اللي أبي أروح له وبس! 👍

هذي إعدادتي الحاليّة اللي ودّه يستفيد منها:

1"editor.lineNumbers": "relative",
2"vim.easymotion": true,
3"vim.foldfix": true,
4 "vim.normalModeKeyBindingsNonRecursive": [
5 {
6 "before": [
7 " "
8 ],
9 "after": [
10 "leader",
11 "leader",
12 "leader",
13 "b",
14 "d",
15 "w"
16 ]
17 }
18 ],
19"vim.easymotionMarkerHeight": 30,
20"vim.easymotionKeys": "hklyuiopnmqwertzxcvbasdgjf"
21

نقاط الضعف الحاليّة

حتى الآن أواجه صعوبة في تجربة النسخ واللصق, لا زلت متعود على cmd+v للصق النص بينما في vim bidnings النسخ واللصق يتم من خلال y p.. كذلك لا زلت ألقى نفسي أكمّل على الماوس إذا كنت راجع للمحرر بعد عملية بحث على الانترنت مثلًا..

أخيرًا ودّي أشجع أي أحد يفكر بخوض هالتجربة, أنا إن شاء الله مكمّل خصوصًا إني أشوف إني أخذت من مزايا العمل على Vim بدون ما أترك محرري المفضل! 😍