vim.wasm: تم نقل VIM إلى webassembly هذا المشروع عبارة عن شوكة تجريبية لمحرر VIM من قبل Rhysd لتجميعه في مجمع webassembly باستخدام emscripten و binaryen. يعمل VIM على عامل الويب ويتفاعل مع الخيط الرئيسي عبر SharedArrayBuffer .
الهدف من هذا المشروع هو تشغيل محرر VIM على المتصفحات دون أن يفقد وظائف VIM القوية من خلال تجميع مصادر Vim C في ويب.

الاستخدام
:write فقط كتابة ملف على الذاكرة. قم بتنزيل المخزن المؤقت الحالي بواسطة :export أو ملف محدد بواسطة :export {file} ."* مدعوم. على سبيل المثال ، لصق نص حافظة System إلى VIM مع "*p أو :put * ، ونسخ النص في VIM إلى حافظة النظام مع "*y أو: :set clipboard=unnamed :yank * .~/.vim مستمرة في DB المفهرسة. يرجى كتابة التكوين المفضل لديك في ~/.vim/vimrc (وليس ~/.vimrc ).file={filepath}={url} يجلب ملفًا من {url} إلى {filepath} . يمكن فتح الملفات عن بُعد التعسفية (تهتم بـ CORS).:!/path/to/file.js يقوم بتقييم رمز JavaScript في المتصفح. :!% تقييم العازلة الحالية.:e tutor .arg= معلمات الاستعلام (على سبيل المثال ?arg=~%2f.vim%2fvimrc&arg=hello.txt ) لإضافة وسيطات سطر الأوامر vim .يلاحظ
SharedArrayBuffer و Atomics . على Firefox أو Safari ، يجب تمكين أعلام الميزات ( javascript.options.shared_memory for Firefox) في الوقت الحالي.keydown . يرجى تعطيل ملحقات المتصفح التي تعترض أحداث المفاتيح (سيكون وضع التخفي هو الأفضل).:quit ، لكنه لا يغلق علامة تبويب المتصفح. من فضلك أغلقها يدويًا :) يتم تعبئة هذا المشروع على أنه vim-wasm NPM PACAKGE لاستخدامه في تطبيق الويب بسهولة. يرجى قراءة الوثائق لمزيد من التفاصيل.
إصدار VIM المنقذ الحالي هو 8.2.0055 مع مجموعات الميزات "العادية" و "الصغيرة". يرجى التحقق من changelog لتحديث سجل.
ترتبط المشاريع التالية بحزمة NPM وقد تكون أكثر ملاءمة لحالة الاستخدام الخاصة بك.

في موضوع العمال ، يتم تشغيل VIM عن طريق تجميع في WASM. يتم أن يولد مؤشر ترابط العامل كعامل ويب مخصص من الموضوع الرئيسي عند فتح الصفحة.
لنفترض أنك تدخل شيئًا باستخدام لوحة المفاتيح. يأخذ المتصفح KeyboardEvent في حدث keydown . JavaScript في مؤشر الترابط الرئيسي يمسك بالحدث وتخزين معلومات Keydown إلى مخزن مؤقت للذاكرة المشتركة.
تتم مشاركة المخزن المؤقت مع موضوع العامل. ينتظر VIM ويحصل على معلومات KeyDown عن طريق استقصاء المخزن المؤقت للذاكرة المشتركة عبر API من Atomics API. عندما يتم العثور على المعلومات الرئيسية في المخزن المؤقت ، فإنه يقوم بتحميل المعلومات ويحسب تسلسل المفاتيح. عبر JS إلى WASM API بفضل emscripten ، تتم إضافة التسلسل إلى المخزن المؤقت لـ VIM في WASM.
تتم معالجة التسلسل في المخزن المؤقت للإدخال بواسطة Core Editor Logic (تحديث المخزن المؤقت ، الشاشة ، ...). بسبب التحديثات ، تحدث بعض أحداث السحب مثل نص الرسم ، ورسم المستقيم ، ومناطق التمرير ، ...
يتم إرسال أحداث السحب هذه إلى JavaScript في موضوع العمال من WASM بفضل emscripten's JS إلى C API. النظر في نسبة بكسل الجهاز و <canvas/> API ، يتم حساب كيفية تقديم الأحداث ويتم تمرير أحداث التقديم المحسوبة هذه من مؤشر ترابط العامل إلى مؤشر ترابط رئيسي عبر تمرير الرسالة مع postMessage() .
الموضوع الرئيسي JavaScript يتلقى ويحدث هذه الأحداث التقديم. على إطار الرسوم المتحركة ، يجعلها إلى <canvas/> .
أخيرًا ، يمكنك رؤية الشاشة المقدمة في الصفحة.

