This repository has no description
2.6 kB
68 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 # Enable kitty graphics protocol passthrough
44 set -g allow-passthrough on
45 set -ga update-environment TERM
46 set -ga update-environment TERM_PROGRAM
47
48 # Session manager popup (prefix + s)
49 bind s display-popup -E -w 80% -h 80% "${sessionManager}"
50 '';
51 tmuxConfigFile = pkgs.writeText "tmux.conf" tmuxConfigText;
52 in
53 {
54 packages.tmux =
55 (inputs.wrappers.lib.wrapPackage {
56 pkgs = pkgs;
57 package = pkgs.tmux;
58 flags = {
59 "-f" = "${tmuxConfigFile}";
60 };
61 }).overrideAttrs
62 (old: {
63 passthru = (old.passthru or { }) // {
64 tmuxConfig = tmuxConfigText;
65 };
66 });
67 };
68}