neovim-flake Manual


Preface
1. Try it out
1.1. Nix
1.2. Tidal
1.3. Maximal
1.4. Using Prebuilt Configs
2. Default Configs
2.1. Tidal Cycles
2.2. Nix
2.3. Maximal
3. Custom Configuration
4. Custom Plugins
4.1. New Method
4.2. Old Method
5. Custom Neovim Package
6. Home Manager
7. Language Support
7.1. LSP Custom Packages/Command
A. Configuration Options
B. Release Notes
B.1. Release 0.1
B.1.1. Changelog
B.2. Release 0.2
B.2.1. Changelog
B.3. Release 0.3
B.3.1. Changelog
B.4. Release 0.4
B.4.1. Changelog

Preface

If your problem is caused by a bug in neovim-flake then it should be reported on the neovim-flake issue tracker. Alongside bug reports, feature requests are also welcome over neovim-flake pull requests.

Chapter 1. Try it out

$ cachix use neovim-flake # Optional: it'll save you CPU resources and time
$ nix run github:notashelf/neovim-flake # will run the default configuration

1.1. Nix

By default LSP support for Nix is enabled alongside all complementary Neovim plugins. By running nix run ., which is the default package, you will build Neovim with this config.

1.2. Tidal

Tidal is an alternative config that adds vim-tidal on top of the plugins from the Nix configuration.

1.3. Maximal

Maximal is the ultimate configuration that will enable basically everything. Keep in mind, however, that this will pull a lot of dependencies.

You are strongly recommended to use the binary cache if you would like to try the Maximal configuration.

1.4. Using Prebuilt Configs

$ nix run github:notashelf/neovim-flake#nix
$ nix run github:notashelf/neovim-flake#tidal
$ nix run github:notashelf/neovim-flake#maximal

Chapter 2. Default Configs

While you can configure neovim-flake yourself using the builder, here are a few default configurations you can use.

2.1. Tidal Cycles

$ nix run github:notashelf/neovim-flake#tidal file.tidal

Utilizing vim-tidal and mitchmindtree’s fantastic tidalcycles.nix start playing with tidal cycles in a single command.

In your tidal file, type a cycle e.g. d1 $ s "drum" and then press ctrl+enter. Super collider with superdirt, and a modified GHCI with tidal will start up and begin playing. Note, you need jack enabled on your system. If you are using pipewire, its as easy as setting services.pipewire.jack.enable = true.

2.2. Nix

$ nix run github:notashelf/neovim-flake#nix test.nix

Enables all the of neovim plugins, with language support for specifically Nix. This lets you see what a fully configured neovim setup looks like without downloading a whole bunch of language servers and associated tools.

2.3. Maximal

$ nix shell github:notashelf/neovim-flake#maximal test.nix

It is the same fully configured neovim as with the Nix config, but with every supported language enabled.

Note

Running the maximal config will download a lot of packages as it is downloading language servers, formatters, and more.

Chapter 3. Custom Configuration

Custom configuration is done with the neovimConfiguration function. It takes in the configuration as a module. The output of the configuration function is an attrset.

{
  options = "The options that were available to configure";
  config = "The outputted configuration";
  pkgs = "The package set used to evaluate the module";
  neovim = "The built neovim package";
}

The following is an example of a barebones vim configuration with the default theme enabled.

