Compare commits

...

46 Commits

Author SHA1 Message Date
416dc73906 Adjust layout width divisor
More closely match the width/height ration to how the fonts is rendered,
making the ratio of 100 closer to square.
2026-01-02 11:43:35 +00:00
df7a4d581b Implement macOS status-right-length increase 2025-12-04 16:44:50 +00:00
c2ff680dd3 Actually do version comparison for display-popup 2025-12-04 16:44:25 +00:00
9bce4090fa Use iSMC instead of custom cpu-temp tool
Fixes #10
2025-11-26 22:49:01 +00:00
e0537d5fd1 Don't use >= in TMUX_VERSION comparisons 2025-11-24 22:44:55 +00:00
effbc648f8 Use TMUX_LAYOUT_FULLSCREEN instead of heuristic
Only change `window-wide-left`/`window-wide-right` to 63%/37% split when
`TMUX_LAYOUT_FULLSCREEN=1`.
2025-11-23 10:42:36 +00:00
e500aaef7b Add binding to use window-auto layout 2025-11-23 10:42:11 +00:00
e59cea9249 Use bash not sh in wide window layouts 2025-11-18 10:39:22 +00:00
05c67a2e90 Adjust wide window layouts for wider configs 2025-11-18 10:38:20 +00:00
19e9306008 Fix indexing into icon char buffers 2025-11-11 21:44:54 +00:00
4635fc169d Add work session layout 2025-11-11 09:49:18 +00:00
60e95c36a6 Don't use display-popup in tmux 3.2 and lower 2025-11-09 20:08:05 +00:00
8c6231616c Change macOS CPU temp sensor 2025-11-06 21:15:51 +00:00
cc130f0c4d Add kill-window binding 2025-08-19 15:35:22 +01:00
e3dd81ed15 Add project bind to select ~/Projects 2025-08-19 15:35:18 +01:00
aa9ff89aa5 Don't use Ctrl in display-popup bindings 2025-08-19 15:27:34 +01:00
3d3a56e0ee Reintroduce cpu-temp in system-info on macOS 2025-07-29 15:37:16 +01:00
3444e1083b Use which not where 2025-07-08 15:09:16 +01:00
81378e08d0 Call exit in interpreter.sh 2025-07-01 11:04:35 +01:00
4f770fd649 Add popup to choose an interpreter and launch it 2025-06-28 12:21:26 +01:00
85ba6d45d1 Make popup terminal border match fzf style 2025-06-28 11:47:48 +01:00
002c2ba9b8 Add session switcher popup binding 2025-06-27 12:16:02 +01:00
8c92370420 Move theme into separate file 2025-06-27 12:14:00 +01:00
3ce1f3d43c Add C-<Space> C-t binding for shell popup 2025-06-24 13:58:10 +01:00
c3109181d6 Enable C-v for toggling rectangle selection in copy mode 2025-06-23 20:13:13 +01:00
09fdaebbe7 Add more vim like copy-mode bindings 2025-06-22 20:59:25 +01:00
d0bc106279 Use btop when available in visor session 2025-01-01 22:31:07 +00:00
38f5bb7f9c Make install.sh work on base 3.2 (for macOS) 2024-10-10 18:16:58 +01:00
9964392ee0 Fix session-config use of old local session name 2024-08-09 10:29:00 +01:00
6580e0b883 Rename local session to config 2024-08-06 10:48:09 +01:00
c18df0825b system-info: Always have a space before battery %age 2024-07-23 23:22:05 +01:00
2005b6140f Don't split home on local session layout 2024-07-03 23:47:06 +01:00
d874f095a4 Add infra session layout 2024-07-01 23:34:48 +01:00
360f5d0115 Don't specify %age in window-auto for 50% split 2024-06-19 18:38:16 +01:00
71f3ff3659 Fix install.sh where ~ does expand inside associative array 2024-04-28 16:33:20 +01:00
0924e6174e Fixup session-local layout 2024-04-20 15:26:57 +01:00
3391ae2eb5 Tune window-auto for smaller terminals 2024-04-16 19:17:21 +01:00
7fd94d4f10 Enable standalone install with install.sh
Move away from being dependant on Ansible task.yaml config setup and
move all login into install.sh to support installing tmux config just by
cloning and running the script.
2024-04-13 16:28:55 +01:00
896a9e09d3 Fix bug in window-auto layout 2024-04-12 23:45:56 +01:00
f02e0a20f6 Add work config to local layout if extant 2024-04-12 23:43:56 +01:00
85c11bc57c Fix window-auto session to use current pane directory 2024-04-12 23:39:45 +01:00
cc475b4400 Fix hardcoded use of /usr/bin/zsh instead of via env 2024-04-12 23:23:14 +01:00
2c859ddd93 Fix window-auto when using in session layouts 2024-04-12 22:10:56 +01:00
14894bdf47 Fix garbage on session start
Use the workaround mentioned in
https://github.com/microsoft/WSL/issues/5931 to stop garbage being
output when starting a new session.
2024-04-12 21:43:50 +01:00
b9a82c93d9 Use window-auto layout in session layouts 2024-04-12 21:06:03 +01:00
7bc20823de Add meta window layout that automatically chooses split 2024-04-12 21:06:03 +01:00
21 changed files with 305 additions and 106 deletions

