1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-21 17:59:39 +01:00
home-manager/modules/programs/sesh.nix
Austin Horstman 86402a17b6 treewide: flatten single file modules
Some files don't need nesting and can be root level again to reduce
conflicts with other PRs.

Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
2025-06-23 16:20:26 -05:00

111 lines
3.4 KiB
Nix
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
pkgs,
lib,
config,
...
}:
let
inherit (lib)
mkEnableOption
mkIf
mkMerge
mkOption
mkPackageOption
types
;
cfg = config.programs.sesh;
tomlFormat = pkgs.formats.toml { };
in
{
meta.maintainers = [ lib.hm.maintainers.michaelvanstraten ];
options.programs.sesh = {
enable = mkEnableOption "the sesh terminal session manager";
package = mkPackageOption pkgs "sesh" { };
fzfPackage = mkPackageOption pkgs "fzf" { nullable = true; };
zoxidePackage = mkPackageOption pkgs "zoxide" { nullable = true; };
settings = mkOption {
type = types.submodule { freeformType = tomlFormat.type; };
default = { };
description = ''
Configuration for sesh, written to `~/.config/sesh/sesh.toml`.
See the [sesh documentation](https://github.com/joshmedeski/sesh#configuration) for available options.
'';
};
enableAlias = mkOption {
type = types.bool;
default = true;
description = "Whether to enable a shell alias `s` to quickly launch sessions.";
};
enableTmuxIntegration = mkOption {
type = types.bool;
default = true;
description = "Enable Tmux integration with sesh.";
};
tmuxKey = mkOption {
type = types.str;
default = "s";
description = "Keybinding for invoking sesh in Tmux.";
};
icons = mkOption {
type = types.bool;
default = true;
description = ''
Display icons next to results ({option}`--icons` argument).
'';
};
};
config =
let
args = lib.escapeShellArgs (lib.optional cfg.icons "--icons");
fzf-args = lib.escapeShellArgs (lib.optional cfg.icons "--ansi");
in
mkIf cfg.enable (mkMerge [
{
home.packages = [ cfg.package ];
home.file.".config/sesh/sesh.toml".source = tomlFormat.generate "sesh.toml" cfg.settings;
}
(mkIf cfg.enableAlias {
home.packages = lib.mkIf (cfg.fzfPackage != null) [ cfg.fzfPackage ];
home.shellAliases.s = "sesh connect $(sesh list ${args} | fzf ${fzf-args})";
})
(mkIf cfg.enableTmuxIntegration {
assertions = [
{
assertion = config.programs.fzf.tmux.enableShellIntegration;
message = "To use Tmux integration with sesh, enable `programs.fzf.tmux.enableShellIntegration`.";
}
];
home.packages = lib.mkIf (cfg.zoxidePackage != null) [ cfg.zoxidePackage ];
programs.tmux.extraConfig = ''
bind-key "${cfg.tmuxKey}" run-shell "sesh connect \"$(
sesh list ${args} | fzf-tmux -p 55%,60% \
--no-sort --ansi --border-label ' sesh ' --prompt ' ' \
--header ' ^a all ^t tmux ^g configs ^x zoxide ^d tmux kill ^f find' \
--bind 'tab:down,btab:up' \
--bind 'ctrl-a:change-prompt( )+reload(sesh list ${args})' \
--bind 'ctrl-t:change-prompt(🪟 )+reload(sesh list ${args} -t)' \
--bind 'ctrl-g:change-prompt( )+reload(sesh list ${args} -c)' \
--bind 'ctrl-x:change-prompt(📁 )+reload(sesh list ${args} -z)' \
--bind 'ctrl-f:change-prompt(🔎 )+reload(fd -H -d 2 -t d -E .Trash . ~)' \
--bind 'ctrl-d:execute(tmux kill-session -t {})+change-prompt( )+reload(sesh list ${args})' \
-- ${fzf-args}
)\""
'';
})
]);
}