Frequently Asked Questions

How do I use a plugin not implemented in nixvim

Using a plugin not supported by nixvim, but packaged in nixpkgs is straightforward:

  • Register the plugin through extraPlugins: extraPlugins = [pkgs.vimPlugins."<plugin name>"].
  • Configure the plugin through extraConfigLua: extraConfigLua = "require('my-plugin').setup({foo = "bar"})";

How do I use a plugin not packaged in nixpkgs

This is straightforward too, you can add the following to extraPlugins for a plugin hosted on GitHub:

extraPlugins = [(pkgs.vimUtils.buildVimPlugin {
    name = "my-plugin";
    src = pkgs.fetchFromGitHub {
        owner = "<owner>";
        repo = "<repo>";
        rev = "<commit hash>";
        hash = "<nix NAR hash>";
    };
})];

The nixpkgs manual has more information on this.

How do I solve "<name> cannot be found in pkgs"

When using Nixvim, it is possible to encounter errors about something not being found in pkgs. For example:

 … while evaluating the attribute 'optionalValue.value'

   at /nix/store/XXX-source/lib/modules.nix:868:5:
    867|
    868|     optionalValue =
       |     ^
    869|       if isDefined then { value = mergedValue; }

 … while evaluating a branch condition

   at /nix/store/XXX-source/lib/modules.nix:869:7:
    868|     optionalValue =
    869|       if isDefined then { value = mergedValue; }
       |       ^
    870|       else {};

 … while evaluating the option `plugins.<name>.package':

 (stack trace truncated; use '--show-trace' to show the full, detailed trace)

 error: <name> cannot be found in pkgs

This usually means one of two things:

  • The nixpkgs version is not in line with NixVim (for example nixpkgs nixos-24.05 is used with NixVim master)
  • The nixpkgs unstable version used with NixVim is not recent enough.

When building nixvim using flakes and our "standalone mode", we usually recommend not declaring a "follows" for inputs.nixvim. This is so that nixvim is built against the same nixpkgs revision we're using in our test suite.

If you are building nixvim using the NixOS, home-manager, or nix-darwin modules then we advise that you keep your nixpkgs lock as close as possible to ours.

tip

Once #1784 is implemented, there will be alternative ways to achieve this using the module system.

How do I create multiple aliases for a single keymap

You could use the builtin map function (or similar) to do something like this:

keymaps =
  (builtins.map (key: {
    inherit key;
    action = "<some-action>";
    options.desc = "My cool keymapping";
  }) ["<key-1>" "<key-2>" "<key-3>"])
  ++ [
    # Other keymaps...
  ];

This maps a list of keys into a list of similar keymaps. It is equivalent to:

keymaps = [
  {
    key = "<key-1>";
    action = "<some-action>";
    options.desc = "My cool keymapping";
  }
  {
    key = "<key-2>";
    action = "<some-action>";
    options.desc = "My cool keymapping";
  }
  {
    key = "<key-3>";
    action = "<some-action>";
    options.desc = "My cool keymapping";
  }
  # Other keymaps...
];

How to use system provided binaries instead of nixvim provided ones

There are a number of plugins that install extra packages using nix, but this can cause issues. For example enabling plugins.treesitter could add gcc to the PATH of neovim, and this could break workflows that rely on the system provided compiler.

Most plugins that install packages also provide a xxxPackage option that can be set to null to skip the installation of the package. For example plugin.treesitter provides the gccPackage option.