View File

@@ -3,7 +3,7 @@
session_name=$(tmux display-message -p '#S')
session_layout=~/.local/share/tmux/layouts/session-$session_name
if [ -f $session_layout ]; then
tmux source-file $session_layout
$session_layout
else
tmux rename-window home
fi

45
install.sh Executable file
View File

@@ -0,0 +1,45 @@
#!/usr/bin/env bash
if [ ! -d $HOME/.local/share/tmux/layouts ]; then
mkdir -p $HOME/.local/share/tmux/layouts
echo changed created layouts directory
fi
symlink() {
local source=$1
local dest=$2
if [ -L $dest ]; then
local target=`readlink $dest`
if [ "$target" != "$source" ]; then
rm $dest
ln -s $source $dest
echo changed replace incorrect symlink $dest
fi
elif [ -f $dest ]; then
error symlink failed $dest exists but is a regular file
else
ln -s $source $dest
echo changed created symlink $dest
fi
}
symlink $HOME/.config/tmux/tmux.conf \
$HOME/.tmux.conf
symlink $HOME/.config/tmux/layouts/session-config \
$HOME/.local/share/tmux/layouts/session-config
symlink $HOME/.config/tmux/layouts/session-infra \
$HOME/.local/share/tmux/layouts/session-infra
symlink $HOME/.config/tmux/layouts/session-main \
$HOME/.local/share/tmux/layouts/session-main
symlink $HOME/.config/tmux/layouts/session-visor \
$HOME/.local/share/tmux/layouts/session-visor
symlink $HOME/.config/tmux/layouts/session-work \
$HOME/.local/share/tmux/layouts/session-work
symlink $HOME/.config/tmux/layouts/window-auto \
$HOME/.local/share/tmux/layouts/window-auto
symlink $HOME/.config/tmux/layouts/window-tall \
$HOME/.local/share/tmux/layouts/window-tall
symlink $HOME/.config/tmux/layouts/window-wide-left \
$HOME/.local/share/tmux/layouts/window-wide-left
symlink $HOME/.config/tmux/layouts/window-wide-right \
$HOME/.local/share/tmux/layouts/window-wide-right

32
interpreter.sh Executable file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -e
interpreters=()
add() {
local interp=$1
if command -v $interp &> /dev/null; then
interpreters+=($(which $interp))
fi
}
add ipython
add python
add cling
add lua
add luajit
add node
add bash
add zsh
add fish
interpreter=$(
echo "${interpreters[@]}" | tr ' ' '\n' |
fzf --layout=reverse --info=hidden --border=none --cycle
)
$interpreter
exit

