Skip to content

Instantly share code, notes, and snippets.

@chadaustin
Last active February 11, 2024 13:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chadaustin/d4696e18217a7de9b2671549abcb54c4 to your computer and use it in GitHub Desktop.
Save chadaustin/d4696e18217a7de9b2671549abcb54c4 to your computer and use it in GitHub Desktop.
my tmux config
# Detect the correct TERM value for new sessions.
# if-shell uses /bin/sh, so bashisms like [[ do not work.
if "[ $(tput colors) = 16777216 ]" {
set -g default-terminal "tmux-direct"
} {
if "[ $(tput colors) = 256 ]" {
set -g default-terminal "tmux-256color"
} {
set -g default-terminal "tmux"
}
}
# I use Emacs keybindings.
setw -g mode-keys emacs
# More terminal insanity. There's no correct value, but the
# half-second default adds noticeably latency.
# https://unix.stackexchange.com/a/608179/459183
#
# mintty uses an alternate, unambiguous keycode:
# https://github.com/mintty/mintty/wiki/CtrlSeqs#escape-keycode
set -s escape-time 200
# I can afford 50 MB of scrollback.
# Measured on WSL 1 with:
# yes $(python3 -c "print('y' * 80)")
set -g history-limit 100000
# When multiple clients are connected to a session, only resize
# windows to the smaller terminal's size if both clients are looking
# at the same window.
setw -g aggressive-resize on
# Forward window titles to the parent terminal, but only hostname and
# process.
set -g set-titles on
set -g set-titles-string "#h: #W"
# When there is activity in a window, set the window active flag,
# which gives a small visual indicator in the status line. But disable
# any messages or dings, by default.
set -g monitor-activity on
set -g activity-action none
# Make tmux "tabs" (called windows in tmux) work like iTerm2 and web
# browsers.
#
# Every other terminal counts from 1. Now the window numbers match the
# order of the numeric keys on a keyboard.
set -g base-index 1
setw -g pane-base-index 1
# Automatically renumber when they're created, closed, or moved, so
# that the window number always matches its index.
setw -g renumber-windows on
# My tmux muscle memory still wants C-b 0 to select the first window.
bind 0 select-window -t ":^"
# Other terminals and web browsers use 9 to focus the final tab.
bind 9 select-window -t ":$"
# Match iTerm2 by binding Alt-Number to the corresponding window. This
# does not conflict with any programs I use. Graphical UIs tend to
# either ignore M-0 or have it select the last tab.
bind -n "M-0" select-window -t ":^"
bind -n "M-1" select-window -t ":1"
bind -n "M-2" select-window -t ":2"
bind -n "M-3" select-window -t ":3"
bind -n "M-4" select-window -t ":4"
bind -n "M-5" select-window -t ":5"
bind -n "M-6" select-window -t ":6"
bind -n "M-7" select-window -t ":7"
bind -n "M-8" select-window -t ":8"
bind -n "M-9" select-window -t ":$"
# Match iTerm2's keybindings for selecting previous and next windows.
bind -n "M-{" previous-window
bind -n "M-}" next-window
# "C-b c" adds a window at the end. Have "C-b C-c" add a window after
# the current one.
bind "C-c" new-window -a
# I rarely remember how to move windows around, so add some slightly
# more convenient bindings.
bind "S-Left" {
swap-window -t -1
select-window -t -1
}
bind "S-Right" {
swap-window -t +1
select-window -t +1
}
# Additional key bindings.
# Incrementally searching backwards in the scrollback is one of the
# most common actions. Give it a dedicated keybinding. This turns
# "C-b [ C-r" into "C-b r".
bind r {
copy-mode
command-prompt -i -p "(search up)" \
"send-keys -X search-backward-incremental '%%%'"
}
# Toggle terminal mouse support.
bind m set-option -g mouse \; display "Mouse: #{?mouse,ON,OFF}"
# Toggle status bar. Useful for focusing in fullscreen mode. See Emacs
# writeroom-mode.
bind t set-option status
# Improve the status bar. The default status bar places the session ID
# to the left, but I rarely have more than one session. I do, however,
# care about the hostname, so hostname:session_id followed by month,
# day, and current time is useful context for the lower right.
set -g status-left " "
set -g status-right-length 60
set -g status-right " #h:#S %b %d %H:%M "
# If we support at least 256 colors, give the tmux status bar a nice
# amber glow, reminiscent of old amber phosphor CRTs. Also, render the
# active window with a slightly brighter background, so it stands out
# clearly.
if "[ $(tput colors) -ge 256 ]" {
set -g status-left-style "fg=black bg=colour130"
set -g status-right-style "bg=colour17 fg=orange"
set -g status-style "fg=black bg=colour130"
set -g message-style "fg=black bg=colour172"
# Current window should be slightly brighter.
set -g window-status-current-style "fg=black bg=colour172"
# Windows with activity should be very subtly highlighted.
set -g window-status-activity-style "fg=colour17 bg=colour130"
set -g mode-style "fg=black bg=colour172"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment