libvim
? libvim
est un fork de Vim, dans le but de fournir une API minimale basée sur C, modélisant l'édition modale de Vim. Il n'inclut aucune interface utilisateur (pas même une interface utilisateur de terminal) et est principalement chargé d'agir comme un moteur de manipulation rapide du tampon, fidèle aux frappes au clavier de Vim. C'est encore un travail en cours et il reste beaucoup de travail à stabiliser.
Si vous recherchez un terminal Vim, consultez neovim, ou un GUI Vim, consultez Onivim 2.
libvim
est principalement destiné à Onivim 2. Après avoir implémenté plusieurs itérations de 'UI Vims' entre la v1, la v2 et d'autres projets, l'abstraction que je souhaitais était une sorte de Vim purement fonctionnel, complètement découplé de l'interface utilisateur du terminal - où 'vim ' est une fonction de (editor state, input) => (new editor state)
. Comme Onivim 2 gère entièrement la couche de rendu, cette fonction modélisée par Vim comme une fonction pure pourrait se concentrer uniquement sur la manipulation du tampon.
À cette fin, libvim
expose une simple API C pour travailler avec Vim et prend en charge l'écoute des modifications de tampon, des messages, etc.
Il est chargé de :
Il n'est PAS responsable de :
Tous ces éléments sont destinés à être gérés par le consommateur de la bibliothèque - laissant libvim
se concentrer sur le travail de manipulation rapide du tampon.
libvim
construit multiplateforme (puisque Onivim 2 l'exige !), ainsi que pour WebAssembly - nous aimerions porter nos didacticiels v1 vers une expérience basée sur un navigateur.
Il existe d'autres applications intéressantes d'un tel « Vim abstrait » :
readline
, par exemple. Pour un exemple d'utilisation de l'API, consultez les apitests comme normal_mode_motion. L'API complète est disponible ici : libvim.h
Le cœur de l'API est vimInput
qui prend une seule clé et est traité de manière synchrone par la machine à états. Les « effets secondaires » tels que les mises à jour de tampon, les messages, etc. peuvent être souscrits via des rappels comme vimSetBufferUpdateCallback
.
Cette bibliothèque est en développement actif et nous ne donnons actuellement aucune garantie quant à la compatibilité ascendante. Utilisez l'API à vos propres risques.
esy
est comme npm
pour le code natif. Si vous ne l'avez pas déjà, installez-le en exécutant :
npm install -g [email protected]
git clone https://github.com/onivim/libvim
cd src
esy install
esy '@test' install
esy build
esy '@test' build
Le workflow esy
fonctionne très bien pour les builds ponctuelles, mais reconstruira le monde à chaque fois, donc pendant le développement, il est préférable d'avoir un workflow incrémentiel.
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
Vous pouvez tester une libvim
construite localement par rapport à un Onivim 2 construit localement en ajoutant une résolution dans le package.json
Onivim 2, comme :
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
Assurez-vous simplement qu'il pointe vers le dossier libvim/src
.
REMARQUE : Nous avons constaté des problèmes avec ce flux de travail où les binaires peuvent être obsolètes dans Onivim 2, nous vous recommandons donc d'exécuter
rm -rf _esy && esy i
après chaque modification pour reconstruire la dépendance.
libvim
est-il basé sur Vim et non sur Neovim ? Je suis un grand fan du travail effectué par l'équipe Neovim (et l'équipe a incroyablement soutenu le projet Onivim). Idéalement, nous serions restés avec Neovim ou implémenterions libvim
basé sur libnvim
. En fait, la première fois que j'ai essayé de construire cette « abstraction minimale », j'ai essayé de la baser sur libnvim
de Neovim. J'ai limité le délai d'enquête à 2 jours et je me suis heurté à de sérieux obstacles - notre environnement de construction est un peu difficile sous Windows (il est basé sur la chaîne d'outils de compilateur croisé Cygwin + MingW) - J'ai rencontré plusieurs problèmes pour que Neovim + deps soit construit dans cet environnement . Sur la base de ce pic, j'ai estimé qu'il faudrait environ 3 à 4 semaines pour que cela fonctionne dans cette chaîne d'outils.
Notez qu'il ne s'agit pas d'un problème Neovim - l'utilisation des dépendances et l'exploitation de CMake
sont de bonnes décisions - c'est une conséquence de notre système de construction OCaml. La chaîne d'outils du compilateur croisé Cygwin + MingW n'est pas bien gérée par toutes les dépendances (étant un hybride étrange de Win32 et Unix, il arrive souvent que les #ifdefs soient erronés, que des dépendances incorrectes soient intégrées, et cela peut prendre énormément de temps. travailler sur ces problèmes).
Vim, en revanche, a été capable de compiler facilement dans cet environnement (REMARQUE : si quelqu'un est intéressé par la création d'un package Neovim multiplateforme et compatible esy
- nous pouvons y revenir !). Je suis également intéressé par les versions WebAssembly, pour le portage des didacticiels Onivim v1 sur le Web, dans lesquelles cette bibliothèque abstraite en C compilée sur WebAssembly conviendrait parfaitement.
Au-delà des problèmes de construction, Neovim et Vim auraient besoin d'une refactorisation pour fournir cette API synchrone et fonctionnelle :
La motivation de tout ce travail était de supprimer la couche RPC d'Onivim v2 pour réduire la complexité et les modes de défaillance. Au final, il s'agissait d'une décision technique purement basée sur des contraintes. Si nous pouvons obtenir une API similaire, constructible via esy
multiplateforme, avec nvim
- je serais heureux de l'utiliser :)
Si libvim
vous intéresse et que vous souhaitez soutenir le développement, considérez ce qui suit :
Si vous souhaitez contribuer à améliorer libvim
, consultez le fichier CONTRIBUTING.md.
Quelques lieux de contribution :
libvim
Le code libvim
est sous licence MIT.
Cela dépend également du code tiers, notamment Vim, mais aussi d'autres - voir ThirdPartyLicenses.txt pour les détails de la licence.