Neovim
„Neovim“ wurde von Dirk (Diskussion) als in Bearbeitung markiert. Um Bearbeitungskonflikte zu vermeiden, kontaktiere Dirk (Diskussion) bitte, bevor du den Artikel bearbeitest.
Neovim ist ein Vim-Fork mit dem Ziel, die Codebase zu verbessern und zu modernisieren, die Implementierung von APIs zu vereinfachen, und den Editor leicht mittels Lua zu Konfigurieren und zu scripten.
Installation
Das Programm ist als
neovim
in extra
verfügbar, und kann von dort
mittels Pacman
installiert werden.
Neovim lässt sich mittels seines Kurznamens nvim
starten.
Vergleich zu Vim
Neovim ist vollständig kompatibel zum modalen Bearbeitungs-Workflow von Vim, sowie zu Vimscript v1, unterscheidet sich aber in einigen Punkten.
- APIs stehen bei Neovim an erster Stelle, sie können von externen Programmen untersucht werden, sind dokumentiert, und es können verschiedene Versionen der APIs angeboten werden.
- Die Kommunikation innerhalb Neovims wird über MessagePack realisiert, das es ermöglicht, Erweiterung in beliebigen Programmiersprachen zu entwickeln.
- Neovim kann sehr einfach als Editor oder als Scripthost in andere Programme eingebettet werden.
- Als Konfigurations- und Plugin-Sprache steht Lua an erster Stelle.
- Der Parser generiert einen AST, Syntaxhighlighting und Fehleranalyse sind daher semantisch möglich, und nicht nur basierend auf regulären Ausdrücken.
- Eingebauter LSP-Client
Es werden Vim-Plugins bis Version 8.x unterstützt. Es ist nicht geplant, Vimscript 9.x zu unterstützen.
Konfiguration
Die Konfiguration erfolgt standardmäßig innerhalb des Verzeichnisses ~/.config/nvim
. Von dort wird die Datei init.lua
geladen und der in ihr vorhandene Lua-Code zur Konfiguration geladen.
Die Konfiguration von Neovim wird durch das Verändern von Lua-Tables vorgenommen. Tables sind eine flexible Datenstruktur, die verwendet wird, um Arrays, Listen, Dictionaries oder Objekte zu speichern und zu verwalten. Der am meisten benutzte Table ist vim.opt
. Über diesen Table wird Neovim generell konfiguriert.
Da die Konfiguration sehr schnell sehr individuell wird, sei hier nur auf zwei gängige Varianten der Konfiguration eingegangen.
~/.config/nvim/init.lua
vim.opt.cursorline = true -- Aktuelle Zeile des Cursors hervorheben vim.opt.spell = true -- Rechtschreibprüfung aktivieren vim.opt.spelllang = 'de' -- Sprache der Rechtschreibprüfung einstellen vim.opt.relativenumber = true -- Zeige relative Zeilennummern an
Einige Tables können auch durch Append-Aufrufe erweitert oder angepasst werden.
~/.config/nvim/init.lua
vim.opt_local.wrap = false -- Führe keinen Zeilenumbruch aus vim.opt.list = true -- Zeige Listchars an vim.opt.listchars:append({ tab = '┏━┓', -- Drei Zeichen aus denen das Tab gebaut wird trail = '␣', -- Leerzeichen am Zeilenende nbsp = '▂', -- Schmales geschütztes Leerzeichen precedes = '❰', -- Langer Text, der nach links aus dem Buffer läuft extends = '❱' -- Langer Text, der nach rechts aus dem Buffer läuft })
Dieses Beispiel definiert einige der Listchars um, Sonderzeichen die Standardmäßig nicht angezeigt werden. Normaler weise benutzt Neovim dafür gewöhnliche ASCII-Zeichen. Hierdurch werden Unicode-Zeichen definiert.
Plugins
Plugins werden automatisch geladen, wenn sich die Plugin-Dateien in einem Unterverzeichnis eines im runtimepath
Vorhandenen Verzeichnisses befinden. Man kann sich diesen Table innerhalb Neovims anzeigen lassen.
:lua print(vim.inspect(vim.opt.runtimepath:get()))
{ "/home/USERNAME/.config/nvim", "/home/USERNAME/.local/share/nvim/site", "/home/USERNAME/.config/nvim/after", "/usr/share/nvim/site", "/usr/share/nvim/runtime", [...] }
Plugins, die dort liegen, lassen sich mittels Lua direkt als Module laden.
require('mein_plugin') -- Plugin aus dem Verzeichnis `mein_plugin` require('weitere_plugins.foo') -- Plugin aus dem Verzeichnis `weitere_plugins/foo`
Die Konfiguration der Plugins ist abhängig davon, was die Plugins an Konfiguration unterstützen. Zum Beispiel kann man ein Plugin wie folgt laden:
require('mein_plugin').setup({ option_A = true, option_b = 'foobar' })
Damit wird das Plugin beim laden direkt konfiguriert. Welche Parameter ein Plugin interpretieren kann, geht aus der jeweiligen Plugindokumentation hervor.
Pluginmanager (am Beispiel von lazy.nvim)
Für die Installation, Konfiguration, und das Laden von Plugins, ohne jedes mal manuell das Plugin herunterzuladen und einzurichten, haben sich Pluginmanager etabliert. Diese fassen den gesamten Prozess zusammen und bieten auch meist eine entsprechende Schnittstelle zur Überprüfung und Wartung der Plugins.
Der am weitesten verbreitete und funktionsreichste Pluginmanager ist lazy.nvim
. Dieser ist sehr auf Performance ausgelegt und bietet zudem die Möglichkeit, Plugins erst dann zu laden, wenn sie erstmalig benutzt werden. So kann zum Beispiel ein Textformatierplugin erst dann geladen werden, wenn die entsprechende Tastenkombination gedrückt wird, anstatt immer direkt bei jedem starten von Neovim geladen zu werden, was die Startzeit insgesamt gesehen deutlich verbessert.
Installation
lazy.nvim benötigt Git, dies muss also installiert sein. Dann lädt man die Plugin-Dateien herunter und stellt sie dem runtimepath
voran. Um die Konfiguration in sich geschlossen zu halten, kann man dies innerhalb der Neovim-Konfiguration erledigen, und muss auf dem Zielsystem beim Verteilen der Konfiguration nur sicherstellen, dass Git (und eben Neovim) installiert sind.
~/.config/nvim/init.lua
local lazypath = vim.fn.stdpath('data')..'/lazy/lazy.nvim' -- Zielpfad definieren vim.opt.rtp:prepend(lazypath) -- Zielpfad voranstellen -- Falls lazy.nvim nicht installiert ist ... if not vim.loop.fs_stat(lazypath) then vim.fn.system({'git', 'clone', '--branch=stable', '--filter=blob:none', 'https://github.com/folke/lazy.nvim.git', lazypath }) end
Damit wird der Pluginmanager initial installiert falls er nicht vorhanden sein sollte. Will man auch noch das letzte bisschen Performance rauskitzeln, so kann man die if not
-Abfrage ersatzlos entfernen, nachdem lazy.nvim installiert wurde, die Konfiguration ist dann allerdings nicht mehr komplett portabel, da Neovim ein installiertes lazy.nvim voraussetzt.
Konfiguration
Nachdem lazy.nvim installiert wurde, muss es einmalig geladen werden. Hier bietet sich gleich an, die Plugins im Verzeichnis ~/.config/nvim/plugins
zu verwalten. In diesem Verzeichnis liegende Lua-Dateien werden durch den Pluginmanager als Pluginkonfigurationsdateien interpretiert und geladen.
require('lazy').setup('plugins')
Sofern im Verzeichnis ~/.config/nvim/plugins
keine Dateien liegen, kommt es zu einer Fehlermeldung über nicht gefundene Spezifikationen für das Modul plugins
.
Plugin-Installation (Syntaxhighlighting)
Zuerst sollte also ein Plugin geladen werden. Hier bietet sich das Treesitter-Plugin an, um über den integrierten Parser Tree-sitter semantisches Syntaxhighlighting zu erhalten.
~/.config/nvim/plugins
return { 'nvim-treesitter/nvim-treesitter', build = ':TSUpdate', event = { 'BufRead' }, main = 'nvim-treesitter.configs', opts = { indent = { enable = true }, highlight = { enable=true }, auto_install = true, } }
Darüber wird das Treesitter-Plugin geladen. Der erste Eintrag im Table definiert,m von wo das Plugin geladen wird. Wenn die Angabe im Schema author/pluginname
ist, wird Versucht, das Plugin von GitHub zu laden. Bei Angabe eines vollständigen URLs von eben jenem URL. Wenn man dir = '/pfad/zum/plugin'
benutzt, wird das Plugin ohne Download direkt vom angegebenen Pfad geladen.
Wenn Neovim nun gestartet wird, erkennt der Pluginmanager automatisch die Plugindatei und lädt das entsprechende Plugin herunter. Verlassen wird der Dialog mit Q. Man kann den Dialog jederzeit mittels :Lazy
öffnen. Die Einzelnen Dialogreiter werden mittels ⇧ Shift+H, I, U, etc. aufgerufen und stellen diverse Informationen und Aktionen bereit.
Es wird beim öffnen anderer Dateien nun zudem automatisch geprüft, ob Tree-sitter die Syntax der Datei erkennt, und wenn ja – und wenn noch nicht geschehen – werden automatisch die Syntaxhighlightinginformationen heruntergeladen und angewendet.
Colorscheme-Installation (Theme)
Das Standard-Theme von Neovim ist sehr minimalistisch. Es wird dank des nvim-treesitter
-Plugins dieses zwar richtig angewendet, aber es wird nur wenig farblich unterschieden. Im Internet lassen sich viele Colorschemes finden, die sich einfach als Plugin installieren lassen, und mittels lazy.nvim aktiviert werden können.
Es wird empfohlen, das Colorscheme sofort zu laden, und dies auch mit hoher Priorität zu tun, so dass das Colorscheme auf jeden Fall geladen ist, bevor der Pluginmanager irgendetwas anderes lädt oder Neovim mit der Anzeige beginnt.
return { 'sainnhe/everforest', -- Repository lazy = false, -- Colorscheme sofort laden priority = 1000, -- Mit hoher Priorität laden config = function () vim.opt.background = 'light' -- Hellen Hintergrund definieren vim.g.everforest_background = 'soft' -- Hintergrundvariante bestimmen vim.cmd.colorscheme('everforest') -- Das Colorscheme setzen end }
Hier wird das Colorscheme everforest in einer hellen Variante mit sanftem Hintergrund geladen. Colorschemes können – wie alle anderen Plugins – verschiedene Konfigurationsoptionen besitzen, die in den jeweiligen Readmes zu finden sind.