mirror of
https://codeberg.org/muon/home.git
synced 2026-07-04 07:59:33 +00:00
103 lines
3.1 KiB
Nix
103 lines
3.1 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}: let
|
|
inherit (lib) mkIf types;
|
|
|
|
cfg = config.programs.worktrunk;
|
|
in {
|
|
options.programs.worktrunk = {
|
|
enable = lib.mkEnableOption "worktrunk, a CLI tool for managing work sessions";
|
|
|
|
package = lib.mkPackageOption pkgs "worktrunk" {nullable = true;};
|
|
|
|
enableBashIntegration = lib.hm.shell.mkBashIntegrationOption {inherit config;};
|
|
|
|
enableFishIntegration = lib.hm.shell.mkFishIntegrationOption {inherit config;};
|
|
|
|
enableNushellIntegration = lib.hm.shell.mkNushellIntegrationOption {inherit config;};
|
|
|
|
enableZshIntegration = lib.hm.shell.mkZshIntegrationOption {inherit config;};
|
|
|
|
shellWrapperName = lib.mkOption {
|
|
type = types.str;
|
|
default = "wt";
|
|
example = "wt";
|
|
description = ''
|
|
Name of the shell wrapper to be called.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
home.packages = mkIf (cfg.package != null) [cfg.package];
|
|
|
|
programs = let
|
|
bashIntegration = ''
|
|
${cfg.shellWrapperName}() {
|
|
local directive_file=$(mktemp)
|
|
WORKTRUNK_DIRECTIVE_FILE="$directive_file" command ${
|
|
if cfg.shellWrapperName != "wt"
|
|
then "wt"
|
|
else "\${WORKTRUNK_BIN:-wt}"
|
|
} "$@"
|
|
if [[ -s "$directive_file" ]]; then
|
|
source "$directive_file"
|
|
fi
|
|
rm -f "$directive_file"
|
|
}
|
|
'';
|
|
|
|
fishIntegration = ''
|
|
set -l directive_file (mktemp)
|
|
${
|
|
if cfg.shellWrapperName != "wt"
|
|
then ''
|
|
env WORKTRUNK_DIRECTIVE_FILE=$directive_file wt $argv''
|
|
else ''
|
|
set -q WORKTRUNK_BIN; or set -l WORKTRUNK_BIN wt
|
|
env WORKTRUNK_DIRECTIVE_FILE=$directive_file $WORKTRUNK_BIN $argv''
|
|
}
|
|
if test -s "$directive_file"
|
|
set -l directive (string collect < "$directive_file")
|
|
eval $directive
|
|
end
|
|
command rm -f "$directive_file"
|
|
'';
|
|
|
|
nushellIntegration = ''
|
|
def --env --wrapped ${cfg.shellWrapperName} [...args] {
|
|
let directive_file = (mktemp --tmpdir)
|
|
let worktrunk_bin = (${
|
|
if cfg.shellWrapperName != "wt"
|
|
then "'wt'"
|
|
else "$env.WORKTRUNK_BIN? | default 'wt'"
|
|
})
|
|
with-env { WORKTRUNK_DIRECTIVE_FILE: $directive_file } {
|
|
^$worktrunk_bin ...$args
|
|
}
|
|
if ($directive_file | path exists) {
|
|
let directives = open $directive_file --raw | str trim | lines
|
|
for directive in $directives {
|
|
if ($directive | str starts-with "cd '") {
|
|
let target_dir = $directive | str substring 4..-2
|
|
cd $target_dir
|
|
}
|
|
}
|
|
}
|
|
rm -f $directive_file
|
|
}
|
|
'';
|
|
in {
|
|
bash.initExtra = mkIf cfg.enableBashIntegration bashIntegration;
|
|
|
|
zsh.initContent = mkIf cfg.enableZshIntegration bashIntegration;
|
|
|
|
fish.functions.${cfg.shellWrapperName} = mkIf cfg.enableFishIntegration fishIntegration;
|
|
|
|
nushell.extraConfig = mkIf cfg.enableNushellIntegration nushellIntegration;
|
|
};
|
|
};
|
|
}
|