{ config, lib, pkgs, ... }: with lib; let cfg = config.my.programs.tmux; tmux-sessionizer = pkgs.writeShellApplication { name = "ts"; runtimeInputs = with pkgs; [ tmux findutils coreutils procps fd ]; text = '' #!/usr/bin/env bash if [[ $# -eq 1 ]]; then selected=$1 else selected=$(fd -gH '.git' ~/ --min-depth 1 --max-depth 5 --type d --prune --exec dirname {} | fzf) fi if [[ -z $selected ]]; then exit 0 fi selected_name=$(basename "$selected" | tr . _) if ! tmux has-session -t="$selected_name" 2> /dev/null; then tmux new-session -ds "$selected_name" -c "$selected" fi if [[ -z ''${TMUX+x} ]]; then tmux attach -t "$selected_name" else tmux switch-client -t "$selected_name" fi ''; }; in { options.my.programs.tmux = { enable = mkEnableOption "tmux"; autoAttach = mkEnableOption "autoAttach"; }; config = mkIf cfg.enable { my.shell.abbreviations.t = "tmux"; home-manager.users.moritz.home.packages = [ tmux-sessionizer ]; home-manager.users.moritz.programs = { tmux = { enable = true; clock24 = true; customPaneNavigationAndResize = true; keyMode = "vi"; mouse = true; newSession = true; prefix = "C-Space"; sensibleOnTop = false; plugins = with pkgs.tmuxPlugins; [ sensible tmux-fzf yank ]; }; fzf.tmux.enableShellIntegration = true; fish.interactiveShellInit = let insideVariables = [ "$TMUX" "$INSIDE_EMACS" "$EMACS" "$VIM" "$VSCODE_RESOLVING_ENVIRONMENT" ]; insideVariableMissing = concatStringsSep " && " (map (x: "test -z ${x}") insideVariables); in mkIf cfg.autoAttach '' if ! fish_is_root_user && test "$TERM_PROGRAM" != 'vscode' && ${insideVariableMissing} if test -z $tmux_autostarted set -x tmux_autostarted true ts end end ''; }; }; }