np is a NixVim (Neovim) configuration focused on development specific
distribution of the Nvim. The goals is to create configs per project
for extra ease of development using Nvim -- without messing up the Nvim configurations.
The base of np is carefuly configured nvim that's easy to use regardless
of the languages you work with. I can't say it is like LazyVim, but I can
say it is inspired from it (while many design decisions violate LazyVim philosphy).
Thanks to Nvim, NixVim, Nix, LazyVim and many all plugin authors.
This project is a movement towards my concept of POD. See POD.
To try np without setting up a project, run the base configuration:
nix run .#npThis launches Neovim with the full np. Screenshots.
np provides a base NixVim configuration as a module. To configure a NixVim
project per project, follow this pattern:
- Create
nix/nixvim.nixin your project for tailoring options:
{ np, ... }:
{
imports = [ np.nixvimModules.base ];
# Your project-specific NixVim module overrides
plugins = {
# Add or override plugins here
lsp.servers.yourLanguage.enable = true;
};
# Other nixvim options to tailor for your project
}-
In your project's
flake.nix, build and include the tailored Neovim as a dependency.npis built on NixOS unstable pkgs and NixOS 25.11. Usemain/nixos-25.11branches accordingly.{ inputs = { # np requires nixpkgs-unstable. nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixvim.url = "github:nix-community/nixvim"; np.url = "github:ar-at-localhost/np"; # or local path }; outputs = { self, nixpkgs, nixvim, np, ... }: let system = "x86_64-linux"; # adjust for your system # Use legacyPackages from nixpkgs-unstable. pkgs = nixpkgs.legacyPackages.${system}; in { devShells.${system}.default = pkgs.mkShell { packages = [ # Other development packages... # Make nixvim with our unstable pkgs and the project-specific module. (nixvim.legacyPackages.${system}.makeNixvimWithModule { inherit pkgs; module = ./nix/nixvim.nix; extraSpecialArgs = { inherit (pkgs) stdenv; }; }) ]; }; }; }
This pattern keeps your project configuration organized and allows Nix to merge
the base np module with your project-specific overrides, creating a tailored
Neovim instance per project.
np provides two categories of optional modules:
- Langs: Language-specific support (LSP, formatters, tree-sitter)
- Xtras: Tool and feature extensions
{ np, ... }:
{
imports = [
np.nixvimModules.base
np.nixvimModules.langs.python # Python LSP, formatters, tree-sitter
np.nixvimModules.langs.rust # Rust LSP and tree-sitter
np.nixvimModules.xtras.orgmode # Orgmode support
];
# Your project-specific overrides
plugins.lsp.servers.nil_ls.enable = false; # Example override
}You can also import all presets or xtras at once:
{ np, ... }:
{
imports = [
np.nixvimModules.base
np.nixvimModules.langs.all # All language modules
np.nixvimModules.xtras.all # All xtras
];
}Langs (language support):
cpp(C/C++ with clangd),docker(Docker with dockerls),dotnet(.NET),javascript(JS/TS with biome/eslint),make,mjml,python,rust,sql,web(full web stack),xml
Xtras (tools/features):
orgmode- Orgmode support with org-bullets, org-modern, and headlines
Which language(s) support is configured out of the box?
Answer: Nix, Markdown, TOML/YAML, Bash, and Lua.
Which languages are supported?
Answer: Many languages are supported via opt-in modules. See langs for available options.
See Roadmap.