Neovim Nightly on NixOS with Home-Manager and Plugins from Git

I recently switched to NixOS with Home-Manager and wanted to try out Neovim Nightly aka Neovim 5.0.
What is different on my setup? I will show you how to ditch all Plugin-Managers out there and use one Nix function to fetch all Neovim plugins from git. It will also keep them up-to-date everytime you rebuild your system.

I assume you already have Home-Manager installed on your system. Install Neovim Nightly:

nixpkgs.overlays = [
  (import (builtins.fetchTarball {
    url =;

programs.neovim = {
  enable = true;
  package = pkgs.neovim-nightly;

Below is an example configuration of my custom Plugin-Manager.
I tried adding comments to every important line.
The function pluginGit creates a Nix Vim plugin with a builtin function called buildVimPluginFrom2Nix. This function is a wrapper for almost every Vim plugin that you will find in the official NixPkgs.
The downside of using the package from NixPkgs is, that your plugins only update when the package updates. Usually Vim Plugin-Managers always fetch the plugins from git, unless you specified a commit.
This is also possible with my function. The first parameter is a commit, tag or branch. The plugin function is a wrapper around pluginGit, which defaults to HEAD. This will always point to the latest commit on the Repo.

{ config, pkgs, lib, vimUtils, ... }:
  # installs a vim plugin from git with a given tag / branch
  pluginGit = ref: repo: vimUtils.buildVimPluginFrom2Nix {
    pname = "${lib.strings.sanitizeDerivationName repo}";
    version = ref;
    src = builtins.fetchGit {
      url = "${repo}.git";
      ref = ref;

  # always installs latest version
  plugin = pluginGit "HEAD";
in {
  programs.neovim = {
    enable = true;
    package = pkgs.neovim-nightly;

    # read in the vim config from filesystem
    # this enables syntaxhighlighting when editing those
    extraConfig = builtins.concatStringsSep "\n" [
      (lib.strings.fileContents ./base.vim)
      (lib.strings.fileContents ./plugins.vim)
      (lib.strings.fileContents ./lsp.vim)

      # this allows you to add lua config files
        lua << EOF
        ${lib.strings.fileContents ./config.lua}
        ${lib.strings.fileContents ./lsp.lua}

    # install needed binaries here
    extraPackages = with pkgs; [
      # used to compile tree-sitter grammar

      # installs different langauge servers for neovim-lsp
      # have a look on the link below to figure out the ones for your languages
      nodePackages.typescript nodePackages.typescript-language-server
    plugins = with pkgs.vimPlugins; [
      # you can use plugins from the pkgs

      # or you can use our function to directly fetch plugins from git
      (plugin "neovim/nvim-lspconfig")
      (plugin "hrsh7th/nvim-compe") # completion
      (plugin "Raimondi/delimitMate") # auto bracket

      # this installs the plugin from 'lua' branch
      (pluginGit "lua" "lukas-reineke/indent-blankline.nvim")

      # syntax highlighting
      (plugin "nvim-treesitter/nvim-treesitter")
      (plugin "p00f/nvim-ts-rainbow") # bracket highlighting

Let me know what you think in the comments below! I am open for new enhancements :)