يتم تنفيذ واجهة Webassembly Frontend لـ VIM كواجهة جديدة لـ VIM مثل واجهة المستخدم الرسومية الأخرى مثل GTK Frontend. يتم تجميع مصادر C إلى كل ملفات LLVM Bitcode ثم يتم ربطها بملف BitCode واحد vim.bc بواسطة emcc . ستقوم emcc أخيرًا بتجميع vim.bc في vim.wasm ثنائي باستخدام ثنائي وينشئ وقت تشغيل HTML/JavaScript.
كان الفرق الذي واجهته في البداية هو عدم وجود مكتبة طرفية مثل ncurses. قمت بتعديل configure البرنامج النصي لتجاهل فحص المكتبة الطرفية. لا بأس لأن واجهة المستخدم الرسومية لـ WASM تستخدم دائمًا بدلاً من الواجهة الأمامية CUI. كنت بحاجة إلى العديد من الحلول configure الشيكات.
يوفر Emscripten بيئة تشبه Unix. لذلك os_unix.c يمكنه دعم WASM. ومع ذلك ، فإن بعض الميزات لا تدعمها emscripten. لقد أضفت العديد من حراس #ifdef FEAT_GUI_WASM لتعطيل الميزات التي لا يمكن دعمها بواسطة WASM (أي fork (2) الدعم ، الدعم pty ، معالجات الإشارة ، ... إلخ).
لقد قمت بإنشاء gui_wasm.c الرجوع بشدة gui_mac.c و gui_w32.c . يتم تنفيذ حلقة الحدث ( gui_mch_update() و gui_mch_wait_for_chars() ) ببساطة مع حظر الانتظار. ويتم تمرير جميع أحداث عرض واجهة المستخدم تقريبًا إلى طبقة JavaScript عن طريق استدعاء وظائف JavaScript من C بفضل emscripten.
يتم تجميع مصادر C (مع العديد من التحسينات) في LLVM bitcode مع clang المدمجة في emscripten. ثم يتم ربط جميع ملفات BitCode ( .o ) بملف BitCode واحد vim.bc مع رابط llvm-link (مدمج أيضًا مع EmScripten).
لقد قمت بإنشاء وقت تشغيل JavaScript في TypeScript لرسم أحداث التقديم المرسلة من C. javaScript Runtime يتم فصلها إلى جزأين ؛ الموضوع الرئيسي وخيط العمال. wasm/main.ts هو لخيط رئيسي. إنه يبدأ VIM في موضوع العمال ويسحب شاشة VIM إلى <canvas> تلقي أحداث الرسم من VIM. wasm/runtime.ts و wasm/pre.ts هي لخيط العمال. يتم كتابتها باستخدام emscripten API.
يقوم emcc (برنامج التحويل البرمجي Cscripten) بتجميع vim.bc و runtime.js في vim.wasm و vim.js و vim.data مع ملفات وقت تشغيل VIM المحملة مسبقًا (أي colorcheme) باستخدام binaryen. يتم تحميل ملفات وقت التشغيل على نظام ملفات افتراضية متوفر على متصفح بواسطة EmScripten. هنا ، يتم تجميع هذه الملفات لخيط العامل. wasm/main.js يبدأ عامل ويب مخصص تحميل vim.js
أخيرًا ، قمت بإنشاء wasm/index.html صغير يحتوي على <canvas/> لتقديم شاشة VIM وتحميل wasm/main.js .
استضافة الآن wasm/index.html مع خادم ويب والوصول إليه مع المستعرض يفتح VIM. إنها تعمل.
sleep() على جافا سكريبت الجزء الأصعب لهذا النقل هو كيفية تنفيذ حظر الانتظار (عادة ما يتم مع sleep() ).
نظرًا لأن حظر الخيط الرئيسي على صفحة الويب يعني منع تفاعل المستخدم ، فهو محظور بشكل أساسي. يتم تنفيذ جميع العمليات التي تستغرق وقتًا تقريبًا كأبي غير متزامن في JavaScript. لا يمكن لـ WASM التشغيل على الخيط الرئيسي منع الخيط باستثناء الحلقة المزدحمة.
لكن برامج C تستخدم وظيفة sleep() بشكل عرضي ، لذا فهي مشكلة عند نقل البرامج. من المتوقع أيضًا أن تنتظر الواجهة الأمامية لـ VIM's GUI مدخلات المستخدم بحظر الانتظار.
يوفر emscripten حل بديل لهذه المشكلة ، emterpreter. مع EmterPreter ، يوفر EmScripten (Pseudo) وظائف الانتظار مثل emscripten_sleep() . عند استخدامها في وظيفة C ، تقوم emcc بتجميع الوظيفة في رمز بايت Emterpreter بدلاً من WASM. وفي وقت التشغيل ، يتم تشغيل رمز البايت على مترجم (على WASM). عندما يصل المترجم المترجم عند النقطة التي تستدعي emscripten_sleep() ، فإنه يعلق تنفيذ رمز البايت ويعين مؤقتًا (مع وظيفة setTimeout JS). بعد انتهاء الوقت ، يستأنف المترجم الفوري الدولة ويستمر في التنفيذ.
من خلال هذه الآلية ، يبدو الانتظار غير المتزامن لـ JavaScript كما لو أن الانتظار المتزامن من عالم C. في البداية استخدمت Emterpreter وعملت. ومع ذلك ، كانت هناك العديد من القضايا.
بحثت عن بديل ووجدت Atomics.wait() . Atomics.wait() هي وظيفة بدائية متزامنة منخفضة المستوى. ينتظر حتى يتم تحديث بايت محدد في المخزن المؤقت للذاكرة المشتركة. إنه يمنع الانتظار . بالطبع لا يتوفر في الموضوع الرئيسي. يجب استخدامه على موضوع العامل.
لقد نقلت قاعدة رمز WASM إلى عامل الويب الذي يعمل على موضوع العمال ، على الرغم من أن تقديم <canvas/> لا يزال يتم في الموضوع الرئيسي.

