vim.wasm: vim porté sur webassembly Ce projet est une fourche expérimentale de l'éditeur VIM par @rhysd pour le compiler dans WebAssembly en utilisant Emscripten et Binaryen. VIM s'exécute sur Web Worker et interagit avec le fil principal via SharedArrayBuffer .
L'objectif de ce projet est d'exécuter VIM Editor sur les navigateurs sans perdre les fonctionnalités puissantes de VIM en compilant des sources VIM C dans WebAssembly.

USAGE
:write uniquement le fichier sur la mémoire. Télécharger le tampon actuel par :export ou fichier spécifique par :export {file} ."* est pris en charge. Par exemple, collez le texte du presse-papiers système à VIM avec "*p ou :put * , et copiez du texte dans VIM dans le presse-papiers système avec "*y ou :yank * . Si vous souhaitez synchroniser le presse-papiers de VIM avec le presse-papiers système,: :set clipboard=unnamed devrait fonctionner comme Vim normal.~/.vim sont stockés constamment dans une base de base indexée. Veuillez écrire votre configuration préférée dans ~/.vim/vimrc (pas ~/.vimrc ).file={filepath}={url} obtient un fichier de {url} à {filepath} . Les fichiers distants arbitraires peuvent être ouverts (se soucier des COR).:!/path/to/file.js évalue le code JavaScript dans le navigateur. :!% Évalue le tampon actuel.:e tutor .arg= requête (par exemple ?arg=~%2f.vim%2fvimrc&arg=hello.txt ) pour ajouter des arguments de ligne de commande vim .AVIS
SharedArrayBuffer et Atomics . Sur Firefox ou Safari, les drapeaux de fonction ( javascript.options.shared_memory pour Firefox) doivent être activés pour l'instant.keydown . Veuillez désactiver les extensions de votre navigateur qui interceptent les événements clés (le mode incognito serait le meilleur).:quit , mais il ne ferme pas un onglet de navigateur. Veuillez le fermer manuellement :) Ce projet est emballé sous le nom de NPM Pacakge vim-wasm à utiliser facilement dans l'application Web. Veuillez lire la documentation pour plus de détails.
La version VIM portée actuelle est 8.2.0055 avec des ensembles de fonctionnalités «normaux» et «petits». Veuillez consulter ChangeLog pour l'historique de mise à jour.
Les projets suivants sont liés à ce package NPM et peuvent être plus adaptés à votre cas d'utilisation.

Dans Worker Thread, VIM s'exécute en compilé dans Wasm. Le fil du travailleur est engendré en tant que travailleur Web dédié à partir du thread principal lors de l'ouverture de la page.
Disons que vous saisissez quelque chose avec le clavier. Le navigateur le prend en tant que KeyboardEvent lors de l'événement keydown . JavaScript dans le thread principal capture l'événement et stockent des informations de clés dans un tampon de mémoire partagé.
Le tampon est partagé avec le fil du travailleur. VIM attend et obtient les informations de clé en interrogeant le tampon de mémoire partagé via l'API Atomics de JavaScript. Lorsque des informations clés se trouvent dans le tampon, elles chargent les informations et calcule la séquence clé. Via JS à API WASM Grâce à Emscripten, la séquence est ajoutée au tampon d'entrée de VIM dans WASM.
La séquence dans le tampon d'entrée est traitée par la logique de l'éditeur de base (tampon de mise à jour, écran, ...). En raison des mises à jour, certains événements de tirage se produisent tels que des dames, des dames, des régions de défilement, ...
Ces événements de tirage sont envoyés à JavaScript dans Worker Thread de WASM grâce à l'API JS à C d'Emscripten. Considérant le ratio Pixel du dispositif et l'API <canvas/> , comment rendre les événements est calculé et ces événements de rendu calculés sont passés du fil du travailleur au thread principal via un message passant avec postMessage() .
Le fil principal JavaScript reçoit et met en place ces événements de rendu. Sur le cadre d'animation, il les rend à <canvas/> .
Enfin, vous pouvez voir l'écran rendu dans la page.

WebAssembly Frontend for VIM est implémenté en tant que nouvelle GUI Frontend de VIM comme d'autres GUI tels que GTK Frontend. Les sources C sont compilées sur chaque fichier Bitcode LLVM, puis ils sont liés à un fichier bitcode vim.bc par emcc . emcc compilera enfin le vim.bc dans vim.wasm Binary en utilisant Binaryen et génère l'exécution HTML / JavaScript.
La différence que j'ai dû faire face au début était le manque de bibliothèque terminale telle que les ncurses. J'ai modifié le script configure pour ignorer la vérification de la bibliothèque du terminal. C'est OK car GUI Frontend pour Wasm est toujours utilisé à la place du frontend CUI. J'avais besoin de nombreuses solutions de contournement pour passer des vérifications configure .
Emscripten fournit un environnement de type Unix. Ainsi os_unix.c peut prendre en charge Wasm. Cependant, certaines fonctionnalités ne sont pas prises en charge par Emscripten. J'ai ajouté de nombreuses gardes #ifdef FEAT_GUI_WASM pour désactiver les fonctionnalités qui ne peuvent pas être prises en charge par WasM (c'est-à-dire la prise en charge fork (2) , le support Pty, les gestionnaires de signaux sont tronqués, ... etc.).
J'ai créé gui_wasm.c référençant fortement gui_mac.c et gui_w32.c . Loop d'événement ( gui_mch_update() et gui_mch_wait_for_chars() ) est simplement implémenté avec l'attente de blocage. Et presque tous les événements de rendu d'interface utilisateur sont transmis à la couche JavaScript en appelant des fonctions JavaScript de C grâce à Emscripten.
Les sources C sont compilées (avec de nombreuses optimisations) dans le code bit de LLVM avec Clang qui est intégré à Emscripten. Ensuite, tous les fichiers bitcodes ( .o ) sont liés à un fichier bitcode vim.bc avec le linker llvm-link (également intégré à Emscripten).
Et j'ai créé JavaScript Runtime dans TypeScript pour dessiner les événements de rendu envoyés à partir de C. JavaScript Runtime est séparé en deux parties; thread principal et fil de travail. wasm/main.ts est pour le fil principal. Il démarre VIM dans le fil de travail et dessine l'écran VIM vers <canvas> recevant des événements de dessin de VIM. wasm/runtime.ts et wasm/pre.ts sont destinés au fil des travailleurs. Ils sont écrits à l'aide de l'API Emscripten.
emcc (compilateur C d'EMScripten) compile le vim.bc et runtime.js dans vim.wasm , vim.js et vim.data avec des fichiers d'exécution VIM pré-réalisés (IE ColorScheme) à l'aide de Binaryen. Les fichiers d'exécution sont chargés sur un système de fichiers virtuel fourni sur un navigateur par EMScripten. Ici, ces fichiers sont compilés pour le thread des travailleurs. wasm/main.js lance un travailleur Web dédié chargant vim.js
Enfin, j'ai créé un petit wasm/index.html qui contient <canvas/> pour rendre l'écran VIM et charger wasm/main.js
Maintenant l'hébergement wasm/index.html avec un serveur Web et l'accès à celui-ci avec le navigateur Open Vim. Ça marche.
sleep() sur javascript La partie la plus difficile pour ce portage a été de savoir comment implémenter l'attente de blocage (généralement réalisée avec sleep() ).
Étant donné que le blocage du thread principal sur la page Web signifie bloquer l'interaction utilisateur, il est essentiellement interdit. Presque toutes les opérations prenant du temps sont implémentées en tant qu'API asynchrones en JavaScript. WASM fonctionnant sur le thread principal ne peut pas bloquer le fil à l'exception de la boucle occupée.
Mais les programmes C utilisent avec désinvolture la fonction sleep() , c'est donc un problème lors du portage des programmes. Le frontend GUI de VIM devrait également attendre la saisie des utilisateurs avec l'attente de blocage.
Emscripten fournit une solution de contournement pour ce problème, Emterpreter. Avec Emterpreter, Emscripten fournit (pseudo) bloquer les fonctions d'attente telles que emscripten_sleep() . Lorsqu'ils sont utilisés dans la fonction C, emcc compile la fonction en code d'octet EMTERPreter au lieu de WASM. Et au moment de l'exécution, le code d'octet est exécuté sur un interprète (sur wasm). Lorsque l'interprète atteint le point d'appel emscripten_sleep() , il suspend l'exécution du code d'octets et définit la minuterie (avec la fonction setTimeout JS). Après l'expiration du temps, l'interprète reprend l'état et continue l'exécution.
Par ce mécanisme, l'attente asynchrone de Javascript ressemble à l'attente synchrone du monde C. Au début, j'ai utilisé Emterpreter et cela a fonctionné. Cependant, il y avait plusieurs problèmes.
J'ai cherché une alternative et j'ai trouvé Atomics.wait() . Atomics.wait() est une fonction primitive synchrone de bas niveau. Il attend qu'un octet spécifique dans le tampon de mémoire partagé soit mis à jour. Il bloque l'attente . Bien sûr, il n'est pas disponible sur le fil principal. Il doit être utilisé sur un fil de travail.
J'ai déplacé la base de code WASM dans le web travailleur fonctionnant sur le thread des travailleurs, bien que le rendu <canvas/> soit toujours effectué dans le thread principal.

VIM utilise Atomics.wait() pour l'attente de la saisie des utilisateurs en regardant un tampon de mémoire partagé. Lorsqu'un événement clé se produit, le thread principal stocke les données de l'événement clé dans le tampon de mémoire partagé et indique qu'un nouvel événement clé est venu par Atomics.notify() . Le thread de travailleur détecte que le tampon a été mis à jour par Atomics.wait() et charge les données d'événement clés du tampon. VIM calcule une séquence de clés à partir des données et les ajouter au tampon d'entrée. Enfin, VIM gère l'événement et envoie des événements de dessin sur le fil principal via JavaScript.
En prime, l'interaction de l'utilisateur n'est plus empêché car presque toutes les logiques, y compris entières VIM, sont exécutées dans le thread des travailleurs.
Veuillez vous assurer que Emscripten (j'utilise 1.38.37) et Binaryen (j'utilise V84) sont installés. Si vous utilisez MacOS, ils peuvent être installés avec brew install emscripten binaryen .
Veuillez utiliser le script build.sh pour pirater ce projet. Juste après le clonage de ce référentiel, exécutez simplement ./build.sh . Il construit VIM.WASM dans wasm/ Directory. Cela prend beaucoup de temps et de CPU.
Enfin, hébergez le wasm/ directement sur localhost avec un serveur Web tel que python -m http.server 1234 . Accès à localhost:1234?debug commencera VIM avec les journaux de débogage. Notez qu'il est beaucoup plus lent que la version de version car de nombreuses fonctionnalités de débogage sont activées. Veuillez lire Wasm / Readme.md pour plus de détails.
Veuillez noter que la branche wasm de ce référentiel fusionne fréquemment la dernière branche VIM / VIM Master. Si vous souhaitez pirater ce projet, veuillez vous assurer de créer votre propre branche et de fusionner la branche wasm dans votre branche par git merge .
sleep() . Par défaut, Emscripten compile sleep() dans une boucle occupée. Vim.Wasm utilise donc EMTERPreter qui fournit emscripten_sleep() . Certaines fonctions de liste blanche sont exécutées avec Emterpreter. Mais cette fonctionnalité n'est pas si stable. Il rend les binaires construits plus grands et la compilation plus longtemps.string ne fonctionne pas.SharedArrayBuffer est désactivé en raison de la vulnérabilité de sécurité Spectre. Cela peut être fixé avec Asyncify. Le travail est en cours et suivi au PR # 35. Le développement est géré dans les projets GitHub.
<canvas/> dans le thread des travailleurs en utilisant une toile hors écranCe projet a été fortement inspiré par le projet impressionnant Vim.js de Lu Wang.
Tous les fichiers supplémentaires de ce référentiel sont sous licence en vertu de la même licence que VIM (Licence VIM). Veuillez consulter :help license pour plus de détails.
Le réadme original suit.

Pour les traductions de cette lecture, voir la fin.
VIM est une version considérablement améliorée du Good Old Unix Editor VI. De nombreuses nouvelles fonctionnalités ont été ajoutées: UNDO à plusieurs niveaux, mise en évidence de la syntaxe, historique des lignes de commande, aide en ligne, vérification des orthographiques, complétion du nom de fichier, opérations de bloc, langage de script, etc. Il existe également une interface utilisateur graphique (GUI) disponible. Pourtant, la compatibilité VI est maintenue, ceux qui ont VI "dans les doigts" se sentiront chez eux. Voir runtime/doc/vi_diff.txt pour les différences avec vi.
Cet éditeur est très utile pour modifier les programmes et autres fichiers en texte brut. Toutes les commandes sont données avec des caractères clavier normaux, de sorte que ceux qui peuvent taper avec dix doigts peuvent fonctionner très rapidement. De plus, les touches de fonction peuvent être mappées sur les commandes par l'utilisateur, et la souris peut être utilisée.
VIM passe sous MS-Windows (NT, 2000, XP, Vista, 7, 8, 10), Macintosh, VMS et presque toutes les saveurs d'Unix. Le transport vers d'autres systèmes ne devrait pas être très difficile. Les anciennes versions de VIM fonctionnent sur MS-DOS, MS-Windows 95/98 / ME, Amiga DOS, Atari Mint, Beos, RISC OS et OS / 2. Ceux-ci ne sont plus maintenus.
Vous pouvez souvent utiliser votre gestionnaire de packages préféré pour installer VIM. Sur Mac et Linux, une petite version de VIM est préinstallée, vous devez toujours installer VIM si vous voulez plus de fonctionnalités.
Il existe des distributions distinctes pour UNIX, PC, Amiga et certains autres systèmes. Ce fichier README.md est livré avec l'archive d'exécution. Il comprend la documentation, les fichiers de syntaxe et autres fichiers utilisés lors de l'exécution. Pour exécuter VIM, vous devez obtenir l'une des archives binaires ou une archive source. Le celui dont vous avez besoin dépend du système sur lequel vous souhaitez l'exécuter et si vous le souhaitez ou que vous le compilez vous-même. Consultez http://www.vim.org/download.php pour un aperçu des distributions actuellement disponibles.
Quelques endroits populaires pour obtenir le dernier VIM:
Si vous avez obtenu une distribution binaire, vous n'avez pas besoin de compiler VIM. Si vous avez obtenu une distribution de source, toutes les choses pour la compilation de VIM se trouvent dans le répertoire src . Voir src/INSTALL pour les instructions.
Voir l'un de ces fichiers pour les instructions spécifiques au système. Soit dans le répertoire ReadMedir (dans le référentiel) ou dans le répertoire supérieur (si vous déballez une archive):
README_ami.txt Amiga
README_unix.txt Unix
README_dos.txt MS-DOS and MS-Windows
README_mac.txt Macintosh
README_vms.txt VMS
Il existe d'autres fichiers README_*.txt , selon la distribution que vous avez utilisée.
Le tuteur VIM est un cours de formation d'une heure pour les débutants. Souvent, il peut être démarré comme vimtutor . Voir :help tutor pour plus d'informations.
Le meilleur est d'utiliser :help dans VIM. Si vous n'avez pas encore d'exécutable, lisez runtime/doc/help.txt . Il contient des pointeurs vers les autres fichiers de documentation. Le manuel de l'utilisateur se lit comme un livre et est recommandé d'apprendre à utiliser VIM. Voir :help user-manual .
VIM est Charityware. Vous pouvez l'utiliser et le copier autant que vous le souhaitez, mais vous êtes encouragé à faire un don pour aider les orphelins en Ouganda. Veuillez lire le fichier runtime/doc/uganda.txt pour plus de détails (faire :help uganda à l'intérieur de VIM).
Résumé de la licence: Il n'y a aucune restriction sur l'utilisation ou la distribution d'une copie non modifiée de VIM. Des parties de VIM peuvent également être distribuées, mais le texte de licence doit toujours être inclus. Pour les versions modifiées, quelques restrictions s'appliquent. La licence est compatible GPL, vous pouvez compiler VIM avec les bibliothèques GPL et la distribuer.
Correction des bogues et ajouter de nouvelles fonctionnalités prend beaucoup de temps et d'efforts. Pour montrer votre appréciation pour le travail et motiver Bram et d'autres à continuer à travailler sur VIM, veuillez envoyer un don.
Étant donné que Bram est de retour à un travail rémunéré, l'argent sera désormais utilisé pour aider les enfants en Ouganda. Voir runtime/doc/uganda.txt . Mais en même temps, les dons augmentent la motivation de Bram pour continuer à travailler sur VIM!
Pour les informations les plus récentes sur le parrainage, regardez sur le site Web VIM: http://www.vim.org/sponsor/
Si vous souhaitez aider à améliorer VIM, consultez le fichier contribution.md.
Les dernières nouvelles sur VIM peuvent être trouvées sur la page d'accueil de VIM: http://www.vim.org/
Si vous avez des problèmes, jetez un œil à la documentation VIM ou aux conseils: http://www.vim.org/docs.php http://vim.wikia.com/wiki/vim_tips_wiki
Si vous avez encore des problèmes ou toute autre question, utilisez l'une des listes de diffusion pour en discuter avec des utilisateurs et des développeurs VIM: http://www.vim.org/maillist.php
Si rien d'autre ne fonctionne, signalez directement les bogues: Bram moolenaar [email protected]
Envoyez d'autres commentaires, patchs, fleurs et suggestions à: Bram moolenaar [email protected]
Ceci est README.md pour la version 8.2 de VIM: vi a amélioré.
coréen