1
0
mirror of https://github.com/nix-community/home-manager synced 2024-06-02 21:13:33 +02:00
home-manager/modules/programs/lf.nix
musjj 406d34d919
lf: simplify option validation (#4334)
Don't try to validate a limited set of hardcoded options, instead just
convert them as-is. Now, users can keep all their options in a single
attribute set, including arbitrary `user_{option}`s which was impossible
to express with a hard-coded submodule. As a plus, there is also less
maintainence burden.
2023-08-12 18:10:49 +02:00

170 lines
4.6 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let cfg = config.programs.lf;
in {
meta.maintainers = [ hm.maintainers.owm111 ];
options = {
programs.lf = {
enable = mkEnableOption "lf";
package = mkOption {
type = types.package;
default = pkgs.lf;
defaultText = literalExpression "pkgs.lf";
description = ''
lf package to use.
'';
};
settings = mkOption {
type = with types;
attrsOf (oneOf [ str int (listOf (either str int)) bool ]);
default = { };
example = {
tabstop = 4;
number = true;
ratios = [ 1 1 2 ];
};
description = ''
An attribute set of lf settings. See the lf documentation for
detailed descriptions of these options. Prefer
{option}`programs.lf.previewer.*` for setting lf's {var}`previewer`
option. All string options are quoted with double quotes.
'';
};
commands = mkOption {
type = with types; attrsOf (nullOr str);
default = { };
example = {
get-mime-type = ''%xdg-mime query filetype "$f"'';
open = "$$OPENER $f";
};
description = ''
Commands to declare. Commands set to null or an empty string are
deleted.
'';
};
keybindings = mkOption {
type = with types; attrsOf (nullOr str);
default = { };
example = {
gh = "cd ~";
D = "trash";
i = "$less $f";
U = "!du -sh";
gg = null;
};
description =
"Keys to bind. Keys set to null or an empty string are deleted.";
};
cmdKeybindings = mkOption {
type = with types; attrsOf (nullOr str);
default = { };
example = literalExpression ''{ "<c-g>" = "cmd-escape"; }'';
description = ''
Keys to bind to command line commands which can only be one of the
builtin commands. Keys set to null or an empty string are deleted.
'';
};
previewer.source = mkOption {
type = with types; nullOr path;
default = null;
example = literalExpression ''
pkgs.writeShellScript "pv.sh" '''
#!/bin/sh
case "$1" in
*.tar*) tar tf "$1";;
*.zip) unzip -l "$1";;
*.rar) unrar l "$1";;
*.7z) 7z l "$1";;
*.pdf) pdftotext "$1" -;;
*) highlight -O ansi "$1" || cat "$1";;
esac
'''
'';
description = ''
Script or executable to use to preview files. Sets lf's
{var}`previewer` option.
'';
};
previewer.keybinding = mkOption {
type = with types; nullOr str;
default = null;
example = "i";
description = ''
Key to bind to the script at {var}`previewer.source` and
pipe through less. Setting to null will not bind any key.
'';
};
extraConfig = mkOption {
type = types.lines;
default = "";
example = ''
$mkdir -p ~/.trash
'';
description = "Custom lfrc lines.";
};
};
};
config = mkIf cfg.enable {
home.packages = [ cfg.package ];
xdg.configFile."lf/lfrc".text = let
fmtSetting = k: v:
optionalString (v != null) "set ${
if isBool v then
"${optionalString (!v) "no"}${k}"
else if isList v then
''${k} "${concatStringsSep ":" (map (w: toString w) v)}"''
else
"${k} ${if isInt v then toString v else ''"${v}"''}"
}";
settingsStr = concatStringsSep "\n"
(remove "" (mapAttrsToList fmtSetting cfg.settings));
fmtCmdMap = before: k: v:
"${before} ${k}${optionalString (v != null && v != "") " ${v}"}";
fmtCmd = fmtCmdMap "cmd";
fmtMap = fmtCmdMap "map";
fmtCmap = fmtCmdMap "cmap";
commandsStr = concatStringsSep "\n" (mapAttrsToList fmtCmd cfg.commands);
keybindingsStr =
concatStringsSep "\n" (mapAttrsToList fmtMap cfg.keybindings);
cmdKeybindingsStr =
concatStringsSep "\n" (mapAttrsToList fmtCmap cfg.cmdKeybindings);
previewerStr = optionalString (cfg.previewer.source != null) ''
set previewer ${cfg.previewer.source}
${optionalString (cfg.previewer.keybinding != null) ''
map ${cfg.previewer.keybinding} ''$${cfg.previewer.source} "$f" | less -R
''}
'';
in ''
${settingsStr}
${commandsStr}
${keybindingsStr}
${cmdKeybindingsStr}
${previewerStr}
${cfg.extraConfig}
'';
};
}