# cat << ►_◄ > /dev/null # -- general ------------------------------------------------------------------- set -g default-terminal "screen-256color" # colors! setw -g xterm-keys on set -s escape-time 0 # fastest command sequences set -sg repeat-time 600 # increase repeat timeout set -s quiet on # disable various messages set -g prefix2 C-a # GNU-Screen compatible prefix bind C-a send-prefix -2 set -g status-utf8 on # expect UTF-8 setw -g utf8 on set -g history-limit 5000 # boost history # edit configuration bind e new-window -n '~/.tmux.conf.local' "sh -c '\${EDITOR:-vim} ~/.tmux.conf.local && tmux source ~/.tmux.conf && tmux display \"~/.tmux.conf sourced\"'" # reload configuration bind r source-file ~/.tmux.conf \; display '~/.tmux.conf sourced' # see https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard if 'which -s reattach-to-user-namespace' 'set -g default-command "exec initializing... 2> /dev/null & reattach-to-user-namespace $SHELL -l"' # -- display ------------------------------------------------------------------- set -g base-index 1 # start windows numbering at 1 setw -g pane-base-index 1 # make pane numbering consistent with windows setw -g automatic-rename on # rename window to reflect current program # renumber windows when a window is closed set -g renumber-windows on set -g set-titles on # set terminal title set -g set-titles-string '#h ❐ #S ● #I #W' set -g display-panes-time 800 # slightly longer pane indicators display time set -g display-time 1000 # slightly longer status messages display time set -g status-interval 10 # redraw status line every 10 seconds # 24 hour clock setw -g clock-mode-style 24 # clear both screen and history bind -n C-l send-keys C-l \; run 'tmux clear-history' # activity set -g monitor-activity on set -g visual-activity off # tmux theme, colors and status line # available themes: # - powerline (a powerline inspired theme) # - powerline_patched_font (a powerline inspired theme using a patched font) tmux_conf_theme=powerline # -- navigation ---------------------------------------------------------------- # create new session bind C-c new-session # find session bind C-f command-prompt -p find-session 'switch-client -t %%' # pane navigation bind -r h select-pane -L # move left bind -r j select-pane -D # move down bind -r k select-pane -U # move up bind -r l select-pane -R # move right bind > swap-pane -D # swap current pane with the next one bind < swap-pane -U # swap current pane with the previous one # maximize current pane bind + run 'cut -c3- ~/.tmux.conf | sh -s maximize_pane' # pane resizing bind -r H resize-pane -L 2 bind -r J resize-pane -D 2 bind -r K resize-pane -U 2 bind -r L resize-pane -R 2 # window navigation bind -r C-h previous-window # select previous window bind -r C-l next-window # select next window bind Tab last-window # move to last active window # toggle mouse bind m run "cut -c3- ~/.tmux.conf | sh -s toggle_mouse" # -- urlview ------------------------------------------------------------------- bind U run "cut -c3- ~/.tmux.conf | sh -s urlview #{pane_id}" # -- facebook pathpicker ------------------------------------------------------- bind F run "cut -c3- ~/.tmux.conf | sh -s fpp #{pane_id}" # -- list choice --------------------------------------------------------------- bind -t vi-choice h tree-collapse bind -t vi-choice l tree-expand run 'tmux bind -t vi-choice K start-of-list 2> /dev/null' run 'tmux bind -t vi-choice J end-of-list 2> /dev/null' bind -t vi-choice H tree-collapse-all bind -t vi-choice L tree-expand-all bind -t vi-choice Escape cancel # -- edit mode ----------------------------------------------------------------- # the following vi-copy bindings match my vim settings # see https://github.com/gpakosz/.vim.git bind -ct vi-edit H start-of-line bind -ct vi-edit L end-of-line bind -ct vi-edit q cancel bind -ct vi-edit Escape cancel # -- copy mode ----------------------------------------------------------------- bind Enter copy-mode # enter copy mode bind b list-buffers # list paster buffers bind p paste-buffer # paste from the top pate buffer bind P choose-buffer # choose which buffer to paste from # the following vi-copy bindings match my vim settings # see https://github.com/gpakosz/.vim.git bind -t vi-copy v begin-selection bind -t vi-copy C-v rectangle-toggle bind -t vi-copy y copy-selection bind -t vi-copy Escape cancel bind -t vi-copy H start-of-line bind -t vi-copy L end-of-line # copy to Mac OSX pasteboard if 'which -s reattach-to-user-namespace' 'bind y run "tmux save-buffer - | reattach-to-user-namespace pbcopy"' # -- user defined -------------------------------------------------------------- if '[ -f ~/.tmux.conf.local ]' 'source ~/.tmux.conf.local' # -- 8< ------------------------------------------------------------------------ run 'cut -c3- ~/.tmux.conf | sh -s apply_theme $tmux_conf_theme' run 'cut -c3- ~/.tmux.conf | sh -s apply_configurable_bindings $tmux_conf_new_windows_retain_current_path $tmux_conf_new_panes_retain_current_path' run 'for name in $(printenv | grep -Eo ^tmux_conf_[^=]+); do tmux setenv -gu $name; done;' # ►_◄ # # # exit the script if any statement returns a non-true return value # set -e # # apply_theme() { # case "$1" in # powerline_patched_font) # left_separator='' # left_separator_black='' # right_separator='' # right_separator_black='' # session_symbol='' # ;; # powerline) # left_separator='|' # left_separator_black=' ' # right_separator='|' # right_separator_black=' ' # ;; # esac # # case "$1" in # powerline*) # # # panes # pane_border_fg=colour238 # light gray # pane_active_border_fg=colour39 # light blue # # tmux set -g pane-border-style fg=$pane_border_fg \; set -g pane-active-border-style fg=$pane_active_border_fg # #uncomment for fat borders # #tmux set -ga pane-border-style bg=$pane_border_fg \; set -ga pane-active-border-style bg=$pane_active_border_fg # # display_panes_active_colour=colour39 # light blue # display_panes_colour=colour39 # light blue # tmux set -g display-panes-active-colour $display_panes_active_colour \; set -g display-panes-colour $display_panes_colour # # # messages # message_fg=colour16 # black # message_bg=colour226 # yellow # message_attr=bold # tmux set -g message-style fg=$message_fg,bg=$message_bg,$message_attr # # message_command_fg=colour16 # black # message_command_bg=colour160 # light yellow # tmux set -g message-command-style fg=$message_command_fg,bg=$message_command_bg,$message_attr # # # windows mode # mode_fg=colour16 # black # mode_bg=colour226 # yellow # mode_attr=bold # tmux setw -g mode-style fg=$mode_fg,bg=$mode_bg,$mode_attr # # # status line # status_fg=colour253 # white # status_bg=colour232 # dark gray # tmux set -g status-style fg=$status_fg,bg=$status_bg # # session_fg=colour16 # black # session_bg=colour226 # yellow # status_left="#[fg=$session_fg,bg=$session_bg,bold] ❐ #S #[fg=$session_bg,bg=$status_bg,nobold]$left_separator_black" # if [ x"`tmux -q -L tmux_theme_status_left_test -f /dev/null new-session -d \; show -g -v status-left \; kill-session`" = x"[#S] " ] ; then # status_left="$status_left " # fi # tmux set -g status-left-length 32 \; set -g status-left "$status_left" # # window_status_fg=colour245 # light gray # window_status_bg=colour232 # dark gray # window_status_format="#I #W" # tmux setw -g window-status-style fg=$window_status_fg,bg=$window_status_bg \; setw -g window-status-format "$window_status_format" # # window_status_current_fg=colour16 # black # window_status_current_bg=colour39 # light blue # window_status_current_format="#[fg=$window_status_bg,bg=$window_status_current_bg]$left_separator_black#[fg=$window_status_current_fg,bg=$window_status_current_bg,bold] #I $left_separator #W #[fg=$window_status_current_bg,bg=$status_bg,nobold]$left_separator_black" # tmux setw -g window-status-current-format "$window_status_current_format" # tmux set -g status-justify left # # window_status_activity_fg=default # window_status_activity_bg=default # window_status_activity_attr=underscore # tmux setw -g window-status-activity-style fg=$window_status_activity_fg,bg=$window_status_activity_bg,$window_status_activity_attr # # window_status_bell_fg=colour226 # yellow # window_status_bell_bg=default # window_status_bell_attr=blink,bold # tmux setw -g window-status-bell-style fg=$window_status_bell_fg,bg=$window_status_bell_bg,$window_status_bell_attr # # window_status_last_fg=colour39 # light blue # window_status_last_attr=default # tmux setw -g window-status-last-style $window_status_last_attr,fg=$window_status_last_fg # # battery_full_fg=colour160 # red # battery_empty_fg=colour254 # white # battery_bg=colour160 # black # time_date_fg=colour245 # light gray # time_date_bg=colour232 # dark gray # whoami_fg=colour254 # white # whoami_bg=colour160 # red # host_fg=colour16 # black # host_bg=colour254 # white # status_right="${tmux_conf_battery:-#(cut -c3- ~/.tmux.conf | sh -s battery ${tmux_conf_battery_symbol:-block} ${tmux_conf_battery_symbol_count:-auto} ${tmux_conf_battery_palette:-colour160,colour254,colour16} ${tmux_conf_battery_status})} #[fg=$time_date_fg,nobold]$right_separator %R $right_separator %d %b #[fg=$whoami_bg,bg=$time_date_bg,nobold]$right_separator_black#[fg=$whoami_fg,bg=$whoami_bg,nobold] #(whoami) $right_separator_black#[fg=$host_fg,bg=$host_bg,bold] #h " # tmux set -g status-right-length 64 \; set -g status-right "$status_right" # # # clock # clock_mode_colour=colour39 # light blue # tmux setw -g clock-mode-colour $clock_mode_colour # ;; # esac # } # # circled_digit() { # circled_digits='⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳' # if [ $1 -lt 20 ] 2>/dev/null ; then # echo ${circled_digits:$1:1} # else # echo $1 # fi # } # # maximize_pane() { # tmux -q -L swap-pane-test -f /dev/null new-session -d \; new-window \; new-window \; swap-pane -t :1 \; kill-session || { tmux display 'your tmux version has a buggy swap-pane command - see ticket #108, fixed in upstream commit 78e783e'; exit; } # __current_pane=$(tmux display -p '#{pane_id}') # # __dead_panes=$(tmux list-panes -s -F '#{pane_dead} #{pane_id} #{pane_start_command}' | grep -o '^1 %.\+maximized.\+$' || true) # __restore=$(echo "${__dead_panes}" | sed -n -E -e "s/^1 ${__current_pane} .+maximized.+(%[0-9]+)$/tmux swap-pane -s \1 -t ${__current_pane} \; kill-pane -t ${__current_pane}/p" -e "s/^1 (%[0-9]+) .+maximized.+${__current_pane}$/tmux swap-pane -s \1 -t ${__current_pane} \; kill-pane -t \1/p" ) # # if [ x"${__restore}" = x ] ; then # [ x"$(tmux list-panes | wc -l | sed 's/^ *//g')" = x1 ] && tmux display "Can't maximize with only one pane" && return # __window=$(tmux new-window -P "exec maximized...& tmux setw remain-on-exit on; clear; tmux clear-history; printf 'Pane has been maximized, press + to restore. %s' \\${__current_pane};") # __window=${__window%.*} # # __guard=50 # while ( [ x"$(tmux list-panes -t ${__window} -F '#{session_name}:#{window_index} #{pane_dead}')" != x"${__window} "1 ] && [ x"${__guard}" != x0 ] ) ; do sleep 0.01 ; __guard=$((__guard - 1)); done # if [ x"${__guard}" = 0 ] ; then # exit 1 # fi # # __new_pane=$(tmux display -p '#{pane_id}') # tmux setw remain-on-exit off \; swap-pane -s "${__current_pane}" -t "${__new_pane}" # else # ${__restore} || tmux kill-pane # fi # } # # toggle_mouse() { # if (tmux show -g -w |grep -q mode-mouse); then # old=$(tmux show -g -w | grep mode-mouse | cut -d' ' -f2) # new="" # # if [ "$old" = "on" ] ; then # new="off" # else # new="on" # fi # # tmux set -g mode-mouse $new \;\ # set -g mouse-resize-pane $new \;\ # set -g mouse-select-pane $new \;\ # set -g mouse-select-window $new \;\ # display "mouse: $new" # else # old=$(tmux show -g | grep mouse | head -n 1 | cut -d' ' -f2) # new="" # # if [ "$old" = "on" ] ; then # new="off" # else # new="on" # fi # # tmux set -g mouse $new \;\ # display "mouse: $new" # fi # } # # battery() { # battery_symbol=$1 # battery_symbol_count=$2 # battery_palette=$3 # battery_status=$4 # if [ x"$battery_symbol_count" = x"auto" ]; then # columns=$(tmux -q display -p '#{client_width}' 2> /dev/null || echo 80) # if [ $columns -ge 80 ]; then # battery_symbol_count=10 # else # battery_symbol_count=5 # fi # fi # battery_symbol_heart_full=♥ # battery_symbol_heart_empty=♥ # battery_symbol_block_full=◼ # battery_symbol_block_empty=◻ # eval battery_symbol_full='$battery_symbol_'"$battery_symbol"'_full' # eval battery_symbol_empty='$battery_symbol_'"$battery_symbol"'_empty' # # uname_s=$(uname -s) # if [ x"$uname_s" = x"Darwin" ]; then # batt=$(pmset -g batt) # percentage=$(echo $batt |egrep -o [0-9]+%) || return # discharging=$(echo $batt | grep -qi "discharging" && echo "true" || echo "false") # charge="${percentage%%%} / 100" # elif [ x"$uname_s" = x"Linux" ]; then # batpath=/sys/class/power_supply/BAT0 # if [ ! -d $batpath ]; then # batpath=/sys/class/power_supply/BAT1 # fi # batfull=$batpath/energy_full # batnow=$batpath/energy_now # if [ ! -r $batfull -o ! -r $batnow ]; then # return # fi # discharging=$(grep -qi "discharging" $batpath/status && echo "true" || echo "false") # charge="$(cat $batnow) / $(cat $batfull)" || return # fi # # if [ x"$battery_status" = x"1" -o x"$battery_status" = x"true" ]; then # if [ x"$discharging" = x"true" ]; then # printf "%s " 🔋 # else # printf "%s " ⚡ # fi # fi # # if echo $battery_palette | grep -q -E '^(colour[0-9]{1,3},?){3}$'; then # battery_full_fg=$(echo $battery_palette | cut -d, -f1) # battery_empty_fg=$(echo $battery_palette | cut -d, -f2) # battery_bg=$(echo $battery_palette | cut -d, -f3) # # full=$(printf %.0f $(awk "BEGIN{print $charge * $battery_symbol_count}")) # [ $full -gt 0 ] && \ # printf '#[fg=%s,bg=%s]' $battery_full_fg $battery_bg && \ # printf "%0.s$battery_symbol_full" $(seq 1 $full) # empty=$(($battery_symbol_count - $full)) # [ $empty -gt 0 ] && \ # printf '#[fg=%s,bg=%s]' $battery_empty_fg $battery_bg && \ # printf "%0.s$battery_symbol_empty" $(seq 1 $empty) # elif echo $battery_palette | grep -q -E '^heat|gradient(,colour[0-9]{1,3})?$'; then # battery_style=$(echo $battery_palette | cut -d, -f1) # battery_bg=$(echo $battery_palette | cut -s -d, -f2) # battery_bg=${battery_bg:-colour16} # gradient="196 202 208 214 220 226 190 154 118 82 46" # heat="233 234 235 237 239 241 243 245 247 144 143 142 184 214 208 202 196" # eval palette=$(echo \$$battery_style) # count=$(echo $(echo $palette | wc -w)) # # eval set -- "$palette" # palette=$(eval echo $(eval echo $(printf "\\$\{\$(expr %s \* $count / $battery_symbol_count)\} " $(seq 1 $battery_symbol_count)))) # # full=$(printf %.0f $(awk "BEGIN{print $charge * $battery_symbol_count}")) # printf '#[bg=%s]' $battery_bg # [ $full -gt 0 ] && \ # printf "#[fg=colour%s]$battery_symbol_full" $(echo $palette | cut -d' ' -f1-$full) # empty=$(($battery_symbol_count - $full)) # if [ x"$battery_symbol" = x"heart" ]; then # [ $empty -gt 0 ] && \ # printf '#[fg=%s]' $battery_bg && \ # printf "%0.s$battery_symbol_empty" $(seq 1 $empty) # else # [ $empty -gt 0 ] && \ # printf "#[fg=colour%s]$battery_symbol_empty" $(echo $palette | cut -d' ' -f$((full+1))-$(($full + $empty))) # fi # fi # } # # apply_configurable_bindings() { # windows_retain_current_path=${1:-false} # if [ x"$windows_retain_current_path" = x"true" -o x"$windows_retain_current_path" = x"1" ] ; then # tmux bind c new-window -c '#{pane_current_path}' # else # tmux bind c new-window # fi # # panes_retain_current_path=${2:-true} # if [ x"$panes_retain_current_path" = x"true" -o x"$panes_retain_current_path" = x"1" ] ; then # tmux bind '"' split-window -v -c "#{pane_current_path}" \;\ # bind % split-window -h -c "#{pane_current_path}" \;\ # bind - split-window -v -c "#{pane_current_path}" \;\ # bind _ split-window -h -c "#{pane_current_path}" # else # tmux bind '"' split-window -v \;\ # bind % split-window -h \;\ # bind - split-window -v \;\ # bind _ split-window -h # fi # } # # urlview() { # tmux capture-pane -J -S - -E - -b urlview-$1 -t $1 # tmux split-window "(tmux show-buffer -b urlview-$1 | urlview || true); tmux delete-buffer -b urlview-$1" # } # # fpp() { # tmux capture-pane -J -S - -E - -b fpp-$1 -t $1 # tmux split-window "(tmux show-buffer -b fpp-$1 | fpp || true); tmux delete-buffer -b fpp-$1" # } # $@