28
layouts/session-config Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/env zsh
tmux rename-window home
tmux new-window -c ~/.config/nvim
tmux rename-window config/nvim
`dirname $0`/window-auto
tmux new-window -c ~/.config/zsh
tmux rename-window config/zsh
`dirname $0`/window-auto
tmux new-window -c ~/.config/tmux
tmux rename-window config/tmux
`dirname $0`/window-auto
if [ -d ~/.config/work ]; then
tmux new-window -c ~/.config/work
tmux rename-window config/work
`dirname $0`/window-auto
fi
tmux new-window -c ~/.config/local
tmux rename-window config/local
tmux move-window -s config:config/local -t 9
`dirname $0`/window-auto
tmux select-window -t config:home

12
layouts/session-infra Executable file
View File

@@ -0,0 +1,12 @@
#!/usr/bin/env zsh
tmux rename-window home
for entry in ~/Projects/infra/*; do
if [ ! -d $entry ]; then
continue
fi
tmux new-window -c $entry
tmux rename-window $(basename $entry)
`dirname $0`/window-auto
done

View File

@@ -1,20 +0,0 @@
#!/usr/bin/env -S tmux source-file
rename-window home
new-window -c ~/.config/nvim
rename-window config/nvim
new-window -c ~/.config/zsh
rename-window config/zsh
new-window -c ~/.config/tmux
rename-window config/tmux
new-window -c ~/.config/local
rename-window config/local
move-window -s local:config/local -t 9
select-window -t local:home
# vim: ft=tmux

View File

@@ -1,6 +1,5 @@
#!/usr/bin/env -S tmux source-file
#!/usr/bin/env zsh
rename-session main
rename-window home
# vim: ft=tmux
tmux rename-session main
tmux rename-window home
`dirname $0`/window-auto

View File

@@ -1,7 +1,9 @@
#!/usr/bin/env -S tmux source-file
rename-window home
split-window -h htop
if 'command -v btop &> /dev/null' \
'split-window -h btop' \
'split-window -h htop'
select-pane -t visor:home.1
# vim: ft=tmux

9
layouts/session-work Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env sh
tmux rename-window work
tmux rename-window home
$(dirname $0)/window-auto
tmux new-window -c ~/Projects/modularml/modular
tmux rename-window modularml/modular
$(dirname $0)/window-auto

27
layouts/window-auto Executable file
View File

@@ -0,0 +1,27 @@
#!/usr/bin/env zsh
cols=`tmux display -p "#{pane_width}"`
lines=`tmux display -p "#{pane_height}"`
width=$(( $cols / 2.5 ))
height=$lines.0
ratio=$(( ($width / $height) * 100 ))
if [[ $cols -lt 140 ]] && [[ $lines -lt 70 ]]; then
# terminal is too small
exit
fi
if [[ $ratio -ge 100 ]]; then
# terminal is wide or square
if [[ $cols -gt 240 ]]; then
# terminal is wide and large
`dirname $0`/window-wide-right
else
# terminal is wide and small
tmux split-window -h -c '#{pane_current_path}'
tmux select-pane -t 1
fi
else
# terminal is tall
`dirname $0`/window-tall
fi

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env -S tmux source-file
split-window -v -l 34%
split-window -v -l 34% -c '#{pane_current_path}'
select-pane -t 1
# vim: ft=tmux

View File

@@ -1,6 +1,11 @@
#!/usr/bin/env -S tmux source-file
#!/usr/bin/env bash
split-window -h -l 43%
select-pane -t 1
cols=`tmux display -p "#{pane_width}"`
# vim: ft=tmux
if [ "$LAYOUT_FULLSCREEN" = "1" ]; then
tmux split-window -h -l 37% -c '#{pane_current_path}'
tmux select-pane -t 1
else
tmux split-window -h -l 43% -c '#{pane_current_path}'
tmux select-pane -t 1
fi

View File

@@ -1,6 +1,11 @@
#!/usr/bin/env -S tmux source-file
#!/usr/bin/env bash
split-window -h -l 57%
select-pane -t 1
cols=`tmux display -p "#{pane_width}"`
# vim: ft=tmux
if [ "$TMUX_LAYOUT_FULLSCREEN" = "1" ]; then
tmux split-window -h -l 63% -c '#{pane_current_path}'
tmux select-pane -t 1
else
tmux split-window -h -l 57% -c '#{pane_current_path}'
tmux select-pane -t 1
fi

20
project.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -e
projects=()
# Get list of projects from ~/Projects
for dir in $HOME/Projects/**/*; do
if [ -d $dir ]; then
projects+=(${dir#$HOME/Projects/})
fi
done
project=$(
echo "${projects[@]}" | tr ' ' '\n' | sort -u |
fzf --layout=reverse --info=hidden --border=rounded --cycle
)
tmux new-window -n $project -c ~/Projects/$project
~/.local/share/tmux/layouts/window-auto

26
session.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -e
sessions=()
# Get list of predefined session layouts
for item in $HOME/.local/share/tmux/layouts/session-*; do
sessions+=(${item#$HOME/.local/share/tmux/layouts/session-})
done
# Get list of existing sessions
sessions+=($(tmux list-sessions | awk -F: '{print $1}'))
# Pick the session with fzf (remove duplicates)
session=$(
echo "${sessions[@]}" | tr ' ' '\n' | sort -u |
fzf --layout=reverse --info=hidden --border=rounded --cycle
)
# Create the session if it doesn't alreayd exist
tmux list-sessions | grep "^$session:" &> /dev/null || \
tmux new-session -Ads $session -c $HOME
# Switch to the session
tmux switch-client -t $session

View File

@@ -35,11 +35,11 @@ if upower -e | grep 'BAT' 2> /dev/null; then
local percentage=$(echo $output | awk '{ print $4 }')
if [ "$charging" = "Charging," ];then
echo $percentage | awk '$battery ~ /.*/ {
printf "%3d%% %s\n", $battery, substr("󰢟󰢜󰂆󰂇󰂈󰢝󰂉󰢞󰂊󰂋󰂅", int($battery / 9), 1)
printf " %d%% %s\n", $battery, substr("󰢟󰢜󰂆󰂇󰂈󰢝󰂉󰢞󰂊󰂋󰂅", int($battery / 100 * 11), 1)
}'
else
echo $percentage | awk '$battery ~ /.*/ {
printf "%3d%% %s\n", $battery, substr("󰂎󰁺󰁻󰁼󰁽󰁾󰁿󰂀󰂁󰂂󰁹", int($battery / 9), 1)
printf " %d%% %s\n", $battery, substr("󰂎󰁺󰁻󰁼󰁽󰁾󰁿󰂀󰂁󰂂󰁹", int($battery / 100 * 11), 1)
}'
fi
}
@@ -57,7 +57,7 @@ while true; do
# Parse the current CPU load on all cores/threads.
cpu_load=" `mpstat -P ALL -n 1 -u 1 -o JSON | \
jq '.sysstat.hosts[0].statistics[0]["cpu-load"][1:]|.[].idle' | \
awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 11), 1) }'`"
awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 100 * 9), 1) }'`"
# Parse the current CPU package temperature.
cpu_temp=$(get_cpu_temp)

