feat(devshell): add language tools conditionally based on cats

- Extract mkWrapperConfig to share cats/settings between package and devshell
- Add python, R, julia, and markdown packages to devShells when their cats are enabled
- Reuse same package construction logic as specs/deps.nix for consistency
- Keep lang_packages overridable via lib.mkDefault for downstream flakes
This commit is contained in:
Daniel Winkler 2026-05-03 16:35:56 +10:00
commit e9c99811d4

120
flake.nix
View file

@ -36,45 +36,58 @@
wrappers, wrappers,
... ...
} @ inputs: let } @ inputs: let
mkWrapperConfig = pkgs: {
cats = {
clickhouse = false;
gitPlugins = true;
julia = false;
lua = true;
markdown = false;
nix = true;
optional = false;
python = false;
r = false;
};
settings = {
lang_packages = {
python = with pkgs.python3Packages; [
duckdb
polars
];
r = with pkgs.rpkgs.rPackages; [
arrow
broom
data_table
janitor
styler
];
julia = ["DataFramesMeta" "QuackIO"];
};
colorscheme = "cyberdream";
background = "dark";
wrapRc = true;
};
binName = "vv";
};
wrapperSettings = pkgs: let wrapperSettings = pkgs: let
cfg = mkWrapperConfig pkgs;
def = pkgs.lib.mkDefault; def = pkgs.lib.mkDefault;
in in
wrapper.config.wrap { wrapper.config.wrap {
inherit pkgs; inherit pkgs;
cats = { cats = pkgs.lib.mapAttrs (_: v: def v) cfg.cats;
clickhouse = def false;
gitPlugins = def true;
julia = def false;
lua = def true;
markdown = def false;
nix = def true;
optional = def false;
python = def false;
r = def false;
};
settings = { settings = {
lang_packages = { lang_packages = {
python = with pkgs.python3Packages; [ python = def cfg.settings.lang_packages.python;
duckdb r = def cfg.settings.lang_packages.r;
polars julia = def cfg.settings.lang_packages.julia;
];
r = with pkgs.rpkgs.rPackages; [
arrow
broom
data_table
janitor
styler
];
julia = ["DataFramesMeta" "QuackIO"];
}; };
colorscheme = def "cyberdream"; colorscheme = def cfg.settings.colorscheme;
background = def "dark"; background = def cfg.settings.background;
wrapRc = def true; wrapRc = def cfg.settings.wrapRc;
}; };
binName = def "vv"; binName = def cfg.binName;
}; };
systems = [ systems = [
@ -146,12 +159,55 @@
devShells = forAllSystems ( devShells = forAllSystems (
system: let system: let
pkgs = mkPkgs system; pkgs = mkPkgs system;
cfg = mkWrapperConfig pkgs;
nvimPkg = wrapperSettings pkgs; nvimPkg = wrapperSettings pkgs;
pythonPackages = let
python_packages_fn =
if pkgs ? basePythonPackages
then ps: pkgs.basePythonPackages ps ++ cfg.settings.lang_packages.python
else _: cfg.settings.lang_packages.python;
in
with pkgs; [
(python3.withPackages python_packages_fn)
nodejs
ruff
basedpyright
uv
];
rPackages = let
r_packages = (pkgs.baseRPackages or []) ++ cfg.settings.lang_packages.r;
in
with pkgs; [
(rWrapper.override {packages = r_packages;})
radianWrapper
(quarto.override {extraRPackages = r_packages;})
air-formatter
yaml-language-server
updateR
];
juliaPackages = let
julia_with_packages = pkgs.julia-bin.withPackages cfg.settings.lang_packages.julia;
in [julia_with_packages];
markdownPackages = with pkgs; [
python313Packages.pylatexenc
quarto
zk
];
shellPackages = [nvimPkg]
++ pkgs.lib.optionals cfg.cats.python pythonPackages
++ pkgs.lib.optionals cfg.cats.r rPackages
++ pkgs.lib.optionals cfg.cats.julia juliaPackages
++ pkgs.lib.optionals cfg.cats.markdown markdownPackages;
in { in {
default = pkgs.mkShell { default = pkgs.mkShell {
name = "vShell"; name = "vShell";
packages = [nvimPkg]; packages = shellPackages;
nativeBuildInputs = with pkgs; [] ++ (pkgs.lib.optionals self.wrappers.default.cats.optional [devenv]); nativeBuildInputs = with pkgs; [] ++ (pkgs.lib.optionals cfg.cats.optional [devenv]);
inputsFrom = []; inputsFrom = [];
shellHook = ""; shellHook = "";
}; };