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/libvimcd srcesy installesy '@test' installesy buildesy '@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 srcmake apitest/autoindent.test.execd 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 iauszufü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.