{
  inputs.neovim-flake = {
    url = "github:notashelf/neovim-flake";
    inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs = {nixpkgs, neovim-flake, ...}: let
    system = "x86_64-linux";
    pkgs = nixpkgs.legacyPackages.${system};
    configModule = {
      # Add any custom options (and feel free to upstream them!)
      # options = ...

      config.vim = {
        theme.enable = true;
      };
    };

    customNeovim = neovim-flake.lib.neovimConfiguration {
      modules = [configModule];
      inherit pkgs;
    };
  in {
    packages.${system}.neovim = customNeovim.neovim;
  };
}

Chapter 4. Custom Plugins

You can use custom plugins, before they are implemented in the flake. To add a plugin, you need to add it to your config’s config.vim.startPlugins array.

4.1. New Method

As of version 0.5, we have a more extensive API for configuring plugins, under vim.extraPlugins.

Instead of using DAGs exposed by the library, you may use the extra plugin module as follows:

{
  config.vim.extraPlugins = with pkgs.vimPlugins; {
    aerial = {
      package = aerial-nvim;
      setup = ''
        require('aerial').setup {
          -- some lua configuration here
        }
      '';
    };

    harpoon = {
      package = harpoon;
      setup = "require('harpoon').setup {}";
      after = ["aerial"];
    };
  };
}

4.2. Old Method

Users who have not yet updated to 0.5, or prefer a more hands-on approach may use the old method where the load orderof the plugins is determined by DAGs.

{
  # fetch plugin source from GitHub and add it to startPlugins
  config.vim.startPlugins = [
    (pkgs.fetchFromGitHub {
      owner = "FrenzyExists";
      repo = "aquarium-vim";
      rev = "d09b1feda1148797aa5ff0dbca8d8e3256d028d5";
      sha256 = "CtyEhCcGxxok6xFQ09feWpdEBIYHH+GIFVOaNZx10Bs=";
    })
  ];
}

However, just making the plugin available might not be enough. In that case, you can write custom vimscript or lua config, using config.vim.configRC or config.vim.luaConfigRC respectively. These options are attribute sets, and you need to give the configuration you’re adding some name, like this:

{
  config.vim.configRC.aquarium = "colorscheme aquiarum";
}

Note: If your configuration needs to be put in a specific place in the config, you can use functions from inputs.neovim-flake.lib.nvim.dag to order it. Refer to https://github.com/nix-community/home-manager/blob/master/modules/lib/dag.nix.

Also, if you successfully made your plugin work, please make a PR to add it to the flake, or open an issue with your findings so that we can make it available for everyone easily.

Chapter 5. Custom Neovim Package

As of v0.5, you may now specify the neovim package that will be wrapped with your configuration. This is done with the vim.package option.

{inputs, pkgs, ...}: {
  # using the neovim-nightly overlay
  config.vim.package = inputs.neovim-overlay.packages.${pkgs.system}.neovim;
}

The neovim-nightly-overlay always exposes an unwrapped package. If using a different source, you are highly recommended to get an "unwrapped" version of the neovim package,similar to neovim-unwrapped in nixpkgs.

Chapter 6. Home Manager

The Home Manager module allows us to customize the different vim options. To use it, we first add the input flake.

{
  neovim-flake = {
    url = github:notashelf/neovim-flake;
    # you can override input nixpkgs
    inputs.nixpkgs.follows = "nixpkgs";
  };
}

Followed by importing the HM module.

{
  imports = [ neovim-flake.homeManagerModules.default ];
}

Then we should be able to use the given module. E.g.

{
  programs.neovim-flake = {

    enable = true;
    # your settings need to go into the settings attrset
    settings = {
      vim.viAlias = false;
      vim.vimAlias = true;
      vim.lsp = {
        enable = true;
      };
    };
  };
}

Chapter 7. Language Support

Language specific support means there is a combination of language specific plugins, treesitter support, nvim-lspconfig language servers, and null-ls integration. This gets you capabilities ranging from autocompletion to formatting to diagnostics. The following languages have sections under the vim.languages attribute. See the configuration docs for details.

Adding support for more languages, and improving support for existing ones are great places where you can contribute with a PR.

7.1. LSP Custom Packages/Command

In any of the opt.languages.<language>.lsp.package options you can provide your own LSP package, or provide the command to launch the language server, as a list of strings.

You can use this to skip automatic installation of a language server, and instead use the one found in your $PATH during runtime, for example:

vim.languages.java = {
        lsp = {
                enable = true;
                package = ["jdt-language-server" "-data" "~/.cache/jdtls/workspace"];
        };
}