diff --git a/default.nix b/default.nix index 2cde789..73b854b 100644 --- a/default.nix +++ b/default.nix @@ -1,8 +1,7 @@ -{ - config, - pkgs, - lib, - ... +{ config +, pkgs +, lib +, ... }: with lib; let rust-analyzer = @@ -13,32 +12,33 @@ with lib; let if config.class ? dev then symlinkJoin - { - name = "nvim-fenix"; - paths = [ - (fenix.latest.withComponents [ - "cargo" - "clippy-preview" - "rust-src" - "rust-std" - "rustc" - "rustfmt-preview" - ]) - cargo-watch - ]; - } + { + name = "nvim-fenix"; + paths = [ + (fenix.latest.withComponents [ + "cargo" + "clippy-preview" + "rust-src" + "rust-std" + "rustc" + "rustfmt-preview" + ]) + cargo-watch + ]; + } else symlinkJoin { name = "nvim-rust"; - paths = [rustc cargo rustfmt clippy cargo-watch]; + paths = [ rustc cargo rustfmt clippy cargo-watch ]; }; -in { +in +{ programs.neovim = { # https://github.com/nix-community/home-manager/blob/master/modules/programs/neovim.nix enable = true; vimAlias = true; withNodeJs = true; - extraPackages = with pkgs; [fzf xclip fish]; + extraPackages = with pkgs; [ fzf xclip fish ]; plugins = with pkgs.vimPlugins; [ vim-fugitive git-blame-nvim @@ -87,87 +87,92 @@ in { telescope-undo-nvim oil-nvim ]; - extraLuaConfig = let - # tries to compute a package set required to make package resolution in lua - # via deps["pkg"] work - inherit (builtins) head tail hasAttr getAttr; - pkg = parts: pkgs: let - rem = tail parts; - subset = - if hasAttr (head parts) pkgs - then getAttr (head parts) pkgs - else throw "no attr ${name}"; - in - if rem == [] - then subset - else builtins.addErrorContext "${concatStringsSep "." parts}" (pkg rem subset); - getPkg = name: let parts = builtins.split "\\." name; in pkg parts pkgs; - packages = file: let - out = builtins.readFile (pkgs.runCommandLocal "extract-deps" - { - nativeBuildInputs = [pkgs.gnused]; - __contentAddressed = true; - } '' - sed -nr 's/.*(deps\["(.*)_path"\]).*/\2/p' ${file} | uniq > $out - ''); - names = lib.splitString "\n" out; - in - filter (name: name != "") names; - paths = - (listToAttrs (map - (name: { - inherit name; - value = getPkg name; - }) - (packages "${confDir}/*.lua"))) - // { - lldb = pkgs.lldb; - rust_analyzer = rust-analyzer; - typst_lsp = pkgs.typst-lsp; - inherit (pkgs.python3Packages) python-lsp-server; - inherit (pkgs.luajitPackages) lua-lsp; - inherit (pkgs.nodePackages) typescript-language-server bash-language-server; + extraLuaConfig = + let + # tries to compute a package set required to make package resolution in lua + # via deps["pkg"] work + inherit (builtins) head tail hasAttr getAttr; + pkg = parts: pkgs: + let + rem = tail parts; + subset = + if hasAttr (head parts) pkgs + then getAttr (head parts) pkgs + else throw "no attr ${name}"; + in + if rem == [ ] + then subset + else builtins.addErrorContext "${concatStringsSep "." parts}" (pkg rem subset); + getPkg = name: let parts = builtins.split "\\." name; in pkg parts pkgs; + packages = file: + let + out = builtins.readFile (pkgs.runCommandLocal "extract-deps" + { + nativeBuildInputs = [ pkgs.gnused ]; + __contentAddressed = true; + } '' + sed -nr 's/.*(deps\["(.*)_path"\]).*/\2/p' ${file} | uniq > $out + ''); + names = lib.splitString "\n" out; + in + filter (name: name != "") names; + paths = + (listToAttrs (map + (name: { + inherit name; + value = getPkg name; + }) + (packages "${confDir}/*.lua"))) + // { + lldb = pkgs.lldb; + rust_analyzer = rust-analyzer; + typst_lsp = pkgs.typst-lsp; + inherit (pkgs.python3Packages) python-lsp-server; + inherit (pkgs.luajitPackages) lua-lsp; + inherit (pkgs.nodePackages) typescript-language-server bash-language-server; + }; + pathsLua = pkgs.writeTextFile { + name = "nvim-deps.lua"; + text = '' + deps = {} + ${concatStringsSep "\n " (mapAttrsToList (name: path: ''deps["${name}_path"] = "${path}"'') paths)} + return deps + ''; }; - pathsLua = pkgs.writeTextFile { - name = "nvim-deps.lua"; - text = '' - deps = {} - ${concatStringsSep "\n " (mapAttrsToList (name: path: ''deps["${name}_path"] = "${path}"'') paths)} - return deps - ''; - }; - confDir = lib.sourceFilesBySuffices ./. ["lua" "vim"]; - in + confDir = lib.sourceFilesBySuffices ./. [ "lua" "vim" ]; + in with lib; '' vim.cmd [[source ${confDir}/init.vim]] package.path = package.path .. ";${confDir}/?.lua;${pathsLua};" dofile("${confDir}/init.lua") ''; }; - programs.git.ignores = [".nvim_session"]; - xdg.configFile."nvim/coc-settings.json".text = let - preferProjectEnv = binName: alternate: - pkgs.writeShellScript "${binName}-switcher" '' - if command -v ${binName}; then - ${binName} ''${@} - else - ${alternate} ''${@} - fi - ''; - addSDK = { - name, - lsp, - sdk, - }: - with pkgs; - runCommandLocal name - { - nativeBuildInputs = [makeWrapper]; - } '' - makeWrapper ${lsp} $out \ - --prefix PATH : ${lib.makeBinPath sdk} + programs.git.ignores = [ ".nvim_session" ]; + xdg.configFile."nvim/coc-settings.json".text = + let + preferProjectEnv = binName: alternate: + pkgs.writeShellScript "${binName}-switcher" '' + if command -v ${binName}; then + ${binName} ''${@} + else + ${alternate} ''${@} + fi ''; - in + addSDK = + { name + , lsp + , sdk + , + }: + with pkgs; + runCommandLocal name + { + nativeBuildInputs = [ makeWrapper ]; + } '' + makeWrapper ${lsp} $out \ + --prefix PATH : ${lib.makeBinPath sdk} + ''; + in builtins.toJSON { python = { pythonPath = preferProjectEnv "python3" (pkgs.python3 + "/bin/python3"); @@ -189,55 +194,55 @@ in { fullFunctionSignatures.enable = true; # https://github.com/rust-lang/rust-analyzer/pull/15582 snippets = { "return Err(..)" = { - postfix = ["reterr"]; + postfix = [ "reterr" ]; body = ''return Err($${receiver});''; description = "return expression as Err"; scope = "expr"; }; "format!(..)" = { - postfix = ["fmt"]; + postfix = [ "fmt" ]; body = ''format!($${receiver})''; description = "use receiver as format string"; scope = "expr"; }; "wrap { .. }" = { - postfix = ["brace" "wrap"]; + postfix = [ "brace" "wrap" ]; body = ''{$${receiver}}''; description = "wrap this type in { .. }"; scope = "expr"; }; "async move { .. }" = { - postfix = ["asyncm"]; + postfix = [ "asyncm" ]; body = ''async move {$${receiver}}''; description = "wrap this type in async move { .. }"; scope = "expr"; }; "try { .. }" = { - postfix = ["try"]; + postfix = [ "try" ]; body = ''let result: Result<_,_> = try {$${receiver}};''; description = "wrap this type in try { .. }"; scope = "expr"; }; "while let Some(item) = { .. } {}" = { - postfix = ["letwhile"]; + postfix = [ "letwhile" ]; body = ''while let Some(item) = $${receiver} {}''; description = "wrap this type in while let Some"; scope = "expr"; }; "let $x = $x.clone()" = { - postfix = ["cloned"]; + postfix = [ "cloned" ]; body = ''let $${receiver} = $${receiver}.clone();''; description = "clone a variable into a new binding"; scope = "expr"; }; "let $x = $x.into()" = { - postfix = ["into"]; + postfix = [ "into" ]; body = ''let $${receiver} = $${receiver}.clone();''; description = "call into() and create a new binding"; scope = "expr"; }; "assert_eq!($x, .. );" = { - postfix = ["asseq"]; + postfix = [ "asseq" ]; body = ''assert_eq!($${receiver}, );''; description = "create an assertion for the expression"; scope = "expr"; @@ -251,7 +256,7 @@ in { serverPath = addSDK { name = "rust-env"; lsp = "${rust-analyzer}/bin/rust-analyzer"; - sdk = [rust-sdk]; + sdk = [ rust-sdk ]; }; imports.group.enable = true; inlayHints = { @@ -274,7 +279,7 @@ in { enable = true; experimental.enable = true; }; - files.excludeDirs = ["result" "target"]; + files.excludeDirs = [ "result" "target" ]; extraEnv = { RA_LOG = "debug"; }; @@ -282,14 +287,14 @@ in { languageserver = { ccls = { command = preferProjectEnv "ccls" "${pkgs.ccls}/bin/ccls"; - filetypes = ["c" "cc" "cpp" "c++" "objc" "objcpp"]; - rootPatterns = [".ccls" "compile_commands.json" ".git/" ".hg/"]; + filetypes = [ "c" "cc" "cpp" "c++" "objc" "objcpp" ]; + rootPatterns = [ ".ccls" "compile_commands.json" ".git/" ".hg/" ]; initializationOptions = { cache = { directory = "${config.xdg.cacheHome}/ccls"; }; }; - clang.extraOptions = ["-std=c++20"]; + clang.extraOptions = [ "-std=c++20" ]; }; nix = { command = "${pkgs.nil}/bin/nil"; @@ -299,15 +304,15 @@ in { autoEvalInputs = true; }; maxMemoryMB = 1024 * 4; - rootPatterns = ["flake.nix"]; - filetypes = ["nix"]; + rootPatterns = [ "flake.nix" ]; + filetypes = [ "nix" ]; }; diagnostic-languageserver = { filetypes = { - sh = ["${pkgs.shellcheck}/bin/shellcheck"]; + sh = [ "${pkgs.shellcheck}/bin/shellcheck" ]; }; }; - cSpell = {diagnosticLevel = "hint";}; + cSpell = { diagnosticLevel = "hint"; }; }; }; home.sessionVariables = rec {