depot/third_party/home-manager/modules/programs/broot.nix
Default email c6444ecc3c Project import generated by Copybara.
GitOrigin-RevId: 51e44a13acea71b36245e8bd8c7db53e0a3e61ee
2024-01-05 12:06:15 +01:00

241 lines
6.5 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.programs.broot;
tomlFormat = pkgs.formats.toml { };
settingsModule = {
freeformType = tomlFormat.type;
options = {
modal = mkEnableOption "modal (vim) mode";
verbs = mkOption {
type = with types; listOf (attrsOf (either bool str));
default = [ ];
example = literalExpression ''
[
{ invocation = "p"; execution = ":parent"; }
{ invocation = "edit"; shortcut = "e"; execution = "$EDITOR {file}" ; }
{ invocation = "create {subpath}"; execution = "$EDITOR {directory}/{subpath}"; }
{ invocation = "view"; execution = "less {file}"; }
{
invocation = "blop {name}\\.{type}";
execution = "mkdir {parent}/{type} && ''${pkgs.neovim}/bin/nvim {parent}/{type}/{name}.{type}";
from_shell = true;
}
]
'';
description = ''
Define new verbs. For more information, see
[Verb Definition Attributes](https://dystroy.org/broot/documentation/configuration/#verb-definition-attributes)
in the broot documentation.
The possible attributes are:
`invocation` (optional)
: how the verb is called by the user, with placeholders for arguments
`execution` (mandatory)
: how the verb is executed
`key` (optional)
: a keyboard key triggering execution
`shortcut` (optional)
: an alternate way to call the verb (without
the arguments part)
`leave_broot` (optional)
: whether to quit broot on execution
(default: `true`)
`from_shell` (optional)</term>
: whether the verb must be executed from the
parent shell (default: `false`)
'';
};
skin = mkOption {
type = types.attrsOf types.str;
default = { };
example = literalExpression ''
{
status_normal_fg = "grayscale(18)";
status_normal_bg = "grayscale(3)";
status_error_fg = "red";
status_error_bg = "yellow";
tree_fg = "red";
selected_line_bg = "grayscale(7)";
permissions_fg = "grayscale(12)";
size_bar_full_bg = "red";
size_bar_void_bg = "black";
directory_fg = "lightyellow";
input_fg = "cyan";
flag_value_fg = "lightyellow";
table_border_fg = "red";
code_fg = "lightyellow";
}
'';
description = ''
Color configuration.
Complete list of keys (expected to change before the v1 of broot):
* `char_match`
* `code`
* `directory`
* `exe`
* `file`
* `file_error`
* `flag_label`
* `flag_value`
* `input`
* `link`
* `permissions`
* `selected_line`
* `size_bar_full`
* `size_bar_void`
* `size_text`
* `spinner`
* `status_error`
* `status_normal`
* `table_border`
* `tree`
* `unlisted`
Add `_fg` for a foreground color and
`_bg` for a background color.
'';
};
};
};
shellInit = shell:
# Using mkAfter to make it more likely to appear after other
# manipulations of the prompt.
mkAfter ''
source ${
pkgs.runCommand "br.${shell}" { nativeBuildInputs = [ cfg.package ]; }
"broot --print-shell-function ${shell} > $out"
}
'';
in {
meta.maintainers = [ hm.maintainers.aheaume maintainers.dermetfan ];
imports = [
(mkRenamedOptionModule [ "programs" "broot" "modal" ] [
"programs"
"broot"
"settings"
"modal"
])
(mkRenamedOptionModule [ "programs" "broot" "verbs" ] [
"programs"
"broot"
"settings"
"verbs"
])
(mkRenamedOptionModule [ "programs" "broot" "skin" ] [
"programs"
"broot"
"settings"
"skin"
])
];
options.programs.broot = {
enable = mkEnableOption "Broot, a better way to navigate directories";
enableBashIntegration = mkOption {
default = true;
type = types.bool;
description = ''
Whether to enable Bash integration.
'';
};
enableZshIntegration = mkOption {
default = true;
type = types.bool;
description = ''
Whether to enable Zsh integration.
'';
};
enableFishIntegration = mkOption {
default = true;
type = types.bool;
description = ''
Whether to enable Fish integration.
'';
};
enableNushellIntegration = mkOption {
default = true;
type = types.bool;
description = ''
Whether to enable Nushell integration.
'';
};
package = mkOption {
type = types.package;
default = pkgs.broot;
defaultText = literalExpression "pkgs.broot";
description = "Package providing broot";
};
settings = mkOption {
type = types.submodule settingsModule;
default = { };
description = "Verbatim config entries";
};
};
config = mkIf cfg.enable {
home.packages = [ cfg.package ];
xdg.configFile."broot" = {
recursive = true;
source = pkgs.symlinkJoin {
name = "xdg.configFile.broot";
paths = [
# Copy all files under /resources/default-conf
"${cfg.package.src}/resources/default-conf"
# Dummy file to prevent broot from trying to reinstall itself
(pkgs.writeTextDir "launcher/installed-v1" "")
];
postBuild = ''
ln -s ${
tomlFormat.generate "broot-config" cfg.settings
} $out/conf.toml
# Remove conf.hjson, whose content has been merged into programs.broot.settings
rm $out/conf.hjson
'';
};
};
programs.broot.settings = builtins.fromJSON (builtins.readFile
(pkgs.runCommand "default-conf.json" {
nativeBuildInputs = [ pkgs.hjson ];
}
"hjson -c ${cfg.package.src}/resources/default-conf/conf.hjson > $out"));
programs.bash.initExtra = mkIf cfg.enableBashIntegration (shellInit "bash");
programs.zsh.initExtra = mkIf cfg.enableZshIntegration (shellInit "zsh");
programs.fish.shellInit = mkIf cfg.enableFishIntegration (shellInit "fish");
programs.nushell.extraConfig =
mkIf cfg.enableNushellIntegration (shellInit "nushell");
};
}