diff --git a/modules/programs/lazyworktree.nix b/modules/programs/lazyworktree.nix index 46f84210..f1af3f15 100644 --- a/modules/programs/lazyworktree.nix +++ b/modules/programs/lazyworktree.nix @@ -46,12 +46,58 @@ in for supported values. ''; }; + + enableBashIntegration = lib.hm.shell.mkBashIntegrationOption { inherit config; }; + + enableFishIntegration = lib.hm.shell.mkFishIntegrationOption { inherit config; }; + + enableZshIntegration = lib.hm.shell.mkZshIntegrationOption { inherit config; }; + + shellWrapperName = mkOption { + type = lib.types.str; + default = "lwt"; + example = "wt"; + description = '' + Name of the shell wrapper that launches lazyworktree and changes to the + selected worktree directory on exit. + This option only has an effect when at least one shell integration + option is enabled. + ''; + }; }; config = mkIf cfg.enable { home.packages = mkIf (cfg.package != null) [ cfg.package ]; + xdg.configFile."lazyworktree/config.yaml" = mkIf (cfg.settings != { }) { source = yamlFormat.generate "lazyworktree.yaml" cfg.settings; }; + + programs = { + bash.initExtra = mkIf cfg.enableBashIntegration '' + function ${cfg.shellWrapperName}() { + local lazyworktree_dir + lazyworktree_dir="$(command lazyworktree "$@")" || return + [ -n "$lazyworktree_dir" ] && [ -d "$lazyworktree_dir" ] && cd "$lazyworktree_dir" + } + ''; + + zsh.initContent = mkIf cfg.enableZshIntegration '' + function ${cfg.shellWrapperName}() { + local lazyworktree_dir + lazyworktree_dir="$(command lazyworktree "$@")" || return + [ -n "$lazyworktree_dir" ] && [ -d "$lazyworktree_dir" ] && cd "$lazyworktree_dir" + } + ''; + + fish.functions.${cfg.shellWrapperName} = mkIf cfg.enableFishIntegration '' + set -l lazyworktree_dir (command lazyworktree $argv) + or return + + if test -n "$lazyworktree_dir"; and test -d "$lazyworktree_dir" + cd "$lazyworktree_dir" + end + ''; + }; }; }