{ config, lib, pkgs, ... }: with lib; let cfg = config.my.programs.tmux; fzf1 = pkgs.writeShellApplication { name = "fzf1"; runtimeInputs = with pkgs; [ coreutils fzf ]; text = '' #!/usr/bin/env bash options=$(fzf --filter "''$*" < /dev/stdin) if [[ -z $options ]]; then exit 1 elif [[ $(wc -l <<< "$options") -eq 1 ]]; then selected="$options" else selected=$(echo "$options" | fzf --query="$*") fi if [[ -z $selected ]]; then exit 0 fi echo "$selected" ''; }; tmux-switch = pkgs.writeShellApplication { name = "tmux-switch"; runtimeInputs = with pkgs; [ tmux ]; text = '' #!/usr/bin/env bash if [[ -z ''${TMUX+x} ]]; then tmux attach -t "$1" else tmux switch-client -t "$1" fi ''; }; tmux-sessionizer = pkgs.writeShellApplication { name = "ts"; runtimeInputs = with pkgs; [ tmux findutils coreutils procps fd fzf ]; text = '' #!/usr/bin/env bash selected=$(fd -HIg '.git' ~/ --min-depth 1 --max-depth 5 --type d --prune --exec dirname {} | ${getExe fzf1} "$*") 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 ${getExe tmux-switch} "$selected_name" ''; }; tmux-attach = pkgs.writeShellApplication { name = "ta"; runtimeInputs = with pkgs; [ tmux ]; text = '' #!/usr/bin/env bash selected=$(tmux list-sessions -F '#{session_name}' | ${getExe fzf1} "$*") ${getExe tmux-switch} "$selected" ''; }; in { options.my.programs.tmux = { enable = mkEnableOption "tmux"; autoAttach = mkEnableOption "autoAttach"; keybinds = mkOption { type = with types; attrsOf (attrsOf string); default = { }; description = "Keybinds for tmux"; example = literalExample '' { prefix = { "-" = "split-window -v"; "|" = "split-window -h"; }; copy-mode-vi = { "v" = "send -X begin-selection"; }; } ''; }; }; config = mkIf cfg.enable { my.shell.abbreviations.t = "tmux"; home-manager.users.moritz.home.packages = [ tmux-sessionizer tmux-attach ]; home-manager.users.moritz.programs = { tmux = { enable = true; clock24 = true; customPaneNavigationAndResize = true; keyMode = "vi"; mouse = true; prefix = "C-Space"; sensibleOnTop = false; plugins = with pkgs.tmuxPlugins; [ sensible tmux-fzf vim-tmux-navigator yank ]; extraConfig = let mkKeybind = table: mapAttrsToList (keybind: value: "bind-key -T ${table} '${keybind}' ${value}"); keybinds = flatten (mapAttrsToList mkKeybind cfg.keybinds); in '' # Keybinds ${concatStringsSep "\n" keybinds} ''; }; 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 ''; }; }; }