From 2a76a414a046494ecc6b1e4e9a2bd1149e0ff6bf Mon Sep 17 00:00:00 2001 From: Ismo Vuorinen Date: Tue, 14 Jan 2025 05:50:19 +0200 Subject: [PATCH] feat(config): split tmux config, add helpers --- config/exports | 7 +- config/tmux/config-keybinds.conf | 37 ++++++++ config/tmux/config-plugins.conf | 48 ++++++++++ config/tmux/config-settings.conf | 40 ++++++++ config/tmux/config-themes.conf | 16 ++++ config/tmux/rename-session.sh | 28 ++++++ config/tmux/theme-activate.sh | 16 ++++ config/tmux/tmux.conf | 155 +++---------------------------- 8 files changed, 203 insertions(+), 144 deletions(-) create mode 100644 config/tmux/config-keybinds.conf create mode 100644 config/tmux/config-plugins.conf create mode 100644 config/tmux/config-settings.conf create mode 100644 config/tmux/config-themes.conf create mode 100755 config/tmux/rename-session.sh create mode 100755 config/tmux/theme-activate.sh diff --git a/config/exports b/config/exports index eda8025..599e883 100755 --- a/config/exports +++ b/config/exports @@ -469,11 +469,12 @@ export TF_PLUGIN_CACHE_DIR="$XDG_CACHE_HOME/terraform/plugin-cache" # https://tmux.github.io/ msg "Setting up tmux configuration" export TMUX_TMPDIR="$XDG_STATE_HOME/tmux" -export TMUX_PLUGINS="$XDG_CONFIG_HOME/tmux/plugins" -export TMUX_CONF="$XDG_CONFIG_HOME/tmux/tmux.conf" +export TMUX_CONF_DIR="$XDG_CONFIG_HOME/tmux" +export TMUX_PLUGINS="$TMUX_CONF_DIR/plugins" +export TMUX_CONF="$TMUX_CONF_DIR/tmux.conf" ## These settings are for zsh-tmux export ZSH_TMUX_AUTOSTART=false -export ZSH_TMUX_CONFIG="$DOTFILES/config/tmux/tmux.conf" +export ZSH_TMUX_CONFIG="$TMUX_CONF" export ZSH_TMUX_UNICODE=true export ZSH_TMUX_AUTOQUIT=false export ZSH_TMUX_DEFAULT_SESSION_NAME=main diff --git a/config/tmux/config-keybinds.conf b/config/tmux/config-keybinds.conf new file mode 100644 index 0000000..a450d99 --- /dev/null +++ b/config/tmux/config-keybinds.conf @@ -0,0 +1,37 @@ +# ╭──────────────────────────────────────────────────────────╮ +# │ Bindings │ +# ╰──────────────────────────────────────────────────────────╯ +# bind flags +# -r = repeatable, only needs prefix once +# -n = doesn't need prefix +# -t = binds to a certain key-table (root, copy-mode, prefix, etc.) + +# Set to Control + Space, keeping the default of C-b intact. +# C-Space send-prefix line doubles the prefix when in nested tmux session. +set -g prefix C-Space +bind C-Space send-prefix + +# Use Alt-arrow keys without prefix key to switch panes +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 + +# Easier switching between window +bind C-n next-window +bind C-p previous-window +bind C-a last-window + +# Reload tmux config with + r +unbind r +bind r "source-file ~/.dotfiles/config/tmux/tmux.conf; display 'tmux cfg reloaded!'" + +# copy mode using 'Esc' +unbind [ +bind Escape copy-mode + +# paste using 'p' +unbind p +bind p paste-buffer + +# vim: ft=tmux ts=2 sw=2 et diff --git a/config/tmux/config-plugins.conf b/config/tmux/config-plugins.conf new file mode 100644 index 0000000..e6709ac --- /dev/null +++ b/config/tmux/config-plugins.conf @@ -0,0 +1,48 @@ +# ╭──────────────────────────────────────────────────────────╮ +# │ Plugins │ +# ╰──────────────────────────────────────────────────────────╯ + +# ── Plugins related configurations ──────────────────────────────────── + +# Plugin that lets you suspend local tmux session, +# so that you can work with nested remote tmux session painlessly. +# https://github.com/MunifTanjim/tmux-suspend +set -g @suspend_key 'F12' + +## A plugin to name your tmux windows smartly. +## https://github.com/ofirgall/tmux-window-name +### Maximum name length of a window +set -g @tmux_window_name_max_name_len "20" +### Replace $HOME with ~ in window names +set -g @tmux_window_dir_programs "['nvim', 'vim', 'vi', 'git']" +set -g @tmux_window_name_ignored_programs "['sqlite3', 'antidote', 'direnv', 'md5']" # Default is [] +set -g @tmux_window_name_shells "['bash', 'fish', 'sh', 'zsh']" +set -g @tmux_window_name_substitute_sets "[('.+ipython2', 'ipython2'), ('.+ipython3', 'ipython3'), ('.+\.local', '.local'), ('.+asdf', 'asdf')]" +set -g @tmux_window_name_use_tilde "True" + +# https://github.com/erikw/tmux-dark-notify +set -g @dark-notify-theme-path-light "$TMUX_CONF_DIR/theme-light.conf" +set -g @dark-notify-theme-path-dark "$TMUX_CONF_DIR/theme-dark.conf" + +## https://github.com/MunifTanjim/tmux-mode-indicator +set -g @mode_indicator_copy_mode_style 'bg=default,fg=yellow' +set -g @mode_indicator_empty_mode_style 'bg=default,fg=#7aa2f7' +set -g @mode_indicator_prefix_mode_style 'bg=default,fg=#7aa2f7' +set -g @mode_indicator_sync_mode_style 'bg=default,fg=red' + +# https://github.com/wfxr/tmux-fzf-url +set -g @fzf-url-bind 'u' +set -g @fzf-url-history-limit '2000' + +# ── Sourcing the plugins ────────────────────────────────────────────── + +run-shell "$TMUX_PLUGINS/tmux-sensible/sensible.tmux" +run-shell "$TMUX_PLUGINS/tmux-window-name/tmux_window_name.tmux" +run-shell "$TMUX_PLUGINS/tmux-mode-indicator/mode_indicator.tmux" +run-shell "$TMUX_PLUGINS/tmux-suspend/suspend.tmux" +run-shell "$TMUX_PLUGINS/tmux-yank/yank.tmux" +run-shell "$TMUX_PLUGINS/tmux-current-pane-hostname/current_pane_hostname.tmux" +run-shell "$TMUX_PLUGINS/tmux-dark-notify/main.tmux" +run-shell "$TMUX_PLUGINS/tmux-fzf-url/fzf-url.tmux" + +# vim: ft=tmux ts=2 sw=2 et diff --git a/config/tmux/config-settings.conf b/config/tmux/config-settings.conf new file mode 100644 index 0000000..c7795d7 --- /dev/null +++ b/config/tmux/config-settings.conf @@ -0,0 +1,40 @@ +# ╭──────────────────────────────────────────────────────────╮ +# │ Settings │ +# ╰──────────────────────────────────────────────────────────╯ +# set [flags] [command] [value] +# Flags can be combined, e.g. -as +# -a : Append the value to the existing setting. +# -s : Apply the setting to the current session. +# -g : Apply the setting globally to all sessions. +# -o : Set the option only if it is not already set. +# -u : Unset the specified option. + +set -g default-terminal "tmux-256color" # Set default terminal to 256 colors +set -g detach-on-destroy off # don't detach tmux when killing a session +set -g display-time 0 # Hide clock +set -g focus-events on # Focus events enabled for terminals that support them +set -g mouse on # Mouse support +set -g set-titles on # Allow tmux to set the terminal title +set -g status on # Setting status on +set -g status-keys vi # vi keys to move between panes + +# Activity Monitoring (for when something happens in another pain) +set -g monitor-activity on +set -g visual-activity off +set -g visual-bell off + +# A bell in another window should cause a bell in the current window +set -g bell-action any + +# Keep Tmux alive when the initial command is finished +set -g remain-on-exit off + +# Start windows and panes at 1, not 0 +set -g base-index 1 +set -g pane-base-index 1 +set -g renumber-windows on + +# Activate with `DEBUG=1 tmux -vv` +if-shell '[ "$DEBUG" = "1" ]' 'set -g debug-file ~/.cache/tmux-debug.log' + +# vim: ft=tmux ts=2 sw=2 et diff --git a/config/tmux/config-themes.conf b/config/tmux/config-themes.conf new file mode 100644 index 0000000..5df290d --- /dev/null +++ b/config/tmux/config-themes.conf @@ -0,0 +1,16 @@ +# ╭──────────────────────────────────────────────────────────╮ +# │ Theme │ +# ╰──────────────────────────────────────────────────────────╯ + +set -g pane-active-border-style "fg=#7aa2f7" +set -g pane-border-style "fg=#3b4261" +set -g status-justify "left" +set -g status-left '' +set -g status-left-length "0" +set -g status-position "bottom" +set -g status-right "#S@#{hostname_short} #{tmux_mode_indicator}" +set -g status-right-length "30" +set -g window-status-current-format ' #I:#W#{?window_zoomed_flag, ◈ ,} ' +set -g window-status-format ' #I:#W ' + +# vim: ft=tmux ts=2 sw=2 et diff --git a/config/tmux/rename-session.sh b/config/tmux/rename-session.sh new file mode 100755 index 0000000..84aaf7e --- /dev/null +++ b/config/tmux/rename-session.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# Default session name +DEFAULT_NAME="main" + +# Current session +CURRENT_SESSION=$(tmux display-message -p "#{session_name}") + +# Check that the session has a name +if [ "$CURRENT_SESSION" = "#{session_name}" ] || [ "$CURRENT_SESSION" = "0" ]; then + # Check if the default name is already in use + if tmux has-session -t "$DEFAULT_NAME" 2> /dev/null; then + # Query the user for a new name + echo "Session name '$DEFAULT_NAME' is already in use. Enter a new name:" + read -r NEW_NAME + while tmux has-session -t "$NEW_NAME" 2> /dev/null || [ -z "$NEW_NAME" ]; do + echo "Name '$NEW_NAME' is invalid or already in use. Enter a new name:" + read -r NEW_NAME + done + # Rename the session with the new name + tmux rename-session -t "$(tmux display-message -p "#{session_id}")" "$NEW_NAME" + exit 0 + else + # Rename the session with the default name + tmux rename-session -t "$(tmux display-message -p "#{session_id}")" "$DEFAULT_NAME" + exit 0 + fi +fi diff --git a/config/tmux/theme-activate.sh b/config/tmux/theme-activate.sh new file mode 100755 index 0000000..56d89de --- /dev/null +++ b/config/tmux/theme-activate.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# If our dark/light theme switching theme file can be found, +# source it in tmux. This is a separate file to keep the +# current theme settings separate from the main tmux configuration. +# +# This script requires the following in your tmux.conf: +# `run-shell "./theme-activate.sh"` +# and having the tmux-dark-notify plugin installed. +# +# Author: Ismo Vuorinen 2025 +# License: MIT + +THEME_FILE="$HOME/.local/state/tmux/tmux-dark-notify-theme.conf" + +[[ -e $THEME_FILE ]] && tmux source-file "$THEME_FILE" diff --git a/config/tmux/tmux.conf b/config/tmux/tmux.conf index ecdc8a8..0cbd4b6 100644 --- a/config/tmux/tmux.conf +++ b/config/tmux/tmux.conf @@ -4,149 +4,22 @@ # - https://tmuxguide.readthedocs.io/en/latest/tmux/tmux.html # - https://github.com/dreamsofcode-io/tmux/blob/main/tmux.conf -# ╭──────────────────────────────────────────────────────────╮ -# │ Settings │ -# ╰──────────────────────────────────────────────────────────╯ -# set [flags] [command] [value] -# Flags can be combined, e.g. -as -# -a : Append the value to the existing setting. -# -s : Apply the setting to the current session. -# -g : Apply the setting globally to all sessions. -# -o : Set the option only if it is not already set. -# -u : Unset the specified option. +# Load the configuration settings +source-file "$TMUX_CONF_DIR/config-settings.conf" -set -g default-terminal "tmux-256color" -# set -ag terminal-overrides ",xterm-256color:RGB" +# Load the theme settings +source-file "$TMUX_CONF_DIR/config-themes.conf" -# undercurl -set -as terminal-overrides ',*:Smulx=\E[4::%p1%dm' # undercurl support -set -as terminal-overrides ',*:Setulc=\E[58::2::::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m' # underscore colors - needs tmux-3.0 +# Load the keybindings +source-file "$TMUX_CONF_DIR/config-keybinds.conf" -# Enable hyperlinks -# set -as terminal-overrides ',*:Hls=\E]8;id=%p1%s;%p2%s\E\\:Hlr=\E]8;;\E\\'' +# Load the plugins and plugin settings +source-file "$TMUX_CONF_DIR/config-plugins.conf" -set -g status-keys vi # vi keys to move between panes -set -g detach-on-destroy off # don't detach tmux when killing a session -set -g display-time 0 # Hide clock -set -g focus-events on # Focus events enabled for terminals that support them -set -g mouse on # Mouse support -set -g set-titles "on" # Allow tmux to set the terminal title -set -g set-titles on # Expose window title -set -g status "on" # Setting status on +# Load theme based on tmux-dark-notify state. +# This script helps states where dark-notify is not available, +# and we want to have light or dark state constantly available. +run-shell "$TMUX_CONF_DIR/theme-activate.sh" -# Activity Monitoring (for when something happens in another pain) -set -g monitor-activity on -set -g visual-activity off -set -g visual-bell off - -# A bell in another window should cause a bell in the current window -set -g bell-action any - -# Keep Tmux alive when the initial command is finished -set -g remain-on-exit off - -# Start windows and panes at 1, not 0 -set -g base-index 1 -set -g pane-base-index 1 -set -g renumber-windows on - -# ╭──────────────────────────────────────────────────────────╮ -# │ Theme │ -# ╰──────────────────────────────────────────────────────────╯ - -set -g pane-active-border-style "fg=#7aa2f7" -set -g pane-border-style "fg=#3b4261" -set -g status-justify "left" -set -g status-left '' -set -g status-left-length "0" -set -g status-position "bottom" -set -g status-right "#S@#{hostname_short} #{tmux_mode_indicator}" -set -g status-right-length "30" -set -g window-status-current-format ' #I:#W#{?window_zoomed_flag, ◈ ,} ' -set -g window-status-format ' #I:#W ' - -# ╭──────────────────────────────────────────────────────────╮ -# │ Plugins related configurations │ -# ╰──────────────────────────────────────────────────────────╯ - -# Plugin that lets you suspend local tmux session, -# so that you can work with nested remote tmux session painlessly. -# https://github.com/MunifTanjim/tmux-suspend -set -g @suspend_key 'F12' - -## A plugin to name your tmux windows smartly. -## https://github.com/ofirgall/tmux-window-name -### Maximum name length of a window -set -g @tmux_window_name_max_name_len "20" -### Replace $HOME with ~ in window names -set -g @tmux_window_dir_programs "['nvim', 'vim', 'vi', 'git']" -set -g @tmux_window_name_ignored_programs "['sqlite3', 'antidote', 'direnv', 'md5']" # Default is [] -set -g @tmux_window_name_shells "['bash', 'fish', 'sh', 'zsh']" -set -g @tmux_window_name_substitute_sets "[('.+ipython2', 'ipython2'), ('.+ipython3', 'ipython3'), ('.+\.local', '.local'), ('.+asdf', 'asdf')]" -set -g @tmux_window_name_use_tilde "True" - -# https://github.com/erikw/tmux-dark-notify -set -g @dark-notify-theme-path-light '~/.dotfiles/config/tmux/theme-light.conf' -set -g @dark-notify-theme-path-dark '~/.dotfiles/config/tmux/theme-dark.conf' - -## https://github.com/MunifTanjim/tmux-mode-indicator -set -g @mode_indicator_copy_mode_style 'bg=default,fg=yellow' -set -g @mode_indicator_empty_mode_style 'bg=default,fg=#7aa2f7' -set -g @mode_indicator_prefix_mode_style 'bg=default,fg=#7aa2f7' -set -g @mode_indicator_sync_mode_style 'bg=default,fg=red' - -# https://github.com/wfxr/tmux-fzf-url -set -g @fzf-url-bind 'u' -set -g @fzf-url-history-limit '2000' - -# ╭──────────────────────────────────────────────────────────╮ -# │ Bindings │ -# ╰──────────────────────────────────────────────────────────╯ -# bind flags -# -r = repeatable, only needs prefix once -# -n = doesn't need prefix -# -t = binds to a certain key-table (root, copy-mode, prefix, etc.) - -# Set to Control + Space, keeping the default of C-b intact. -# C-Space send-prefix line doubles the prefix when in nested tmux session. -set -g prefix C-Space -bind C-Space send-prefix - -# Use Alt-arrow keys without prefix key to switch panes -bind -n M-Down select-pane -D -bind -n M-Left select-pane -L -bind -n M-Right select-pane -R -bind -n M-Up select-pane -U - -# Easier switching between window -bind C-n next-window -bind C-p previous-window -bind C-a last-window - -# Reload tmux config with + r -unbind r -bind r "source-file ~/.dotfiles/config/tmux/tmux.conf; display 'tmux cfg reloaded!'" - -# copy mode using 'Esc' -unbind [ -bind Escape copy-mode - -# paste using 'p' -unbind p -bind p paste-buffer - -# ╭──────────────────────────────────────────────────────────╮ -# │ Plugins │ -# ╰──────────────────────────────────────────────────────────╯ - -run-shell ~/.dotfiles/config/tmux/plugins/tmux-sensible/sensible.tmux -run-shell ~/.dotfiles/config/tmux/plugins/tmux-window-name/tmux_window_name.tmux -run-shell ~/.dotfiles/config/tmux/plugins/tmux-mode-indicator/mode_indicator.tmux -run-shell ~/.dotfiles/config/tmux/plugins/tmux-suspend/suspend.tmux -run-shell ~/.dotfiles/config/tmux/plugins/tmux-yank/yank.tmux -run-shell ~/.dotfiles/config/tmux/plugins/tmux-current-pane-hostname/current_pane_hostname.tmux -run-shell ~/.dotfiles/config/tmux/plugins/tmux-dark-notify/main.tmux -run-shell ~/.dotfiles/config/tmux/plugins/tmux-fzf-url/fzf-url.tmux - -if-shell "test -e $HOME/.local/state/tmux/tmux-dark-notify-theme.conf" \ - "source-file $HOME/.local/state/tmux/tmux-dark-notify-theme.conf" +# If we started tmux with a session name, rename it. +run-shell "$TMUX_CONF_DIR/rename-session.sh"