From 07d2156dfb4620e8e18b4d1244a17b7fde4f91da Mon Sep 17 00:00:00 2001 From: Daniel Winkler Date: Tue, 12 May 2026 15:58:31 +1000 Subject: [PATCH 1/5] fixed R.nvim --- .commandcode/taste/taste.md | 8 ++++++++ flake.nix | 13 ++++++++++--- modules/module/settings/cats.nix | 2 +- modules/module/settings/env.nix | 7 ++++++- modules/module/specs/plugins.nix | 8 +++++++- overlays/r.nix | 28 +++++++++++++++++++++++++++- plugin/21_datascience.lua | 6 ++++++ 7 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 .commandcode/taste/taste.md diff --git a/.commandcode/taste/taste.md b/.commandcode/taste/taste.md new file mode 100644 index 0000000..4b588b2 --- /dev/null +++ b/.commandcode/taste/taste.md @@ -0,0 +1,8 @@ +# nix +- For R.nvim in the Nix wrapper, both RNVIM_COMPLDIR (C server compilation) and a writable R_LIBS_USER directory (nvimcom R package installation) must be configured — fixing only one leaves permission errors in the other. Confidence: 0.65 +- For R.nvim writable directories (RNVIM_COMPLDIR, R_LIBS_USER, TMPDIR), prefer project-local paths (e.g., $PWD/.Rlibs) over global cache paths — the cache approach may let the build succeed but still fail at runtime. Confidence: 0.70 + +# Taste (Continuously Learned by [CommandCode][cmd]) + +[cmd]: https://commandcode.ai/ + diff --git a/flake.nix b/flake.nix index 8482605..be28255 100644 --- a/flake.nix +++ b/flake.nix @@ -46,7 +46,7 @@ nix = true; optional = false; python = false; - r = false; + r = true; }; settings = { lang_packages = { @@ -199,7 +199,8 @@ zk ]; - shellPackages = [nvimPkg] + shellPackages = + [nvimPkg] ++ pkgs.lib.optionals cfg.cats.python pythonPackages ++ pkgs.lib.optionals cfg.cats.r rPackages ++ pkgs.lib.optionals cfg.cats.julia juliaPackages @@ -210,7 +211,13 @@ packages = shellPackages; nativeBuildInputs = with pkgs; [] ++ (pkgs.lib.optionals cfg.cats.optional [devenv]); inputsFrom = []; - shellHook = ""; + shellHook = '' + echo 'I am a NixShell' + export R_HOME=$(R RHOME) + export R_LIBS_SITE=$(strings "$(command -v R)" | grep -oP '/nix/store/[^:]+/library' | sort -u | paste -sd: -) + export R_LIBS_USER="$PWD/.r-libs" + mkdir -p "$R_LIBS_USER" + ''; }; } ); diff --git a/modules/module/settings/cats.nix b/modules/module/settings/cats.nix index 22b3638..3da043e 100644 --- a/modules/module/settings/cats.nix +++ b/modules/module/settings/cats.nix @@ -43,7 +43,7 @@ nix = lib.mkDefault true; optional = lib.mkDefault false; python = lib.mkDefault false; - r = lib.mkDefault false; + r = lib.mkDefault true; test = lib.mkDefault false; treesitterParsers = lib.mkDefault true; utils = lib.mkDefault true; diff --git a/modules/module/settings/env.nix b/modules/module/settings/env.nix index 2ae4b9c..0749ede 100644 --- a/modules/module/settings/env.nix +++ b/modules/module/settings/env.nix @@ -11,12 +11,17 @@ UV_PYTHON_DOWNLOADS = "never"; UV_PYTHON = pkgs.python.interpreter; }) + (lib.mkIf (config.cats.r or false) { + RNVIM_COMPLDIR = "$PWD/.r-compl"; + R_LIBS_USER = "${pkgs.nvimcom}:$PWD/.Rlibs"; + TMPDIR = "$PWD/.r-tmp"; + }) ]; # Environment variables with defaults (can be overridden by user) config.envDefault = lib.mkMerge [ (lib.mkIf (config.cats.r or false) { - R_LIBS_USER = "./.Rlibs"; + R_LIBS_USER = "${pkgs.nvimcom}:$PWD/.Rlibs"; }) ]; } diff --git a/modules/module/specs/plugins.nix b/modules/module/specs/plugins.nix index ded8195..eb9d499 100644 --- a/modules/module/specs/plugins.nix +++ b/modules/module/specs/plugins.nix @@ -11,7 +11,13 @@ config.specs.r = { data = with pkgs.vimPlugins; [ - config.nvim-lib.neovimPlugins.r + (config.nvim-lib.neovimPlugins.r.overrideAttrs (old: { + postInstall = (old.postInstall or "") + '' + mkdir -p $out/rnvimserver + cp ${pkgs.nvimcom}/bin/rnvimserver $out/rnvimserver/rnvimserver + chmod +x $out/rnvimserver/rnvimserver + ''; + })) quarto-nvim { data = otter-nvim; diff --git a/overlays/r.nix b/overlays/r.nix index 2fb71c8..22c42fa 100644 --- a/overlays/r.nix +++ b/overlays/r.nix @@ -33,12 +33,38 @@ overlays = [inputs.fran.overlays.default]; }; # rixpkgs.legacyPackages.${prev.stdenv.hostPlatform.system}; + # Pre-build nvimcom from R.nvim plugin source so R.nvim never tries to + # compile it at runtime into the read-only nix store. + nvimcom = final.stdenv.mkDerivation { + pname = "nvimcom"; + version = "0.9.92"; + src = inputs.plugins-r; + nativeBuildInputs = [ + (rpkgs.rWrapper.override { packages = []; }) + ]; + buildPhase = '' + mkdir -p $out/bin + R CMD INSTALL -l $out nvimcom + cd rnvimserver + $CC -pthread -O2 -Wall \ + complete.c resolve.c hover.c definition.c signature.c \ + rhelp.c chunk.c roxygen.c data_structures.c logging.c \ + rnvimserver.c obbr.c tcp.c utilities.c ../nvimcom/src/common.c \ + -o $out/bin/rnvimserver + cd .. + mkdir -p $out/nvimcom/bin + cp $out/bin/rnvimserver $out/nvimcom/bin/rnvimserver + chmod +x $out/bin/rnvimserver $out/nvimcom/bin/rnvimserver + ''; + installPhase = "true"; + }; + # Standard R packages used by default in rWrapper and quarto reqPkgs = with rpkgs.rPackages; [ # languageserver ]; in { - inherit rpkgs; + inherit rpkgs nvimcom; baseRPackages = reqPkgs; # R wrapper with standard packages diff --git a/plugin/21_datascience.lua b/plugin/21_datascience.lua index 118ee20..62d8f49 100644 --- a/plugin/21_datascience.lua +++ b/plugin/21_datascience.lua @@ -44,6 +44,12 @@ end) -- r now(function() if nix.get_cat("r", false) then + local cwd = vim.fn.getcwd(-1) + vim.env.RNVIM_COMPLDIR = cwd .. "/.r-compl" + vim.env.R_LIBS_USER = (vim.env.R_LIBS_USER or ""):gsub("%$PWD", cwd) + vim.env.TMPDIR = cwd .. "/.r-tmp" + vim.fn.mkdir(vim.env.RNVIM_COMPLDIR, "p") + vim.fn.mkdir(vim.env.TMPDIR, "p") vim.g.rout_follow_colorscheme = true require("r").setup({ -- Create a table with the options to be passed to setup() From 1055522af932f5c781ff475cb390143534d49141 Mon Sep 17 00:00:00 2001 From: Daniel Winkler Date: Wed, 13 May 2026 12:30:17 +1000 Subject: [PATCH 2/5] moved r-nvim to flake build --- .Rprofile | 5 ++++ .r-tmp/R.nvim-daniel/globenv_1202824815 | 0 .r-tmp/R.nvim-daniel/liblist_1202824815 | 0 flake.lock | 38 ++++++++++++++++++++----- flake.nix | 9 +++++- modules/module/settings/env.nix | 4 +-- modules/module/specs/plugins.nix | 2 +- overlays/default.nix | 4 +++ overlays/r.nix | 29 ++----------------- 9 files changed, 54 insertions(+), 37 deletions(-) create mode 100644 .Rprofile create mode 100644 .r-tmp/R.nvim-daniel/globenv_1202824815 create mode 100644 .r-tmp/R.nvim-daniel/liblist_1202824815 diff --git a/.Rprofile b/.Rprofile new file mode 100644 index 0000000..7617f61 --- /dev/null +++ b/.Rprofile @@ -0,0 +1,5 @@ +if (Sys.getenv("RNVIM_TMPDIR") == "") { + options(defaultPackages = c("utils", "grDevices", "graphics", "stats", "methods")) +} else { + options(defaultPackages = c("utils", "grDevices", "graphics", "stats", "methods", "nvimcom")) +} diff --git a/.r-tmp/R.nvim-daniel/globenv_1202824815 b/.r-tmp/R.nvim-daniel/globenv_1202824815 new file mode 100644 index 0000000..e69de29 diff --git a/.r-tmp/R.nvim-daniel/liblist_1202824815 b/.r-tmp/R.nvim-daniel/liblist_1202824815 new file mode 100644 index 0000000..e69de29 diff --git a/flake.lock b/flake.lock index 32a6765..bf489c1 100644 --- a/flake.lock +++ b/flake.lock @@ -22,11 +22,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1777954456, - "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", + "lastModified": 1778443072, + "narHash": "sha256-zi7/fsqM/kFdNuED//4WOCUtezGtKKqRNORjMvfwjnA=", "owner": "nixos", "repo": "nixpkgs", - "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", + "rev": "da5ad661ba4e5ef59ba743f0d112cbc30e474f32", "type": "github" }, "original": { @@ -69,6 +69,29 @@ "type": "github" } }, + "r-nvim-nix": { + "inputs": { + "nixpkgs": [ + "rixpkgs" + ], + "rnvimsrc": [ + "plugins-r" + ] + }, + "locked": { + "lastModified": 1778638679, + "narHash": "sha256-+mdjgYfyNtI/5E6X8uUx3u9qpGC9POS4LagOHSM3Iy0=", + "owner": "dwinkler1", + "repo": "r_nvim_nix", + "rev": "eb784558e18b8f1dead5bd211b96fd287ac1bed7", + "type": "github" + }, + "original": { + "owner": "dwinkler1", + "repo": "r_nvim_nix", + "type": "github" + } + }, "rixpkgs": { "locked": { "lastModified": 1771303851, @@ -80,8 +103,8 @@ }, "original": { "owner": "dwinkler1", - "ref": "nixpkgs", "repo": "rixpkgs", + "rev": "af2dd3f7b4b172077747c0869d4e30702fb71b0e", "type": "github" } }, @@ -91,6 +114,7 @@ "nixpkgs": "nixpkgs", "plugins-cmp-pandoc-references": "plugins-cmp-pandoc-references", "plugins-r": "plugins-r", + "r-nvim-nix": "r-nvim-nix", "rixpkgs": "rixpkgs", "wrappers": "wrappers" } @@ -102,11 +126,11 @@ ] }, "locked": { - "lastModified": 1777991014, - "narHash": "sha256-0DS24OW9d9iz+w0LCz6KpS2IpE2z2gHxeBdMZg9xpDY=", + "lastModified": 1778560014, + "narHash": "sha256-Hu9RMo7vJt/4dx/vAvyG+cE9RBwpaH1ouyunvruYaDI=", "owner": "BirdeeHub", "repo": "nix-wrapper-modules", - "rev": "dc5184095ad488e937ec308b52c9c0b218959d8b", + "rev": "e30aa99c9c7038e16efae3cad7916a47307a9e36", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index be28255..1ffa69a 100644 --- a/flake.nix +++ b/flake.nix @@ -10,7 +10,11 @@ url = "github:BirdeeHub/nix-wrapper-modules"; inputs.nixpkgs.follows = "nixpkgs"; }; - rixpkgs.url = "github:dwinkler1/rixpkgs/nixpkgs"; + rixpkgs.url = "github:dwinkler1/rixpkgs/af2dd3f7b4b172077747c0869d4e30702fb71b0e"; + + r-nvim-nix.url = "github:dwinkler1/r_nvim_nix"; + r-nvim-nix.inputs.rnvimsrc.follows = "plugins-r"; + r-nvim-nix.inputs.nixpkgs.follows = "rixpkgs"; fran = { url = "github:dwinkler1/fran"; @@ -61,6 +65,7 @@ janitor languageserver styler + pkgs.nvimcom ]; julia = ["DataFramesMeta" "QuackIO"]; }; @@ -187,6 +192,8 @@ air-formatter yaml-language-server updateR + nvimcom + rnvimserver ]; juliaPackages = let diff --git a/modules/module/settings/env.nix b/modules/module/settings/env.nix index 0749ede..14e0a32 100644 --- a/modules/module/settings/env.nix +++ b/modules/module/settings/env.nix @@ -13,7 +13,7 @@ }) (lib.mkIf (config.cats.r or false) { RNVIM_COMPLDIR = "$PWD/.r-compl"; - R_LIBS_USER = "${pkgs.nvimcom}:$PWD/.Rlibs"; + R_LIBS_USER = "${pkgs.nvimcom}/library:$PWD/.Rlibs"; TMPDIR = "$PWD/.r-tmp"; }) ]; @@ -21,7 +21,7 @@ # Environment variables with defaults (can be overridden by user) config.envDefault = lib.mkMerge [ (lib.mkIf (config.cats.r or false) { - R_LIBS_USER = "${pkgs.nvimcom}:$PWD/.Rlibs"; + R_LIBS_USER = "${pkgs.nvimcom}/library:$PWD/.Rlibs"; }) ]; } diff --git a/modules/module/specs/plugins.nix b/modules/module/specs/plugins.nix index eb9d499..a47ba65 100644 --- a/modules/module/specs/plugins.nix +++ b/modules/module/specs/plugins.nix @@ -14,7 +14,7 @@ (config.nvim-lib.neovimPlugins.r.overrideAttrs (old: { postInstall = (old.postInstall or "") + '' mkdir -p $out/rnvimserver - cp ${pkgs.nvimcom}/bin/rnvimserver $out/rnvimserver/rnvimserver + cp ${pkgs.rnvimserver}/bin/rnvimserver $out/rnvimserver/rnvimserver chmod +x $out/rnvimserver/rnvimserver ''; })) diff --git a/overlays/default.nix b/overlays/default.nix index 821ff88..ebb6518 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -3,12 +3,14 @@ let lib = nixpkgs.lib; rOverlay = import ./r.nix {inherit inputs;}; + rNvimNixOverlay = inputs.r-nvim-nix.overlays.default; franOverlay = inputs.fran.overlays.default; pythonOverlay = import ./python.nix inputs; pluginsOverlay = import ./plugins.nix inputs; dependencyOverlays = [ rOverlay + rNvimNixOverlay pythonOverlay pluginsOverlay ]; @@ -17,6 +19,7 @@ in { inherit rOverlay + rNvimNixOverlay franOverlay pythonOverlay pluginsOverlay @@ -30,6 +33,7 @@ in overlays = { inherit rOverlay + rNvimNixOverlay franOverlay pythonOverlay pluginsOverlay diff --git a/overlays/r.nix b/overlays/r.nix index 22c42fa..a9961fb 100644 --- a/overlays/r.nix +++ b/overlays/r.nix @@ -33,38 +33,15 @@ overlays = [inputs.fran.overlays.default]; }; # rixpkgs.legacyPackages.${prev.stdenv.hostPlatform.system}; - # Pre-build nvimcom from R.nvim plugin source so R.nvim never tries to - # compile it at runtime into the read-only nix store. - nvimcom = final.stdenv.mkDerivation { - pname = "nvimcom"; - version = "0.9.92"; - src = inputs.plugins-r; - nativeBuildInputs = [ - (rpkgs.rWrapper.override { packages = []; }) - ]; - buildPhase = '' - mkdir -p $out/bin - R CMD INSTALL -l $out nvimcom - cd rnvimserver - $CC -pthread -O2 -Wall \ - complete.c resolve.c hover.c definition.c signature.c \ - rhelp.c chunk.c roxygen.c data_structures.c logging.c \ - rnvimserver.c obbr.c tcp.c utilities.c ../nvimcom/src/common.c \ - -o $out/bin/rnvimserver - cd .. - mkdir -p $out/nvimcom/bin - cp $out/bin/rnvimserver $out/nvimcom/bin/rnvimserver - chmod +x $out/bin/rnvimserver $out/nvimcom/bin/rnvimserver - ''; - installPhase = "true"; - }; + # nvimcom and rnvimserver are provided by the r-nvim-nix flake overlay + # (inputs.r-nvim-nix.overlays.default) # Standard R packages used by default in rWrapper and quarto reqPkgs = with rpkgs.rPackages; [ # languageserver ]; in { - inherit rpkgs nvimcom; + inherit rpkgs; baseRPackages = reqPkgs; # R wrapper with standard packages From 55866137ba5379c266defbb50f3fd9b40fe1a8b2 Mon Sep 17 00:00:00 2001 From: Daniel Winkler Date: Wed, 13 May 2026 12:30:36 +1000 Subject: [PATCH 3/5] cleanup --- .r-tmp/R.nvim-daniel/globenv_1202824815 | 0 .r-tmp/R.nvim-daniel/liblist_1202824815 | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .r-tmp/R.nvim-daniel/globenv_1202824815 delete mode 100644 .r-tmp/R.nvim-daniel/liblist_1202824815 diff --git a/.r-tmp/R.nvim-daniel/globenv_1202824815 b/.r-tmp/R.nvim-daniel/globenv_1202824815 deleted file mode 100644 index e69de29..0000000 diff --git a/.r-tmp/R.nvim-daniel/liblist_1202824815 b/.r-tmp/R.nvim-daniel/liblist_1202824815 deleted file mode 100644 index e69de29..0000000 From 22809d94cd5f03cde3150d93b6e3b385cca738f6 Mon Sep 17 00:00:00 2001 From: Daniel Winkler Date: Wed, 13 May 2026 13:28:55 +1000 Subject: [PATCH 4/5] update --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index bf489c1..7f552ab 100644 --- a/flake.lock +++ b/flake.lock @@ -79,11 +79,11 @@ ] }, "locked": { - "lastModified": 1778638679, - "narHash": "sha256-+mdjgYfyNtI/5E6X8uUx3u9qpGC9POS4LagOHSM3Iy0=", + "lastModified": 1778641093, + "narHash": "sha256-Cq0spPQCYJkyHFTBTXqjmbq663kIVZA63/TQkTzE4ps=", "owner": "dwinkler1", "repo": "r_nvim_nix", - "rev": "eb784558e18b8f1dead5bd211b96fd287ac1bed7", + "rev": "435103d25d56dbe43197f7969cf535fda17ff597", "type": "github" }, "original": { From 2b7a5d0b0d3bcb82e276187a779d474747cb4df0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 13 May 2026 06:29:50 +0000 Subject: [PATCH 5/5] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'r-nvim-nix': 'github:dwinkler1/r_nvim_nix/435103d' (2026-05-13) → 'github:dwinkler1/r_nvim_nix/c7b880d' (2026-05-13) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 7f552ab..b67b913 100644 --- a/flake.lock +++ b/flake.lock @@ -79,11 +79,11 @@ ] }, "locked": { - "lastModified": 1778641093, - "narHash": "sha256-Cq0spPQCYJkyHFTBTXqjmbq663kIVZA63/TQkTzE4ps=", + "lastModified": 1778643549, + "narHash": "sha256-dJBdYawL+/IVtmXLFZ+kQGOo5fd1cliDJJdJEi0Mqqw=", "owner": "dwinkler1", "repo": "r_nvim_nix", - "rev": "435103d25d56dbe43197f7969cf535fda17ff597", + "rev": "c7b880dde56b4fcef09938e311415b63f2262498", "type": "github" }, "original": {