View File

@@ -32,14 +32,14 @@ while true; do
cpu_load=" `mpstat -P ALL -n 1 -u 1 -o JSON | \
jq '.sysstat.hosts[0].statistics[0]["cpu-load"][1:]|.[].idle' | \
awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 11), 1) }'`"
awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 100 * 9), 1) }'`"
raw_battery=$($powershell -NoProfile \
"(Get-WmiObject win32_battery).EstimatedChargeRemaining" \
| sed 's/\r//')
if [ "" != "$raw_battery" ]; then
battery="$(echo $raw_battery | awk '$battery ~ /.*/ {
printf "%3d%% %s\n", $battery, substr("", int($battery / 9), 1)
printf " %d%% %s\n", $battery, substr("", int($battery / 100 * 11), 1)
}')"
fi

View File

@@ -8,6 +8,8 @@ if [ ! -d $cache_dir ]; then
mkdir -p $cache_dir
fi
[ -f $cache_dir/cpu-temp ] && rm $cache_dir/cpu-temp
# Cleanup cache file when interrupted.
trap '[ -f $cache_file ] && rm $cache_file; exit' INT
trap '[ -f $cache_file ] && rm $cache_file; exit' TERM
@@ -17,14 +19,16 @@ ioreg -w0 -l | grep BatteryInstalled &> /dev/null && \
has_battery=true || has_battery=false
while true; do
# # Get the current CPU temperature.
# cpu_temp="`/usr/local/bin/osx-cpu-temp`"
# Get the current CPU temperature.
cpu_temp=$(
~/.local/bin/iSMC -o json temp | jq '."PMU tdie1".quantity' | xargs printf "%.1f°C "
)
cpu_load=$(sudo powermetrics --format text \
--sample-rate 1200 --sample-count 1 --samplers cpu_power |
grep --color=never -E 'CPU \d idle residency:' |
grep --color=never -Eo '\d+\.\d+' |
gawk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 10), 1) }'
grep --color=never -E 'CPU \d active residency:' |
gawk '{print $5}' |
gawk '$idle ~ /[-.0-9]*/ { printf "%s", substr(" ▁▂▃▄▅▆▇█", int($idle / 100 * 9), 1) }'
)
# Parse the current battery charge percentage.
@@ -34,7 +38,7 @@ while true; do
grep --color=never -Eo '\d+%' | \
grep --color=never -Eo '\d+')"
battery="$(echo $raw_battery | gawk '$battery ~ /.*/ {
printf "%3d%% %s\n", $battery, substr("󰂎󰁺󰁻󰁼󰁽󰁾󰁿󰂀󰂁󰂂󰁹", int($battery / 9), 1)
printf " %d%% %s\n", $battery, substr("󰂎󰁺󰁻󰁼󰁽󰁾󰁿󰂀󰂁󰂂󰁹", int($battery / 100 * 11), 1)
}')"
fi

