feat: add nvimdots
This commit is contained in:
7
nvim/nixos/default.nix
Normal file
7
nvim/nixos/default.nix
Normal file
@@ -0,0 +1,7 @@
|
||||
# NOTE: to add more language support, make a directory under `nixos`, followed by the language name and `default.nix`. See `dotnet/default.nix` for example.
|
||||
{
|
||||
imports = [
|
||||
./dotnet
|
||||
./neovim
|
||||
];
|
||||
}
|
||||
43
nvim/nixos/dotnet/default.nix
Normal file
43
nvim/nixos/dotnet/default.nix
Normal file
@@ -0,0 +1,43 @@
|
||||
# This module provides DOTNET_ROOT, with a different way to install dotnet locally.
|
||||
# This module is modified from the NixOS module `programs.dotnet`
|
||||
|
||||
{ config, lib, pkgs, ... }:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.programs.dotnet.dev;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
programs.dotnet.dev = {
|
||||
enable = mkEnableOption "" // {
|
||||
description = ''
|
||||
Install the DotNet runtime and set the
|
||||
{env}`DOTNET_ROOT` variable.
|
||||
'';
|
||||
};
|
||||
environmentVariables = mkOption {
|
||||
type = with types; lazyAttrsOf (oneOf [ str path int float ]);
|
||||
default = { };
|
||||
example = { DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = "0"; };
|
||||
description = ''
|
||||
An attribute set an environment variable for DotNET.
|
||||
'';
|
||||
};
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.dotnet-sdk_7;
|
||||
defaultText = literalExpression "pkgs.dotnet-sdk_7";
|
||||
description = "DotNET package to install.";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
# Please see https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables#dotnet_root-dotnet_rootx86
|
||||
home.sessionVariables = {
|
||||
DOTNET_ROOT = "${cfg.package}";
|
||||
} // cfg.environmentVariables;
|
||||
};
|
||||
}
|
||||
232
nvim/nixos/neovim/default.nix
Normal file
232
nvim/nixos/neovim/default.nix
Normal file
@@ -0,0 +1,232 @@
|
||||
# home-manager module of neovim setup
|
||||
{ config
|
||||
, lib
|
||||
, pkgs
|
||||
, ...
|
||||
}:
|
||||
let
|
||||
cfg = config.programs.neovim.nvimdots;
|
||||
inherit (lib) flip warn const;
|
||||
inherit (lib.attrsets) optionalAttrs;
|
||||
inherit (lib.lists) optionals;
|
||||
inherit (lib.modules) mkIf;
|
||||
inherit (lib.options) mkEnableOption mkOption literalExpression;
|
||||
inherit (lib.strings) concatStringsSep versionOlder versionAtLeast;
|
||||
inherit (lib.types) listOf coercedTo package functionTo;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
programs.neovim = {
|
||||
nvimdots = {
|
||||
enable = mkEnableOption ''
|
||||
Activate "ayamir/nvimdots".
|
||||
Have a look at https://github.com/ayamir/nvimdots for details
|
||||
'';
|
||||
bindLazyLock = mkEnableOption ''
|
||||
Bind lazy-lock.json in your repository to $XDG_CONFIG_HOME/nvim.
|
||||
Very powerful in terms of keeping the environment consistent, but has the following side effects.
|
||||
You cannot update it even if you run the Lazy command, because it binds read-only.
|
||||
You need to remove lazy-lock.json before enabling this option if `mergeLazyLock` is set.
|
||||
'';
|
||||
mergeLazyLock = mkEnableOption ''
|
||||
Merges the managed lazy-lock.json with the existing one under $XDG_CONFIG_HOME/nvim if its hash has changed on activation.
|
||||
Upstream package version changes have high priority.
|
||||
This means changes to lazy-lock.json in the config directory (likely due to installing package) will be preserved.
|
||||
In other words, it achieves environment consistency while remaining adaptable to changes.
|
||||
You need to unlink lazy-lock.json before enabling this option if `bindLazyLock` is set.
|
||||
Please refer to the wiki for details on the behavior.
|
||||
'';
|
||||
setBuildEnv = mkEnableOption ''
|
||||
Sets environment variables that resolve build dependencies as required by `mason.nvim` and `nvim-treesitter`
|
||||
Environment variables are only visible to `nvim` and have no effect on any parent sessions.
|
||||
Required for NixOS.
|
||||
'';
|
||||
withBuildTools = mkEnableOption ''
|
||||
Include basic build tools like `gcc` and `pkg-config`.
|
||||
Required for NixOS.
|
||||
'';
|
||||
withHaskell = mkEnableOption ''
|
||||
Enable the Haskell compiler. Set to `true` to
|
||||
use Haskell plugins.
|
||||
'';
|
||||
extraHaskellPackages = mkOption {
|
||||
type =
|
||||
let
|
||||
fromType = listOf package;
|
||||
in
|
||||
coercedTo fromType
|
||||
(flip warn const ''
|
||||
Assigning a plain list to extraHaskellPackages is deprecated.
|
||||
Please assign a function taking a package set as argument, so
|
||||
extraHaskellPackages = [ pkgs.haskellPackages.xxx ];
|
||||
should become
|
||||
extraHaskellPackages = ps: [ ps.xxx ];
|
||||
'')
|
||||
(functionTo fromType);
|
||||
default = _: [ ];
|
||||
defaultText = literalExpression "ps: [ ]";
|
||||
example = literalExpression "hsPkgs: with hsPkgs; [ mtl ]";
|
||||
description = ''
|
||||
The extra Haskell packages required for your plugins to work.
|
||||
This option accepts a function that takes a Haskell package set as an argument,
|
||||
and selects the required Haskell packages from this package set.
|
||||
See the example for more info.
|
||||
'';
|
||||
};
|
||||
extraDependentPackages = mkOption {
|
||||
type = listOf package;
|
||||
default = [ ];
|
||||
example = literalExpression "[ pkgs.openssl ]";
|
||||
description = "Extra build depends to add `LIBRARY_PATH` and `CPATH`.";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
config =
|
||||
let
|
||||
# Inspired from https://github.com/NixOS/nixpkgs/blob/nixos-unstable/nixos/modules/programs/nix-ld.nix
|
||||
build-dependent-pkgs = builtins.filter (package: !package.meta.unsupported) [
|
||||
# manylinux
|
||||
pkgs.acl
|
||||
pkgs.attr
|
||||
pkgs.bzip2
|
||||
pkgs.curl
|
||||
pkgs.glibc
|
||||
pkgs.libsodium
|
||||
pkgs.libssh
|
||||
pkgs.libxml2
|
||||
pkgs.openssl
|
||||
pkgs.stdenv.cc.cc
|
||||
pkgs.stdenv.cc.cc.lib
|
||||
pkgs.systemd
|
||||
pkgs.util-linux
|
||||
pkgs.xz
|
||||
pkgs.zlib
|
||||
pkgs.zstd
|
||||
# Packages not included in `nix-ld`'s NixOSModule
|
||||
pkgs.glib
|
||||
pkgs.libcxx
|
||||
]
|
||||
++ cfg.extraDependentPackages;
|
||||
|
||||
neovim-build-deps = pkgs.buildEnv {
|
||||
name = "neovim-build-deps";
|
||||
paths = build-dependent-pkgs;
|
||||
extraOutputsToInstall = [ "dev" ];
|
||||
pathsToLink = [ "/lib" "/include" ];
|
||||
ignoreCollisions = true;
|
||||
};
|
||||
|
||||
buildEnv = [
|
||||
''CPATH=''${CPATH:+''${CPATH}:}${neovim-build-deps}/include''
|
||||
''CPLUS_INCLUDE_PATH=''${CPLUS_INCLUDE_PATH:+''${CPLUS_INCLUDE_PATH}:}:${neovim-build-deps}/include/c++/v1''
|
||||
''LD_LIBRARY_PATH=''${LD_LIBRARY_PATH:+''${LD_LIBRARY_PATH}:}${neovim-build-deps}/lib''
|
||||
''LIBRARY_PATH=''${LIBRARY_PATH:+''${LIBRARY_PATH}:}${neovim-build-deps}/lib''
|
||||
''NIX_LD_LIBRARY_PATH=''${NIX_LD_LIBRARY_PATH:+''${NIX_LD_LIBRARY_PATH}:}${neovim-build-deps}/lib''
|
||||
''PKG_CONFIG_PATH=''${PKG_CONFIG_PATH:+''${PKG_CONFIG_PATH}:}${neovim-build-deps}/include/pkgconfig''
|
||||
];
|
||||
in
|
||||
mkIf cfg.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = ! (cfg.bindLazyLock && cfg.mergeLazyLock);
|
||||
message = "bindLazyLock and mergeLazyLock cannot be enabled at the same time.";
|
||||
}
|
||||
];
|
||||
xdg.configFile = {
|
||||
"nvim/init.lua".source = ../../init.lua;
|
||||
"nvim/lua".source = ../../lua;
|
||||
"nvim/snips".source = ../../snips;
|
||||
"nvim/tutor".source = ../../tutor;
|
||||
} // optionalAttrs cfg.bindLazyLock {
|
||||
"nvim/lazy-lock.json".source = ../../lazy-lock.json;
|
||||
} // optionalAttrs cfg.mergeLazyLock {
|
||||
"nvim/lazy-lock.fixed.json" = {
|
||||
source = ../../lazy-lock.json;
|
||||
onChange = ''
|
||||
if [ -f ${config.xdg.configHome}/nvim/lazy-lock.json ]; then
|
||||
tmp=$(mktemp)
|
||||
${pkgs.jq}/bin/jq -r -s '.[0] * .[1]' ${config.xdg.configHome}/nvim/lazy-lock.json ${config.xdg.configFile."nvim/lazy-lock.fixed.json".source} > "''${tmp}" && mv "''${tmp}" ${config.xdg.configHome}/nvim/lazy-lock.json
|
||||
else
|
||||
${pkgs.rsync}/bin/rsync --chmod 644 ${config.xdg.configFile."nvim/lazy-lock.fixed.json".source} ${config.xdg.configHome}/nvim/lazy-lock.json
|
||||
fi
|
||||
'';
|
||||
};
|
||||
};
|
||||
home = {
|
||||
packages = [
|
||||
pkgs.ripgrep
|
||||
];
|
||||
shellAliases = optionalAttrs (cfg.setBuildEnv && (versionOlder config.home.stateVersion "24.05")) {
|
||||
nvim = concatStringsSep " " buildEnv + " nvim";
|
||||
};
|
||||
};
|
||||
programs.neovim = {
|
||||
enable = true;
|
||||
|
||||
withNodeJs = true;
|
||||
withPython3 = true;
|
||||
|
||||
extraPackages = [
|
||||
# Dependent packages used by default plugins
|
||||
pkgs.doq
|
||||
pkgs.tree-sitter
|
||||
]
|
||||
++ optionals cfg.withBuildTools [
|
||||
pkgs.cargo
|
||||
pkgs.clang
|
||||
pkgs.cmake
|
||||
pkgs.gcc
|
||||
pkgs.gnumake
|
||||
pkgs.go
|
||||
pkgs.lua51Packages.luarocks
|
||||
pkgs.ninja
|
||||
pkgs.pkg-config
|
||||
pkgs.yarn
|
||||
]
|
||||
++ optionals cfg.withHaskell [
|
||||
(pkgs.writeShellApplication {
|
||||
name = "stack";
|
||||
text = ''
|
||||
exec "${pkgs.stack}/bin/stack" "--extra-include-dirs=${config.home.profileDirectory}/lib/nvim-depends/include" "--extra-lib-dirs=${config.home.profileDirectory}/lib/nvim-depends/lib" "$@"
|
||||
'';
|
||||
})
|
||||
(pkgs.haskellPackages.ghcWithPackages (ps: cfg.extraHaskellPackages ps))
|
||||
];
|
||||
|
||||
extraPython3Packages = ps: with ps; [
|
||||
docformatter
|
||||
isort
|
||||
pynvim
|
||||
];
|
||||
}
|
||||
// optionalAttrs (versionAtLeast config.home.stateVersion "24.05") {
|
||||
extraWrapperArgs = optionals cfg.setBuildEnv [
|
||||
"--suffix"
|
||||
"CPATH"
|
||||
":"
|
||||
"${neovim-build-deps}/include"
|
||||
"--suffix"
|
||||
"CPLUS_INCLUDE_PATH"
|
||||
":"
|
||||
"${neovim-build-deps}/include/c++/v1"
|
||||
"--suffix"
|
||||
"LD_LIBRARY_PATH"
|
||||
":"
|
||||
"${neovim-build-deps}/lib"
|
||||
"--suffix"
|
||||
"LIBRARY_PATH"
|
||||
":"
|
||||
"${neovim-build-deps}/lib"
|
||||
"--suffix"
|
||||
"PKG_CONFIG_PATH"
|
||||
":"
|
||||
"${neovim-build-deps}/include/pkgconfig"
|
||||
"--suffix"
|
||||
"NIX_LD_LIBRARY_PATH"
|
||||
":"
|
||||
"${neovim-build-deps}/lib"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
34
nvim/nixos/testEnv.nix
Normal file
34
nvim/nixos/testEnv.nix
Normal file
@@ -0,0 +1,34 @@
|
||||
{ inputs, pkgs, ... }:
|
||||
let
|
||||
testSettings = { config, ... }: {
|
||||
warnings = [
|
||||
"home-manager version: ${config.home.version.release}"
|
||||
];
|
||||
home = {
|
||||
username = "hm-user";
|
||||
homeDirectory = "/home/hm-user";
|
||||
stateVersion = config.home.version.release;
|
||||
};
|
||||
xdg.enable = true;
|
||||
programs = {
|
||||
home-manager.enable = true;
|
||||
git.enable = true;
|
||||
neovim = {
|
||||
enable = true;
|
||||
nvimdots = {
|
||||
enable = true;
|
||||
setBuildEnv = true;
|
||||
withBuildTools = true;
|
||||
withHaskell = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
in
|
||||
inputs.home-manager.lib.homeManagerConfiguration {
|
||||
inherit pkgs;
|
||||
modules = [
|
||||
./default.nix
|
||||
testSettings
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user