1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 11:36:05 +01:00
home-manager/modules/programs/ranger.nix
Tom Hubrecht 8eb2f2a26a
treewide: Remove unwanted dependencies (#7487)
Fixes interpolation of packages in the default and example texts.
2025-07-17 14:12:50 -05:00

209 lines
5.2 KiB
Nix

{
config,
pkgs,
lib,
...
}:
let
inherit (lib) literalExpression mkOption types;
cfg = config.programs.ranger;
in
{
options.programs.ranger = {
enable = lib.mkEnableOption "ranger file manager";
package = lib.mkPackageOption pkgs "ranger" { nullable = true; };
extraPackages = mkOption {
type = types.listOf types.package;
default = [ ];
description = "Extra packages added to ranger.";
};
finalPackage = mkOption {
type = types.package;
readOnly = true;
visible = false;
description = "Resulting ranger package.";
};
settings = mkOption {
type = types.attrsOf (
types.oneOf [
types.bool
types.float
types.int
types.str
]
);
default = { };
description = ''
Settings written to {file}`$XDG_CONFIG_HOME/ranger/rc.conf`.
'';
example = {
column_ratios = "1,3,3";
confirm_on_delete = "never";
unicode_ellipsis = true;
scroll_offset = 8;
};
};
aliases = mkOption {
type = types.attrsOf types.str;
default = { };
description = ''
Aliases written to {file}`$XDG_CONFIG_HOME/ranger/rc.conf`.
'';
example = {
e = "edit";
setl = "setlocal";
filter = "scout -prts";
};
};
mappings = mkOption {
type = types.attrsOf types.str;
default = { };
description = ''
Mappings written to {file}`$XDG_CONFIG_HOME/ranger/rc.conf`.
'';
example = {
Q = "quitall";
q = "quit";
};
};
extraConfig = mkOption {
type = types.lines;
default = "";
description = ''
Extra configuration lines to add to
{file}`$XDG_CONFIG_HOME/ranger/rc.conf`.
'';
};
plugins = mkOption {
type = types.listOf (
types.submodule {
options = {
name = mkOption {
type = types.str;
description = ''
Name of the plugin linked to
{file}`$XDG_CONFIG_HOME/ranger/plugins/`. In the case of a
single-file plugin, it must also have `.py` suffix.
'';
};
src = mkOption {
type = types.path;
description = ''
The plugin file or directory.
'';
};
};
}
);
default = [ ];
description = ''
List of files to be added to {file}`$XDG_CONFIG_HOME/ranger/plugins/`.
'';
example = literalExpression ''
[
{
name = "zoxide";
src = builtins.fetchGit {
url = "https://github.com/jchook/ranger-zoxide.git";
rev = "363df97af34c96ea873c5b13b035413f56b12ead";
};
}
]
'';
};
rifle = mkOption {
type = types.listOf (
types.submodule {
options = {
condition = mkOption {
type = types.str;
description = ''
A condition to match a file.
'';
example = "mime ^text, label editor";
};
command = mkOption {
type = types.str;
description = ''
A command to run for the matching file.
'';
example = literalExpression ''"''${pkgs.vim}/bin/vim -- \"$@\""'';
};
};
}
);
default = [ ];
description = ''
Settings written to {file}`$XDG_CONFIG_HOME/ranger/rifle.conf`.
'';
};
};
config = lib.mkIf cfg.enable (
lib.mkMerge [
{
assertions = [
{
assertion = cfg.extraPackages != [ ] -> cfg.package != null;
message = "programs.ranger.extraPackages requires non-null programs.ranger.package";
}
];
programs.ranger.finalPackage = lib.mkIf (cfg.package != null) (
cfg.package.overrideAttrs (oldAttrs: {
propagatedBuildInputs = (oldAttrs.propagatedBuildInputs or [ ]) ++ cfg.extraPackages;
})
);
home.packages = lib.mkIf (cfg.package != null) [ cfg.finalPackage ];
xdg.configFile."ranger/rc.conf".text =
let
mkString = lib.generators.mkValueStringDefault { };
mkConfig =
cmd:
lib.generators.toKeyValue {
mkKeyValue = k: v: "${cmd} ${k} ${mkString v}";
};
in
''
${mkConfig "set" cfg.settings}
${mkConfig "alias" cfg.aliases}
${mkConfig "map" cfg.mappings}
${cfg.extraConfig}
'';
}
(lib.mkIf (cfg.plugins != [ ]) {
xdg.configFile =
let
toAttrs = i: {
name = "ranger/plugins/${i.name}";
value.source = i.src;
};
in
lib.listToAttrs (map toAttrs cfg.plugins);
})
(lib.mkIf (cfg.rifle != [ ]) {
xdg.configFile."ranger/rifle.conf".text =
let
lines = map (i: "${i.condition} = ${i.command}") cfg.rifle;
in
lib.concatLines lines;
})
]
);
meta.maintainers = [ lib.hm.maintainers.fpob ];
}