[~] BACK



~~ NIXVIM ~~

** VIM ABER VIA NIX **

[VIM] | [20241112] | [0] | [0x17]





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!


[~] BACK