EN

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 ftsteht 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.

Artikel vom 23. August 2024.
Zuletzt bearbeitet: 9. November 2024