View File

@@ -1,24 +0,0 @@
---
- name: tmux create layouts directory
file:
state: directory
dest: ~/.local/share/tmux/layouts
- name: tmux create config symbolic link
file:
state: link
src: ~/.config/tmux/tmux.conf
dest: ~/.tmux.conf
- name: tmux create layout symbolic links
file:
state: link
src: '~/.config/tmux/layouts/{{item}}'
dest: '~/.local/share/tmux/layouts/{{item}}'
with_items:
- session-local
- session-main
- session-visor
- window-tall
- window-wide-left
- window-wide-right

34
theme.tmux Normal file
View File

@@ -0,0 +1,34 @@
# Left status style
if -b '[ "$WSL_DISTRO_NAME" != "" ]' \
'setw -g status-left " #(hostname)|#{WSL_DISTRO_NAME}|#{session_name}"' \
'setw -g status-left " #(hostname -s)|#{session_name}"'
setw -g status-left-style fg=colour240,bg=colour233
setw -g status-left-length 32
# Centre status style
setw -g status-style fg=colour240,bg=colour233
# Right status style shows system info, date, and time.
setw -g status-right "#[fg=colour240]#(cat ~/.cache/tmux/system-info)#[fg=white] %a %d-%m-%y %H:%M "
setw -g status-right-style fg=white,bg=colour233
if -b '[ "`uname`" = "Darwin" ]' \
'run "tmux setw -g status-right-length $((`sysctl -n hw.ncpu` + 48))"' \
'run "tmux setw -g status-right-length $((`nproc --all` + 48))"'
# Active window status style
setw -g window-status-current-format " #{window_index}: #{window_name}"
setw -g window-status-current-style fg=white,bg=colour233
# Inactive window status style
setw -g window-status-format " #{window_index}: #{window_name}"
setw -g window-status-style fg=colour240,bg=colour233
# Pane border style
set -g pane-border-style fg=colour233,bg=colour233
set -g pane-active-border-style fg=colour235,bg=colour235
# Command line window list selection
set-window-option -g mode-style fg=white,bg=colour237
set-option -g message-style fg=white,bg=colour237
# vim: ft=tmux

View File

