libvim
؟ libvim
هو شوكة من Vim، بهدف توفير الحد الأدنى من واجهة برمجة التطبيقات المستندة إلى C، ونمذجة تحرير Vim المشروط. إنه لا يتضمن أي واجهة مستخدم على الإطلاق (ولا حتى واجهة مستخدم طرفية)، وهو مسؤول بشكل أساسي عن العمل كمحرك معالجة سريع للمخزن المؤقت، مخلص لضغطات مفاتيح Vim. لا يزال العمل قيد التنفيذ، ولا يزال هناك الكثير من العمل لتحقيق الاستقرار.
إذا كنت تبحث عن محطة Vim، فاطلع على neovim، أو GUI Vim، فاطلع على Onivim 2.
تم تصميم libvim
في المقام الأول لـ Onivim 2. بعد تنفيذ العديد من التكرارات لـ "UI Vims" بين الإصدارين v1 وv2 ومشاريع أخرى، كان التجريد الذي كنت أرغب في الحصول عليه هو نوع من Vim وظيفي خالص، منفصل تمامًا عن واجهة المستخدم الطرفية - حيث "vim" ' هي وظيفة (editor state, input) => (new editor state)
. نظرًا لأن Onivim 2 يتعامل تمامًا مع طبقة العرض، فإن هذه الوظيفة التي تم تصميمها على طراز Vim كوظيفة خالصة يمكن أن تركز على معالجة المخزن المؤقت فقط.
ولتحقيق هذه الغاية، يعرض libvim
واجهة برمجة تطبيقات C بسيطة للعمل مع Vim، ويدعم الاستماع إلى تغييرات المخزن المؤقت والرسائل وما إلى ذلك.
وهي مسؤولة عن:
وهي ليست مسؤولة عن:
تم تصميم كل هذه الأمور ليتم التعامل معها من قبل مستهلك المكتبة - مما يترك libvim
للتركيز على مهمة معالجة المخزن المؤقت السريع.
يبني libvim
نظامًا أساسيًا مشتركًا (نظرًا لأن Onivim 2 يتطلب ذلك!)، بالإضافة إلى WebAssembly - نود أن ننقل برامجنا التعليمية v1 إلى تجربة تعتمد على المتصفح.
هناك تطبيقات أخرى مثيرة للاهتمام لمثل هذه "Vim المجردة":
readline
، على سبيل المثال. للحصول على مثال لاستخدام واجهة برمجة التطبيقات (API)، راجع التطبيقات مثل Normal_mode_motion. واجهة برمجة التطبيقات الكاملة متاحة هنا: libvim.h
قلب واجهة برمجة التطبيقات (API) هو vimInput
الذي يأخذ مفتاحًا واحدًا، وتتم معالجته بشكل متزامن بواسطة جهاز الحالة. يمكن الاشتراك في "الآثار الجانبية" مثل تحديثات المخزن المؤقت والرسائل وما إلى ذلك عبر عمليات رد الاتصال مثل vimSetBufferUpdateCallback
.
هذه المكتبة قيد التطوير النشط ولا نقدم حاليًا أي ضمانات بشأن التوافق مع الإصدارات السابقة. استخدم واجهة برمجة التطبيقات (API) على مسؤوليتك الخاصة.
esy
يشبه npm
للتعليمات البرمجية الأصلية. إذا لم يكن لديك بالفعل، قم بتثبيته عن طريق تشغيل:
npm install -g [email protected]
git clone https://github.com/onivim/libvim
cd src
esy install
esy '@test' install
esy build
esy '@test' build
يعمل سير العمل esy
بشكل رائع بالنسبة للإنشاءات لمرة واحدة، ولكنه سيعيد بناء العالم في كل مرة، لذا فمن الأفضل أن يكون لديك سير عمل تزايدي أثناء التطوير.
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
يمكنك اختبار libvim
المبني محليًا مقابل Onivim 2 المبني محليًا عن طريق إضافة دقة في الحزمة Onivim 2 package.json
، مثل:
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
فقط تأكد من أنه يشير إلى المجلد libvim/src
.
ملاحظة: لقد رأينا مشكلات في سير العمل هذا حيث يمكن أن تكون الثنائيات قديمة في Onivim 2، لذلك نوصي بتشغيل
rm -rf _esy && esy i
بعد كل تغيير لإعادة بناء التبعية.
libvim
على Vim وليس Neovim؟ أنا معجب جدًا بالعمل الذي يقوم به فريق Neovim (وكان الفريق داعمًا بشكل لا يصدق لمشروع Onivim). من الناحية المثالية، كنا سنظل متمسكين بـ Neovim أو ننفذ libvim
بناءً على libnvim
. في الواقع، في المرة الأولى التي حاولت فيها بناء هذا "الحد الأدنى من التجريد" - حاولت أن أبنيه على libnvim
الخاص بـ Neovim. لقد قمت بتحديد موعد التحقيق لمدة يومين، وواجهت بعض العقبات الخطيرة - بيئة البناء لدينا تمثل تحديًا بعض الشيء على نظام التشغيل Windows (تعتمد على سلسلة أدوات المترجم المشترك Cygwin + MingW) - واجهت العديد من المشكلات في الحصول على Neovim + deps للبناء في تلك البيئة . بناءً على هذا الارتفاع، قدرت أن الأمر سيستغرق ما يقرب من 3 إلى 4 أسابيع لتشغيله في سلسلة الأدوات تلك.
لاحظ أن هذه ليست مشكلة Neovim - يعد استخدام التبعية والاستفادة من CMake
قرارات جيدة - إنها نتيجة لنظام بناء OCaml الخاص بنا. لا يتم التعامل مع سلسلة أدوات التحويل البرمجي المتقاطع Cygwin + MingW بشكل جيد من خلال جميع التبعيات (كونها مزيجًا غريبًا من Win32 وUnix، فغالبًا ما تكون الحالة التي تكون فيها #ifdefs خاطئة، ويتم سحب التبعيات غير الصحيحة، ويمكن أن يكون ذلك بمثابة إهدار كبير للوقت العمل من خلال هذه القضايا).
في المقابل، كان Vim قادرًا على التجميع في تلك البيئة بسهولة (ملاحظة: إذا كان أي شخص مهتمًا ببناء حزمة Neovim متعددة المنصات وممكّنة esy
- فيمكننا إعادة النظر في هذا!). أنا مهتم أيضًا بتصميمات WebAssembly، لنقل دروس Onivim v1 إلى الويب، حيث ستكون مكتبة C الملخصة التي تم تجميعها إلى WebAssembly مناسبة تمامًا.
بالإضافة إلى مشكلات البناء، سيحتاج كل من Neovim وVim إلى إعادة البناء لتوفير واجهة برمجة التطبيقات المتزامنة والوظيفية:
كان الدافع وراء كل هذا العمل هو إزالة طبقة RPC من Onivim v2 لتقليل التعقيد وأوضاع الفشل - وفي النهاية، كان هذا قرارًا فنيًا قائمًا على القيود. إذا تمكنا من الحصول على واجهة برمجة تطبيقات مماثلة، قابلة للبناء عبر النظام esy
، باستخدام nvim
- سأكون سعيدًا باستخدام ذلك :)
إذا كان libvim
مثيرًا للاهتمام بالنسبة لك، وترغب في دعم التطوير، ففكر في ما يلي:
إذا كنت ترغب في المساعدة في تحسين libvim
، راجع ملف CONTRIBUTING.md.
بعض أماكن المساهمة:
libvim
كود libvim
مرخص بموجب ترخيص MIT.
ويعتمد أيضًا على تعليمات برمجية تابعة لجهة خارجية، لا سيما Vim، ولكنه يعتمد أيضًا على رموز أخرى - راجع ThirdPartyLicenses.txt للحصول على تفاصيل الترخيص.