يستخدم VIM Atomics.wait() لانتظار إدخال المستخدم من خلال مشاهدة مخزن مؤقت للذاكرة المشتركة. عند حدوث حدث رئيسي ، يخزن مؤشرات الترابط الرئيسية بيانات الحدث الرئيسي إلى المخزن المؤقت للذاكرة المشتركة ويبلغ أن حدثًا رئيسيًا جديدًا جاء بواسطة Atomics.notify() . يكتشف مؤشر ترابط العمال أنه تم تحديث المخزن المؤقت بواسطة Atomics.wait() ويقوم بتحميل بيانات الحدث الرئيسي من المخزن المؤقت. يقوم VIM بحساب تسلسل مفتاح من البيانات ويضافه إلى المخزن المؤقت للإدخال. أخيرًا ، يتعامل VIM مع الحدث ويرسل أحداث السحب إلى الموضوع الرئيسي عبر JavaScript.
كمكافأة ، لم يعد تفاعل المستخدم ممنوعًا لأن جميع المنطق تقريبًا بما في ذلك VIM بالكامل يتم تشغيله في مؤشر ترابط العامل.
يرجى التأكد من تثبيت emscripten (أنا أستخدم 1.38.37) و binaryen (أنا أستخدم V84). إذا كنت تستخدم MacOS ، فيمكن تثبيتها مع brew install emscripten binaryen .
يرجى استخدام البرنامج النصي build.sh لاختراق هذا المشروع. فقط بعد استنساخ هذا المستودع ، ما عليك سوى تشغيل ./build.sh . إنه يبني vim.wasm في wasm/ الدليل. يستغرق وقتًا وقوة وحدة المعالجة المركزية كثيرًا.
استضف أخيرًا wasm/ مباشرة على localhost مع خادم ويب مثل python -m http.server 1234 . الوصول إلى localhost:1234?debug في VIM مع سجلات التصحيح. لاحظ أنه أبطأ بكثير من بناء الإصدار حيث يتم تمكين العديد من ميزات التصحيح. يرجى قراءة WASM/README.MD لمزيد من التفاصيل.
يرجى ملاحظة أن فرع wasm لهذا المستودع في كثير من الأحيان يدمج أحدث فرع VIM/VIM Master. إذا كنت ترغب في اختراق هذا المشروع ، فيرجى التأكد من إنشاء فرعك الخاص ودمج فرع wasm في فرعك بواسطة git merge .
sleep() . بشكل افتراضي ، يقوم emscripten بتجميع sleep() في حلقة مزدحمة. لذا فإن vim.wasm يستخدم emterpreter الذي يوفر emscripten_sleep() . يتم تشغيل بعض الوظائف ذات القائمة البيضاء مع Emterpreter. لكن هذه الميزة ليست مستقرة للغاية. يجعل الثنائيات المبنية أكبر وتجميع أطول.string لا يعمل.SharedArrayBuffer معاق بسبب تعرض الأمن الشبح. يمكن إصلاح هذا مع عدم التزامن. العمل قيد التقدم ويتم تتبعه في العلاقات العامة رقم 35. تتم إدارة التطوير في مشاريع جيثب.
<canvas/> في مؤشر ترابط العامل باستخدام قماش خارج الشاشةكان هذا المشروع مستوحى بشدة من مشروع مثير للإعجاب VIM.JS من لو وانغ.
يتم ترخيص جميع الملفات الإضافية في هذا المستودع بموجب نفس الترخيص مثل VIM (ترخيص VIM). يرجى الاطلاع على :help license لمزيد من التفاصيل.
readme الأصلي يتبع.

