Nach fast zwei Jahren Entwicklung wurde die Version 0.5 von Neovim veröffentlicht, einem Fork des Vim-Editors, der sich auf die Verbesserung der Erweiterbarkeit und Flexibilität konzentriert. Im Rahmen des Projekts wird seit über sieben Jahren die Codebasis von Vim überarbeitet, was zu Änderungen führt, die die Wartung des Codes vereinfachen, Werkzeuge zur Aufteilung der Arbeit zwischen mehreren Maintainers bereitstellen, die Benutzeroberfläche vom Kern trennen (die Oberfläche kann verändert werden, ohne die Interna zu berühren) und eine neue erweiterbare Architektur auf Basis von Plugins implementieren. Die ursprünglichen Arbeiten des Projekts werden unter der Lizenz Apache 2.0 verbreitet, während der Kern unter der Vim-Lizenz steht.
Zu den Problemen von Vim, die zur Entwicklung von Neovim führten, zählt die aufgeblähte monolithische Codebasis, die aus über 300.000 Zeilen C-Code (C89) besteht. Nur wenige Personen sind mit den Feinheiten der Vim-Codebasis vertraut, und alle Änderungen werden von einem einzigen Maintainer kontrolliert, was die Wartung und die Weiterentwicklung des Editors erschwert. Anstelle des in den Vim-Kern integrierten Codes zur Unterstützung von GUIs wird in Neovim eine universelle Schnittstelle vorgeschlagen, die es ermöglicht, Benutzeroberflächen mit verschiedenen Toolkits zu erstellen.
Plugins für Neovim laufen als separate Prozesse, wobei das MessagePack-Format für die Interaktion verwendet wird. Die Kommunikation mit den Plugins erfolgt asynchron, ohne die grundlegenden Komponenten des Editors zu blockieren. Ein TCP-Socket kann verwendet werden, um auf ein Plugin zuzugreifen, d.h. das Plugin kann auf einem externen System ausgeführt werden. Neovim bleibt dabei abwärtskompatibel zu Vim, unterstützt weiterhin Vimscript (als Alternative wird Lua angeboten) und ermöglicht die Verwendung der meisten standardmäßigen Vim-Plugins. Die erweiterten Funktionen von Neovim können in Plugins genutzt werden, die mit der spezifischen API von Neovim erstellt wurden.
Derzeit sind bereits etwa 130 spezifische Plugins vorbereitet, es stehen Bindings zur Verfügung, um Plugins und Schnittstellenimplementierungen unter Verwendung verschiedener Programmiersprachen (C++, Clojure, Perl, Python, Go, Java, Lisp, Lua, Ruby) und Frameworks (Qt, ncurses, Node.js, Electron, GTK) zu erstellen. Es werden mehrere Varianten von Benutzeroberflächen entwickelt. GUI-Erweiterungen ähneln in vielerlei Hinsicht Plugins, jedoch initiieren sie im Gegensatz zu Plugins den Aufruf von Neovim-Funktionen, während Plugins aus Neovim heraus aufgerufen werden.
Einige der Änderungen in der neuen Version:
- Ein integrierter LSP-Client (Language Server Protocol) in Lua wurde hinzugefügt, der verwendet werden kann, um sich mit externen Diensten für die Analyse und Code-Autovervollständigung zu verbinden.
- Eine API zur Verwaltung des Layouts von Auswahl-Puffern wurde hinzugefügt.
- Eine API zur Nutzung erweiterter Markierungen wurde hinzugefügt, die das Nachverfolgen von Änderungen auf Byte-Ebene ermöglichen.
- Die Unterstützung von Lua als Sprache für die Plugin-Entwicklung und Konfigurationsverwaltung wurde erweitert.
- Experimentelle Unterstützung für den Syntax-Parser Tree-sitter hinzugefügt.
Quelle: opennet.ru
