libvim
? libvim
ist ein Fork von Vim mit dem Ziel, eine minimale C-basierte API bereitzustellen, die die modale Bearbeitung von Vim modelliert. Es enthält überhaupt keine Benutzeroberfläche (nicht einmal eine Terminal-Benutzeroberfläche) und ist in erster Linie dafür verantwortlich, als schnelle Puffermanipulations-Engine zu fungieren, die den Tastenanschlägen von Vim treu bleibt. Es ist noch in Arbeit und es gibt noch viel zu stabilisieren.
Wenn Sie nach einem Terminal-VIM suchen, schauen Sie sich Neovim an, oder nach einem GUI-VIM, schauen Sie sich Onivim 2 an.
libvim
ist in erster Linie für Onivim 2 gedacht. Nachdem ich mehrere Iterationen von „UI Vims“ zwischen v1, v2 und anderen Projekten implementiert hatte, war die Abstraktion, die ich mir gewünscht hatte, eine Art rein funktionales Vim, vollständig entkoppelt von der Terminal-Benutzeroberfläche – wobei „vim ' ist eine Funktion von (editor state, input) => (new editor state)
. Da Onivim 2 die Rendering-Ebene vollständig übernimmt, könnte sich diese Vim-modellierte-als-reine-Funktion nur auf die Puffermanipulation konzentrieren.
Zu diesem Zweck stellt libvim
eine einfache C-API für die Arbeit mit Vim bereit und unterstützt das Abhören von Pufferänderungen, Nachrichten usw.
Es ist verantwortlich für:
Es ist NICHT verantwortlich für:
All dies soll vom Konsumenten der Bibliothek erledigt werden, so dass sich libvim
auf die Aufgabe der schnellen Puffermanipulation konzentrieren kann.
libvim
erstellt plattformübergreifend (da Onivim 2 dies erfordert!) sowie für WebAssembly – wir möchten unsere v1-Tutorials auf eine browserbasierte Erfahrung portieren.
Es gibt weitere interessante Anwendungen eines solchen „abstrahierten Vim“:
readline
. Ein Beispiel für die API-Nutzung finden Sie in den Apitests wie normal_mode_motion. Die vollständige API ist hier verfügbar: libvim.h
Das Herzstück der API ist vimInput
, das einen einzelnen Schlüssel benötigt und synchron von der Zustandsmaschine verarbeitet wird. „Nebeneffekte“ wie Pufferaktualisierungen, Nachrichten usw. können über Rückrufe wie vimSetBufferUpdateCallback
abonniert werden.
Diese Bibliothek befindet sich in der aktiven Entwicklung und wir geben derzeit keine Garantie für die Abwärtskompatibilität. Die Nutzung der API erfolgt auf eigenes Risiko.
esy
ist wie npm
für nativen Code. Wenn Sie es noch nicht haben, installieren Sie es, indem Sie Folgendes ausführen:
npm install -g [email protected]
git clone https://github.com/onivim/libvim
cd src
esy install
esy '@test' install
esy build
esy '@test' build
Der esy
-Workflow eignet sich hervorragend für einmalige Builds, erstellt die Welt jedoch jedes Mal neu. Daher ist es während der Entwicklung besser, einen inkrementellen Workflow zu verwenden.
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
Sie können ein lokal erstelltes libvim
mit einem lokal erstellten Onivim 2 testen, indem Sie eine Auflösung in der package.json
von Onivim 2 hinzufügen, wie zum Beispiel:
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
Stellen Sie einfach sicher, dass es auf den Ordner libvim/src
verweist.
HINWEIS: Wir haben Probleme mit diesem Workflow festgestellt, bei denen die Binärdateien in Onivim 2 veraltet sein können. Wir empfehlen daher, nach jeder Änderung
rm -rf _esy && esy i
auszuführen, um die Abhängigkeit neu aufzubauen.
libvim
auf Vim und nicht auf Neovim? Ich bin ein großer Fan der Arbeit des Neovim-Teams (und das Team hat das Onivim-Projekt unglaublich unterstützt). Im Idealfall wären wir bei Neovim geblieben oder hätten libvim
basierend auf libnvim
implementiert. Tatsächlich habe ich beim ersten Versuch, diese „minimale Abstraktion“ zu erstellen, versucht, sie auf Neovims libnvim
aufzubauen. Ich habe die Untersuchung auf zwei Tage begrenzt und bin auf einige ernsthafte Hürden gestoßen – unsere Build-Umgebung ist unter Windows etwas anspruchsvoll (sie basiert auf der Cygwin + MingW Cross-Compiler-Toolchain) – ich bin auf mehrere Probleme gestoßen, Neovim + Deps in dieser Umgebung zu erstellen . Basierend auf diesem Anstieg schätzte ich, dass es etwa drei bis vier Wochen dauern würde, bis es in dieser Toolchain funktioniert.
Beachten Sie, dass dies kein Neovim-Problem ist – die Abhängigkeitsnutzung und Nutzung von CMake
sind gute Entscheidungen – es ist eine Folge unseres OCaml-Build-Systems. Die Cygwin + MingW-Cross-Compiler-Toolchain wird nicht von allen Abhängigkeiten gut gehandhabt (da es sich um eine seltsame Mischung aus Win32 und Unix handelt, kommt es häufig vor, dass #ifdefs falsch sind, falsche Abhängigkeiten eingezogen werden und dies eine enorme Zeitverschwendung sein kann). die Bearbeitung dieser Probleme).
Im Gegensatz dazu konnte Vim problemlos in dieser Umgebung kompiliert werden (HINWEIS: Wenn jemand daran interessiert ist, ein plattformübergreifendes, esy
-fähiges Neovim-Paket zu erstellen, können wir uns das noch einmal ansehen!). Ich interessiere mich auch für WebAssembly-Builds für die Portierung der Onivim v1-Tutorials ins Web, in die diese in WebAssembly kompilierte C-abstrakte Bibliothek perfekt passen würde.
Abgesehen von den Build-Problemen müssten sowohl Neovim als auch Vim umgestaltet werden, um diese synchrone, funktionale API bereitzustellen:
Die Motivation all dieser Arbeiten bestand darin, die RPC-Schicht aus Onivim v2 zu entfernen, um die Komplexität und Fehlermodi zu reduzieren – letztendlich war dies eine rein auf Einschränkungen basierende technische Entscheidung. Wenn wir mit nvim
eine ähnliche API bekommen können, die über esy
plattformübergreifend erstellt werden kann, würde ich das gerne nutzen :)
Wenn libvim
für Sie interessant ist und Sie die Entwicklung unterstützen möchten, sollten Sie Folgendes berücksichtigen:
Wenn Sie dazu beitragen möchten, libvim
zu verbessern, sehen Sie sich die Datei CONTRIBUTING.md an.
Einige Orte für Beiträge:
libvim
nicht erforderlich sind libvim
Code ist unter der MIT-Lizenz lizenziert.
Es hängt auch vom Code von Drittanbietern ab, insbesondere von Vim, aber auch von anderen – Lizenzdetails finden Sie in ThirdPartyLicenses.txt.