This repository has no description
2.7 kB
71 lines
1{ self, inputs, ... }:
2{
3 perSystem =
4 { pkgs, ... }:
5 let
6 sessionManager = pkgs.writeShellScript "tmux-session-manager" ''
7 while true; do
8 existing=$(tmux list-sessions -F '#{session_name}: #{session_windows} windows (created #{session_created_string})#{?session_attached, (attached),}' 2>/dev/null)
9 [[ -z "$existing" ]] && break
10 chosen=$(echo -e ">>> new session <<<\n$existing" \
11 | ${pkgs.fzf}/bin/fzf --height=80% --reverse \
12 --header="Pick a tmux session (DEL to kill)" \
13 --expect=delete \
14 --preview='s={1}; s=''${s%:}; [ "$s" = ">>>" ] && echo "Create a new session" || tmux capture-pane -t "$s" -p -e 2>/dev/null' \
15 --preview-window=down:50%)
16 key=$(echo "$chosen" | head -1)
17 selection=$(echo "$chosen" | tail -1)
18 chosen_name=$(echo "$selection" | cut -d: -f1)
19 if [[ "$key" == "delete" && -n "$chosen_name" && "$chosen_name" != ">>> new session <<<" ]]; then
20 tmux kill-session -t "$chosen_name" 2>/dev/null
21 continue
22 fi
23 if [[ -n "$chosen_name" && "$chosen_name" != ">>> new session <<<" ]]; then
24 tmux switch-client -t "$chosen_name"
25 exit 0
26 fi
27 break
28 done
29 # Create a new session
30 session_name=$(${
31 self.packages.${pkgs.system}.name-generator
32 }/bin/name-generator 2>/dev/null || echo "session-$$")
33 tmux new-session -d -s "$session_name"
34 tmux switch-client -t "$session_name"
35 '';
36 tmuxConfigText = ''
37 set-option -g default-terminal screen-256color
38
39 # Enable extended keys (CSI u / modified key sequences)
40 set -s extended-keys on
41 set -as terminal-features 'xterm*:extkeys'
42
43 # Auto-destroy sessions when no clients attached (handles terminal close)
44 set -g destroy-unattached on
45
46 # Enable kitty graphics protocol passthrough
47 set -g allow-passthrough on
48 set -ga update-environment TERM
49 set -ga update-environment TERM_PROGRAM
50
51 # Session manager popup (prefix + s)
52 bind s display-popup -E -w 80% -h 80% "${sessionManager}"
53 '';
54 tmuxConfigFile = pkgs.writeText "tmux.conf" tmuxConfigText;
55 in
56 {
57 packages.tmux =
58 (inputs.wrappers.lib.wrapPackage {
59 pkgs = pkgs;
60 package = pkgs.tmux;
61 flags = {
62 "-f" = "${tmuxConfigFile}";
63 };
64 }).overrideAttrs
65 (old: {
66 passthru = (old.passthru or { }) // {
67 tmuxConfig = tmuxConfigText;
68 };
69 });
70 };
71}