Neovim Verzeichnisstruktur
Neovim legt eine Verzeichnisstruktur fest, in der jeder Ordner einem bestimmten Zweck dient. Die Inhalte einiger Verzeichnisse werden automatisch eingebunden und folgen dabei einer festgelegten Reihenfolge. Hier werde ich nur auf die Verzeichnisse eingehen, die für die meisten Anwender relevant sind.
Dateien beim Programmstart laden
Traditionell wurde Vim durch die automatische Ausführung der .vimrc
-Datei beim Start initialisiert. Neovim folgt der
XDG-Spezifikation, nach der das Konfigurationsverzeichnis über die XDG_CONFIG_HOME
-Umgebungsvariable festgelegt wird. Vor Version 0.5 bedeutete dies für die meisten Benutzer, dass ~/.vimrc
durch ~/.config/nvim/init.vim
ersetzt wurde.
Seit Lua als Alternative zu Vimscript eingeführt wurde, lässt sich Neovim auch über init.lua
initialisieren. Dabei schließen sich init.lua
und init.vim
wechselseitig aus. Sind beide Dateien im Neovim-Konfigurationsverzeichnis vorhanden, wird beim Start eine Fehlermeldung (Conflicting configs
) angezeigt. Im Folgenden gehe ich davon aus, dass die Konfiguration mit Lua erfolgt, und lasse init.vim
sowie Vimscript-spezifische Aspekte außen vor.
Wer seine Einstellungen einfach halten möchte, kann sie alle in init.lua
unterbringen. Um jedoch von fortgeschrittenen Funktionen zu profitieren und die Übersichtlichkeit zu wahren, sollten Konfigurationen auf mehrere Dateien und Verzeichnisse aufgeteilt werden.
In vielen YouTube-Guides und Blog-Artikeln wird das lua/
-Unterverzeichnis Ort für erweiterte Konfigurationen empfohlen. Neovim bietet jedoch weitere Unterverzeichnisse, deren Skripte (ähnlich wie init.lua
) automatisch und in einer festgelegten Reihenfolge beim Start ausgeführt werden. Die Verzeichnisstruktur bestimmt, zu welchem Zeitpunkt der Initialisierung die jeweiligen Konfigurationsdateien ausgeführt werden.
Im Folgenden beschränke ich mich auf Ordner, deren Inhalte ausgeführt werden sollen. Daneben können im Unterverzeichnis autoload/
Helper-Funktionen und Bibliotheken abgelegt werden, die nur geladen, jedoch erst bei Bedarf aufgerufen werden. Das Laden dieser Dateien erfolgt unmittelbar nach Ausführung der init.lua
.
plugin/
und after/plugin/
Nach init.lua
werden die Skripte im plugin/
-Unterverzeichnis aufgerufen. Es ist deshalb ein guter Ort, um allgemeine Konfigurationen wie Tastenzuordnungen, Colorschemes oder Anzeigeoptionen (z.B. Zeilennummern) unterzubringen. Wenn man sehr viele solche Einstellungen vornimmt, lassen sie sich auf verschiedene Dateien aufteilen (wie etwa options.lua
oder keymaps.lua
).
In einigen Artikeln wird plugin/
primär für Vimscript-Skripte empfohlen. In der offiziellen Dokumentation konnte ich dafür jedoch keine Hinweise finden. Meines Wissens spricht nichts dagegen, in diesem Verzeichnis auch Lua-Skripte abzulegen.
Das after/plugin/
-Unterverzeichnis dient dazu, das Standardverhalten bestehender Plugins zu modifizieren, ohne deren Quellcode zu verändern. Hier geht es insbesondere um Plugins wie Telescope, NERDTree oder Comment – also Anwendungen, die viele Benutzer unter “Plugins” verstehen. Ein realistisches Beispiel sind Tastenbelegungen: Wenn ein Plugin Standard-Keymappings vorgibt, können diese durch eigene Zuweisungen in einer Datei in after/plugin/
überschrieben werden.
Als gute Praxis bietet es sich an, für jedes verwendete Plugin eine separate Konfigurationsdatei in after/plugin/
zu erstellen.
ftplugin/
und after/ftplugin/
Mit den Skripten in diesen Unterverzeichnissen verhält es sich ähnlich wie mit plugin/
bzw. after/plugin/
, jedoch mit dem Unterschied, dass die vorgenommenen Anpassungen nur für bestimmte Dateitypen gelten (das Präfix ft
steht hier für file type). Damit die Änderungen wirksam werden, muss der Name des Skripts dem gewünschten Dateityp entsprechen, z.B. python.lua
oder lua.lua
.
Ein häufiges Beispiel ist die Konfiguration der Tab-Darstellung, die je nach Sprache unterschiedlich gehandhabt wird. So verlangen die Style-Guides in Python meist vier Leerzeichen pro Tab, während Nix oft nur zwei verwendet. Auch Tastenbelegungen können auf diese Weise sprachspezifisch konfiguriert werden.
Das lua
-Unterverzeichnis
Das lua
-Unterverzeichnis ermöglicht es, die Neovim-Konfiguration modular und flexibel aufzubauen. Falls die Skripte dieses Verzeichnisses aufgerufen werden, geschieht das nach den bisher besprochenen automatischen Aufrufen. Damit sie beim Programmstart ausgeführt werden, muss jedoch ein require(<dateiname>)
in der init.lua
erfolgen.
Ein Beispiel: Mit require(plugins)
wird die Datei lua/plugins.lua
ausgeführt. Dateien in Unterverzeichnissen können entweder per Punkt- oder Slash-Notation eingebunden werden: require(kai.plugins)
und require(kai/plugins)
sind äquivalent und rufen lua/kai/plugins.lua
auf.
Durch eine init.lua
in einem Unterverzeichnis können komfortabel alle darin erstellten Dateien ausgeführt werden. Enthält lua/kai/
eine init.lua
, kann man durch require(kai)
in der obersten init.lua
alle darin festgelegten Konfigurationen laden.
Diese Struktur erleichtert es auch, Profile zu erstellen. Daher tragen die Unterverzeichnisse unter lua/
in vielen Guides im Sinne von Benutzerprofilen den Namen des Anwenders. Durch das Anlegen direkter Unterverzeichnisse (wie lua/kai/
) kann man verschiedene Konfigurationen einfach verwalten und bei Bedarf zwischen Profilen wechseln.