بقلم سوسام بال في 07 ديسمبر 2019.
مقدمة
قبل خمسة عشر عامًا، كانت كتابة كود Lisp في Vim مغامرة غريبة. لم تكن هناك مكونات إضافية جيدة لـ Vim تساعد في التحرير المنظم لتعبيرات Lisp أو تسمح بالبرمجة التفاعلية عن طريق تضمين حلقة القراءة والتقييم والطباعة (REPL) أو مصحح الأخطاء داخل المحرر. وقد تحسن الوضع كثيرًا منذ ذلك الحين. في السنوات العشر الماضية، شهدنا تطويرًا نشطًا لاثنين من مكونات Vim الإضافية: Slimv و Vlime. يبلغ عمر Slimv أكثر من 10 سنوات الآن، بينما Vlime أحدث وعمره أقل من 3 سنوات في الوقت الحالي. كلاهما يدعم البرمجة التفاعلية في Lisp.
سأقوم بمناقشة ومقارنة كل من Slimv و Vlime في هذه المقالة. سأوضح كيفية البدء باستخدام كلا المكونين الإضافيين وتقديم بعض ميزاتهما الأساسية. لن أغطي كل شيء رغم ذلك؛ هذا ليس برنامجًا تعليميًا شاملاً. للحصول على دروس مفصلة، راجع قسم المراجع.
إذا كنت تبحث فقط عن مقارنة بين المكونين الإضافيين أو توصية سريعة، فانتقل مباشرة إلى قسم مقارنة Slimv و Vlime أو قسم التوصية السريعة.
المحتويات
- مقدمة
- الخلفية
- Lisp
- إيماكس: SLIME
- Vim: Slimv/Vlime
- إدارة الإضافات في Vim
- إصدارات البرامج
- ابدأ
- ابدأ مع Slimv و SBCL
- ابدأ مع Vlime و SBCL
- ابدأ مع Paredit
- استخدم المصحح والمفتش
- استخدم المصحح والمفتش مع Slimv
- استخدم المصحح والمفتش مع Vlime
- وظيفة التتبع
- تتبع الدالة في Slimv
- تتبع الدالة في Vlime
- ميزات أنيقة
- تقييم نموذج المستوى الأعلى
- أقواس قوس قزح
- قائمة الوسائط
- الاكتمال الشامل
- وصف الرمز
- توسيع الماكرو
- المرجع الترافقي
- تطبيقات Common Lisp الأخرى
- استخدم Slimv مع CLISP
- استخدم Slimv مع ECL
- استخدم Vlime مع CLISP
- استخدم Vlime مع ECL
- لهجات Lisp الأخرى
- استخدم Slimv مع مخطط MIT/GNU
- استخدم Slimv مع Clojure
- مقارنة Slimv وVlime
- توصية سريعة
- الإفصاح
- المراجع
الخلفية
قبل أن نبدأ في تفاصيل Slimv وVlime، من المفيد أن نلقي نظرة سريعة على التراث الذي أدى إلى ظهور هذه المكونات الإضافية. توفر هذه الأدوات بيئات تطوير Lisp لـ Vim، لذا تبدأ قصتها مع Lisp نفسها.
Lisp
Lisp هي عائلة من لغات البرمجة تتميز ببادئة مقوسة بالكامل. تختلف هذه اللغة تمامًا عن معظم لغات البرمجة الشائعة اليوم مثل C و Python و Ruby وغيرها. إن طبيعتها المتجانسة ونظام الماكرو القوي الذي يمكنه تحويل تعبيرات Lisp يجعلها لغة مرنة ومتعددة الاستخدامات وقابلة للتوسيع والاستبطان لدرجة أن المقالات التي تصف Lisp غالبًا ما تتضمن كلمة الإلهام. على سبيل المثال، راجع المقالات التالية:
- التغلب على المتوسطات (بقلم بول جراهام)
- طبيعة Lisp (بقلم سلافا أخمشت)
- كيف أصبحت Lisp لغة البرمجة الخاصة بالله (بواسطة سنكلير الهدف)
وصف آلان كاي Lisp بشكل مشهور بأنها: أعظم لغة برمجة منفردة تم تصميمها على الإطلاق.
كتب جون فوديرارو هذا عن Lisp: Lisp هي لغة برمجة قابلة للبرمجة.
وقد عبر إريك س. ريموند عن التنوير الذي يختبره المرء من خلال تعلم Lisp في مقالته الشهيرة بعنوان كيف تصبح هاكر: تستحق Lisp التعلم من أجل تجربة التنوير العميقة التي ستحصل عليها عندما تفهمها أخيرًا. ستجعلك هذه التجربة مبرمجًا أفضل لبقية أيامك، حتى لو لم تستخدم Lisp نفسها كثيرًا.
راندال مونرو، مبتكر XKCD، خصص موقعًا هزليًا عبر الويب مقطعين فكاهيين لـ Lisp.
تم تطوير Lisp في عام 1958 بواسطة جون مكارثي، وهي ثاني أقدم لغة برمجة مستخدمة اليوم، حيث تسبقها فورتران بسنة واحدة فقط. تشمل بعض لهجات Lisp الشائعة اليوم Common Lisp و Scheme و Clojure. ستركز معظم هذه المقالة على Common Lisp، وسيتم مناقشة Scheme و Clojure بإيجاز في نهاية المقالة.
إيماكس: SLIME
يفكر العديد من مبرمجي Lisp على الفور في Emacs عندما يفكرون في كتابة كود Lisp. Emacs هي عائلة من محرري النصوص، وعادةً ما يتم تنفيذ محرر Emacs نفسه بلغة Lisp. يوجد وضع Emacs يسمى SLIME يوفر دعمًا ممتازًا للبرمجة في Lisp. يرمز SLIME إلى وضع التفاعل Lisp الفائق لـ Emacs. تم إصدار SLIME لأول مرة في أغسطس 2003، وقد تم إنشاؤه بواسطة Eric Marsden ثم تم تطويره لاحقًا بواسطة Luke Gorrie و Helmut Eller. يوفر حلقة قراءة وتقييم وطباعة (REPL) وتصحيحًا متكاملًا وتقييمًا تفاعليًا للتعبيرات، وكلها متاحة مباشرةً داخل المحرر. هناك العديد من روابط المفاتيح الأنيقة المتاحة لتجميع وتقييم أجزاء أو كل التعليمات البرمجية في المخزن المؤقت الحالي.
يعمل SLIME عن طريق تشغيل خادم Swank TCP. Swank هو برنامج خادم خلفي مكتوب بلغة Common Lisp يستمع على مقبس لتلقي أوامر SLIME من Emacs وتنفيذها. يعد SLIME مفيدًا جدًا لدرجة أنه يعتبر لا غنى عنه من قبل العديد من مبرمجي Lisp الذين يكتبون كود Lisp في Emacs.
Vim: Slimv/Vlime
هل هناك أي شيء مشابه لـ SLIME لـ Vim؟ نعم، هناك خياران شائعان:
- Slimv: يرمز إلى وضع التفاعل Lisp الفائق لـ Vim. إنه مكون إضافي لـ Vim أنشأه Tamas Kovacs وتم إصداره لأول مرة في يناير 2009.
- Vlime: إنه مكون إضافي لـ Vim أنشأه Kay Z وتم إصداره لأول مرة في مايو 2017. وهو أحدث بكثير من Slimv، حيث Vlime أصغر من Slimv بثماني سنوات.
يستخدم كلا المكونين الإضافيين بنية خادم العميل مثل SLIME في Emacs. يعتمد كلاهما على خادم Swank للبدء. في الواقع، يقوم Slimv بتجميع نسخة معدلة قليلاً من Swank معه، ليتمكن من تشغيله والاتصال به لإرسال التعبيرات لتقييمها. لا يقوم Vlime بتجميع خادم Swank مع نفسه ولكنه يوفر برنامجًا يقوم بتنزيل خادم Swank تلقائيًا عند الحاجة.
إدارة الإضافات في Vim
عندما بدأت استخدام Vim منذ خمسة عشر عامًا، اعتدنا على تنزيل إضافة Vim ونسخها أو استخراجها إلى دليل ~/.vim. في هذه الأيام، هناك عدد قليل من أدوات إدارة الإضافات لـ Vim مثل Pathogen و Vundle و vim-plug وما إلى ذلك. لن أستخدم أيًا منها في هذه المقالة، لأنني لا أعرف أيها تستخدمون ولا أرغب في كتابة خطوات لكل منها.
في الواقع، لم أستخدم مطلقًا أي مدير إضافي لـ Vim بنفسي. حتى Vim 7، كنت أقوم بإنشاء دليل ~/.vim/bundle، ثم أنسخ كل إضافة إلى دليلها الخاص بداخله وأضف مسار دليل الإضافة إلى خيار Vim’s runtimepath.
يتمتع Vim 8 بدعم أصلي للحزم مما يجعل تثبيت الإضافات وتحميلها أسهل. باستخدام Vim 8، يمكننا نسخ كل إضافة إلى دليلها الخاص ضمن ~/.vim/pack/plugins/start ويتم تحميلها تلقائيًا عند بدء تشغيل Vim. اسم الدليل plugins في هذا المسار هو مجرد مثال، يمكن أن يكون أي اسم عشوائي وسيظل Vim يقوم بتحميل الإضافات بشكل جيد.
في هذه المقالة، سأستخدم الدعم الأصلي لـ Vim 8 للحزم لإعداد إضافات Vim. الاستثناء الوحيد لهذا هو تثبيت Vlime. دليل المستوى الأعلى لـ Vlime ليس دليل الإضافة. يوجد دليل الإضافة في دليل فرعي يسمى vim. هذا لا يتوافق مع بنية دليل الإضافات في حزمة Vim. لذلك، في هذه المقالة، سأقوم بإعداد Vlime بالطريقة التقليدية عن طريق نسخه إلى ~/.vim/bundle ثم إضافة المسار إلى دليل الإضافات الخاص به إلى خيار Vim’s runtimepath.
إصدارات البرامج
نظرًا لأن هذه المقالة تتضمن عدة طبقات من البرامج، فقد لا تبقى بعض المعلومات المكتوبة هنا دقيقة في المستقبل، حيث تتغير هذه الأجزاء المتنوعة من البرامج وتتطور بمرور الوقت. لذلك، سأقوم في هذا القسم بتدوين إصدارات الأدوات البرمجية المختلفة التي استخدمتها أثناء كتابة هذه المقالة، وهي كالتالي:
- ديبيان جنو/لينكس 10.1 (باستر)
- فيم 8.1
- Slimv (تم تحديث Git repo آخر مرة في 30 نوفمبر 2019 مع الالتزام 47a0070)
- Vlime (تم تحديث Git repo آخر مرة في 16 أكتوبر 2017 مع الالتزام 065b95f)
- Paredit (تم تحديث Git repo آخر مرة في 30 نوفمبر 2019 مع الالتزام د99905أ)
- قوس قزح (تم تحديث Git repo آخر مرة في 29 أكتوبر 2015 مع الالتزام 27e7cd7)
- إس بي سي إل 1.4.16.ديبيان
- جنو كليب 2.49.92
- الخسائر الائتمانية المتوقعة 16.1.3
- مخطط MIT/GNU 9.1.1 على Debian GNU/Linux 9.11 (ممتد)
- كلوجر 1.10.1
- الإصدار التجريبي من Quicklisp (آخر تحديث للمكتبات في 30 نوفمبر 2019)
- تموكس 2.8
ربما ستحتاج فقط إلى مجموعة فرعية صغيرة من الأدوات المذكورة أعلاه اعتمادًا على الأقسام التي ستتبعها في هذه المقالة. ما عليك سوى اختيار الأقسام التي ترغب في تجربتها واتباع الخطوات المكتوبة فيها. سيرشدونك خلال إجراءات تثبيت الأدوات المطبقة على الأقسام التي اخترتها. بغض النظر عن الأقسام التي تختارها، أنصحك بالتأكيد بالاطلاع على الأقسام الفرعية الثلاثة التي تحمل عنوان ابدأ. تتطرق هذه الأقسام الفرعية إلى تفاصيل حول بعض المتطلبات الأساسية مثل دعم tmux و Paredit ودعم واجهة Python في Vim، وما إلى ذلك، والتي لم يتم تناولها في الأقسام الأخرى.
قد يبدو اختيار دبيان غريبًا، لكنني أردت أن تكون الأوامر والخطوات التي نناقشها في هذه المقالة قابلة للتكرار بسهولة في نظام تشغيل مجاني ومفتوح المصدر. دبيان هو المفضل لدي، وما يعمل عليه يمكن تكراره بسهولة على أوبونتو والمشتقات الأخرى، غالبًا دون أي تغييرات في الخطوات. أعتقد أنه لن يكون من الصعب جدًا ترجمة الخطوات المتوفرة لديبيان إلى خطوات يمكن أن تعمل على نظام تشغيل آخر.
لاحظ أن Quicklisp (أحد المتطلبات الأساسية لـ Vlime) لا يزال برنامجًا تجريبيًا في وقت كتابة هذه المقالة. قد تتغير الخطوات الفعلية لتثبيت Quicklisp في المستقبل. يُرجى مراجعة الموقع الرسمي Quicklisp للحصول على أحدث التعليمات لتثبيته.
ابدأ
ابدأ مع Slimv و SBCL
فيما يلي خطوات إعداد Slimv واستخدامه:
1. قم بتثبيت الأدوات المطلوبة لإعداد بيئة تطوير Common Lisp باستخدام Slimv باستخدام هذا الأمر:
sudo apt-get install vim-nox sbcl tmux git
Vim الافتراضي في دبيان هو vim.basic المقدمة من حزمة vim التي لا تدعم واجهة بايثون. Slimv مكتوب بلغة Vim و Lisp و Python 3، لذا فهو يحتاج إلى حزمة Vim التي تدعم واجهة Python. إحدى هذه الحزم هي vim-nox الذي يوفر أمر vim.nox. يؤدي تثبيته إلى تحديث الأمر vim تلقائيًا لتشغيل vim.nox. حزمة أخرى مماثلة هي vim-gtk والتي توفر بالإضافة إلى ذلك دعم واجهة المستخدم الرسومية. يمكن إطلاق Vim الرسومية المعروفة باسم GVim باستخدام أمر gvim. يتم تشغيله في بيئة سطح المكتب. لغرض هذا المقال، سألتزم بـ vim-nox لأنه خفيف الوزن. جميع الخطوات المخصصة لـ Slimv ستعمل بشكل جيد بنفس القدر مع vim-gtk و MacVim و GVim.
تثبيت tmux اختياري. يمكن لـ Slimv تشغيل خادم Swank تلقائيًا إذا كان Vim يعمل ضمن tmux أو GNU Screen أو بيئة سطح المكتب، لذلك إذا كنت تستخدم GNU Screen بالفعل، فلن تحتاج إلى تثبيت tmux. أيضًا، إذا كنت تقوم بتشغيل Slimv في بيئة سطح مكتب، فلن تحتاج حقًا إلى تثبيت tmux أو GNU Screen، على الرغم من أنه يمكنك ذلك إذا كنت ترغب في رؤية Swank يعمل في نافذة tmux أو GNU Screen منفصلة بدلاً من نافذة طرفية منفصلة. في هذه المقالة، سأفترض أن Vim يعمل ضمن tmux. إذا كنت ستقوم بتشغيل Slimv في محطة طرفية بدون بيئة سطح مكتب أو tmux أو GNU Screen، فيجب تشغيل خادم Swank يدويًا. توضح النقطة 4 أدناه كيفية القيام بذلك.
2. يُعد تثبيت Slimv أمرًا بسيطًا جدًا. إليك طريقة واحدة للقيام بذلك:
git clone https://github.com/kovisoft/slimv.git ~/.vim/pack/plugins/start/slimvvim +’helptags ~/.vim/pack/plugins/start/slimv/doc’ +q
هذا كل شيء! تم إعداد Slimv. الأمر بهذه البساطة. توضح الأوامر أعلاه كيفية إعداد Slimv باستخدام أمرين Shell فقط. يمكنك أيضًا استخدام مدير إضافات Vim لتثبيت Slimv لك، لكنني لن أغطي ذلك هنا.
3. هذه خطوة اختيارية. يدعم Slimv بدء تشغيل خادم Swank تلقائيًا إذا كنت تقوم بتشغيل Vim في tmux أو GNU Screen أو بيئة سطح المكتب. لبدء تشغيل tmux، أدخل هذا الأمر:
tmux
إذا كنت تستخدم شاشة GNU أو بيئة سطح المكتب، فلن تحتاج إلى تشغيل tmux. إذا كنت لا تستخدم tmux أو GNU Screen أو بيئة سطح المكتب، فيجب عليك تشغيل خادم Swank يدويًا كما هو موضح في النقطة التالية.
4. هذه الخطوة ضرورية فقط إذا كنت لا تستخدم tmux أو GNU Screen أو بيئة سطح المكتب. يوضح الأمر التالي كيفية بدء تشغيل خادم Swank يدويًا:
sbcl –load ~/.vim/pack/plugins/start/slimv/slime/start-swank.lisp
إذا كنت تستخدم tmux أو GNU Screen أو بيئة سطح مكتب، فيمكن لـ Slimv تشغيل خادم Swank تلقائيًا عند الحاجة ولا تحتاج إلى تنفيذ هذه الخطوة.
5. قم بإنشاء ملف تعليمات برمجية مصدر Lisp جديد، على سبيل المثال، foo.lisp، بهذا الأمر:
vim foo.lisp
6. للاتصال بخادم Swank، أدخل الأمر التالي في الوضع العادي:
,ج
إذا كان Vim يعمل ضمن tmux أو GNU Screen أو بيئة سطح المكتب، فسيقوم Slimv تلقائيًا بتشغيل خادم Swank والاتصال به. بعد أن يتصل Slimv بـ Swank بنجاح، يجب أن تنقسم نافذة Vim إلى قسمين ويجب أن تظهر المطالبة التالية في النافذة المقسمة الجديدة:
CL-USER>
هذا هو REPL المتكامل. وهو الآن حي وجاهز للبرمجة التفاعلية. نفترض هنا أن Slimv يستخدم مفتاح Slimv Leader الافتراضي ,. إذا قمت بتجاوز مفتاح Vim الرئيسي، فقد يكون مفتاح Slimv الرئيسي هو نفس مفتاح Vim الرئيسي. أدخل الأمر :echo g:slimv_leader في وضع سطر الأوامر Vim للعثور على المفتاح الرئيسي الذي يستخدمه Slimv.
7. اكتب بعض التعليمات البرمجية في المخزن المؤقت للملف الجديد. للقيام بذلك، اكتب أولاً أنا للدخول إلى وضع الإدراج واكتب هذا الرمز:
(تنسيق ر hello, world~%)
اكتب خروج للعودة إلى الوضع العادي.
8. لتقييم التعبير الحالي تحت المؤشر، أدخل الأمر التالي في الوضع العادي:
,ه
يجب أن يظهر كل من التعبير الحالي ونتيجته في نافذة REPL.
9. REPL تفاعلي. اكتب كنترول+ث ث للتبديل إلى نافذة REPL. ثم اكتب أنا للدخول إلى وضع الإدراج واكتب هذا الرمز:
(+ 1 2)
اكتب يدخل لتقييم التعبير تمامًا كما تفعل في REPL الحقيقي. يجب أن تظهر النتيجة بعد ذلك في REPL. اكتب خروج للعودة إلى الوضع الطبيعي مرة أخرى. استخدم أمر الوضع العادي كنترول+ث ث للتبديل بين النوافذ المنقسمة.
10. الآن بعد أن بدأت مع Slimv، إليك ملاحظة مختصرة حول إلغاء التثبيت، في حالة احتياجك إليها في أي وقت. إذا تم تثبيت Slimv كما هو موضح في النقطة 2 أعلاه، فأدخل الأمر التالي لإلغاء تثبيته:
rm -rf ~/.vim/pack/plugins/start/slimv
في الخطوتين 7 و 9، ربما لاحظت أنه بمجرد كتابة قوس فتح أو علامة اقتباس مزدوجة، يتم إدراج قوس إغلاق مطابق تلقائيًا. يتم ذلك بواسطة إضافة Paredit التي تم تجميعها مع Slimv. يضمن Paredit التحرير المنظم لتعبيرات Lisp ويحافظ على توازن جميع الأحرف المتطابقة (الأقواس والأقواس وعلامات الاقتباس). كما أنه يوفر العديد من روابط المفاتيح الجديدة لتحرير التعبيرات بسهولة. سوف ننظر في Paredit بمزيد من التفاصيل في القسم الفرعي ابدأ مع Paredit لاحقًا.
ابدأ مع Vlime و SBCL
فيما يلي خطوات إعداد Vlime واستخدامه:
1. قم بتثبيت الأدوات المطلوبة لإعداد بيئة تطوير Common Lisp باستخدام Vlime باستخدام هذا الأمر:
sudo apt-get install vim sbcl git curl
لاحظ أنه على عكس Slimv، يمكن لـ Vlime العمل مع Vim الافتراضي في Debian، أي vim.basic. لا يتطلب Vlime Vim مع واجهة Python.
2. قم بتثبيت Quicklisp باستخدام هذه الأوامر:
curl -O https://beta.quicklisp.org/quicklisp.lispsbcl –load quicklisp.lisp –eval ‘(quicklisp-quickstart:install)’ –eval ‘(exit)’sbcl –load ~/quicklisp/setup.lisp –eval ‘(ql:add-to-init-file)’ –eval ‘(exit)’
اكتب يدخل وفي النهاية، عند المطالبة، لإكمال التثبيت.
3. قم بتثبيت Vlime و Paredit باستخدام هذه الأوامر:
git clone https://github.com/l04m33/vlime.git ~/.vim/bundle/vlimegit clone https://github.com/kovisoft/paredit ~/.vim/pack/plugins/start/pareditecho ‘set runtimepath^=~/.vim/bundle/vlime/vim’>> ~/.vimrcvim +’helptags ~/.vim/bundle/vlime/vim/doc’ +’helptags ~/.vim/pack/plugins/start/paredit/doc’ +q
على عكس Slimv، Vlime لا يحزم Paredit جنبًا إلى جنب مع نفسه. كما هو موضح في القسم السابق، فهو يساعدنا في التحرير المنظم لتعبيرات Lisp. أوصي بتثبيت Paredit ولكن في حالة اختيار عدم القيام بذلك، تأكد من تمكين تحميل الإضافات لنوع الملف عن طريق إدخال أمر :filetype في وضع سطر الأوامر. يجب أن يحتوي الإخراج على plugin:ON. إذا كان مطفأ، قم بإضافة الأمر filetype plugin on لـ ~/.vimrc للتأكد من أن هذا هو دائماً على. لن يعمل Vlime دون تمكين هذا. إذا قمت بتثبيت Paredit، فلا داعي للقلق بشأن هذا لأن Paredit يعتني بتمكين هذا بشكل افتراضي.
4. قم بإنشاء ملف تعليمات برمجية مصدر Lisp جديد، على سبيل المثال، foo.lisp، بهذا الأمر:
vim foo.lisp
5. لبدء تشغيل خادم Vlime (مُجمّع حول خادم Swank) والاتصال به تلقائيًا، أدخل الأمر التالي في الوضع العادي:
\pp
ونفترض هنا أن Vim
Vlime Connection 1 established.
بعد ظهور الرسالة أعلاه، لا بأس بإغلاق نافذة التقسيم لخادم Vlime عن طريق إدخال هذا الأمر في وضع سطر أوامر Vim:
:q
سيستمر خادم Vlime في العمل في الخلفية. يمكن استخدام الأمر التالي في الوضع العادي لعرض إخراج وحدة التحكم لخادم Vlime في أي وقت يكون مطلوبًا:
\pv
6. اكتب بعض التعليمات البرمجية في المخزن المؤقت للملف الجديد. للقيام بذلك، اكتب أولاً أنا للدخول إلى وضع الإدراج واكتب هذا الرمز:
(تنسيق ر hello, world~%)
اكتب خروج للعودة إلى الوضع العادي.
7. لتقييم التعبير الحالي تحت المؤشر، أدخل الأمر التالي في الوضع العادي:
\ee
يجب أن يظهر كل من التعبير الحالي ونتيجته في نافذة REPL. على عكس Slimv، فإن نافذة REPL الخاصة بـ Vlime ليست تفاعلية. تم ضبط الخيار nomodifiable، لذلك لا يمكننا كتابة التعليمات البرمجية مباشرة في نافذة REPL. يمكن أن يكون هذا مشكلة بعض الشيء إذا أردنا كتابة تعبيرات عشوائية في REPL وتنفيذها. للتخفيف من هذا القصور إلى حد ما، يوفر Vlime طريقة بديلة لتقييم التعبير الحالي المعروف باسم وضع التفاعل. ويتم توضيح ذلك في النقطة التالية.
8. تمكين وضع التفاعل عن طريق إدخال هذا الأمر في الوضع العادي:
\i
يقوم نفس الأمر بتعطيل وضع التفاعل، أي أن هذا الأمر يقوم بتبديل حالة وضع التفاعل بين التشغيل والإيقاف. عندما يكون وضع التفاعل قيد التشغيل، قم بتقييم التعبير الموجود أسفل المؤشر بمجرد الضغط على يدخل في الوضع العادي.
9. الآن بعد أن بدأت باستخدام Vlime، إليك ملاحظة مختصرة حول عملية إلغاء التثبيت، في حالة احتياجك إليها في أي وقت. إذا تم تثبيت Quicklisp و Vlime كما هو موضح في النقطتين 2 و 3 أعلاه، فقم بتشغيل هذه الأوامر لإلغاء تثبيتهما:
rm -rf ~/quicklisp ~/.vim/bundle/vlime ~/.vim/pack/plugins/start/pareditsed -i.bkp ‘/runtimepath.*vlime/d’ ~/.vimrc
اختياريًا، قم بإزالة ~/.sblrc أو قم بتحريره لإزالة الكود الخاص بالتحميل quicklisp/setup.lisp.
ابدأ مع Paredit
لقد بدأت بالفعل باستخدام Paredit عندما كتبت كود Lisp أثناء اتباع أحد القسمين الفرعيين السابقين. في اللحظة التي كتبت فيها قوسًا افتتاحيًا، قام Paredit بإدراج قوس إغلاق لك تلقائيًا. يحافظ Paredit على توازن جميع الأحرف المتطابقة مثل الأقواس وعلامات الاقتباس المزدوجة وما إلى ذلك عند تحرير التعليمات البرمجية. إليك تمرينًا موجزًا للغاية للبدء سريعًا في استخدام بعض الميزات الأساسية لبرنامج Paredit:
1. قم بإنشاء ملف تعليمات برمجية مصدر Lisp جديد، على سبيل المثال، foo.lisp، بهذا الأمر:
vim foo.lisp
2. اكتب أنا للدخول إلى وضع الإدراج ثم اكتب هذا فقط:
(defun square (x
عند هذه النقطة، يجب أن يقوم Paredit بإدراج قوسي الإغلاق تلقائيًا. يجب أن يبدو الرمز كما يلي:
(defun square (x))
يجب أن يقع المؤشر مباشرة بعد المعلمة x. توضح الكتلة أعلاه المكان الذي يجب أن يكون فيه المؤشر.
3. بينما لا تزال في وضع الإدراج، اكتب قوس الإغلاق الأول. نعم، اكتبه حتى لو كان قوس الإغلاق موجودًا بالفعل. يجب أن يتجاوز المؤشر الآن قوس الإغلاق الأول كما يلي:
(defun square (x))
بالطبع، لم تكن هناك حاجة لكتابة قوس الإغلاق لأنه كان موجودًا بالفعل ولكن كتابته لتخطيه أكثر كفاءة من الهروب إلى الوضع العادي، ثم الانتقال فوقه ثم الدخول في وضع الإدراج مرة أخرى. هذه، في الواقع، ميزة رائعة جدًا في Paredit. يمكننا إدخال التعليمات البرمجية بنفس ضغطات المفاتيح كما نفعل بدون Paredit.
4. يجب أن تظل في وضع الإدراج. اكتب يدخل لإنشاء سطر جديد أدناه. الآن سيحدث أحد أمرين. إذا تم تعطيل الإرجاع الكهربائي، فسيتم إدراج سطر جديد كما هو متوقع كما يلي:
(defun square (x))
إذا تم تمكين الإرجاع الكهربائي، فسيتم إدراج سطرين جديدين لإنشاء سطر فارغ بينهما:
(defun square (x)
في كلتا الحالتين، يتم إدراج مسافة بادئة لمسافتين تلقائيًا. يسمح السطر الفارغ الجديد المُدرج بواسطة الإرجاع الكهربائي بتحرير الكود المراد إدخاله في هذا السطر الفارغ. يتم تمكين ميزة الإرجاع الكهربائي افتراضيًا في كل من Paredit و Slimv. وهو يعمل عن طريق إعادة رسم خرائط Paredit enter مفتاح (CR) في وضع الإدراج إلى وظيفة تُدخل الإرجاع الكهربائي. يحتاج Slimv إلى إعادة رسم خريطة enter مفتاح لتقديم قائمة الوسيطات للوظيفة الحالية ولكنه يهتم بإجراء إرجاع كهربائي قبل إظهار قائمة الوسائط. ومع ذلك، ينسى Vlime إجراء الإرجاع الكهربائي قبل إظهار قائمة الوسائط، لذلك لا تعمل هذه الميزة في Vlime. في الوقت الحالي، سنستمر في افتراض أن العودة الكهربائية ممكنة وتعمل بشكل جيد. إذا تم تعطيله أو إذا كان لا يعمل لديك، فتجاهل الخطوات التي تناقش الإرجاع الكهربائي.
5. الآن اكتب هذا فقط:
(* x x
مرة أخرى، كان Paredit قد قام بإدراج قوس الإغلاق تلقائيًا. يجب أن يبدو الكود هكذا الآن:
(defun square (x)
(* x x))
6. الآن، اكتب قوس إغلاق آخر للتقدم بعد قوس الإغلاق الذي تم إدراجه تلقائيًا مثل هذا:
(defun square (x)
(* x x))
7. ثم اكتب قوس إغلاق آخر. سيختار Paredit الآن قوس الإغلاق الوحيد الموجود في السطر الخاص به وينقله في نهاية السطر الحالي كما يلي:
(defun square (x)
(* x x))
يساعد هذا السلوك المتمثل في استهلاك السطر الجديد الإضافي الذي تم إدراجه عن طريق الإرجاع الكهربائي عند كتابة قوس إغلاق، الكود على التوافق مع اتفاقية تشفير Lisp الشائعة المتمثلة في وضع جميع أقواس الإغلاق المتتالية بجانب بعضها البعض في نفس السطر. بمعنى آخر، كتابة قوسين مغلقين يعيد تجميع العوائد الكهربائية عندما يكون ذلك ممكنًا.
8. دعونا نرى ما سيحدث إذا حاولنا حذف القوس الافتتاحي حول وظيفة المنتج (وظيفة *). اكتب خروج للعودة إلى الوضع العادي. ثم أدخل ح في الوضع العادي لتحريك المؤشر مكان واحد لليسار بحيث يتم وضع المؤشر بين قوسين بعد الأخير مباشرة x في الكود مثل هذا:
(defun square (x)
(* x x))
اكتب س لحذف قوس الإغلاق الذي يكون فيه المؤشر قيد التشغيل. لا شيء يتم حذفه! بدلاً من ذلك، يتخطى المؤشر القوسين كما يلي:
(defun square (x)
(* x x))
يرفض Paredit حذف قوس الإغلاق لأنه يحتوي على قائمة غير فارغة. كان سيتم حذف قوس الإغلاق مع القوس الافتتاحي إذا كانت القائمة فارغة. هذا هو Paredit الذي يحاول التأكد من أن تعبيرات s تظل صالحة أثناء التحرير. لاحظ أنه في هذه الخطوة، ح هو أمر حركة Vim العادي. في Vim، بشكل افتراضي، س يحذف الحرف الموجود أسفل المؤشر، ولكن عند تمكين Paredit، فإنه يعيد تعيين هذا الأمر ليتصرف بالطريقة التي اتبعها في هذه الخطوة لضمان بقاء الأقواس متوازنة.
9. دعونا نحاول الآن حذف السطر الحالي. اكتب د د للقيام بذلك. تبدو النتيجة كما يلي:
(defun square (x))
لاحظ كيف تم ترك قوس الإغلاق سليمًا للحفاظ على توازن الأقواس. مرة أخرى، أعاد Paredit رسم خريطة د د الأمر بإنتاج هذا السلوك.
10. الآن اكتب د أ( لحذف كامل defun تعبير. يجب أن يبدو المخزن المؤقت فارغًا الآن.
11. اكتب أنا للدخول إلى وضع الإدراج واكتب الكود التالي:
(list (* 10 20) (+ 30 40))
12. اكتب خروج للعودة إلى الوضع العادي. اكتب ح(ح ح لوضع المؤشر على قوس إغلاق التعبير الأول.
(list (* 10 20) (+ 30 40))
الآن اكتب ,>. ينتقل القوس الختامي للتعبير الأول إلى اليمين ويحتوي التعبير التالي. يبدو المخزن المؤقت هكذا:
(list (* 10 20 (+ 30 40)))
نفترض هنا أن Paredit يستخدم مفتاح Paredit الافتراضي ,. إذا قمت بتجاوز مفتاح Vim الرئيسي، فقد يكون مفتاح Paredit هو نفس مفتاح Vim الرئيسي. أدخل الأمر :echo g:paredit_leader في وضع سطر الأوامر Vim للعثور على مفتاح القائد الذي يستخدمه Paredit.
13. الآن اكتب ,<. ينتقل القوس الختامي للتعبير الخارجي إلى اليسار ليخرج التعبير الداخلي. يبدو المخزن المؤقت هكذا مرة أخرى:
(list (* 10 20) (+ 30 40))
أثناء وجود المؤشر بين قوسين، يمكن استخدام أوامر الوضع العادي ,< أو ,> بهذه الطريقة لتحريك الأقواس إلى اليسار أو اليمين على التوالي، وبالتالي دمج التعبيرات أو فصلها.
كانت تلك نظرة عامة مختصرة للغاية عما يمكن أن يفعله Paredit. هناك الكثير في Paredit أكثر مما هو موضح أعلاه. يحتوي Paredit على مجموعة غنية من روابط المفاتيح لجعل تحرير تعبيرات s أمرًا مريحًا للغاية. أدخل :help paredit-keys في وضع سطر الأوامر لرؤية قائمة روابط المفاتيح.
أعتقد أنه من الجيد قراءة وثائق Paredit بأكملها. أدخل :help paredit للقيام بذلك. يبلغ طوله حوالي 500 سطر وتستغرق قراءته حوالي 30 إلى 40 دقيقة. إن الوقت الذي تقضيه في قراءة هذه الوثائق يستحق العناء لأنه يجعل تحرير كود Lisp أمرًا ممتعًا ومثمرًا للغاية.
استخدم المصحح والمفتش
بعد البدء باستخدام Slimv أو Vlime، الشيء التالي الذي قد ترغب في معرفته هو كيفية العمل مع مصحح الأخطاء. تظهر نافذة مصحح الأخطاء عند حدوث خطأ أو حالة لم تتم معالجتها. قد يبدو الأمر مخيفًا جدًا بالنسبة للمبتدئين، لذا من الجيد أن تعتاد عليه في أقرب وقت ممكن. لحسن الحظ، يوفر كل من Slimv و Vlime روابط مفاتيح ممتازة لفحص الخطأ أو تجاهله للعودة إلى المخزن المؤقت للتعليمات البرمجية المصدر بسرعة وسهولة.
استخدم Debugger و Inspector مع Slimv
تؤدي الخطوات التالية إلى حدوث خطأ ثم توضح كيفية العمل مع مصحح الأخطاء في Slimv:
1. قم بإنشاء ملف باستخدام Vim، على سبيل المثال foo.lisp وأدخل الكود التالي فيه:
(مربع ديفون (س)
س س))
(مربع foo)
2. أدخل ,ب لتقييم المخزن المؤقت.
3. بمجرد أن يتم تقييم النموذج المعيب (مربع foo)، يحدث خطأ. يتم عرض الخطأ وعمليات إعادة التشغيل المحتملة والتتبع الخلفي في نافذة مقسمة جديدة لـ SLDB. SLDB لتقف على Slime Debugger. فيما يلي مثال لما قد يظهر في نافذة SLDB:
القيمة foo ليست من النوع NUMBER عند ربط SB-KERNEL::X [Condition of type TYPE-ERROR]إعادة التشغيل: 0: [RETRY] أعد محاولة طلب تقييم SLIME REPL. 1: [*ABORT] العودة إلى المستوى الأعلى في SLIME. 2: [ABORT] إحباط الموضوع (#
تمت إضافة علامة القطع في النهاية بواسطتي للإشارة إلى أنه تم اقتطاع الإخراج الفعلي في هذه المقالة من أجل الإيجاز.
4. في نافذة SLDB، حرك المؤشر إلى السطر الثاني من التتبع الخلفي، أي على السطر التالي:
1: (مربع foo)
ثم اكتب يدخل. يجب الآن أن يتكشف هذا الخط لإظهار التفاصيل التالية:
1: (مربع foo) في (SB-INT:NAMED-LAMBDA SQUARE———————————–السكان المحليون: X=foo
5. حرك المؤشر إلى السطر الذي يبدأ بـ in، أي على هذا السطر:
in (SB-INT:NAMED-LAMBDA SQUARE———————————–
ثم اكتب يدخل. يجب أن تظهر بعض المعلومات حول كود المصدر الخاص به كما يلي:
1: (مربع foo) في (SB-INT:NAMED-LAMBDA SQUARE (X) (BLOCK SQUARE (#:***هنا*** XX)))) بايت 1 محلي: X=foo
6. حرك المؤشر إلى السطر التالي:
س=foo
ثم اكتب ,أنا لفحص هذا المتغير. ستظهر مطالبة لتأكيد اسم المتغير. اكتب يدخل للتأكيد. يجب أن تظهر الآن نافذة المفتش بمزيد من التفاصيل حول هذا المتغير. يجب أن تبدو هذه النافذة كما يلي:
Inspecting #——————–Press
7. اكتب يدخل لفحص أي كائن تحت المؤشر والتعمق أكثر.
8. اكتب مسافة للخلف في الوضع العادي للعودة إلى الكائن السابق.
9. أدخل ,س في الوضع العادي لإنهاء المفتش.
10. أخيرًا، حرك المؤشر إلى السطر التالي في نافذة SLDB:
1: [*ABORT] Return to SLIME’s top level.
ثم اكتب يدخل لتنفيذ إعادة التشغيل هذه. بدلا من ذلك، أدخل ,أ في الوضع العادي لتحديد إحباط إعادة التشغيل والخروج إلى المستوى السابق أو ,س للانسحاب إلى المستوى الأعلى.
في معظم الأوقات عندما يحدث خطأ، ألقي نظرة سريعة على تتبع المكدس لأدرك أنني ارتكبت خطأً سخيفًا وأدخل إلى ,س أمر للإجهاض والخروج إلى المستوى الأعلى. يمكن أن يكون هذا مناسبًا تمامًا لأنه يسمح بالعودة من تصحيح الأخطاء إلى البرمجة بسرعة كبيرة بضغطتين فقط على المفاتيح.
استخدم Debugger و Inspector مع Vlime
تؤدي الخطوات التالية إلى ظهور خطأ ثم توضح كيفية العمل مع مصحح الأخطاء في Vlime:
1. قم بإنشاء ملف باستخدام Vim، على سبيل المثال foo.lisp وأدخل الكود التالي فيه:
(مربع ديفون (س)
س س))
(مربع foo)
2. احفظ الملف، واتصل بخادم Vlime وأدخل \ew في الوضع العادي لتجميع المخزن المؤقت بأكمله.
3. بمجرد أن يتم تقييم النموذج المعيب (مربع foo)، يحدث خطأ. يتم عرض الخطأ وعمليات إعادة التشغيل المحتملة والتتبع الخلفي في نافذة مقسمة جديدة لـ SLDB. SLDB لتقف على Slime Debugger. فيما يلي مثال لما قد يظهر في نافذة SLDB:
الموضوع: 1؛ المستوى: 1 القيمة foo ليست من النوع NUMBER عند ربط SB-KERNEL::X [Condition of type TYPE-ERROR]إعادة التشغيل: 0. * إحباط – العودة إلى المستوى الأعلى لـ SLIME. 1. إحباط – إحباط الموضوع (#
تمت إضافة علامة القطع في النهاية بواسطتي للإشارة إلى أنه تم اقتطاع الإخراج الفعلي في هذه المقالة من أجل الإيجاز.
4. في نافذة SLDB، حرك المؤشر إلى السطر الثاني من التتبع الخلفي، أي على السطر التالي:
1. (مربع foo)
ثم اكتب د. يجب أن تظهر نافذة مقسمة جديدة تحتوي على التفاصيل التالية حول هذا الإطار:
الإطار: 1 (قابل لإعادة التشغيل) المحلي: X: fooالموقع: الملف: /home/susam/foo.lisp الموضع: 20 المقتطف: xx)) (مربع foo)
5. أثناء وجود المؤشر على نفس السطر المذكور في النقطة السابقة، اكتب أنا لإظهار نافذة المفتش لهذا الإطار.
6. في نافذة المفتش، اكتب أنا للدخول في وضع الإدراج. أدخل اسم المتغير التالي في وضع الإدراج:
x
ثم اكتب خروج للعودة إلى الوضع العادي. ثم اكتب يدخل. التفاصيل التالية حول المتغير x يجب أن يظهر الآن في نافذة المفتش:
#============================================Dimensions: (3)Element type: CHARACTERTotal size: 3Adjustable: NILFill pointer: NILContents:0: #f1: #o2: #o
7. اكتب يدخل لفحص أي كائن تحت المؤشر والتعمق أكثر.
8. اكتب ص للعودة إلى الكائن السابق.
9. أدخل أمر Vim العادي :q في وضع سطر الأوامر للخروج من نافذة المفتش.
10. أخيرًا، حرك المؤشر إلى السطر التالي في نافذة SLDB:
1: [*ABORT] Return to SLIME’s top level.
ثم اكتب يدخل لتنفيذ إعادة التشغيل هذه. بدلا من ذلك، يمكننا الدخول أ في الوضع العادي لتحديد إحباط إعادة التشغيل للعودة إلى المستوى السابق. في هذا الوقت، لا يوجد أمر بالعودة إلى المستوى الأعلى لـ SLIME.
وظيفة التتبع
تتبع الدالة في Slimv
توضح الخطوات التالية كيفية البدء بوظائف التتبع في Slimv:
1. قم بإنشاء ملف باستخدام Vim، على سبيل المثال foo.lisp وأدخل الكود التالي فيه:
(defun square (x)
(* x x))
(square (square 2))
2. أدخل ,ب في الوضع العادي لتقييم المخزن المؤقت بأكمله.
3. ضع المؤشر على اسم الوظيفة، أي على square وأدخل ,ر في الوضع العادي لتبديل التتبع لهذه الوظيفة. تظهر مطالبة لتأكيد اسم الوظيفة. اكتب يدخل للتأكيد.
4. أثناء وجود المؤشر على التعبير الأخير، أدخل ,د في الوضع العادي لتقييم نموذج المستوى الأعلى. يظهر الإخراج التالي في المخزن المؤقت REPL.
(square (square 2))
0: (SQUARE 2)
0: SQUARE returned 4
0: (SQUARE 4)
0: SQUARE returned 16
16
يحتوي هذا الإخراج على معلومات حول كل استدعاء للدالة التي تم تتبعها والوسائط التي تم تمريرها إليها والقيم المرجعة.
تتبع الدالة في Vlime
يستغرق الأمر المزيد من العمل لبدء وظائف التتبع في Vlime. توضح الخطوات التالية كيفية القيام بذلك:
1. أضف العبارة التالية إلى ~/.vimrc:
let g:vlime_contribs=[‘SWANK-ASDF’, ‘SWANK-PACKAGE-FU’, ‘SWANK-PRESENTATIONS’, ‘SWANK-FANCY-INSPECTOR’, ‘SWANK-C-P-C’, ‘SWANK-ARGLISTS’, ‘SWANK-REPL’, ‘SWANK-FUZZY’, ‘SWANK-TRACE-DIALOG’]
يحدد المتغير أعلاه قائمة وحدات مساهمة Swank التي سيتم تحميلها أثناء تهيئة اتصال Vlime. يتم تحميل جميع الوحدات المذكورة أعلاه باستثناء الوحدة الأخيرة بشكل افتراضي. الوحدة SWANK-TRACE-DIALOG لا يتم تحميلها بشكل افتراضي ولكن هذه الوحدة ضرورية لوظائف التتبع، لذلك من أجل تحميلها، نحدد هذا المتغير لتحميل هذه الوحدة بالإضافة إلى جميع الوحدات الأخرى التي يتم تحميلها افتراضيًا.
2. قم بإنشاء ملف باستخدام Vim، على سبيل المثال foo.lisp وأدخل الكود التالي فيه:
(defun square (x)
(* x x))
(square (square 2))
3. احفظ الملف، واتصل بخادم Vlime وأدخل \ew في الوضع العادي لتجميع المخزن المؤقت بأكمله.
4. أدخل \td في الوضع العادي لإظهار مربع حوار التتبع في نافذة منقسمة.
5. أدخل كنترول+ث ث في الوضع العادي للعودة إلى نافذة التعليمات البرمجية المصدر.
6. ضع المؤشر على اسم الوظيفة، أي على square وأدخل \tt في الوضع العادي لتبديل التتبع لهذه الوظيفة.
7. أثناء وجود المؤشر على التعبير الأخير، أدخل \er في الوضع العادي لتقييم نموذج المستوى الأعلى.
8. أدخل كنترول+ث ث في الوضع العادي مرتين للذهاب إلى نافذة التتبع.
9. تحت Trace Entries، ضع المؤشر على [refresh] واكتب يدخل.
10. ثم ضع المؤشر على [fetch next batch] واكتب يدخل. يجب أن تظهر نتيجتان لاستدعاءات square التي تم إجراؤها بسبب الخطوة 7. سيتم طي معلومات التتبع أسفل كل مكالمة.
11. حرك المؤشر إلى كل سطر طية وأدخل ض س في الوضع العادي لفتح الطية. بعد فتح الطيتين يجب أن تظهر النتيجة التالية:
0 – COMMON-LISP-USER::SQUARE > 2 4 0 – COMMON-LISP-USER::SQUARE > 4 16
الخطوط التي تبدأ بـ > تعرض الوسائط وتلك التي تبدأ بـ < تظهر قيم الإرجاع.
ميزات أنيقة
في هذا القسم، سنتناول بعض الميزات الرائعة التي توفرها هذه المكونات الإضافية. لن يتم تغطية جميع الميزات هنا. لقد اخترت فقط بعض الميزات للمناقشة هنا والتي شعرت أنها ستكون مفيدة للمبتدئين وفي نفس الوقت توضح أيضًا تعدد استخدامات هذه المكونات الإضافية.
تقييم نموذج المستوى الأعلى
في الأقسام السابقة، رأينا كيفية تقييم التعبير الحالي تحت المؤشر. في هذا القسم، سنرى كيفية تقييم تعبير المستوى الأعلى حول موضع المؤشر الحالي. دعونا نقوم بتمرين صغير لنرى هذا:
1. قم بإنشاء ملف باستخدام Vim، على سبيل المثال foo.lisp وأدخل الكود التالي فيه:
(+ 1 (* 2 (/ 6 2)))
2. مع اتصال Slimv أو Vlime بـ Swank، فلنقم بتلخيص سريع لكيفية تقييم التعبير الحالي. باستخدام Slimv، أدخل أمر الوضع العادي ,ه لتقييم التعبير الحالي. باستخدام Vlime، أدخل أمر الوضع العادي \ee لتقييم التعبير الحالي. التعبير الحالي، أي (/ 6 2) ينبغي الحصول على تقييم والنتيجة 3 يجب أن تظهر في المخزن المؤقت REPL.
3. دعونا نرى الآن كيفية تقييم تعبير المستوى الأعلى. باستخدام Slimv، أدخل أمر الوضع العادي ,د لتقييم تعبير المستوى الأعلى. باستخدام Vlime، أدخل أمر الوضع العادي \er لتقييم تعبير المستوى الأعلى. يجب أن يتم تقييم تعبير المستوى الأعلى والنتيجة 7 يجب أن تظهر في المخزن المؤقت REPL.
أقواس قوس قزح
تجعل أقواس قوس قزح من السهل رؤية الأقواس المتطابقة عن طريق تلوين مستويات مختلفة من الأقواس بألوان مختلفة. الأقواس المتطابقة لها نفس اللون. لتمكين هذه الميزة في Slimv، قم بإضافة هذا الأمر إلى ~/.vimrc:
let g:lisp_rainbow=1
هذه الميزة غير متوفرة في Vlime. ولكن هناك العديد من مكونات Vim الإضافية التي تدعم أقواس قوس قزح. فيما يلي خطوات تثبيت أحد هذه المكونات الإضافية التي تحظى بشعبية كبيرة:
git clone https://github.com/junegunn/rainbow_parentheses.vim.git ~/.vim/pack/plugins/start/rainbow_parenthesesecho ‘autocmd FileType lisp,scheme,clojure RainbowParentheses’>> ~/.vimrc
في حالة رغبتك في إلغاء تثبيته، أدخل هذه الأوامر:
rm -rf ~/.vim/pack/plugins/start/rainbow_parenthesessed -i.bkp ‘/autocmd.*RainbowParentheses/d’ ~/.vimrc
قائمة الوسائط
لا بد أنك رأيت هذه الميزة بالفعل أثناء تجربة الأقسام مسبقًا. أثناء تحرير ملف مصدر Lisp، بعد كتابة اسم الوظيفة، بمجرد كتابة مسافة أو كتابة مفتاح الإدخال، تظهر قائمة الوسائط الخاصة بالوظيفة لتكون بمثابة مرجع. في Slimv، تظهر قائمة الوسائط في سطر الحالة بالأسفل. في Vlime، تظهر قائمة الوسائط في نافذة مقسمة في الأعلى.
الاكتمال الشامل
اكتب اسم وظيفة جزئيا، على سبيل المثال form واكتب Ctrl+N بينما لا يزال في وضع الإدراج. يجب أن تظهر قائمة الإكمال الشامل مع قائمة الإكمالات إذا كان هناك خيارات متعددة. اكتب Ctrl+N لتحديد الاختيار التالي و Ctrl+P لتحديد الاختيار السابق. يؤدي تحديد أحد الخيارات أيضًا إلى إدراج هذا الاختيار على الفور في المخزن المؤقت. يعمل هذا في كل من Slimv و Vlime. في Slimv، يمكننا أيضًا الكتابة Ctrl+N لتحديد الاختيار التالي.
افتراضيًا، يكون الاكتمال الشامل غامضًا. على سبيل المثال، اكتب wl واكتب Ctrl+N ويجب إدراج كلي كامل write-line تلقائيًا بالإضافة إلى إظهار الاختيارات المطابقة الأخرى.
وصف الرمز
باستخدام Slimv، أدخل أمر الوضع العادي ,ق لوصف الرمز الموجود أسفل المؤشر. يؤدي هذا إلى إظهار توثيق الرمز في منطقة رسالة Vim. تعمل هذه الميزة أثناء تحرير الملفات المصدر Common Lisp و Clojure ولكن ليس أثناء تحرير الملف المصدر للمخطط. هذه الميزة غير مدعومة للمخطط في الوقت الحالي. انظر قسم لهجات Lisp الأخرى للحصول على تفاصيل حول كيفية إعداد Slimv باستخدام Clojure و MIT/GNU Scheme.
مع Vlime، أدخل \da في الوضع العادي لوصف الرمز الموجود أسفل المؤشر. يؤدي هذا إلى إظهار توثيق الرمز في نافذة مقسمة.
توسيع الماكرو
فيما يلي تمرين يوضح كيفية توسيع وحدات الماكرو بشكل تفاعلي أثناء تحرير ملف مصدر Lisp:
1. قم بإنشاء ملف باستخدام Vim، على سبيل المثال foo.lisp وأدخل الكود التالي فيه:
(defmacro calc (a op b)
(list op a b))
(defmacro square (x)
(list ‘calc x ‘* x))
(square 2)
2. مع Slimv، أدخل ,ب في الوضع العادي لتقييم المخزن المؤقت بأكمله. باستخدام Vlime، احفظ الملف، واتصل بخادم Vlime واكتب \ew في الوضع العادي لتجميع المخزن المؤقت بأكمله.
3. باستخدام Slimv، أثناء وجود المؤشر على التعبير الأخير، أدخل ,1 في الوضع العادي لتوسيع نموذج الماكرو مرة واحدة. مع Vlime، أدخل \m1 في الوضع العادي أن تفعل الشيء نفسه. يجب أن يظهر التوسع التالي كنتيجة:
(CALC 2 * 2)
يعرض Slimv التوسيع في المخزن المؤقت REPL بينما يعرضه Vlime في نافذة مقسمة جديدة.
4. مع Slimv، أدخل ,م في الوضع العادي لتوسيع التعبير الحالي بشكل متكرر حتى لا يصبح ماكرو. مع Vlime، أدخل \ma في الوضع العادي أن تفعل الشيء نفسه. يجب أن يظهر التوسع التالي كنتيجة:
(* 2 2)
المرجع الترافقي
فيما يلي تمرين يوضح كيفية استخدام أوامر الإسناد الترافقي في Slimv و Vlime:
1. قم بإنشاء ملف باستخدام Vim، على سبيل المثال foo.lisp وأدخل الكود التالي فيه:
(defun square (x)
(* x x))
(defun square-of-sum (x y)
(square (+ x y)))
(defun sum-of-squares (x y)
(+ (square x) (square y)))
(square-of-sum 2 3)
(sum-of-squares 2 3)
2. مع Slimv، أدخل ,ب في الوضع العادي لتقييم المخزن المؤقت بأكمله. باستخدام Vlime، احفظ الملف، واتصل بخادم Vlime واكتب \ew في الوضع العادي لتجميع المخزن المؤقت بأكمله.
3. باستخدام Slimv، ضع المؤشر على أي ظهور للرمز square وأدخل ,سل في الوضع العادي. ستظهر مطالبة لتأكيد اسم الرمز. اكتب يدخل للتأكيد. يجب أن تظهر الآن قائمة كافة المتصلين في مخزن REPL المؤقت. باستخدام Vlime، ضع المؤشر على أي ظهور للرمز square وأدخل \sc في الوضع العادي لسرد جميع المتصلين بالوظيفة. يظهر الإخراج في نافذة مقسمة تحتوي على المخزن المؤقت للإسناد الترافقي (xref). اكتب يدخل على أي عنصر في المخزن المؤقت xref وسيأخذك Vlime مباشرةً إلى الموقع المشار إليه.
تطبيقات Common Lisp الأخرى
استخدمت الأقسام السابقة SBCL كتطبيق لـ Common Lisp. ما مدى جودة عمل Slimv و Vlime مع تطبيقات Common Lisp الأخرى؟
لقد وجدت أن كلا البرنامجين الإضافيين تم اختبارهما جيدًا باستخدام SBCL. ومع ذلك، قد لا يتم اختبارها جيدًا مع التطبيقات الأخرى. نظرًا لعدم وجود اختبارات كافية لتطبيقات Common Lisp بخلاف SBCL، قد تحدث بعض الأخطاء أثناء استخدام تطبيقات أخرى. في بعض الأحيان يكون من الممكن التغلب على هذه الأخطاء وفي أحيان أخرى لا يكون الأمر كذلك. سنرى مثالاً على ذلك في القسم القادم عندما نحاول تشغيل خادم Swank تلقائيًا باستخدام Vlime و CLISP. بالنسبة لهذا القسم، اخترت CLISP و Embeddable Common-Lisp (ECL) كتطبيقين آخرين لـ Common Lisp سيتم استخدامهما مع Slimv و Vlime. بعد متابعة الأقسام الفرعية القادمة، يجب أن تتعرف على كيفية جعل Slimv أو Vlime يعمل مع تطبيقات أخرى لـ Common Lisp.
استخدم Slimv مع CLISP
إذا كنت قد قرأت وجربت الخطوات الموجودة في قسم ابدأ مع Slimv و SBCL سيكون من السهل جدًا استخدام Slimv مع CLISP. الخطوات متشابهة مع بعض التعديلات الطفيفة. تم شرحها أدناه:
1. قم بإلغاء تثبيت SBCL وتثبيت CLISP باستخدام هذه الأوامر:
sudo apt-get remove sbclsudo apt-get install clisp
2. لبدء تشغيل خادم Swank يدويًا، أدخل هذا الأمر:
clisp ~/.vim/pack/plugins/start/slimv/slime/start-swank.lisp
ثم قم بتحرير ملف Lisp المصدر وأدخل الأمر العادي ,ج للاتصال به وإظهار نافذة REPL.
3. لبدء Swank تلقائيًا من Slimv، ليس هناك ما يجب القيام به. ما عليك سوى تحرير ملف مصدر Lisp وإدخال أمر الوضع العادي ,ج. أثناء التشغيل في GNU Screen أو tmux أو بيئة سطح المكتب، يمكن لـ Slimv اكتشاف CLISP تلقائيًا وبدء تشغيل خادم Swank به.
بشكل عام، لبدء تشغيل خادم Swank يدويًا باستخدام تطبيق Common Lisp آخر، نحتاج إلى معرفة كيفية تحميل start-swank.lisp معها.
استخدم Slimv مع ECL
خطوات استخدام Slimv مع Embeddable Common-Lisp (ECL) متشابهة جدًا أيضًا. مرة أخرى، فقط إذا أردنا تشغيل خادم Swank يدويًا، نحتاج إلى معرفة الأمر للقيام بذلك. خلاف ذلك، لا يوجد فرق آخر. فيما يلي الخطوات:
1. تأكد من إلغاء تثبيت SBCL و CLISP وتثبيت ECL.
sudo apt-get remove sbcl clispsudo apt-get install ecl
2. لبدء تشغيل خادم Swank يدويًا، أدخل هذا الأمر:
ecl –load ~/.vim/pack/plugins/start/slimv/slime/start-swank.lisp
ثم قم بتحرير ملف Lisp المصدر وأدخل الأمر العادي ,ج للاتصال به وإظهار نافذة REPL.
3. لبدء Swank تلقائيًا من Slimv، ليس هناك ما يجب القيام به. ما عليك سوى تحرير ملف مصدر Lisp وإدخال أمر الوضع العادي ,ج. أثناء التشغيل في GNU Screen أو tmux أو بيئة سطح المكتب، يمكن لـ Slimv اكتشاف CLISP تلقائيًا وبدء تشغيل خادم Swank به. هناك مشكلة مهلة محتملة يجب أن تكون على دراية بها. يمكن أن يستغرق ECL دقيقة أو دقيقتين لتجميع التعليمات البرمجية التي يتم تحميلها عند بدء تشغيل خادم Swank لأول مرة. ومع ذلك، لدى Slimv فترة مهلة افتراضية تبلغ 20 ثانية، لذلك قد يفشل Slimv مع ظهور رسالة الخطأ التالية:
SWANK server is not running. Press ENTER to continue.
إذا حدث هذا، فما عليك سوى الانتظار حتى يكمل ECL تجميع خادم Swank. بمجرد تشغيل خادم Swank، أدخل أمر الوضع العادي ,ج مرة أخرى ويجب أن يتصل على الفور.
استخدم Vlime مع CLISP
يفترض هذا القسم الفرعي أنك قد قرأت بالفعل وجربت قسم ابدأ مع Vlime و SBCL، لذا فأنت على دراية بأساسيات Vlime. سنرى الآن ما يلزم لاستخدام Vlime مع CLISP في الخطوات التالية:
1. لنفترض أننا نريد البدء من جديد باستخدام CLISP، أي أنه ليس لدينا مصنوعات يدوية سابقة تم إنشاؤها بواسطة SBCL. لتنظيف القطع الأثرية القديمة، أدخل هذه الأوامر:
rm -rf ~/.sbclrc ~/quicklispsudo apt-get remove sbcl
2. قم بتثبيت CLISP باستخدام هذا الأمر:
sudo apt-get install clisp
3. قم بتثبيت Quicklisp باستخدام CLISP باستخدام هذه الأوامر:
curl -O https://beta.quicklisp.org/quicklisp.lispclisp -i quicklisp.lisp -x ‘(quicklisp-quickstart:install)’clisp -i ~/quicklisp/setup.lisp -x ‘(ql:add-to-init-file)’
اكتب يدخل وفي النهاية، عند المطالبة، لإكمال التثبيت.
4. أضف الكود التالي إلى ~/.vimrc:
let g:vlime_cl_impl=’clisp’function! VlimeBuildServerCommandFor_clisp(vlime_loader, vlime_eval) return [‘clisp’, ‘-i’, a:vlime_loader, ‘-x’, a:vlime_eval, ‘-repl’]endfunction
على عكس Slimv، لا يتم دعم التشغيل التلقائي لخادم Swank باستخدام تطبيقات Common Lisp بخلاف SBCL، لذا يخبر برنامج Vim النصي أعلاه Vlime بكيفية بدء تشغيل خادم Swank باستخدام CLISP. يتم استخدام الخيار -repl لحل المشكلة الموضحة في النقطة التالية.
5. Vlime جاهز الآن للاستخدام مع CLISP. ما عليك سوى تحرير ملف مصدر Lisp وإدخال أمر الوضع العادي \pp لبدء تشغيل خادم Swank والاتصال به تلقائيًا. قد ترى الخطأ التالي في مصحح أخطاء SLIME (sldb) نافذة الانقسام:
SOCKET-STATUS on #1=# is illegal
بالرغم من الخطأ أعلاه، يجب أن تظهر الرسالة التالية في الأسفل:
Vlime Connection 1 established.
في حالة ظهور الرسالة أعلاه، يمكنك تجاهل هذا الخطأ وإغلاق نافذة مصحح الأخطاء بالإضافة إلى نافذة إخراج وحدة التحكم والاستمرار في استخدام Vlime بشكل طبيعي. يضمن الخيار -repl المستخدم في الخطوة السابقة أن يبدأ REPL بالرغم من هذا الخطأ. ولولاها لما نجحت هذه الخطوة. هذا ما قصدته عندما قلت سابقًا أننا قد نحتاج إلى حل بعض الأخطاء أثناء استخدام هذه المكونات الإضافية مع تطبيق Common Lisp بخلاف SBCL.
استخدم Vlime مع ECL
فيما يلي خطوات استخدام Vlime مع ECL:
1. لنفترض أننا نريد البدء من جديد مع ECL، أي أنه ليس لدينا عناصر سابقة تم إنشاؤها بواسطة SBCL أو ECL. لتنظيف القطع الأثرية القديمة، أدخل هذه الأوامر:
rm -rf ~/.sbclrc ~/.clisprc.lisp ~/quicklispsudo apt-get remove sbcl clisp
2. قم بتثبيت ECL باستخدام هذا الأمر:
sudo apt-get install ecl
3. قم بتثبيت Quicklisp باستخدام ECL باستخدام هذه الأوامر:
curl -O https://beta.quicklisp.org/quicklisp.lispecl –load quicklisp.lisp –eval ‘(quicklisp-quickstart:install)’ –eval ‘(quit)’ecl –load ~/quicklisp/setup.lisp –eval ‘(ql:add-to-init-file)’ –eval ‘(quit)’
اكتب يدخل وفي النهاية، عند المطالبة، لإكمال التثبيت.
4. أضف الكود التالي إلى ~/.vimrc:
let g:vlime_cl_impl=’ecl’function! VlimeBuildServerCommandFor_ecl(vlime_loader, vlime_eval) return [‘ecl’, ‘–load’, a:vlime_loader, ‘–eval’, a:vlime_eval]endfunction
5. قم بتحرير ملف مصدر Lisp وأدخل أمر الوضع العادي \pp لبدء تشغيل خادم Swank والاتصال به تلقائيًا.
لهجات Lisp الأخرى
لقد رأينا حتى الآن كيفية استخدام Slimv أو Vlime مع تطبيق Common Lisp. الآن دعونا نرى مدى نجاح هذه المكونات الإضافية في العمل مع لهجات Lisp الأخرى. لا يدعم Vlime لهجات Lisp الأخرى. وهو يدعم اللثغة المشتركة فقط. يدعم Slimv لهجتين شائعتين أخريين في Lisp: Scheme و Clojure. وفي القسمين الفرعيين التاليين، نرى كيف:
استخدم Slimv مع مخطط MIT/GNU
تم توثيق Slimv للعمل مع MIT/GNU Scheme على Linux فقط. أدخل :help slimv-installation في Vim لقراءة المزيد عنها. تقول ما يلي تحت قسم المتطلبات الأساسية.
تم تثبيت Lisp أو Clojure أو MIT/GNU Scheme (Linux فقط).
علاوة على ذلك، تم تسمية البرنامج النصي لمحمل Swank لبرنامج MIT/GNU Scheme swank-mit-scheme.scm يقول ما يلي في تعليقات التعليمات البرمجية المصدر الخاصة به:
أنت بحاجة إلى مخطط MIT/GNU 9.2
في وقت كتابة هذا المقال، أكدت أن هذين الشرطين يجب بالفعل استيفائهما لاستخدام Slimv مع MIT/GNU Scheme. فيما يلي خطوات استخدام Slimv مع مخطط MIT/GNU:
1. قم بتثبيت نظام MIT/GNU باستخدام هذا الأمر:
sudo apt-get mit-scheme
تأكد من ذلك vim-nox، تم تثبيت tmux و Slimv كما هو موضح في قسم ابدأ مع Slimv و SBCL الفرعي في وقت سابق.
2. هذه خطوة اختيارية. لبدء تشغيل خادم Swank تلقائيًا من Slimv، قم بتشغيل Vim في tmux أو GNU Screen أو بيئة سطح المكتب. في هذه المقالة، نستخدم tmux، لذا ابدأ tmux بهذا الأمر:
tmux
3. هذه الخطوة ضرورية فقط إذا كنت لا تستخدم tmux أو GNU Screen أو بيئة سطح المكتب. في مثل هذه الحالة، أدخل هذا الأمر لبدء تشغيل خادم Swank يدويًا:
scheme –load ~/.vim/pack/plugins/start/slimv/slime/contrib/swank-mit-scheme.scm
4. قم بإنشاء ملف تعليمات برمجية مصدر مخطط جديد، على سبيل المثال، foo.scm، بهذا الأمر:
vim foo.scm
5. للاتصال بخادم Swank، أدخل الأمر التالي في الوضع العادي لـ Vim:
,ج
6. اكتب بعض التعليمات البرمجية في المخزن المؤقت للملف الجديد. للقيام بذلك، اكتب أولاً أنا للدخول إلى وضع الإدراج واكتب هذا الرمز:
(عرض hello, worldn)
اكتب خروج للعودة إلى الوضع العادي. لتقييم التعبير الحالي تحت المؤشر، أدخل الأمر التالي في الوضع العادي:
,ه
يجب أن يظهر كل من التعبير الحالي ونتيجته في نافذة REPL.
لقد أكدت أن الخطوات المذكورة أعلاه تعمل بشكل جيد مع MIT/GNU Scheme 9.1.1 على Debian GNU/Linux 9.11 (ممتد). كما ذكرت من قبل، يتطلب Slimv أن يعمل Linux مع MIT/GNU Scheme. على سبيل المثال، فشلت محاولة بدء تشغيل خادم Swank باستخدام MIT/GNU Scheme 9.2 على نظام التشغيل macOS High Sierra 10.13.6 مع ظهور هذا الخطأ:
; /usr/local/Cellar/mit-scheme/9.2_2/lib/mit-scheme-c/include/config.h:879:10:fatal error: ‘sys/types.h’ file not found
علاوة على ذلك، يجب أن يكون إصدار MIT/GNU Scheme هو 9.x. على سبيل المثال، عندما أحاول تشغيل Swank باستخدام MIT/GNU Scheme 10.1.5 على Debian GNU/Linux 10.1 (buster)، يحدث الخطأ التالي:
;The object #[package 12 (user)], passed as an argument to ->environment, is not an environment.
استخدم Slimv مع Clojure
يعمل Slimv بشكل جيد مع Clojure أيضًا. ومع ذلك، قد نواجه بعض المشاكل في تحديد موقع Clojure على النظام إذا حاولنا تشغيل خادم Swank تلقائيًا باستخدام Clojure. وذلك لأن مكان وكيفية تثبيت Clojure يختلف من نظام تشغيل إلى آخر ويعتمد أيضًا على إجراء التثبيت المختار لإعداد Clojure.
في الأنظمة المشابهة لنظام Unix، يبحث Slimv عن ملفات JAR التي تتطابق مع نمط الكرة الأرضية clojure*.jar في المسارات التي تطابق نمط الكرة الأرضية /usr/local/bin/*clojure* و ~/*clojure بهذا الترتيب. في نظام التشغيل Windows، يبحث عن ملفات JAR في مسارات الدليل التي تتطابق مع نمط الكرة الأرضية C:*clojure* و C:*clojure*lib. بالإضافة إلى ذلك، يبحث Slimv أيضًا عن ملفات JAR في المسارات المذكورة في ملف PATH متغير البيئة. هناك بعض الاستراتيجيات الإضافية أيضًا لتحديد موقع Clojure ولكننا لن نتطرق إلى ذلك هنا.
سأوضح في هذا القسم كيفية إنشاء Clojure من المصدر باستخدام Maven وتثبيته عليه ~/clojure/clojure.jar، وهو مسار يمكن لـ Slimv العثور عليه بسهولة، لذا فإن تثبيته هنا يعني أن الخطوات أدناه ستعمل في كل مكان بغض النظر عن نظام التشغيل. إذا كنت تستخدم نظام التشغيل Windows، فقم بتثبيت Clojure على C:clojureclojure.jar بدلاً من.
فيما يلي خطوات تثبيت Clojure على ~/clojure/clojure.jar واستخدامه مع Slimv:
1. اختر إحدى مجموعتي الأوامر أدناه لتثبيت Maven:
# في أنظمة Debian وUbuntu وما إلى ذلك. Sudo apt-get install maven # في نظام التشغيل macOS، Brew install openjdk mavenexport JAVA_HOME=/usr/local/opt/openjdkexport PATH=$JAVA_HOME/bin:$PATH
2. أدخل هذه الأوامر لتثبيت Clojure:
git clone https://github.com/clojure/clojure.git ~/clojuregit -C ~/clojure checkout clojure-1.10.1mvn -f ~/clojure/pom.xml -Plocal -Dmaven.test.skip=true package
3. تأكد من ذلك vim-nox، تم تثبيت tmux و Slimv كما هو موضح في قسم ابدأ مع Slimv و SBCL الفرعي في وقت سابق.
4. هذه خطوة اختيارية. لبدء تشغيل خادم Swank تلقائيًا من Slimv، قم بتشغيل Vim في tmux أو GNU Screen أو بيئة سطح المكتب. في هذه المقالة، نستخدم tmux، لذا ابدأ tmux بهذا الأمر:
tmux
5. هذه الخطوة ضرورية فقط إذا كنت لا تستخدم tmux أو GNU Screen أو بيئة سطح المكتب. في مثل هذه الحالة، أدخل هذه الأوامر لبدء تشغيل خادم Swank يدويًا:
SWANK_DIR=~/.vim/pack/plugins/start/slimv/wank-clojure java -cp $HOME/clojure/clojure.jar:$SWANK_DIR clojure.main -i $SWANK_DIR/swank/swank.clj -e ‘(swank.swank/start-repl)’ -r
6. قم بإنشاء ملف كود مصدر Clojure جديد، على سبيل المثال، foo.clj، بهذا الأمر:
vim foo.clj
7. للاتصال بخادم Swank، أدخل الأمر التالي في الوضع العادي لـ Vim:
,ج
8. اكتب بعض التعليمات البرمجية في المخزن المؤقت للملف الجديد. للقيام بذلك، اكتب أولاً أنا للدخول إلى وضع الإدراج واكتب هذا الرمز:
(println hello, world)
اكتب خروج للعودة إلى الوضع العادي. لتقييم التعبير الحالي تحت المؤشر، أدخل الأمر التالي في الوضع العادي:
,ه
يجب أن يظهر كل من التعبير الحالي ونتيجته في نافذة REPL.
مقارنة Slimv و Vlime
لتقديم نظرة شاملة، إليك مقارنة بين Slimv و Vlime، مع الأخذ في الاعتبار أن هذا الجدول ليس شاملاً وأن هناك اختلافات أخرى بين الأداتين:
- تثبيت الإضافة: يتوافق هيكل دليل Slimv مع هياكل الإضافات الافتراضية في Vim ومديري الإضافات الشائعة، مما يجعل تثبيته بسيطًا جدًا. على النقيض، لا يتوافق هيكل دليل Vlime مع هذه الهياكل، مما يعني أنه لا يمكن استخدام دعم حزم Vim الأصلي لتثبيت Vlime، ويتطلب التلاعب بخيار runtimepath في Vim لتحميله بنجاح.
- متطلبات Python: يتطلب Slimv حزمة Vim مجمعة مع دعم واجهة Python. بينما لا يحتوي Vlime على هذا المطلب، ويمكنه العمل مع Vim الأساسي الذي لا يحتوي على واجهة Python.
- بدء تشغيل خادم Swank: يتطلب Slimv تشغيل Vim ضمن tmux أو GNU Screen أو بيئة سطح المكتب حتى يتمكن من بدء تشغيل خادم Swank تلقائيًا. إذا لم تكن أي من هذه الخيارات متاحة، فيجب تشغيل خادم Swank يدويًا. بينما لا يتطلب Vlime tmux أو GNU Screen أو بيئة سطح المكتب لبدء تشغيل خادم Vlime تلقائيًا، يمكنه تشغيل خادم Vlime بمفرده.
- اعتمادية Quicklisp: لا يتطلب Slimv Quicklisp لتثبيت Swank، حيث يقوم بتجميع كود خادم Swank مع نفسه. على عكس ذلك، يتطلب Vlime تثبيت Quicklisp، ويعتمد عليه لتثبيت Swank عند الحاجة إليه لأول مرة.
- تضمين Paredit: يقوم Slimv بتجميع Paredit مع نفسه، لذا فإن تثبيت Slimv يوفر Paredit أيضًا. بينما لا يقوم Vlime بتجميع Paredit مع نفسه، ويجب تثبيت Paredit بشكل منفصل.
- تفاعلية REPL: المخزن المؤقت لـ REPL تفاعلي في Slimv، حيث يمكننا كتابة الكود مباشرة في نافذة REPL ثم كتابة يدخل لتنفيذه. بينما المخزن المؤقت لـ REPL ليس تفاعليًا في Vlime، حيث يتم ضبط خيار nomodifiable، لذلك لا يمكننا كتابة التعليمات البرمجية مباشرة في نافذة REPL.
- الإرجاع الكهربائي في Paredit: تعمل عوائد Paredit الكهربائية بشكل جيد مع Slimv. Slimv يعيد رسم خريطة مفتاح enter لإظهار قائمة الوسائط للوظيفة الحالية بعد إدخال المرتجعات الكهربائية، ويهتم بالحفاظ على وظيفة الإرجاع الكهربائي لـ Paredit. بينما لا تعمل عوائد Paredit الكهربائية بشكل جيد مع Vlime، حيث يعيد Vlime رسم خريطة لمفتاح enter لإظهار قائمة الوسائط للوظيفة الحالية دون إدخال عوائد كهربائية.
- عرض المعلومات: يعرض Slimv قائمة الوسائط الخاصة بالوظيفة ووصف الرمز وما إلى ذلك في سطر الحالة أو منطقة الرسالة بالأسفل. بينما يعرض Vlime قائمة الوسائط الخاصة بالوظيفة ووصف الرمز وما إلى ذلك في نوافذ مقسمة منفصلة، مما قد يجعله أقل راحة عند التنقل بين النوافذ.
- عرض النتائج: يعرض Slimv نتائج التتبع وتوسيع الماكرو والإسناد الترافقي وما إلى ذلك في المخزن المؤقت لـ REPL. بينما يعرض Vlime نتائج التتبع وتوسيع الماكرو والإحالة الترافقية وما إلى ذلك في النوافذ المقسمة، مما قد يبدو غير مريح بسبب النوافذ الإضافية.
- دعم لهجات Lisp: يدعم Slimv البرمجة في Common Lisp و MIT/GNU Scheme و Clojure. بينما يدعم Vlime البرمجة بلغة Common Lisp فقط، ولا يدعم Scheme أو Clojure.
- أقواس قوس قزح: يدعم Slimv أقواس قوس قزح عن طريق الإضافة let g:lisp_rainbow=1 لـ ~/.vimrc، حيث يكون للأقواس على مستويات مختلفة ألوان مختلفة والأقواس المتطابقة لها نفس اللون. بينما لا يحتوي Vlime على أقواس قوس قزح بشكل مدمج، ولكن هذه ليست مشكلة كبيرة نظرًا لوجود العديد من المكونات الإضافية المستقلة المتوفرة التي توفر هذه الميزة.
- الانتقال إلى الدوال المرجعية: لا تساعدنا أوامر Slimv المرجعية في الانتقال مباشرة إلى وظيفة مدرجة في النتائج. بينما تقوم أوامر Vlime المرجعية الترافقية بإنشاء مخزن مؤقت xref يسمح لنا بالانتقال مباشرة إلى وظيفة مدرجة في النتائج عن طريق تحريك المؤشر إلى اسم الوظيفة في المخزن المؤقت xref وكتابة يدخل.
توصية سريعة
إذا كنت تبحث عن توصية سريعة بشأن البرنامج الإضافي الذي ستستخدمه، فسأوصي بـ Slimv. لقد كان موجودًا لفترة أطول بكثير، ويدعم مجموعة واسعة من تطبيقات Lisp. أجد ارتباطات المفاتيح الافتراضية أكثر ملاءمة، كما أن المخزن المؤقت لـ REPL التفاعلي حقًا يعد مكافأة أيضًا. بالإضافة إلى ذلك، يدعم Slimv Scheme و Clojure بينما لا يدعمهما Vlime. بعد قولي هذا، أعتقد أنها فكرة جيدة أن تجرب كلا الإضافات بنفسك ثم تكتشف أيهما يناسبك أكثر.
الإفصاح
تضررت أربعة أخطاء أثناء كتابة هذا المقال! أثناء كتابة هذا المقال، وجدت الأخطاء الأربعة التالية في Slimv والتي تم إصلاحها على الفور: #87, #88, #89 و #90.
المراجع
- زوجان من الاختراقات لـ Emacs
- تم إصدار Vim 8.0
- برنامج Slimv التعليمي
- برنامج تعليمي لـ Vlime