Skip to content
冷酔閑吟 edited this page Aug 19, 2023 · 12 revisions

NixOS Support (via home-manager)

This repository contains the nixosModule for home-manager using flakes. No matter which OS you are using, you can use this configuration out of the box, as long as you use home-manager to manage your environment.

Prerequisites

Add the home-manager URL and nvimdots to inputs in the top-level flake.nix. Next, add the following snippets to your configuration.nix and nvimdots.nix. Re-login to your shell after executing nixos-rebuild switch --flake <flake-url> or home-manager switch --flake <flake-url>.

  • flake.nix
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    nvimdots.url = "github:ayamir/nvimdots";
    home-manager = {
      url = "github:nix-community/home-manager";
      nixpkgs.follows = "nixpkgs";
    };
    # ...
  };
  # ...
}
{
  # Other contents...
  programs.nix-ld.enable = true;
  # ...
}
  • nvimdots.nix
    • setBuildEnv: If set, automatically configures your $CPATH, $CPLUG_INCLUDE_PATH, $LD_LIBLARY_PATH, $LIBRARY_PATH, $NIX_LD_LIBRARY_PATH, and $PKG_CONFIG_PATH.
    • withBuildTools: If set, automatically installs some build utils such as gcc and pkg-config.
    • Caveats:
      • setBuildEnv and withBuildTools is only required on NixOS. Q&A for this details
      • These are required tooling so that mason.nvim and nvim-treesitter can work as expected.
      • They bundle with neovim and won't affect other sessions.
{
  programs.neovim.nvimdots = {
    enable = true;
    setBuildEnv = true;  # Only needed for NixOS
    withBuildTools = true; # Only needed for NixOS
  };
}

dotnet installation and environment variables

This repository provides programs.dotnet.dev to manage dotnet installation and environment variables inspired by programs.java in home-manager. See dotnet/default.nix for a list of available options.

programs.dotnet.dev = {
  enabled = true;
  environmentVariables = {
    DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = "0";  # Will set environment variables for DotNET.
  };
}

Customize your experience (Available Options)

Have a look at default.nix (selection) for more information.

FAQ (Frequently Asked Questions)

mason.nvim cannot build some of the packages or execute those installed binaries

This is because some dependencies are not distributed along with the system - NixOS does not conform to the Filesystem Hierarchy Standard (FHS), so some ingenuity is required.

This nixosModules provides several options to simplify dependency resolution. Nevertheless, you may still use programs.neovim.extraPackages, programs.neovim.extraPython3Packages, programs.neovim.extraLuaPackages provided by home-manager.

  • nvimdots.nix
{pkgs, ...}:
{
  programs.neovim.nvimdots = {
    enable = true;
    setBuildEnv = true;
    withBuildTools = true;
    withHaskell = true; # If you want to use Haskell.
    extraHaskellPackages = hsPkgs: []; # Configure packages for Haskell (nixpkgs.haskellPackages).
    extraDependentPackages = with pkgs; [] # Properly setup the directory hierarchy (`lib`, `include`, and `pkgconfig`).
  }
}

How to add dependencies?

You should include the necessary packages for building this dependency, including include, lib, and pkgconfig requirements, in programs.neovim.extraDependentPackages.

  • As an example, for runtime dependencies, add the corresponding dependencies to home.packages or programs.neovim.extraPackages.
  • NOTE: home.packages is effective inside the user scope whereas programs.neovim.extraPackages is effective inside the entire neovim scope. Some languages may also require the use of wrapper, see below example for details.
{ pkgs, ... }:
{
  # Install to the user scope.
  home.packages = with pkgs; [
    go
  ];
  programs.neovim = {
    # Packages only accessible from neovim
    nvimdots = {
      extraDependentPackages = with pkgs; [ icu ];
      # Haskell packages can be easily installed with the `nvimdots` options.
      extraHaskellPackages = hs: with hs; [ ghcup ];
    };
    extraPackages = with pkgs; [
      go

      # Some languages require the use of wrapper.
      rWrapper.override
      {
        packages = with pkgs.rPackages;
          [ xml2 lintr roxygen2 ];
      }
    ];
    # Python and Lua packages can be easily installed with the corresponding `home-manager` options.
    extraPython3Packages = ps: with ps; [
      numpy
    ];
  };
}

Required packages for building mason.nvim's dependent sources (as of 2023/08/19)

This list is incomplete - not all mason.nvim's dependent sources are tracked and included. You can help by adding missing items.

Language extraPackages extraDependentPackages
Go - hunspell
PHP php phpPackages.composer -
R rWrapper.override { packages = with pkgs.rPackages; [ xml2 lintr roxygen2 ]; } -
Vala meson vala vala jsonrpc-glib

How to check for the list of required dependencies (for mason.nvim's packages)

  • For binaries, patchelf --print-needed <binary> will list the required packages.
  • You can also check the information used by ldd in this package and/or dynamiclib with ldd <binary>.
  • You can check the list of dependencies required during build time using the build log (via mason.nvim's UI).
  • If this dependency is included in nixpkgs, you may be able to find the package you need by looking at the *.nix sources.
  • If you want to be on the safe side, here is a list of dependencies for all packages that have already been registered in mason-registry:
libamd     <==> https://github.com/zship/libamd
libc       <==> https://www.gnu.org/software/libc/
  [OR] libc++ <==> https://libcxx.llvm.org/
libevent   <==> https://libevent.org/
libiconv   <==> https://www.gnu.org/software/libiconv/
libmsgpack <==> http://msgpack.org/
libz       <==> https://www.zlib.net/
libzstd    <==> https://github.com/facebook/zstd

What to do if you can't build a package via mason.nvim

If it is provided by nixpkgs, you should be able to use it by adding the following settings. This is the same as setting up other packages that require external installation:

-- Setup lsps that are not supported by `mason.nvim` but supported by `nvim-lspconfig` here.
if vim.fn.executable("dart") == 1 then
	local _opts = require("completion.servers.dartls")
	local final_opts = vim.tbl_deep_extend("keep", _opts, opts)
	nvim_lsp.dartls.setup(final_opts)
end
Clone this wiki locally