@@ -1,3 +1,6 @@
# Address vim mode switching delay & garbage text on start
set -s escape-time 1
# Set global hooks to perform actions when events occur
set-hook -g session-created 'run ~/.config/tmux/hooks/session-create.sh'
@@ -12,9 +15,6 @@ unbind C-b
set -g prefix C-Space
bind Space send-prefix
# Address vim mode switching delay
set -s escape-time 0
# Increase scrollback buffer size
set -g history-limit 1000000
@@ -58,14 +58,32 @@ if '[ ! -n $ITERM_PROFILE ]' \
# Enable strikethrough on VTE compatible terminals.
set -ga terminal-overrides 'xterm*:smxx=\E[9m'
# Binding to create window-auto layout
bind a run-shell ~/.local/share/tmux/layouts/window-auto
# TODO: bind A run-shell ~/.local/share/tmux/layouts/window-auto --refresh
# Set only on macOS where it's required
if -b '[ "`uname`" = "Darwin" ]' \
'set -g default-command "reattach-to-user-namespace -l $SHELL"'
if -b '[[ "$TMUX_VERSION" > "3.2" ]]' {
# Open a popup with running the default shell
bind T display-popup -S fg=#54546D -b rounded -d '#{pane_current_path}' -E $SHELL
# Open a popup with session creator/switcher
bind S display-popup -B -w 60 -h 10 -E '~/.config/tmux/session.sh'
# Open a popup with project selector
bind P display-popup -B -w 60 -h 10 -E '~/.config/tmux/project.sh'
# Open a popup to pick an interpreter then launch it
bind I display-popup -S fg=#54546D -b rounded -d '#{pane_current_path}' -E '$SHELL -i ~/.config/tmux/interpreter.sh'
}
# Restore old next/previous window bindings
bind C-n next-window
bind C-p previous-window
# Kill current window
bind W kill-window
# Make new splits open in current directory
bind '"' split-window -c '#{pane_current_path}'
bind '%' split-window -h -c '#{pane_current_path}'
@@ -91,7 +109,14 @@ unbind -T copy-mode-vi C-j
# Enter copy mode with C-U
bind C-u copy-mode -u
# Begin selection in copy mode with v not Space
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi V send -X select-line
bind -n C-v if-shell -F '#{pane_in_mode}' \
'send -X rectangle-toggle' \
'send-keys C-v'
# Exit copy mode with i/a
bind -T copy-mode-vi 'i' send -X cancel
bind -T copy-mode-vi 'a' send -X cancel
# Search without entering copy-mode first
bind '/' 'copy-mode;send-keys /'
bind '?' 'copy-mode;send-keys ?'
@@ -135,34 +160,4 @@ if -b '[ "$WSLENV" = "" ]' \
'bind -T copy-mode-vi y send-keys -X copy-pipe "xsel -i --clipboard"' \
'bind -T copy-mode-vi y send-keys -X copy-pipe "win32yank.exe -i -crlf"'
# Left status style
if -b '[ "$WSL_DISTRO_NAME" != "" ]' \
'setw -g status-left " #(hostname)|#{WSL_DISTRO_NAME}|#{session_name}"' \
'setw -g status-left " #(hostname -s)|#{session_name}"'
setw -g status-left-style fg=colour240,bg=colour233
setw -g status-left-length 32
# Centre status style
setw -g status-style fg=colour240,bg=colour233
# Right status style shows system info, date, and time.
setw -g status-right "#[fg=colour240]#(cat ~/.cache/tmux/system-info)#[fg=white] %a %d-%m-%y %H:%M "
setw -g status-right-style fg=white,bg=colour233
if -b '[ "`uname`" != "Darwin" ]' \
'run "tmux setw -g status-right-length $((`nproc --all` + 48))"'
# Active window status style
setw -g window-status-current-format " #{window_index}: #{window_name}"
setw -g window-status-current-style fg=white,bg=colour233
# Inactive window status style
setw -g window-status-format " #{window_index}: #{window_name}"
setw -g window-status-style fg=colour240,bg=colour233
# Pane border style
set -g pane-border-style fg=colour233,bg=colour233
set -g pane-active-border-style fg=colour235,bg=colour235
# Command line window list selection
set-window-option -g mode-style fg=white,bg=colour237
set-option -g message-style fg=white,bg=colour237
source-file ~/.config/tmux/theme.tmux