Created
December 15, 2017 21:55
-
-
Save 58bits/cc342bab79e8d4b5a45227b5fc8f39c0 to your computer and use it in GitHub Desktop.
Revisions
-
Anthony Bouch created this gist
Dec 15, 2017 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,635 @@ #!/bin/bash set -e export LC_NUMERIC=C __newline=' ' _is_enabled() { ( ([ x"$1" = x"enabled" ] || [ x"$1" = x"true" ] || [ x"$1" = x"yes" ] || [ x"$1" = x"1" ]) && return 0 ) || return 1 } export -f _is_enabled _circled_digit() { circled_digits='⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳' if [ "$1" -le 20 ] 2>/dev/null; then i=$(( $1 + 1 )) eval set -- "$circled_digits" eval echo "\${$i}" else echo "$1" fi } export -f _circled_digit _maximize_pane() { current_session=${1:-$(tmux display -p '#{session_name}')} current_pane=${2:-$(tmux display -p '#{pane_id}')} dead_panes=$(tmux list-panes -s -t "$current_session" -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 [ -z "$restore" ]; then [ "$(tmux list-panes -t "$current_session:" | wc -l | sed 's/^ *//g')" -eq 1 ] && tmux display "Can't maximize with only one pane" && return window=$(tmux new-window -t "$current_session:" -P "exec maximized... 2> /dev/null & tmux setw -t \"$current_session:\" remain-on-exit on; printf \"Pane has been maximized, press <prefix>+ to restore. %s\" '$current_pane'") window=${window%.*} guard=10 while [ x"$(tmux list-panes -t "$window" -F '#{session_name}:#{window_index} #{pane_dead}' 2>/dev/null)" != x"$window 1" ] && [ "$guard" -ne 0 ]; do sleep 0.01 guard=$((guard - 1)) done if [ "$guard" -eq 0 ]; then tmux display 'Unable to maximize pane' fi new_pane=$(tmux display -t "$window" -p '#{pane_id}') tmux setw -t "$window" remain-on-exit off \; swap-pane -s "$current_pane" -t "$new_pane" else $restore || tmux kill-pane fi } export -f _maximize_pane _toggle_mouse() { old=$(tmux show -gv mouse) new="" if [ "$old" = "on" ]; then new="off" else new="on" fi tmux set -g mouse $new \;\ display "mouse: $new" } export -f _toggle_mouse _username() { tty=${1:-$(tmux display -p '#{pane_tty}')} ssh_only=$2 # shellcheck disable=SC2039 if [ x"$OSTYPE" = x"cygwin" ]; then pid=$(ps -a | awk -v tty="${tty##/dev/}" '$5 == tty && /ssh/ && !/vagrant ssh/ && !/autossh/ && !/-W/ { print $1 }') [ -n "$pid" ] && ssh_parameters=$(tr '\0' ' ' < "/proc/$pid/cmdline" | sed 's/^ssh //') else ssh_parameters=$(ps -t "$tty" -o command= | awk '/ssh/ && !/vagrant ssh/ && !/autossh/ && !/-W/ { $1=""; print $0; exit }') fi if [ -n "$ssh_parameters" ]; then # shellcheck disable=SC2086 username=$(ssh -G $ssh_parameters 2>/dev/null | awk 'NR > 2 { exit } ; /^user / { print $2 }') # shellcheck disable=SC2086 [ -z "$username" ] && username=$(ssh -T -o ControlPath=none -o ProxyCommand="sh -c 'echo %%username%% %r >&2'" $ssh_parameters 2>&1 | awk '/^%username% / { print $2; exit }') else if ! _is_enabled "$ssh_only"; then # shellcheck disable=SC2039 if [ x"$OSTYPE" = x"cygwin" ]; then username=$(whoami) else username=$(ps -t "$tty" -o user= -o pid= -o ppid= -o command= | awk ' !/ssh/ { user[$2] = $1; ppid[$3] = 1 } END { for (i in user) if (!(i in ppid)) { print user[i] exit } } ') fi fi fi echo "$username" } export -f _username _hostname() { tty=${1:-$(tmux display -p '#{pane_tty}')} ssh_only=$2 # shellcheck disable=SC2039 if [ x"$OSTYPE" = x"cygwin" ]; then pid=$(ps -a | awk -v tty="${tty##/dev/}" '$5 == tty && /ssh/ && !/vagrant ssh/ && !/autossh/ && !/-W/ { print $1 }') [ -n "$pid" ] && ssh_parameters=$(tr '\0' ' ' < "/proc/$pid/cmdline" | sed 's/^ssh //') else ssh_parameters=$(ps -t "$tty" -o command= | awk '/ssh/ && !/vagrant ssh/ && !/autossh/ && !/-W/ { $1=""; print $0; exit }') fi if [ -n "$ssh_parameters" ]; then # shellcheck disable=SC2086 hostname=$(ssh -G $ssh_parameters 2>/dev/null | awk 'NR > 2 { exit } ; /^hostname / { print $2 }') # shellcheck disable=SC2086 [ -z "$hostname" ] && hostname=$(ssh -T -o ControlPath=none -o ProxyCommand="sh -c 'echo %%hostname%% %h >&2'" $ssh_parameters 2>&1 | awk '/^%hostname% / { print $2; exit }') #shellcheck disable=SC1004 hostname=$(echo "$hostname" | awk '\ { \ if ($1~/^[0-9.:]+$/) \ print $1; \ else \ split($1, a, ".") ; print a[1] \ }') else if ! _is_enabled "$ssh_only"; then hostname=$(command hostname -s) fi fi echo "$hostname" } export -f _hostname _root() { tty=${1:-$(tmux display -p '#{pane_tty}')} username=$(_username "$tty" false) if [ x"$username" = x"root" ]; then tmux show -gqv '@root' else echo "" fi } export -f _root _uptime() { case $(uname -s) in *Darwin*) boot=$(sysctl -q -n kern.boottime | awk -F'[ ,:]+' '{ print $4 }') now=$(date +%s) ;; *Linux*|*CYGWIN*|*MSYS*|*MINGW*) now=$(cut -d' ' -f1 < /proc/uptime) ;; *OpenBSD*) boot=$(sysctl -n kern.boottime) now=$(date +%s) esac # shellcheck disable=SC1004 awk -v boot="$boot" -v now="$now" ' BEGIN { uptime = now - boot d = int(uptime / 86400) h = int(uptime / 3600) % 24 m = int(uptime / 60) % 60 s = int(uptime) % 60 system("tmux set -g @uptime_d " d + 0 " \\; " \ "set -g @uptime_h " h + 0 " \\; " \ "set -g @uptime_m " m + 0 " \\; " \ "set -g @uptime_s " s + 0) }' } export -f _uptime _loadavg() { case $(uname -s) in *Darwin*) tmux set -g @loadavg "$(sysctl -q -n vm.loadavg | cut -d' ' -f2)" ;; *Linux*) tmux set -g @loadavg "$(cut -d' ' -f1 < /proc/loadavg)" ;; *OpenBSD*) tmux set -g @loadavg "$(sysctl -q -n vm.loadavg | cut -d' ' -f1)" ;; esac } export -f _loadavg _split_window() { tty=${1:-$(tmux display -p '#{pane_tty}')} shift # shellcheck disable=SC2039 if [ x"$OSTYPE" = x"cygwin" ]; then pid=$(ps -a | sort -d | awk -v tty="${tty##/dev/}" '$5 == tty && /ssh/ && !/-W/ { print $1; exit 0 }') [ -n "$pid" ] && ssh=$(tr '\0' ' ' < "/proc/$pid/cmdline") else ssh=$(ps -t "$tty" -o command= | sort -d | awk '/ssh/ && !/-W/ { print $0; exit 0 }') fi if [ -n "$ssh" ]; then # shellcheck disable=SC2046 tmux split-window "$@" $(echo "$ssh" | sed -e "s/;/\\\\;/g") else tmux split-window "$@" fi } export -f _split_window _apply_theme() { # -- panes ------------------------------------------------------------- tmux_conf_theme_window_fg=${tmux_conf_theme_window_fg:-default} tmux_conf_theme_window_bg=${tmux_conf_theme_window_bg:-default} tmux_conf_theme_highlight_focused_pane=${tmux_conf_theme_highlight_focused_pane:-false} tmux_conf_theme_focused_pane_fg=${tmux_conf_theme_focused_pane_fg:-'default'} # default tmux_conf_theme_focused_pane_bg=${tmux_conf_theme_focused_pane_bg:-'#0087d7'} # light blue # tmux 1.9 doesn't really like set -q if tmux show -g -w | grep -q window-style; then tmux setw -g window-style "fg=$tmux_conf_theme_window_fg,bg=$tmux_conf_theme_window_bg" if _is_enabled "$tmux_conf_theme_highlight_focused_pane"; then tmux setw -g window-active-style "fg=$tmux_conf_theme_focused_pane_fg,bg=$tmux_conf_theme_focused_pane_bg" else tmux setw -g window-active-style default fi fi tmux_conf_theme_pane_border_style=${tmux_conf_theme_pane_border_style:-thin} tmux_conf_theme_pane_border=${tmux_conf_theme_pane_border:-'#444444'} # light gray tmux_conf_theme_pane_active_border=${tmux_conf_theme_pane_active_border:-'#00afff'} # light blue tmux_conf_theme_pane_border_fg=${tmux_conf_theme_pane_border_fg:-$tmux_conf_theme_pane_border} tmux_conf_theme_pane_active_border_fg=${tmux_conf_theme_pane_active_border_fg:-$tmux_conf_theme_pane_active_border} case "$tmux_conf_theme_pane_border_style" in fat) tmux_conf_theme_pane_border_bg=${tmux_conf_theme_pane_border_bg:-$tmux_conf_theme_pane_border_fg} tmux_conf_theme_pane_active_border_bg=${tmux_conf_theme_pane_active_border_bg:-$tmux_conf_theme_pane_active_border_fg} ;; thin|*) tmux_conf_theme_pane_border_bg=${tmux_conf_theme_pane_border_bg:-'default'} tmux_conf_theme_pane_active_border_bg=${tmux_conf_theme_pane_active_border_bg:-'default'} ;; esac tmux setw -g pane-border-style "fg=$tmux_conf_theme_pane_border_fg,bg=$tmux_conf_theme_pane_border_bg" \; set -g pane-active-border-style "fg=$tmux_conf_theme_pane_active_border_fg,bg=$tmux_conf_theme_pane_active_border_bg" tmux_conf_theme_pane_indicator=${tmux_conf_theme_pane_indicator:-'#00afff'} # light blue tmux_conf_theme_pane_active_indicator=${tmux_conf_theme_pane_active_indicator:-'#00afff'} # light blue tmux set -g display-panes-colour "$tmux_conf_theme_pane_indicator" \; set -g display-panes-active-colour "$tmux_conf_theme_pane_active_indicator" # -- status line ------------------------------------------------------- tmux_conf_theme_left_separator_main=${tmux_conf_theme_left_separator_main-''} tmux_conf_theme_left_separator_sub=${tmux_conf_theme_left_separator_sub-'|'} tmux_conf_theme_right_separator_main=${tmux_conf_theme_right_separator_main-''} tmux_conf_theme_right_separator_sub=${tmux_conf_theme_right_separator_sub-'|'} tmux_conf_theme_message_fg=${tmux_conf_theme_message_fg:-'#000000'} # black tmux_conf_theme_message_bg=${tmux_conf_theme_message_bg:-'#ffff00'} # yellow tmux_conf_theme_message_attr=${tmux_conf_theme_message_attr:-'bold'} tmux set -g message-style "fg=$tmux_conf_theme_message_fg,bg=$tmux_conf_theme_message_bg,$tmux_conf_theme_message_attr" tmux_conf_theme_message_command_fg=${tmux_conf_theme_message_command_fg:-'#ffff00'} # yellow tmux_conf_theme_message_command_bg=${tmux_conf_theme_message_command_bg:-'#000000'} # black tmux_conf_theme_message_command_attr=${tmux_conf_theme_message_command_attr:-'bold'} tmux set -g message-command-style "fg=$tmux_conf_theme_message_command_fg,bg=$tmux_conf_theme_message_command_bg,$tmux_conf_theme_message_command_attr" tmux_conf_theme_mode_fg=${tmux_conf_theme_mode_fg:-'#000000'} # black tmux_conf_theme_mode_bg=${tmux_conf_theme_mode_bg:-'#ffff00'} # yellow tmux_conf_theme_mode_attr=${tmux_conf_theme_mode_attr:-'bold'} tmux setw -g mode-style "fg=$tmux_conf_theme_mode_fg,bg=$tmux_conf_theme_mode_bg,$tmux_conf_theme_mode_attr" tmux_conf_theme_status_fg=${tmux_conf_theme_status_fg:-'#8a8a8a'} # white tmux_conf_theme_status_bg=${tmux_conf_theme_status_bg:-'#080808'} # dark gray tmux_conf_theme_status_attr=${tmux_conf_theme_status_attr:-'none'} tmux set -g status-style "fg=$tmux_conf_theme_status_fg,bg=$tmux_conf_theme_status_bg,$tmux_conf_theme_status_attr" \;\ set -g status-left-style "fg=$tmux_conf_theme_status_fg,bg=$tmux_conf_theme_status_bg,$tmux_conf_theme_status_attr" \;\ set -g status-right-style "fg=$tmux_conf_theme_status_fg,bg=$tmux_conf_theme_status_bg,$tmux_conf_theme_status_attr" tmux_conf_theme_window_status_fg=${tmux_conf_theme_window_status_fg:-'#8a8a8a'} # white tmux_conf_theme_window_status_bg=${tmux_conf_theme_window_status_bg:-'#080808'} # dark gray tmux_conf_theme_window_status_attr=${tmux_conf_theme_window_status_attr:-'none'} tmux_conf_theme_window_status_format=${tmux_conf_theme_window_status_format:-'#I #W'} tmux_conf_theme_window_status_current_fg=${tmux_conf_theme_window_status_current_fg:-'#000000'} # black tmux_conf_theme_window_status_current_bg=${tmux_conf_theme_window_status_current_bg:-'#00afff'} # light blue tmux_conf_theme_window_status_current_attr=${tmux_conf_theme_window_status_current_attr:-'bold'} tmux_conf_theme_window_status_current_format=${tmux_conf_theme_window_status_current_format:-'#I #W'} if [ x"$(tmux show -g -v status-justify)" = x"right" ]; then tmux_conf_theme_window_status_current_format="#[fg=$tmux_conf_theme_window_status_current_bg,bg=$tmux_conf_theme_window_status_bg]$tmux_conf_theme_right_separator_main#[fg=default,bg=default,default] $tmux_conf_theme_window_status_current_format #[fg=$tmux_conf_theme_window_status_bg,bg=$tmux_conf_theme_window_status_current_bg,none]$tmux_conf_theme_right_separator_main" else tmux_conf_theme_window_status_current_format="#[fg=$tmux_conf_theme_window_status_bg,bg=$tmux_conf_theme_window_status_current_bg]$tmux_conf_theme_left_separator_main#[fg=default,bg=default,default] $tmux_conf_theme_window_status_current_format #[fg=$tmux_conf_theme_window_status_current_bg,bg=$tmux_conf_theme_status_bg,none]$tmux_conf_theme_left_separator_main" fi tmux_conf_theme_window_status_format=$(echo "$tmux_conf_theme_window_status_format" | sed 's%#{circled_window_index}%#(cut -c3- ~/.tmux.conf | sh -s _circled_digit #I)%g') tmux_conf_theme_window_status_current_format=$(echo "$tmux_conf_theme_window_status_current_format" | sed 's%#{circled_window_index}%#(cut -c3- ~/.tmux.conf | sh -s _circled_digit #I)%g') tmux setw -g window-status-style "fg=$tmux_conf_theme_window_status_fg,bg=$tmux_conf_theme_window_status_bg,$tmux_conf_theme_window_status_attr" \;\ setw -g window-status-format "$tmux_conf_theme_window_status_format" \;\ setw -g window-status-current-style "fg=$tmux_conf_theme_window_status_current_fg,bg=$tmux_conf_theme_window_status_current_bg,$tmux_conf_theme_window_status_current_attr" \;\ setw -g window-status-current-format "$tmux_conf_theme_window_status_current_format" tmux_conf_theme_window_status_activity_fg=${tmux_conf_theme_window_status_activity_fg:-'default'} tmux_conf_theme_window_status_activity_bg=${tmux_conf_theme_window_status_activity_bg:-'default'} tmux_conf_theme_window_status_activity_attr=${tmux_conf_theme_window_status_activity_attr:-'underscore'} tmux setw -g window-status-activity-style "fg=$tmux_conf_theme_window_status_activity_fg,bg=$tmux_conf_theme_window_status_activity_bg,$tmux_conf_theme_window_status_activity_attr" tmux_conf_theme_window_status_bell_fg=${tmux_conf_theme_window_status_bell_fg:-'#ffff00'} # yellow tmux_conf_theme_window_status_bell_bg=${tmux_conf_theme_window_status_bell_bg:-'default'} tmux_conf_theme_window_status_bell_attr=${tmux_conf_theme_window_status_bell_attr:-'blink,bold'} tmux setw -g window-status-bell-style "fg=$tmux_conf_theme_window_status_bell_fg,bg=$tmux_conf_theme_window_status_bell_bg,$tmux_conf_theme_window_status_bell_attr" tmux_conf_theme_window_status_last_fg=${tmux_conf_theme_window_status_last_fg:-'#00afff'} # light blue tmux_conf_theme_window_status_last_bg=${tmux_conf_theme_window_status_last_bg:-'default'} tmux_conf_theme_window_status_last_attr=${tmux_conf_theme_window_status_last_attr:-'none'} tmux setw -g window-status-last-style "fg=$tmux_conf_theme_window_status_last_fg,bg=$tmux_conf_theme_window_status_last_bg,$tmux_conf_theme_window_status_last_attr" # -- indicators tmux_conf_theme_pairing=${tmux_conf_theme_pairing:-'👓'} # U+1F453 tmux_conf_theme_pairing_fg=${tmux_conf_theme_pairing_fg:-'#e4e4e4'} # white tmux_conf_theme_pairing_bg=${tmux_conf_theme_pairing_bg:-'none'} tmux_conf_theme_pairing_attr=${tmux_conf_theme_pairing_attr:-'none'} tmux_conf_theme_prefix=${tmux_conf_theme_prefix:-'⌨'} # U+2328 tmux_conf_theme_prefix_fg=${tmux_conf_theme_prefix_fg:-'#e4e4e4'} # white tmux_conf_theme_prefix_bg=${tmux_conf_theme_prefix_bg:-'none'} tmux_conf_theme_prefix_attr=${tmux_conf_theme_prefix_attr:-'none'} tmux_conf_theme_root=${tmux_conf_theme_root:-'!'} tmux_conf_theme_root_fg=${tmux_conf_theme_root_fg:-'none'} tmux_conf_theme_root_bg=${tmux_conf_theme_root_bg:-'none'} tmux_conf_theme_root_attr=${tmux_conf_theme_root_attr:-'bold,blink'} # -- status left style tmux_conf_theme_status_left=${tmux_conf_theme_status_left-' ❐ #S '} tmux_conf_theme_status_left_fg=${tmux_conf_theme_status_left_fg:-'#000000,#e4e4e4,#e4e4e4'} # black, white , white tmux_conf_theme_status_left_bg=${tmux_conf_theme_status_left_bg:-'#ffff00,#ff00af,#00afff'} # yellow, pink, white blue tmux_conf_theme_status_left_attr=${tmux_conf_theme_status_left_attr:-'bold,none,none'} tmux_conf_theme_status_left=$(echo "$tmux_conf_theme_status_left" | sed \ -e "s/#{pairing}/#[fg=$tmux_conf_theme_pairing_fg]#[bg=$tmux_conf_theme_pairing_bg]#[$tmux_conf_theme_pairing_attr]#{?session_many_attached,$tmux_conf_theme_pairing,}/g") tmux_conf_theme_status_left=$(echo "$tmux_conf_theme_status_left" | sed \ -e "s/#{prefix}/#[fg=$tmux_conf_theme_prefix_fg]#[bg=$tmux_conf_theme_prefix_bg]#[$tmux_conf_theme_prefix_attr]#{?client_prefix,$tmux_conf_theme_prefix,}/g") tmux_conf_theme_status_left=$(echo "$tmux_conf_theme_status_left" | sed \ -e "s%#{root}%#[fg=$tmux_conf_theme_root_fg]#[bg=$tmux_conf_theme_root_bg]#[$tmux_conf_theme_root_attr]#(cut -c3- ~/.tmux.conf | sh -s _root #{pane_tty} #D)#[inherit]%g") if [ -n "$tmux_conf_theme_status_left" ]; then status_left=$(awk \ -v fg_="$tmux_conf_theme_status_left_fg" \ -v bg_="$tmux_conf_theme_status_left_bg" \ -v attr_="$tmux_conf_theme_status_left_attr" \ -v mainsep="$tmux_conf_theme_left_separator_main" \ -v subsep="$tmux_conf_theme_left_separator_sub" ' function subsplit(s, l, i, a, r) { l = split(s, a, ",") for (i = 1; i <= l; ++i) { o = split(a[i], _, "(") - 1 c = split(a[i], _, ")") - 1 open += o - c o_ = split(a[i], _, "{") - 1 c_ = split(a[i], _, "}") - 1 open_ += o_ - c_ o__ = split(a[i], _, "[") - 1 c__ = split(a[i], _, "]") - 1 open__ += o__ - c__ if (i == l) r = sprintf("%s%s", r, a[i]) else if (open || open_ || open__) r = sprintf("%s%s,", r, a[i]) else r = sprintf("%s%s#[fg=%s,bg=%s,%s]%s", r, a[i], fg[j], bg[j], attr[j], subsep) } gsub(/#\[inherit\]/, sprintf("#[default]#[fg=%s,bg=%s,%s]", fg[j], bg[j], attr[j]), r) return r } BEGIN { FS = "|" l1 = split(fg_, fg, ",") l2 = split(bg_, bg, ",") l3 = split(attr_, attr, ",") l = l1 < l2 ? (l1 < l3 ? l1 : l3) : (l2 < l3 ? l2 : l3) } { for (i = j = 1; i <= NF; ++i) { if (open || open_ || open__) printf "|%s", subsplit($i) else { if (i > 1) printf "#[fg=%s,bg=%s,none]%s#[fg=%s,bg=%s,%s]%s", bg[j_], bg[j], mainsep, fg[j], bg[j], attr[j], subsplit($i) else printf "#[fg=%s,bg=%s,%s]%s", fg[j], bg[j], attr[j], subsplit($i) } if (!open && !open_ && !open__) { j_ = j j = j % l + 1 } } printf "#[fg=%s,bg=%s,none]%s", bg[j_], "default", mainsep }' << EOF $tmux_conf_theme_status_left EOF ) fi status_left="$status_left " # -- status right style tmux_conf_theme_status_right=${tmux_conf_theme_status_right-'#{pairing}#{prefix} #{battery_status} #{battery_bar} #{battery_percentage} , %R , %d %b | #{username} | #{hostname} '} tmux_conf_theme_status_right_fg=${tmux_conf_theme_status_right_fg:-'#8a8a8a,#e4e4e4,#000000'} # light gray, white, black tmux_conf_theme_status_right_bg=${tmux_conf_theme_status_right_bg:-'#080808,#d70000,#e4e4e4'} # dark gray, red, white tmux_conf_theme_status_right_attr=${tmux_conf_theme_status_right_attr:-'none,none,bold'} tmux_conf_theme_status_right=$(echo "$tmux_conf_theme_status_right" | sed \ -e "s/#{pairing}/#[fg=$tmux_conf_theme_pairing_fg]#[bg=$tmux_conf_theme_pairing_bg]#[$tmux_conf_theme_pairing_attr]#{?session_many_attached,$tmux_conf_theme_pairing,}/g") tmux_conf_theme_status_right=$(echo "$tmux_conf_theme_status_right" | sed \ -e "s/#{prefix}/#[fg=$tmux_conf_theme_prefix_fg]#[bg=$tmux_conf_theme_prefix_bg]#[$tmux_conf_theme_prefix_attr]#{?client_prefix,$tmux_conf_theme_prefix,}/g") tmux_conf_theme_status_right=$(echo "$tmux_conf_theme_status_right" | sed \ -e "s%#{root}%#[fg=$tmux_conf_theme_root_fg]#[bg=$tmux_conf_theme_root_bg]#[$tmux_conf_theme_root_attr]#(cut -c3- ~/.tmux.conf | sh -s _root #{pane_tty} #D)#[inherit]%g") if [ -n "$tmux_conf_theme_status_right" ]; then status_right=$(awk \ -v fg_="$tmux_conf_theme_status_right_fg" \ -v bg_="$tmux_conf_theme_status_right_bg" \ -v attr_="$tmux_conf_theme_status_right_attr" \ -v mainsep="$tmux_conf_theme_right_separator_main" \ -v subsep="$tmux_conf_theme_right_separator_sub" ' function subsplit(s, l, i, a, r) { l = split(s, a, ",") for (i = 1; i <= l; ++i) { o = split(a[i], _, "(") - 1 c = split(a[i], _, ")") - 1 open += o - c o_ = split(a[i], _, "{") - 1 c_ = split(a[i], _, "}") - 1 open_ += o_ - c_ o__ = split(a[i], _, "[") - 1 c__ = split(a[i], _, "]") - 1 open__ += o__ - c__ if (i == l) r = sprintf("%s%s", r, a[i]) else if (open || open_ || open__) r = sprintf("%s%s,", r, a[i]) else r = sprintf("%s%s#[fg=%s,bg=%s,%s]%s", r, a[i], fg[j], bg[j], attr[j], subsep) } gsub(/#\[inherit\]/, sprintf("#[default]#[fg=%s,bg=%s,%s]", fg[j], bg[j], attr[j]), r) return r } BEGIN { FS = "|" l1 = split(fg_, fg, ",") l2 = split(bg_, bg, ",") l3 = split(attr_, attr, ",") l = l1 < l2 ? (l1 < l3 ? l1 : l3) : (l2 < l3 ? l2 : l3) } { for (i = j = 1; i <= NF; ++i) { if (open_ || open || open__) printf "|%s", subsplit($i) else printf "#[fg=%s,bg=%s,none]%s#[fg=%s,bg=%s,%s]%s", bg[j], (i == 1) ? "default" : bg[j_], mainsep, fg[j], bg[j], attr[j], subsplit($i) if (!open && !open_ && !open__) { j_ = j j = j % l + 1 } } }' << EOF $tmux_conf_theme_status_right EOF ) fi # -- variables #tmux set -g '@root' "$tmux_conf_theme_root" #tmux_conf_battery_bar_symbol_full=${tmux_conf_battery_bar_symbol_full:-'◼'} #tmux_conf_battery_bar_symbol_empty=${tmux_conf_battery_bar_symbol_empty:-'◻'} #tmux_conf_battery_bar_length=${tmux_conf_battery_bar_length:-'auto'} #tmux_conf_battery_bar_palette=${tmux_conf_battery_bar_palette:-'gradient'} #tmux_conf_battery_hbar_palette=${tmux_conf_battery_hbar_palette:-'gradient'} # red, orange, green #tmux_conf_battery_vbar_palette=${tmux_conf_battery_vbar_palette:-'gradient'} # red, orange, green #tmux_conf_battery_status_charging=${tmux_conf_battery_status_charging:-'↑'} # U+2191 #tmux_conf_battery_status_discharging=${tmux_conf_battery_status_discharging:-'↓'} # U+2193 #case "$status_left $status_right" in # *'#{battery_status}'*|*'#{battery_bar}'*|*'#{battery_hbar}'*|*'#{battery_vbar}'*|*'#{battery_percentage}'*) # status_left=$(echo "$status_left" | sed -E \ # -e 's/#\{(\?)?battery_bar/#\{\1@battery_bar/g' \ # -e 's/#\{(\?)?battery_hbar/#\{\1@battery_hbar/g' \ # -e 's/#\{(\?)?battery_vbar/#\{\1@battery_vbar/g' \ # -e 's/#\{(\?)?battery_status/#\{\1@battery_status/g' \ # -e 's/#\{(\?)?battery_percentage/#\{\1@battery_percentage/g') # status_right=$(echo "$status_right" | sed -E \ # -e 's/#\{(\?)?battery_bar/#\{\1@battery_bar/g' \ # -e 's/#\{(\?)?battery_hbar/#\{\1@battery_hbar/g' \ # -e 's/#\{(\?)?battery_vbar/#\{\1@battery_vbar/g' \ # -e 's/#\{(\?)?battery_status/#\{\1@battery_status/g' \ # -e 's/#\{(\?)?battery_percentage/#\{\1@battery_percentage/g') # tmux set -g '@battery_bar_symbol_full' "$tmux_conf_battery_bar_symbol_full" \;\ # set -g '@battery_bar_symbol_empty' "$tmux_conf_battery_bar_symbol_empty" \;\ # set -g '@battery_bar_length' "$tmux_conf_battery_bar_length" \;\ # set -g '@battery_bar_palette' "$tmux_conf_battery_bar_palette" \;\ # set -g '@battery_hbar_palette' "$tmux_conf_battery_hbar_palette" \;\ # set -g '@battery_vbar_palette' "$tmux_conf_battery_vbar_palette" \;\ # set -g '@battery_status_charging' "$tmux_conf_battery_status_charging" \;\ # set -g '@battery_status_discharging' "$tmux_conf_battery_status_discharging" # status_right="#(cut -c3- ~/.tmux.conf | sh -s _battery)$status_right" # ;; #esac case "$status_left $status_right" in *'#{username}'*|*'#{hostname}'*|*'#{username_ssh}'*|*'#{hostname_ssh}'*) status_left=$(echo "$status_left" | sed \ -e 's%#{username}%#(cut -c3- ~/.tmux.conf | sh -s _username #{pane_tty} false #D)%g' \ -e 's%#{hostname}%#(cut -c3- ~/.tmux.conf | sh -s _hostname #{pane_tty} false #D)%g' \ -e 's%#{username_ssh}%#(cut -c3- ~/.tmux.conf | sh -s _username #{pane_tty} true #D)%g' \ -e 's%#{hostname_ssh}%#(cut -c3- ~/.tmux.conf | sh -s _hostname #{pane_tty} true #D)%g') status_right=$(echo "$status_right" | sed \ -e 's%#{username}%#(cut -c3- ~/.tmux.conf | sh -s _username #{pane_tty} false #D)%g' \ -e 's%#{hostname}%#(cut -c3- ~/.tmux.conf | sh -s _hostname #{pane_tty} false #D)%g' \ -e 's%#{username_ssh}%#(cut -c3- ~/.tmux.conf | sh -s _username #{pane_tty} true #D)%g' \ -e 's%#{hostname_ssh}%#(cut -c3- ~/.tmux.conf | sh -s _hostname #{pane_tty} true #D)%g') ;; esac case "$status_left $status_right" in *'#{uptime_d}'*|*'#{uptime_h}'*|*'#{uptime_m}'*) status_left=$(echo "$status_left" | sed -E \ -e 's/#\{(\?)?uptime_d/#\{\1@uptime_d/g' \ -e 's/#\{(\?)?uptime_h/#\{\1@uptime_h/g' \ -e 's/#\{(\?)?uptime_m/#\{\1@uptime_m/g' \ -e 's/#\{(\?)?uptime_s/#\{\1@uptime_s/g') status_right=$(echo "$status_right" | sed -E \ -e 's/#\{(\?)?uptime_d/#\{\1@uptime_d/g' \ -e 's/#\{(\?)?uptime_h/#\{\1@uptime_h/g' \ -e 's/#\{(\?)?uptime_m/#\{\1@uptime_m/g' \ -e 's/#\{(\?)?uptime_s/#\{\1@uptime_s/g') status_right="#(cut -c3- ~/.tmux.conf | sh -s _uptime)$status_right" ;; esac case "$status_left $status_right" in *'#{loadavg}'*) status_left=$(echo "$status_left" | sed -E \ -e 's/#\{(\?)?loadavg/#\{\1@loadavg/g') status_right=$(echo "$status_right" | sed -E \ -e 's/#\{(\?)?loadavg/#\{\1@loadavg/g') status_right="#(cut -c3- ~/.tmux.conf | sh -s _loadavg)$status_right" ;; esac status_left=$(echo "$status_left" | sed 's%#{circled_session_name}%#(cut -c3- ~/.tmux.conf | sh -s _circled_digit #S)%g') status_right=$(echo "$status_right" | sed 's%#{circled_session_name}%#(cut -c3- ~/.tmux.conf | sh -s _circled_digit #S)%g') tmux set -g status-left-length 1000 \; set -g status-left "$status_left" \;\ set -g status-right-length 1000 \; set -g status-right "$status_right" # -- clock ------------------------------------------------------------- tmux_conf_theme_clock_colour=${tmux_conf_theme_clock_colour:-'#00afff'} # light blue tmux_conf_theme_clock_style=${tmux_conf_theme_clock_style:-'24'} tmux setw -g clock-mode-colour "$tmux_conf_theme_clock_colour" \;\ setw -g clock-mode-style "$tmux_conf_theme_clock_style" } export -f _apply_theme _apply_configuration() { # see https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard if command -v reattach-to-user-namespace > /dev/null 2>&1; then default_shell="$(tmux show -gv default-shell)" case "$default_shell" in *fish) tmux set -g default-command "reattach-to-user-namespace -l $default_shell" ;; *sh) tmux set -g default-command "exec $default_shell... 2> /dev/null & reattach-to-user-namespace -l $default_shell" ;; esac fi #_apply_overrides #_apply_bindings _apply_theme for name in $(printenv | grep -Eo '^tmux_conf_[^=]+'); do tmux setenv -gu "$name"; done; } export -f _apply_configuration _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" } export -f _urlview _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" } export -f _fpp "$@"