python312Packages.mypy-boto3-customer-profiles: 1.35.29 -> 1.35.64
[NixPkgs.git] / nixos / modules / programs / less.nix
blob50ea1586f6880c3d85cb90f114220f25fda4b342
1 { config, lib, pkgs, ... }:
3 let
5   cfg = config.programs.less;
7   configText = if (cfg.configFile != null) then (builtins.readFile cfg.configFile) else ''
8     #command
9     ${builtins.concatStringsSep "\n"
10       (lib.mapAttrsToList (command: action: "${command} ${action}") cfg.commands)
11     }
12     ${lib.optionalString cfg.clearDefaultCommands "#stop"}
14     #line-edit
15     ${builtins.concatStringsSep "\n"
16       (lib.mapAttrsToList (command: action: "${command} ${action}") cfg.lineEditingKeys)
17     }
19     #env
20     ${builtins.concatStringsSep "\n"
21       (lib.mapAttrsToList (variable: values: "${variable}=${values}") cfg.envVariables)
22     }
23   '';
25   lessKey = pkgs.writeText "lessconfig" configText;
30   options = {
32     programs.less = {
34       # note that environment.nix sets PAGER=less, and
35       # therefore also enables this module
36       enable = lib.mkEnableOption "less, a file pager";
38       package = lib.mkPackageOption pkgs "less" { };
40       configFile = lib.mkOption {
41         type = lib.types.nullOr lib.types.path;
42         default = null;
43         example = lib.literalExpression ''"''${pkgs.my-configs}/lesskey"'';
44         description = ''
45           Path to lesskey configuration file.
47           {option}`configFile` takes precedence over {option}`commands`,
48           {option}`clearDefaultCommands`, {option}`lineEditingKeys`, and
49           {option}`envVariables`.
50         '';
51       };
53       commands = lib.mkOption {
54         type = lib.types.attrsOf lib.types.str;
55         default = {};
56         example = {
57           h = "noaction 5\\e(";
58           l = "noaction 5\\e)";
59         };
60         description = "Defines new command keys.";
61       };
63       clearDefaultCommands = lib.mkOption {
64         type = lib.types.bool;
65         default = false;
66         description = ''
67           Clear all default commands.
68           You should remember to set the quit key.
69           Otherwise you will not be able to leave less without killing it.
70         '';
71       };
73       lineEditingKeys = lib.mkOption {
74         type = lib.types.attrsOf lib.types.str;
75         default = {};
76         example = {
77           e = "abort";
78         };
79         description = "Defines new line-editing keys.";
80       };
82       envVariables = lib.mkOption {
83         type = lib.types.attrsOf lib.types.str;
84         default = {
85           LESS = "-R";
86         };
87         example = {
88           LESS = "--quit-if-one-screen";
89         };
90         description = "Defines environment variables.";
91       };
93       lessopen = lib.mkOption {
94         type = lib.types.nullOr lib.types.str;
95         default = "|${pkgs.lesspipe}/bin/lesspipe.sh %s";
96         defaultText = lib.literalExpression ''"|''${pkgs.lesspipe}/bin/lesspipe.sh %s"'';
97         description = ''
98           Before less opens a file, it first gives your input preprocessor a chance to modify the way the contents of the file are displayed.
99         '';
100       };
102       lessclose = lib.mkOption {
103         type = lib.types.nullOr lib.types.str;
104         default = null;
105         description = ''
106           When less closes a file opened in such a way, it will call another program, called the input postprocessor,
107           which may perform any desired clean-up action (such as deleting the replacement file created by LESSOPEN).
108         '';
109       };
110     };
111   };
113   config = lib.mkIf cfg.enable {
115     environment.systemPackages = [ cfg.package ];
117     environment.variables = {
118       LESSKEYIN_SYSTEM = builtins.toString lessKey;
119     } // lib.optionalAttrs (cfg.lessopen != null) {
120       LESSOPEN = cfg.lessopen;
121     } // lib.optionalAttrs (cfg.lessclose != null) {
122       LESSCLOSE = cfg.lessclose;
123     };
125     warnings = lib.optional (
126       cfg.clearDefaultCommands && (builtins.all (x: x != "quit") (builtins.attrValues cfg.commands))
127     ) ''
128       config.programs.less.clearDefaultCommands clears all default commands of less but there is no alternative binding for exiting.
129       Consider adding a binding for 'quit'.
130     '';
131   };
133   meta.maintainers = with lib.maintainers; [ johnazoidberg ];