From 04f666dabbaced8d661693cfbe4eb7efa359ce7d Mon Sep 17 00:00:00 2001 From: "RingOfStorms (Joshua Bell)" Date: Tue, 28 Oct 2025 23:29:16 -0500 Subject: [PATCH] add neovim full option --- flake.nix | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 155 insertions(+), 8 deletions(-) diff --git a/flake.nix b/flake.nix index 6c23573..279077c 100644 --- a/flake.nix +++ b/flake.nix @@ -188,14 +188,63 @@ (builtins.filter (n: builtins.substring 0 12 n == "nvim_plugin-") (builtins.attrNames inputs)); }); - # All runtime dependencies are now optional and checked lazily by plugins - # This keeps the neovim flake lean and allows project devShells to provide tools + # Minimal runtime dependencies for a lean flake runtimeDependencies = with pkgs; [ ripgrep # search - core to telescope, checked in telescope.lua init fd # file finding - improves telescope performance, checked in telescope.lua init tree-sitter # highlighting ]; + # Core tools to prefer in PATH (prefix) + runtimeDependenciesCore = with pkgs; [ + ripgrep + fd + tree-sitter + fzf + glow + curl + sshfs + ]; + + # Full optional tools (suffix) — linters, formatters, LSPs + runtimeDependenciesFull = with pkgs; [ + # linters + markdownlint-cli + biome + # formatters + stylua + nixfmt-rfc-style + nodePackages.prettier + rustywind + markdownlint-cli2 + sql-formatter + libsForQt5.qt5.qtdeclarative # qmlformat + # LSPs + nil # nix + lua-language-server + vscode-langservers-extracted # HTML/CSS/JSON/ESLint + nodePackages.typescript-language-server + nodePackages.svelte-language-server + tailwindcss-language-server + python312Packages.python-lsp-server + rust-analyzer + marksman # markdown + taplo # toml + yaml-language-server + lemminx # xml + gopls # go + # Other + typescript + nodejs_24 + clang + (pkgs.rust-bin.stable.latest.default.override { + extensions = [ + "rust-src" + "rust-analyzer" + ]; + }) + ]; + in { default = self.packages.${system}.neovim; @@ -214,9 +263,7 @@ generatedWrapperArgs = old.generatedWrapperArgs or [ ] ++ [ - # Add minimal runtime dependencies to neovim path - # Most tools are now optional and checked at runtime - # Project devShells take precedence via --suffix + # Add minimal runtime dependencies to neovim path (suffix for devShell precedence) "--suffix" "PATH" ":" @@ -297,18 +344,118 @@ "ALL_PROXY" ]; }); + + neovimFull = + (pkgs.wrapNeovimUnstable pkgs.neovim-unwrapped ( + pkgs.neovimUtils.makeNeovimConfig { + withPython3 = false; + customRC = '' + lua ${luaNixGlobal} + luafile ${./.}/init.lua + set runtimepath^=${builtins.concatStringsSep "," (builtins.attrValues pkgs.vimPlugins.nvim-treesitter.grammarPlugins)} + ''; + } + )).overrideAttrs + (old: { + generatedWrapperArgs = + old.generatedWrapperArgs or [ ] + ++ [ + # Add core tools, but let local devShell override + "--suffix" + "PATH" + ":" + "${lib.makeBinPath runtimeDependenciesCore}" + ] + ++ [ + # Add full toolchain, but let local devShell tools override + "--suffix" + "PATH" + ":" + "${lib.makeBinPath runtimeDependenciesFull}" + ] + ++ [ + # Set the LAZY env path to the nix store, see init.lua for how it is used + "--set" + "LAZY" + "${lazyPath}" + ] + ++ [ + # Don't use default directories to not collide with another neovim config + "--run" + ''export NVIM_FLAKE_BASE_DIR="''${XDG_STATE_HOME:-$HOME/.local/state}"'' + "--run" + ''export XDG_CONFIG_HOME="$NVIM_FLAKE_BASE_DIR/nvim_ringofstorms_${version}/config"'' + "--run" + ''export XDG_DATA_HOME="$NVIM_FLAKE_BASE_DIR/nvim_ringofstorms_${version}/share"'' + "--run" + ''export XDG_RUNTIME_DIR="$NVIM_FLAKE_BASE_DIR/nvim_ringofstorms_${version}/run"'' + "--run" + ''export XDG_STATE_HOME="$NVIM_FLAKE_BASE_DIR/nvim_ringofstorms_${version}/state"'' + "--run" + ''export XDG_CACHE_HOME="$NVIM_FLAKE_BASE_DIR/nvim_ringofstorms_${version}/cache"'' + "--run" + ''[ ! -d "$XDG_RUNTIME_DIR" ] && mkdir -p "$XDG_RUNTIME_DIR"'' + "--run" + '' + if [ -n "$WAYLAND_DISPLAY" ]; then + if [ ! -S "$XDG_RUNTIME_DIR/wayland-0" ]; then + mkdir -p "$XDG_RUNTIME_DIR" + ln -sf /run/user/$(id -u)/wayland-0 "$XDG_RUNTIME_DIR/wayland-0" + fi + if [ ! -S "$XDG_RUNTIME_DIR/wayland-1" ]; then + mkdir -p "$XDG_RUNTIME_DIR" + ln -sf /run/user/$(id -u)/wayland-1 "$XDG_RUNTIME_DIR/wayland-1" + fi + fi + '' + ] + ++ [ + # Clear proxy environment variables + "--unset" + "http_proxy" + "--unset" + "https_proxy" + "--unset" + "ftp_proxy" + "--unset" + "all_proxy" + "--unset" + "HTTP_PROXY" + "--unset" + "HTTPS_PROXY" + "--unset" + "FTP_PROXY" + "--unset" + "ALL_PROXY" + ]; + }); } ); nixosModules = { default = { pkgs, + lib, + config, ... }: + let + cfg = config."ringofstorms-nvim"; + in { - environment.systemPackages = [ - self.packages.${pkgs.system}.default - ]; + options."ringofstorms-nvim".includeAllRuntimeDependencies = + lib.mkEnableOption "Include all runtime dependencies (LSPs, formatters, linters, tools) in the packaged Neovim PATH."; + + config = { + environment.systemPackages = [ + ( + if cfg.includeAllRuntimeDependencies then + self.packages.${pkgs.system}.neovimFull + else + self.packages.${pkgs.system}.neovim + ) + ]; + }; }; }; };