From a40d2eedcfeaf1ecf2b811311f9fd03f6f9d2614 Mon Sep 17 00:00:00 2001 From: Fernando Rodrigues Date: Sun, 20 Oct 2024 18:34:31 +0000 Subject: [PATCH] nixos/bat: init bat module Signed-off-by: Fernando Rodrigues --- doc/manpage-urls.json | 3 +- .../manual/release-notes/rl-2505.section.md | 2 + nixos/modules/module-list.nix | 1 + nixos/modules/programs/bat.nix | 122 ++++++++++++++++++ 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 nixos/modules/programs/bat.nix diff --git a/doc/manpage-urls.json b/doc/manpage-urls.json index e878caf042a45c..ba18e98376f4fd 100644 --- a/doc/manpage-urls.json +++ b/doc/manpage-urls.json @@ -322,5 +322,6 @@ "nix-shell(1)": "https://nixos.org/manual/nix/stable/command-ref/nix-shell.html", "mksquashfs(1)": "https://man.archlinux.org/man/extra/squashfs-tools/mksquashfs.1.en", "curl(1)": "https://curl.se/docs/manpage.html", - "netrc(5)": "https://man.cx/netrc" + "netrc(5)": "https://man.cx/netrc", + "cat(1)": "https://www.gnu.org/software/coreutils/manual/html_node/cat-invocation.html" } diff --git a/nixos/doc/manual/release-notes/rl-2505.section.md b/nixos/doc/manual/release-notes/rl-2505.section.md index f3a58367e055f0..d1409ab1cff253 100644 --- a/nixos/doc/manual/release-notes/rl-2505.section.md +++ b/nixos/doc/manual/release-notes/rl-2505.section.md @@ -22,6 +22,8 @@ - [Amazon CloudWatch Agent](https://github.com/aws/amazon-cloudwatch-agent), the official telemetry collector for AWS CloudWatch and AWS X-Ray. Available as [services.amazon-cloudwatch-agent](options.html#opt-services.amazon-cloudwatch-agent.enable). +- [Bat](https://github.com/sharkdp/bat), a {manpage}`cat(1)` clone with wings. Available as [programs.bat](options.html#opt-programs.bat). + - [agorakit](https://github.com/agorakit/agorakit), an organization tool for citizens' collectives. Available with [services.agorakit](options.html#opt-services.agorakit.enable). - [mqtt-exporter](https://github.com/kpetremann/mqtt-exporter/), a Prometheus exporter for exposing messages from MQTT. Available as [services.prometheus.exporters.mqtt](#opt-services.prometheus.exporters.mqtt.enable). diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index b285e3f7c7aebe..7c9118d6387c9f 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -161,6 +161,7 @@ ./programs/bash/ls-colors.nix ./programs/bash/undistract-me.nix ./programs/bazecor.nix + ./programs/bat.nix ./programs/bcc.nix ./programs/benchexec.nix ./programs/browserpass.nix diff --git a/nixos/modules/programs/bat.nix b/nixos/modules/programs/bat.nix new file mode 100644 index 00000000000000..31a3ae33690a40 --- /dev/null +++ b/nixos/modules/programs/bat.nix @@ -0,0 +1,122 @@ +{ + pkgs, + config, + lib, + ... +}: +let + inherit (builtins) isList elem; + inherit (lib) + getExe + literalExpression + maintainers + mapAttrs' + mkEnableOption + mkIf + mkOption + mkPackageOption + nameValuePair + optionalString + types + ; + inherit (types) listOf package; + + cfg = config.programs.bat; + + settingsFormat = pkgs.formats.keyValue { listsAsDuplicateKeys = true; }; + inherit (settingsFormat) generate type; + + initScript = + { + program, + shell, + flags ? [ ], + }: + if (shell != "fish") then + '' + eval "$(${getExe program} ${toString flags})" + '' + else + '' + ${getExe program} ${toString flags} | source + ''; + + shellInit = + shell: + optionalString (elem pkgs.bat-extras.batpipe cfg.extraPackages) (initScript { + program = pkgs.bat-extras.batpipe; + inherit shell; + }) + + optionalString (elem pkgs.bat-extras.batman cfg.extraPackages) (initScript { + program = pkgs.bat-extras.batman; + inherit shell; + flags = [ "--export-env" ]; + }); +in +{ + options.programs.bat = { + enable = mkEnableOption "`bat`, a {manpage}`cat(1)` clone with wings"; + + package = mkPackageOption pkgs "bat" { }; + + extraPackages = mkOption { + default = [ ]; + example = literalExpression '' + with pkgs.bat-extras; [ + batdiff + batman + prettybat + ]; + ''; + description = '' + Extra `bat` scripts to be added to the system configuration. + ''; + type = listOf package; + }; + + settings = mkOption { + default = { }; + example = { + theme = "TwoDark"; + italic-text = "always"; + paging = "never"; + pager = "less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse"; + map-syntax = [ + "*.ino:C++" + ".ignore:Git Ignore" + ]; + }; + description = '' + Parameters to be written to the system-wide `bat` configuration file. + ''; + type = type; + }; + }; + + config = mkIf cfg.enable { + environment = { + systemPackages = [ cfg.package ] ++ cfg.extraPackages; + etc."bat/config".source = generate "bat-config" ( + mapAttrs' ( + name: value: + nameValuePair ("--" + name) ( + if (isList value) then map (str: "\"${str}\"") value else "\"${value}\"" + ) + ) cfg.settings + ); + }; + + programs = { + bash = mkIf (!config.programs.fish.enable) { + interactiveShellInit = shellInit "bash"; + }; + fish = mkIf config.programs.fish.enable { + interactiveShellInit = shellInit "fish"; + }; + zsh = mkIf (!config.programs.fish.enable && config.programs.zsh.enable) { + interactiveShellInit = shellInit "zsh"; + }; + }; + }; + meta.maintainers = with maintainers; [ sigmasquadron ]; +}