Ich mag Vim. Das sollte mittlerweile den Menschen die hier mitlesen aufgefallen sein. Bis jetzt lief hier immer ein Vanilla-Vim mit diversen Anpassungen und Plugins. Regelmäßig spühlt es mir Vim-Distributionen und Forks in meine Feeds. Ich schau mir auch regelmäßig LunarVim, SpaceVim und wie sie alle heißen an, bleibe dann aber meistens bei meinem handgebautem
Vim +
vimrc. Nun kam aber was in mein Sichtfeld, was mich dann doch gehooked hat:
NixVim.
0x01 - OVERVIEW
Was genau ist
NixVim?
NixVim ist laut eigenen Aussagen eine NeoVim Distribution, aber im Gegensatz zu ähnlichen Projekten wie
LunarVim oder
SpaceVim baut
NixVim darauf, komplett via Nix-Modules konfigurierbar zu sein. Das heisst NeoVim wird hier nicht als einzelnes Package installiert und per Dotfiles konfiguriert sondern als Modul in der
configuration.nix behandlet wird. Das hat natürlich den großen Vorteil, dass bei einem Systemwechsel oder Neuinstallation einfach seine Vim-Config innerhalb der NixOS Config mitzieht und in kürzester Zeit seinen geliebten und voll konfigurierten Editor vor sich hat.
0x02 - INSTALLATION
Die Installation von
NixVim ist gewohnt einfach. In meinem Fall liegt ein File namens
"nixvim.nix" im Config-Pfad von NixOS, da ich (immer) noch nicht auf Flakes und Homemanager gewechselt bin. Das File selber wird in der
configurations.nix per Import aufgerufen:
CONFIGURATION.NIX
imports = [./modules/nixvim.nix];
Das alleine reicht natürlich noch nicht. Innerhalb der
nixvim.nix passiert das was
NixVim bzw. NeoVim installiert und sich um Plugins, Themes und die Konfiguration kümmert:
nixvim.nix
let
nixvim = import (builtins.fetchGit {
url = "https://github.com/nix-community/nixvim";
});
in
{ imports = [nixvim.nixosModules.nixvim];
programs.nixvim = {
enable = true;
};
}
Nach dem Rebuild und dem aufrufen von
$> nvim läuft *magic* NeoVim.
Yes! - aber es läuft völlig im default. Ich denke keine*r der Vim ernsthaft und regelmäßig benutzt, tut das im default. Was Vim und NeoVim interessant macht, ist die hohe Konfigurierbarkeit durch Plugins. NeoVim selber ist zum einen kompatibel mit Vim-Plugins (VimScript) aber baut auch eine eigene Schnittstelle für Plugins auf die mit NeoVim spezifischen Plugins interagieren kann (in dem Fall in Lua).
0x03 - PLUGINS
Aktuell befinden sich in den nix-packages
~1700 Pakete, die als
vimPlugins.*** gelistet sind. Es sollte also jedes Plugin verfügbar sein, dass ihr braucht. Beim default übernimmt der Plugin-Manager (Pathogen, Pack, Vundle usw.) die Installation und die Verwaltung der Plugins. Der Nachteil daran wird aber schnell sichtbar, wenn man mal sein Vim auf einem anderen System zum laufen bringen will. Nerviges nachinstallieren von Plugins und anderen Modulen, Configs etc. Zum Glück hat sich NixOS und damit auch
NixVim Reproduzierbarkeit auf die Fahnen geschrieben. So können wir in Zukunft alle Plugins und Änderungen über die
nixvim.nix. Eine übersichtliche Liste an Plugins und deren Config-Optionen bietet hier die Dokumentation von
NixVim selber (
LINK). Grundsätzlich folgt die Installation von Plugins folgendem Syntax:
plugins.pluginname.enable = true; - also alles wie gewohnt. Wie ihr eure Plugins strukturiert ist völlig euch überlassen. Meine Plugins hab ich innerhalb der
nixvim.nix wie folgt aufgebaut:
nixvim.nix
programs.nixvim = {
plugins = {
telescope = {
enable = true;
};
alpha = {
enable = true;
theme = "dashboard";
};
};
}
So lassen sich alle Plugins strukturiert verwalten und das ganze noch reproduzierbar in nur einem
nix File.
Nach dem gleichen Schema lauft das auch mit den Einstellungen bzw. den Basic-Einstellungen von NeoVim.
0x04 - CONFIG
Ok. Plugins sind das eine - für grundlegende Einstellungen braucht es aber nicht immer Plugins. Manche Optionen gehören schlicht und ergreifend in die
vimrc bzw. bei NeoVim in die
init.lua. Wenn ich allerdings alles per NixOS Modul konfigurieren will, dann ohne Ausnahme. Also kommen NeoVim-Optionen nicht in ein separates File sondern ebenfalls in die
nixvim.nix. Das ganze funktioniert ähnlich wie bei Plugins. So bringt NeoVim bzw.
NixVim von Haus aus keine Linenumbers mit. Die sind allerdings recht praktisch - gerade in NeoVim:
nixvim.nix
opt = {
number = true;
};
Statt dem
"plugins.{pluginname}.enable" gehen wir hier den weg über
"opt.{optname}.true". So lassen sich Tabs, Cursorline, Splitverhalten, Linenumbers und so weiter konfigurieren. Alles unter der Option
"opt".
Was Vim/NeoVim so mächtig macht ist, die Möglichkeit alles über Keyboardshortcuts zu steuern. Keymappings lassen sich natürlich auch innerhalb der
nixvim.nix steuern.
0x05 - KEYMAPS
Die Keycombos die Vim/NeoVim mit sich bringt, sind nicht immer optimal gewählt und man kommt doch recht schnell an den Punkt, an dem man manche Kombinationen gerne anders mappen möchte. Wie bei den Optionen bisher ist das natürlich auch in
NixVim möglich. Auch hier tauschen wir einfach wieder
plugins.* oder
opt.* gegen
keymaps.*. Keymaps sind ein kleinwenig komplexer und bestehen nicht mehr nur aus onelinern sondern werden per Submodul definiert aber es bleibt verständlich. So kann bspw. ESC darauf gemappt werden, im Normal-Mode das Searchhighlighting von
hlsearch wieder zu deaktivieren:
nixvim.nix
keymaps = [
{
mode = "n";
key = "<ESC>"
action = "<cmd>nohlsearch<CR>";
}
];
mode definiert hier den Modus in dem das Mapping greift, in diesem Fall
n - Normal-Mode, die Option
key verweist auf den Key der benutzt werden soll und
action definiert was passiert, in dem Fall das Aufheben der Markierung des gesuchten Strings. Mit diesen Submodulen sind alle Keycombos möglich die ihr so braucht.
0x06 - FAZIT
Auch wenn sich der Wechsel von Vim zur NeoVim etwas befremdlich anfühlt, lohnt er sich. Sind wahrscheinlich eh nur nostalgische Gedanken die völlig haltlos sind, denn Vim bleibt ja trotzdem die Basis. Der Vorteil an NeoVim ist natürlich die breite Community, die hier mit- und weiterentwickelt aber auch der Wechsel von VimScript zu Lua bringt etwas Geschwindigkeit in Vim. Das ganze jetzt in Verbindung mit der zentralen Konfigurierbarkeit von
NixVim ist ein Traum. Nie wieder nachinstallieren von Plugins oder ähnlichem. Nur Modul laden - fertig.
Happy Hacking!