# ~/.tmux.conf.local - Personal tmux configuration # Oh my tmux! https://github.com/gpakosz/.tmux # Updated: 2025-01 # Cross-platform: Linux (Ubuntu) + macOS # ============================================================================== # BINDINGS # ============================================================================== tmux_conf_preserve_stock_bindings=false # ============================================================================== # SESSION CREATION # ============================================================================== tmux_conf_new_session_prompt=false tmux_conf_new_session_retain_current_path=false # ============================================================================== # WINDOWS & PANES # ============================================================================== tmux_conf_new_window_retain_current_path=false tmux_conf_new_window_reconnect_ssh=false tmux_conf_new_pane_retain_current_path=true tmux_conf_new_pane_reconnect_ssh=false # ============================================================================== # DISPLAY # ============================================================================== # Auto-detect 24-bit color support tmux_conf_24b_colour=auto # ============================================================================== # THEME # ============================================================================== tmux_conf_theme=enabled # Color palette (dark theme) tmux_conf_theme_colour_1="#080808" # dark gray tmux_conf_theme_colour_2="#303030" # gray tmux_conf_theme_colour_3="#8a8a8a" # light gray tmux_conf_theme_colour_4="#00afff" # light blue tmux_conf_theme_colour_5="#ffff00" # yellow tmux_conf_theme_colour_6="#080808" # dark gray tmux_conf_theme_colour_7="#e4e4e4" # white tmux_conf_theme_colour_8="#080808" # dark gray tmux_conf_theme_colour_9="#ffff00" # yellow tmux_conf_theme_colour_10="#ff00af" # pink tmux_conf_theme_colour_11="#5fff00" # green tmux_conf_theme_colour_12="#8a8a8a" # light gray tmux_conf_theme_colour_13="#e4e4e4" # white tmux_conf_theme_colour_14="#080808" # dark gray tmux_conf_theme_colour_15="#080808" # dark gray tmux_conf_theme_colour_16="#d70000" # red tmux_conf_theme_colour_17="#e4e4e4" # white # Window style tmux_conf_theme_window_fg="default" tmux_conf_theme_window_bg="default" # Pane settings tmux_conf_theme_highlight_focused_pane=false tmux_conf_theme_focused_pane_bg="$tmux_conf_theme_colour_2" tmux_conf_theme_pane_border_style=thin tmux_conf_theme_pane_border="$tmux_conf_theme_colour_2" tmux_conf_theme_pane_active_border="$tmux_conf_theme_colour_4" %if #{>=:#{version},3.2} tmux_conf_theme_pane_active_border="#{?pane_in_mode,$tmux_conf_theme_colour_9,#{?synchronize-panes,$tmux_conf_theme_colour_16,$tmux_conf_theme_colour_4}}" %endif # Pane indicator colours tmux_conf_theme_pane_indicator="$tmux_conf_theme_colour_4" tmux_conf_theme_pane_active_indicator="$tmux_conf_theme_colour_4" # Message/command style tmux_conf_theme_message_fg="$tmux_conf_theme_colour_1" tmux_conf_theme_message_bg="$tmux_conf_theme_colour_5" tmux_conf_theme_message_attr="bold" tmux_conf_theme_message_command_fg="$tmux_conf_theme_colour_5" tmux_conf_theme_message_command_bg="$tmux_conf_theme_colour_1" tmux_conf_theme_message_command_attr="bold" # Mode style tmux_conf_theme_mode_fg="$tmux_conf_theme_colour_1" tmux_conf_theme_mode_bg="$tmux_conf_theme_colour_5" tmux_conf_theme_mode_attr="bold" # ============================================================================== # STATUS BAR # ============================================================================== tmux_conf_theme_status_fg="$tmux_conf_theme_colour_3" tmux_conf_theme_status_bg="$tmux_conf_theme_colour_1" tmux_conf_theme_status_attr="none" # Terminal title tmux_conf_theme_terminal_title="#h โ #S โ— #I #W" # Window status tmux_conf_theme_window_status_fg="$tmux_conf_theme_colour_3" tmux_conf_theme_window_status_bg="$tmux_conf_theme_colour_1" tmux_conf_theme_window_status_attr="none" tmux_conf_theme_window_status_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" # Current window tmux_conf_theme_window_status_current_fg="$tmux_conf_theme_colour_1" tmux_conf_theme_window_status_current_bg="$tmux_conf_theme_colour_4" tmux_conf_theme_window_status_current_attr="bold" tmux_conf_theme_window_status_current_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" # Activity/bell/last window tmux_conf_theme_window_status_activity_fg="default" tmux_conf_theme_window_status_activity_bg="default" tmux_conf_theme_window_status_activity_attr="underscore" tmux_conf_theme_window_status_bell_fg="$tmux_conf_theme_colour_5" tmux_conf_theme_window_status_bell_bg="default" tmux_conf_theme_window_status_bell_attr="blink,bold" tmux_conf_theme_window_status_last_fg="$tmux_conf_theme_colour_4" tmux_conf_theme_window_status_last_bg="$tmux_conf_theme_colour_2" tmux_conf_theme_window_status_last_attr="none" # Powerline separators tmux_conf_theme_left_separator_main='\uE0B0' tmux_conf_theme_left_separator_sub='\uE0B1' tmux_conf_theme_right_separator_main='\uE0B2' tmux_conf_theme_right_separator_sub='\uE0B3' # Status left: session name + uptime tmux_conf_theme_status_left=" โ #S | โ†‘#{?uptime_y, #{uptime_y}y,}#{?uptime_d, #{uptime_d}d,}#{?uptime_h, #{uptime_h}h,}#{?uptime_m, #{uptime_m}m,} " # Status right: network info + mem/cpu + battery + time + user@host # Battery vars use #{?...} conditionals so they're safe on non-laptop systems tmux_conf_theme_status_right=" #(awk '/^# EOF$/,0' ~/.tmux.conf.local | cut -c3- | sh -s _local_ip)#(awk '/^# EOF$/,0' ~/.tmux.conf.local | cut -c3- | sh -s _gateway) #{prefix}#{mouse}#{pairing}#{synchronized} #(awk '/^# EOF$/,0' ~/.tmux.conf.local | cut -c3- | sh -s _mem_cpu)#(awk '/^# EOF$/,0' ~/.tmux.conf.local | cut -c3- | sh -s _battery_fallback) , %R , %d %b | #{username}#{root} | #{hostname} " # Status left colors: yellow, pink, green tmux_conf_theme_status_left_fg="$tmux_conf_theme_colour_6,$tmux_conf_theme_colour_7,$tmux_conf_theme_colour_8" tmux_conf_theme_status_left_bg="$tmux_conf_theme_colour_9,$tmux_conf_theme_colour_10,$tmux_conf_theme_colour_11" tmux_conf_theme_status_left_attr="bold,none,none" # Status right colors: gray, red, white tmux_conf_theme_status_right_fg="$tmux_conf_theme_colour_12,$tmux_conf_theme_colour_13,$tmux_conf_theme_colour_14" tmux_conf_theme_status_right_bg="$tmux_conf_theme_colour_15,$tmux_conf_theme_colour_16,$tmux_conf_theme_colour_17" tmux_conf_theme_status_right_attr="none,none,bold" # ============================================================================== # INDICATORS # ============================================================================== tmux_conf_theme_pairing="๐Ÿ‘“" tmux_conf_theme_pairing_fg="none" tmux_conf_theme_pairing_bg="none" tmux_conf_theme_pairing_attr="none" tmux_conf_theme_prefix="โŒจ" tmux_conf_theme_prefix_fg="none" tmux_conf_theme_prefix_bg="none" tmux_conf_theme_prefix_attr="none" tmux_conf_theme_mouse="โ†—" tmux_conf_theme_mouse_fg="none" tmux_conf_theme_mouse_bg="none" tmux_conf_theme_mouse_attr="none" tmux_conf_theme_root="!" tmux_conf_theme_root_fg="none" tmux_conf_theme_root_bg="none" tmux_conf_theme_root_attr="bold,blink" tmux_conf_theme_synchronized="๐Ÿ”’" tmux_conf_theme_synchronized_fg="none" tmux_conf_theme_synchronized_bg="none" tmux_conf_theme_synchronized_attr="none" # ============================================================================== # BATTERY # ============================================================================== tmux_conf_battery_bar_symbol_full="โ™ฅ" tmux_conf_battery_bar_symbol_empty="ยท" tmux_conf_battery_bar_length="auto" tmux_conf_battery_bar_palette="gradient" tmux_conf_battery_hbar_palette="gradient" tmux_conf_battery_vbar_palette="gradient" tmux_conf_battery_status_charging="๐Ÿ”Œ" tmux_conf_battery_status_discharging="๐Ÿ”‹" # ============================================================================== # CLOCK # ============================================================================== tmux_conf_theme_clock_colour="$tmux_conf_theme_colour_4" tmux_conf_theme_clock_style="24" # ============================================================================== # CLIPBOARD # ============================================================================== tmux_conf_copy_to_os_clipboard=false # ============================================================================== # URLSCAN # ============================================================================== tmux_conf_urlscan_options="--compact --dedupe" # ============================================================================== # USER CUSTOMIZATIONS (keybindings, settings) # ============================================================================== # Vi mode set -g status-keys vi set -g mode-keys vi # Prefix key: Alt-x (instead of C-b) set -gu prefix2 unbind C-a set -g prefix M-x bind M-x send-prefix # Mouse support set -g mouse on # Mouse scroll support bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'" # Split panes with | and - bind \\ split-window -h -c "#{pane_current_path}" bind - split-window -v -c "#{pane_current_path}" # Vim-style pane navigation (Alt + hjkl) bind -n M-h select-pane -L bind -n M-j select-pane -D bind -n M-k select-pane -U bind -n M-l select-pane -R # Arrow key pane navigation (Alt + arrows) bind -n M-Left select-pane -L bind -n M-Right select-pane -R bind -n M-Up select-pane -U bind -n M-Down select-pane -D # Pane resizing (prefix + hjkl) bind j resize-pane -D 5 bind k resize-pane -U 5 bind l resize-pane -R 5 bind h resize-pane -L 5 # Copy to system clipboard - cross-platform (Linux: xclip/xsel, macOS: pbcopy) # Uses a helper script approach for portability bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "sh -c 'if command -v pbcopy >/dev/null 2>&1; then pbcopy; elif command -v xclip >/dev/null 2>&1; then xclip -in -selection clipboard; elif command -v xsel >/dev/null 2>&1; then xsel --clipboard --input; else cat > /dev/null; fi'" bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "sh -c 'if command -v pbcopy >/dev/null 2>&1; then pbcopy; elif command -v xclip >/dev/null 2>&1; then xclip -in -selection clipboard; elif command -v xsel >/dev/null 2>&1; then xsel --clipboard --input; else cat > /dev/null; fi'" # Toggle synchronize-panes bind-key s set-window-option synchronize-panes\; display-message "synchronize-panes is now #{?pane_synchronized,on,off}" # Default shell - use zsh if available, otherwise fall back to default if-shell "command -v zsh >/dev/null 2>&1" "set-option -g default-shell /bin/zsh" # Aggressive resize set-window-option -g aggressive-resize # ============================================================================== # TPM PLUGINS # ============================================================================== # Plugin auto-update on launch/reload tmux_conf_update_plugins_on_launch=true tmux_conf_update_plugins_on_reload=true tmux_conf_uninstall_plugins_on_reload=true # Plugins (installed/updated automatically) set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @resurrect-processes 'vi vim nvim man less more tail top htop' set -g @plugin 'tmux-plugins/tmux-continuum' set -g @continuum-restore 'off' set -g @plugin 'thewtex/tmux-mem-cpu-load' # ============================================================================== # ============================================================================== # CUSTOM VARIABLES (cross-platform) # ============================================================================== # /!\ do not remove the following line # EOF # # # usage: #{local_ip} # # Cross-platform: Linux (ip/hostname) and macOS (ipconfig/route) # _local_ip() { # if command -v ip >/dev/null 2>&1; then # result=$(ip route get 8.8.8.8 2>/dev/null | grep -oP 'src \K[0-9.]+' | head -1) # [ -n "$result" ] && printf 'IP:%s' "$result" && return # fi # if [ "$(uname)" = "Darwin" ]; then # iface=$(route get 8.8.8.8 2>/dev/null | awk '/interface:/ {print $2}') # if [ -n "$iface" ]; then # result=$(ipconfig getifaddr "$iface" 2>/dev/null) # [ -n "$result" ] && printf 'IP:%s' "$result" && return # fi # fi # result=$(hostname -I 2>/dev/null | awk '{print $1}') # [ -n "$result" ] && printf 'IP:%s' "$result" && return # printf 'IP:offline' # } # # # usage: #{gateway} # # Cross-platform: Linux and macOS # _gateway() { # if command -v ip >/dev/null 2>&1; then # gw=$(ip route 2>/dev/null | awk '/default/ {print $3; exit}') # [ -n "$gw" ] && printf ' GW:%s' "$gw" && return # fi # if [ "$(uname)" = "Darwin" ]; then # gw=$(route -n get default 2>/dev/null | awk '/gateway:/ {print $2}') # [ -n "$gw" ] && printf ' GW:%s' "$gw" && return # fi # printf '' # } # # # usage: #{mem_cpu} # # Shows memory/CPU if tmux-mem-cpu-load plugin is installed # _mem_cpu() { # for path in "$HOME/.tmux/plugins/tmux-mem-cpu-load/tmux-mem-cpu-load" "/usr/local/bin/tmux-mem-cpu-load" "/usr/bin/tmux-mem-cpu-load"; do # if [ -x "$path" ]; then # "$path" --colors --powerline-right --interval 2 2>/dev/null # return # fi # done # if [ -f /proc/loadavg ]; then # load=$(cut -d' ' -f1-3 /proc/loadavg 2>/dev/null) # [ -n "$load" ] && printf 'Load:%s' "$load" && return # fi # if [ "$(uname)" = "Darwin" ]; then # load=$(sysctl -n vm.loadavg 2>/dev/null | awk '{print $2, $3, $4}') # [ -n "$load" ] && printf 'Load:%s' "$load" && return # fi # printf '' # } # # # usage: #{battery_fallback} # # Shows battery status or nothing on desktops/servers # _battery_fallback() { # if [ -d /sys/class/power_supply/BAT0 ]; then # cap=$(cat /sys/class/power_supply/BAT0/capacity 2>/dev/null) # status=$(cat /sys/class/power_supply/BAT0/status 2>/dev/null) # if [ -n "$cap" ]; then # icon="๐Ÿ”‹" # [ "$status" = "Charging" ] && icon="๐Ÿ”Œ" # printf '%s%s%%' "$icon" "$cap" # return # fi # fi # if [ "$(uname)" = "Darwin" ]; then # battery=$(pmset -g batt 2>/dev/null | grep -o '[0-9]*%' | head -1) # if [ -n "$battery" ]; then # charging=$(pmset -g batt 2>/dev/null | grep -q 'AC Power' && echo 1) # icon="๐Ÿ”‹" # [ -n "$charging" ] && icon="๐Ÿ”Œ" # printf '%s%s' "$icon" "$battery" # return # fi # fi # printf '' # } # # "$@" # # /!\ do not remove the previous line # # do not write below this line