للحصول على ترجمات من هذه القراءة ، انظر النهاية.
VIM هي نسخة محسنة بشكل كبير من محرر UNIX Old Good Old. تمت إضافة العديد من الميزات الجديدة: Undo متعددة المستويات ، تسليط الضوء على بناء الجملة ، سجل سطر الأوامر ، مساعدة عبر الإنترنت ، فحص الإملائي ، إكمال اسم الملف ، عمليات الكتلة ، لغة البرنامج النصي ، إلخ. هناك أيضًا واجهة مستخدم رسومية (GUI) متاحة. ومع ذلك ، يتم الحفاظ على توافق السادس ، سيشعر أولئك الذين لديهم VI "في الأصابع" في المنزل. انظر runtime/doc/vi_diff.txt للاختلافات مع VI.
هذا المحرر مفيد للغاية لتحرير البرامج والملفات النصية العادية الأخرى. يتم إعطاء جميع الأوامر مع أحرف لوحة المفاتيح العادية ، بحيث يمكن لأولئك الذين يمكنهم الكتابة بأصابع عشرة أصابع العمل بسرعة كبيرة. بالإضافة إلى ذلك ، يمكن تعيين مفاتيح الوظائف إلى أوامر من قبل المستخدم ، ويمكن استخدام الماوس.
يعمل VIM تحت MS-Windows (NT ، 2000 ، XP ، Vista ، 7 ، 8 ، 10) ، Macintosh ، VMs وجميع نكهات UNIX تقريبًا. يجب ألا يكون النقل إلى الأنظمة الأخرى أمرًا صعبًا للغاية. يتم تشغيل الإصدارات القديمة من VIM على MS-DOS ، MS-Windows 95/98/ME ، Amiga DOS ، Atari Mint ، Beos ، RISC OS و OS/2. لم تعد الحفاظ عليها.
يمكنك في كثير من الأحيان استخدام مدير الحزمة المفضل لديك لتثبيت VIM. على Mac و Linux ، يتم تثبيت إصدار صغير من VIM مسبقًا ، لا تزال بحاجة إلى تثبيت VIM إذا كنت تريد المزيد من الميزات.
هناك توزيعات منفصلة لـ UNIX و PC و AMIGA وبعض الأنظمة الأخرى. يأتي ملف README.md هذا مع أرشيف وقت التشغيل. ويشمل الوثائق وملفات بناء الجملة والملفات الأخرى المستخدمة في وقت التشغيل. لتشغيل VIM يجب أن تحصل على أحد الأرشيف الثنائي أو أرشيف المصدر. أي واحد تحتاج إلى النظام الذي تريد تشغيله عليه وما إذا كنت تريد أو يجب أن تجمعه بنفسك. تحقق من http://www.vim.org/download.php للحصول على نظرة عامة على التوزيعات المتاحة حاليًا.
بعض الأماكن الشائعة للحصول على أحدث VIM:
إذا حصلت على توزيع ثنائي ، فلن تحتاج إلى تجميع VIM. إذا حصلت على توزيع مصدر ، فإن جميع الأشياء لتجميع VIM موجودة في دليل src . انظر src/INSTALL للحصول على التعليمات.
انظر أحد هذه الملفات للحصول على التعليمات الخاصة بالنظام. إما في دليل Readmedir (في المستودع) أو الدليل الأعلى (إذا قمت بتفريغ أرشيف):
README_ami.txt Amiga
README_unix.txt Unix
README_dos.txt MS-DOS and MS-Windows
README_mac.txt Macintosh
README_vms.txt VMS
هناك ملفات أخرى README_*.txt ، اعتمادًا على التوزيع الذي استخدمته.
المعلم VIM هو دورة تدريبية لمدة ساعة واحدة للمبتدئين. في كثير من الأحيان يمكن أن تبدأ كما vimtutor . انظر :help tutor لمزيد من المعلومات.
الأفضل هو الاستخدام :help في VIM. إذا لم يكن لديك قابلة للتنفيذ حتى الآن ، فاقرأ runtime/doc/help.txt . أنه يحتوي على مؤشرات لملفات التوثيق الأخرى. يقرأ دليل المستخدم مثل كتاب ويوصى به لتعلم استخدام VIM. انظر :help user-manual .
VIM هو charityware. يمكنك استخدامه ونسخه بقدر ما تريد ، لكنك نشجعك على التبرع لمساعدة الأيتام في أوغندا. يرجى قراءة runtime/doc/uganda.txt للحصول على التفاصيل (do :help uganda داخل VIM).
ملخص الترخيص: لا توجد قيود على استخدام أو توزيع نسخة غير معدلة من VIM. يمكن أيضًا توزيع أجزاء من VIM ، ولكن يجب دائمًا تضمين نص الترخيص. بالنسبة للإصدارات المعدلة ، تنطبق بعض القيود. الترخيص متوافق مع GPL ، يمكنك تجميع VIM مع مكتبات GPL وتوزيعه.
يستغرق إصلاح الأخطاء وإضافة ميزات جديدة الكثير من الوقت والجهد. لإظهار تقديرك للعمل وتحفيز Bram وآخرون لمواصلة العمل على VIM ، يرجى إرسال تبرع.
نظرًا لأن Bram عاد إلى وظيفة مدفوعة الأجر ، فسيتم استخدام الأموال الآن لمساعدة الأطفال في أوغندا. انظر runtime/doc/uganda.txt . ولكن في الوقت نفسه تزيد التبرعات من دافع برام لمواصلة العمل على VIM!
للحصول على أحدث المعلومات حول رعاية نظرة على موقع VIM على الويب: http://www.vim.org/sponsor/
إذا كنت ترغب في المساعدة في جعل VIM أفضل ، راجع ملف المساهمة.
يمكن العثور على آخر الأخبار حول VIM على الصفحة الرئيسية VIM: http://www.vim.org/
إذا كانت لديك مشاكل ، يمكنك إلقاء نظرة على وثائق VIM أو النصائح: http://www.vim.org/docs.php http://vim.wikia.com/wiki/vim_tips_wiki
إذا كنت لا تزال تواجه مشاكل أو أي أسئلة أخرى ، فاستخدم إحدى القوائم البريدية لمناقشتها مع مستخدمي VIM والمطورين: http://www.vim.org/maillist.php
إذا لم يكن هناك شيء آخر يعمل ، فقم بالإبلاغ عن الأخطاء مباشرة: bram moolenaar [email protected]
أرسل أي تعليقات أخرى ، بقع ، زهور واقتراحات إلى: Bram Moolenaar [email protected]
هذا هو README.md للإصدار 8.2 من VIM: VI تحسين.
كوري