aboutsummaryrefslogtreecommitdiff
path: root/modules/terminal/system/programs/tmux.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/terminal/system/programs/tmux.nix')
-rw-r--r--modules/terminal/system/programs/tmux.nix164
1 files changed, 164 insertions, 0 deletions
diff --git a/modules/terminal/system/programs/tmux.nix b/modules/terminal/system/programs/tmux.nix
new file mode 100644
index 0000000..b947d95
--- /dev/null
+++ b/modules/terminal/system/programs/tmux.nix
@@ -0,0 +1,164 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}: let
+ cfg = config.collinux.terminal.programs.tmux;
+
+ scripts.bat = pkgs.writeShellScriptBin "battery.sh" ''
+ energy_now=$(cat /sys/class/power_supply/BAT0/energy_now)
+ energy_full=$(cat /sys/class/power_supply/BAT0/energy_full)
+ percentage=$((energy_now * 100 / energy_full))
+ printf "%.0f%%" "$percentage"
+ '';
+
+ scripts.primeProjects = pkgs.writeShellScriptBin "projects.sh" ''
+ FZF_DEFAULT_OPTS="--color bg:#1E1E2E,bg+:#313244,border:#313244,fg:#CDD6F4,fg+:#CDD6F4,header:#F38BA8,hl:#F38BA8,hl+:#F38BA8,info:#CBA6F7,label:#CDD6F4,marker:#B4BEFE,pointer:#F5E0DC,prompt:#CBA6F7,selected-bg:#45475A,spinner:#F5E0DC"
+
+ projects="
+ $(find $HOME/projects -maxdepth 1 -mindepth 1 -type d)
+ $HOME/Documents/brain2.0
+ $HOME/Music
+ $HOME/nixos
+ "
+ if [ $# -eq 1 ]; then
+ selected="$1"
+ else
+ selected="$(echo "$projects" | fzf --tmux --style=minimal --info=hidden $FZF_DEFAULT_OPTS)"
+ fi
+
+ [ -z "$selected" ] && exit
+
+ session_name="$(basename "$selected" | tr '.' '_')"
+
+ if tmux list-sessions | grep -q "^$session_name:"; then
+ # session already exists, switch to it
+ tmux switch -t "$session_name"
+ else
+ # session doesn't exist, create it and switch to it
+ tmux new-session -ds "$session_name" -c "$selected"
+ tmux switch -t "$session_name"
+ fi
+ '';
+
+ scripts.cleanSessions = pkgs.writeShellScriptBin "clean-sessions.sh" ''
+ current="$(tmux display-message -p '#S')"
+
+ tmux list-sessions -F '#S' | while read -r line; do
+ if [[ "$line" != "$current" && "$line" =~ ^[[:digit:]]+$ ]]; then
+ tmux kill-session -t "$line"
+ fi
+ done
+ '';
+
+ scripts.bar = pkgs.writeShellScriptBin "bar.sh" ''
+ text="#c6d0f5"
+ text_dark="#7F849C"
+ blue="#b3befe"
+ green="#a6d189"
+ red="#f38ba8"
+ bg_dark="#181825"
+ bg_light="#1E1E2E"
+
+ tset() {
+ tmux set -gq "$@"
+ }
+
+ tset status on
+
+ tset status-position bottom
+ tset status-justify absolute-centre
+ tset status-bg $bg_light
+
+ tset status-left-style fg=$green
+ tset status-left "  #{client_session} "
+
+ tset window-status-style fg=$text_dark
+ tset window-status-format "#I:#W"
+ tset window-status-current-style fg=$blue,bold
+ tset window-status-current-format "#I:#W"
+ tset window-status-separator " "
+
+ tset status-right-style fg=$red
+ tset status-right "#(${scripts.bat}/bin/battery.sh)"
+
+ ## pane borders
+ tset pane-border-style fg=$bg_dark,bg=$bg_dark
+ tset pane-active-border-style fg=$bg_dark,bg=$bg_dark
+
+ ## pane backgrounds
+ # Set the foreground/background color for the active window
+ tset window-active-style bg=$bg_light
+
+ # Set the foreground/background color for all other windows
+ tset window-style bg=$bg_dark
+ '';
+
+ plugins.tmux-resurrect = builtins.fetchGit {
+ url = "https://github.com/tmux-plugins/tmux-resurrect";
+ rev = "cff343cf9e81983d3da0c8562b01616f12e8d548";
+ };
+
+ tmux-conf = pkgs.writeText "tmux.conf" ''
+ # Resurrect
+ run-shell ${plugins.tmux-resurrect}/resurrect.tmux
+ set -g @resurrect-dir "$HOME/.local/share/tmux-resurrect"
+ set -g @resurrect-processes 'hx cmus cava nix-shell'
+
+ set -g mouse on
+
+ # bell
+ set -g visual-activity off
+ set -g visual-bell off
+ set -g visual-silence off
+ setw -g monitor-activity off
+ set -g bell-action none
+
+ # Panes
+ bind-key -n C-w kill-pane
+
+ bind -n C-Enter if -F '#{e|>:#{e|/:#{pane_width},#{pane_height}},2.5}' {
+ split-window -h -c '#{pane_current_path}'
+ } {
+ split-window -v -c '#{pane_current_path}'
+ }
+
+ unbind -n MouseDown3Pane ## disable right click menu
+ bind-key -n M-z resize-pane -Z ## Pane zoom
+
+ # Windows
+ bind-key -n C-t new-window -c '#{pane_current_path}'
+ bind-key -n C-Tab next-window
+ bind-key -n C-S-Tab previous-window # doesn't work in foot :(
+
+ set -g renumber-windows on
+ set -g allow-rename off
+
+ # Statusbar
+ set-hook -g client-attached 'if -F "#{==:#{session_windows},1}" { set status off } { set status on }'
+ set-hook -g window-linked 'if -F "#{==:#{session_windows},1}" { set status off } { set status on }'
+ set-hook -g window-unlinked 'if -F "#{==:#{session_windows},1}" { set status off } { set status on }'
+
+ run-shell "${scripts.bar}/bin/bar.sh"
+
+ # Sessions
+ # set-hook -ag client-detached 'run-shell ${scripts.cleanSessions}/bin/clean-sessions.sh'
+ # set-hook -ag client-session-changed 'run-shell ${scripts.cleanSessions}/bin/clean-sessions.sh'
+
+ bind-key -n C-f run-shell "${scripts.primeProjects}/bin/projects.sh"
+ bind-key -n M-1 run-shell "${scripts.primeProjects}/bin/projects.sh ~/Music"
+ bind-key -n M-2 run-shell "${scripts.primeProjects}/bin/projects.sh ~/Documents/brain2.0"
+ bind-key -n M-3 run-shell "${scripts.primeProjects}/bin/projects.sh ~/nixos"
+
+ bind-key -n C-g display-popup -E -w 80% -h 80% -x C -y C -d "#{pane_current_path}" "${pkgs.lazygit}/bin/lazygit"
+ '';
+in
+ lib.mkIf cfg.enable {
+ hjem.users."${config.collinux.user.name}" = {
+ files = {
+ ".config/tmux/tmux.conf".source = tmux-conf;
+ };
+ packages = [pkgs.tmux];
+ };
+ }