mirror of
https://github.com/o0th/tmux-nova.git
synced 2026-09-10 07:16:28 -04:00
This commit enables a tmux config to load plugin variables to be used in tmux-nova segments. This works by loading a file before plugin declarations that sets up a status-left option with the variables we want to load, then after the plugins are sourced we load those values into tmux environment variables to be used in segments.
311 lines
11 KiB
Bash
311 lines
11 KiB
Bash
#!/usr/bin/env bash
|
|
export LC_ALL=en_US.UTF-8
|
|
|
|
current_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
source $current_dir/utils.sh
|
|
|
|
#
|
|
# global options
|
|
#
|
|
|
|
padding=$(get_option "@nova-padding" 1)
|
|
nerdfonts=$(get_option "@nova-nerdfonts" false)
|
|
nerdfonts_right=$(get_option "@nova-nerdfonts-right" )
|
|
nerdfonts_left=$(get_option "@nova-nerdfonts-left" )
|
|
rows=$(get_option "@nova-rows" 0)
|
|
pane=$(get_option "@nova-pane" "#S:#I:#W")
|
|
|
|
#
|
|
# Default segments
|
|
#
|
|
|
|
upsert_option "@nova-segment-mode" "#{?client_prefix,Ω,ω}"
|
|
upsert_option "@nova-segment-whoami" "#(whoami)@#h"
|
|
|
|
#
|
|
# double
|
|
#
|
|
|
|
if [ "$rows" -eq 0 ]; then
|
|
tmux set-option -g status on
|
|
else
|
|
tmux set-option -g status $(expr $rows + 1)
|
|
fi
|
|
|
|
#
|
|
# interval
|
|
#
|
|
|
|
interval=$(get_option "@nova-interval" 5)
|
|
tmux set-option -g interval $interval
|
|
|
|
#
|
|
# UI style
|
|
#
|
|
|
|
message_command_style_bg=$(get_option "@nova-message-command-style-bg" "#44475a")
|
|
message_command_style_fg=$(get_option "@nova-message-command-style-fg" "#f8f8f2")
|
|
tmux set-option -g message-command-style "bg=$message_command_style_bg,fg=$message_command_style_fg"
|
|
|
|
message_style_bg=$(get_option "@nova-message-style-bg" "#282a36")
|
|
message_style_fg=$(get_option "@nova-message-style-fg" "#f8f8f2")
|
|
tmux set-option -g message-style "bg=$message_style_bg,fg=$message_style_fg"
|
|
|
|
mode_style_bg=$(get_option "@nova-mode-style-bg" "#44475a")
|
|
mode_style_fg=$(get_option "@nova-mode-style-fg" "#f8f8f2")
|
|
tmux set-option -g mode-style "bg=$mode_style_bg,fg=$mode_style_fg"
|
|
|
|
#
|
|
# status-style
|
|
#
|
|
|
|
status_style_bg=$(get_option "@nova-status-style-bg" "#44475a")
|
|
status_style_fg=$(get_option "@nova-status-style-fg" "#f8f8f2")
|
|
status_style_active_bg=$(get_option "@nova-status-style-active-bg" "#6272a4")
|
|
status_style_active_fg=$(get_option "@nova-status-style-active-fg" "#f8f8f2")
|
|
tmux set-option -g status-style "bg=$status_style_bg,fg=$status_style_fg"
|
|
|
|
#
|
|
# pane
|
|
#
|
|
|
|
pane_border_style=$(get_option "@nova-pane-border-style" "#282a36")
|
|
pane_active_border_style=$(get_option "@nova-pane-active-border-style" "#44475a")
|
|
tmux set-option -g pane-border-style "fg=${pane_border_style}"
|
|
tmux set-option -g pane-active-border-style "fg=${pane_active_border_style}"
|
|
|
|
#
|
|
# load variables
|
|
#
|
|
|
|
var_names=$(tmux show-environment -g @nova-load-variables | sed 's/@nova-load-variables=//')
|
|
IFS=' ' read -r -a var_names<<< $var_names
|
|
length=${#var_names[@]}
|
|
|
|
vars=$(get_option "status-left" "")
|
|
IFS='*' read -r -a vars<<< $vars
|
|
|
|
for ((j = 0; j < ${length}; j++)); do
|
|
interpolated_var="${vars[$j]}"
|
|
var_name="${var_names[$j]}"
|
|
|
|
stripped_var=$(echo $interpolated_var | sed 's/#(//' | sed 's/)//')
|
|
tmux set-environment -g "$var_name" "$stripped_var"
|
|
done
|
|
|
|
|
|
#
|
|
# segments-0-left
|
|
#
|
|
|
|
segments_left=$(get_option "@nova-segments-0-left" "")
|
|
IFS=' ' read -r -a segments_left <<< $segments_left
|
|
|
|
tmux set-option -g status-left ""
|
|
|
|
first_left_segment=true
|
|
for segment in "${segments_left[@]}"; do
|
|
segment_content=$(get_option "@nova-segment-$segment" "mode")
|
|
segment_colors=$(get_option "@nova-segment-$segment-colors" "#282a36 #f8f8f2")
|
|
IFS=' ' read -r -a segment_colors <<< $segment_colors
|
|
if [ "$segment_content" != "" ]; then
|
|
# condition everything on the non emptiness of the evaluated segment
|
|
tmux set-option -ga status-left "#{?#{w:#{E:@nova-segment-$segment}},"
|
|
|
|
if [ $nerdfonts = true ] && [ $first_left_segment = false ]; then
|
|
tmux set-option -ga status-left "#[bg=${segment_colors[0]}]"
|
|
tmux set-option -ga status-left "$nerdfonts_left"
|
|
fi
|
|
|
|
tmux set-option -ga status-left "#[fg=${segment_colors[1]}#,bg=${segment_colors[0]}]"
|
|
tmux set-option -ga status-left "$(padding $padding)"
|
|
tmux set-option -ga status-left "$segment_content"
|
|
tmux set-option -ga status-left "$(padding $padding)"
|
|
|
|
# set the fg color for the next nerdfonts seperator
|
|
tmux set-option -ga status-left "#[fg=${segment_colors[0]}]"
|
|
|
|
# condition end
|
|
tmux set-option -ga status-left ',}'
|
|
|
|
first_left_segment=false
|
|
fi
|
|
done
|
|
|
|
if [ $nerdfonts = true ]; then
|
|
tmux set-option -ga status-left "#[bg=${status_style_bg}]"
|
|
tmux set-option -ga status-left "$nerdfonts_left"
|
|
fi
|
|
|
|
#
|
|
# status-format
|
|
#
|
|
|
|
pane_justify=$(get_option "@nova-pane-justify" "left")
|
|
tmux set-option -g status-justify ${pane_justify}
|
|
|
|
if [ $nerdfonts = true ]; then
|
|
tmux set-window-option -g window-status-current-format "#[fg=${status_style_bg},bg=${status_style_active_bg}]"
|
|
tmux set-window-option -ga window-status-current-format "$nerdfonts_left"
|
|
fi
|
|
|
|
tmux set-window-option -g window-status-format "#[fg=$status_style_fg]#[bg=$status_style_bg]"
|
|
tmux set-window-option -ga window-status-format "$(padding $padding)"
|
|
tmux set-window-option -ga window-status-format "$pane"
|
|
tmux set-window-option -ga window-status-format "$(padding $padding)"
|
|
|
|
if [ $nerdfonts = true ]; then
|
|
tmux set-window-option -ga window-status-current-format "#[fg=${status_style_active_fg}]#[bg=${status_style_active_bg}]"
|
|
else
|
|
tmux set-window-option -g window-status-current-format "#[fg=${status_style_active_fg}]#[bg=${status_style_active_bg}]"
|
|
fi
|
|
|
|
tmux set-window-option -ga window-status-current-format "$(padding $padding)"
|
|
tmux set-window-option -ga window-status-current-format "$pane"
|
|
tmux set-window-option -ga window-status-current-format "$(padding $padding)"
|
|
|
|
if [ $nerdfonts = true ]; then
|
|
tmux set-window-option -ga window-status-current-format "#[fg=${status_style_active_bg},bg=${status_style_bg}]"
|
|
tmux set-window-option -ga window-status-current-format "$nerdfonts_left"
|
|
fi
|
|
|
|
#
|
|
# segments-0-right
|
|
#
|
|
|
|
segments_right=$(get_option "@nova-segments-0-right" "")
|
|
IFS=' ' read -r -a segments_right <<< $segments_right
|
|
|
|
tmux set-option -g status-right ""
|
|
|
|
for segment in "${segments_right[@]}"; do
|
|
segment_content=$(get_option "@nova-segment-$segment" "")
|
|
segment_colors=$(get_option "@nova-segment-$segment-colors" "#282a36 #f8f8f2")
|
|
IFS=' ' read -r -a segment_colors <<< $segment_colors
|
|
if [ "$segment_content" != "" ] && [ "$segment_colors" != "" ]; then
|
|
if [ $nerdfonts = true ] && [ ! -n "$(tmux show-option -gqv status-right)" ]; then
|
|
tmux set-option -ga status-right "#[bg=#${status_style_bg}]"
|
|
fi
|
|
|
|
# condition everything on the non emptiness of the evaluated segment
|
|
tmux set-option -ga status-right "#{?#{w:#{E:@nova-segment-$segment}},"
|
|
|
|
if [ $nerdfonts = true ]; then
|
|
tmux set-option -ga status-right "#[fg=${segment_colors[0]}]"
|
|
tmux set-option -ga status-right "$nerdfonts_right"
|
|
fi
|
|
|
|
tmux set-option -ga status-right "#[fg=${segment_colors[1]}#,bg=${segment_colors[0]}]"
|
|
tmux set-option -ga status-right "$(padding $padding)"
|
|
tmux set-option -ga status-right "$segment_content"
|
|
tmux set-option -ga status-right "$(padding $padding)"
|
|
|
|
# set the bg color for the next nerdfonts seperator
|
|
[ $nerdfonts = true ] && tmux set-option -ga status-right "#[bg=${segment_colors[0]}]"
|
|
|
|
# condition end
|
|
tmux set-option -ga status-right ',}'
|
|
fi
|
|
done
|
|
|
|
for ((row=1; row <= rows; row++)); do
|
|
|
|
#
|
|
# segments-n-left
|
|
#
|
|
|
|
status_style_double_bg=$(get_option "@nova-status-style-double-bg" "#282a36")
|
|
segments_bottom_left=$(get_option "@nova-segments-$row-left" "")
|
|
IFS=' ' read -r -a segments_bottom_left <<< $segments_bottom_left
|
|
|
|
tmux set-option -g status-format[$row] "#[fill=$status_style_double_bg]#[align=left]"
|
|
nerdfonts_color="$status_style_double_bg"
|
|
|
|
for segment in "${segments_bottom_left[@]}"; do
|
|
segment_content=$(get_option "@nova-segment-$segment" "")
|
|
segment_colors=$(get_option "@nova-segment-$segment-colors" "#282a36 #f8f8f2")
|
|
IFS=' ' read -r -a segment_colors <<< $segment_colors
|
|
if [ "$segment_content" != "" ]; then
|
|
if [ $nerdfonts = true ] && [ "$(tmux show-option -gqv status-format[$row])" != "#[align=left]"]; then
|
|
tmux set-option -ga status-format[$row] "#[fg=${nerdfonts_color},bg=#${segment_colors[0]}]"
|
|
tmux set-option -ga status-format[$row] "$nerdfonts_left"
|
|
fi
|
|
|
|
tmux set-option -ga status-format[$row] "#[fg=${segment_colors[1]},bg=${segment_colors[0]}]"
|
|
tmux set-option -ga status-format[$row] "$(padding $padding)"
|
|
tmux set-option -ga status-format[$row] "$segment_content"
|
|
tmux set-option -ga status-format[$row] "$(padding $padding)"
|
|
|
|
[ $nerdfonts = true ] && nerdfonts_color="${segment_colors[0]}"
|
|
fi
|
|
done
|
|
|
|
if [ $nerdfonts = true ] && [ ! -z $nerdfonts_color ]; then
|
|
tmux set-option -ga status-format[$row] "#[fg=${nerdfonts_color},bg=${status_style_double_bg}]"
|
|
tmux set-option -ga status-format[$row] "$nerdfonts_left"
|
|
fi
|
|
|
|
#
|
|
# segments-n-center
|
|
#
|
|
|
|
nerdfonts_color="$status_style_double_bg"
|
|
|
|
segments_bottom_center=$(get_option "@nova-segments-$row-center" "")
|
|
IFS=' ' read -r -a segments_bottom_center <<< $segments_bottom_center
|
|
|
|
tmux set-option -ga status-format[$row] "#[align=centre]"
|
|
|
|
for segment in "${segments_bottom_center[@]}"; do
|
|
segment_content=$(get_option "@nova-segment-$segment")
|
|
segment_colors=$(get_option "@nova-segment-$segment-colors" "#282a36 #f8f8f2")
|
|
IFS=' ' read -r -a segment_colors <<< $segment_colors
|
|
|
|
if [ "$segment_content" != "" ]; then
|
|
if [ $nerdfonts = true ]; then
|
|
tmux set-option -ga status-format[$row] "#[fg=${nerdfonts_color},bg=#${segment_colors[0]}]"
|
|
tmux set-option -ga status-format[$row] "$nerdfonts_left"
|
|
fi
|
|
|
|
tmux set-option -ga status-format[$row] "#[fg=${segment_colors[1]},bg=${segment_colors[0]}]"
|
|
tmux set-option -ga status-format[$row] "$(padding $padding)"
|
|
tmux set-option -ga status-format[$row] "$segment_content"
|
|
tmux set-option -ga status-format[$row] "$(padding $padding)"
|
|
|
|
if [ $nerdfonts = true ]; then
|
|
tmux set-option -ga status-format[$row] "#[fg=${nerdfonts_color},bg=#${segment_colors[0]}]"
|
|
tmux set-option -ga status-format[$row] "$nerdfonts_right"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
#
|
|
# segments-n-right
|
|
#
|
|
|
|
nerdfonts_color="$status_style_double_bg"
|
|
|
|
segments_bottom_right=$(get_option "@nova-segments-$row-right" "")
|
|
IFS=' ' read -r -a segments_bottom_right <<< $segments_bottom_right
|
|
|
|
tmux set-option -ga status-format[$row] "#[align=right]"
|
|
|
|
for segment in "${segments_bottom_right[@]}"; do
|
|
segment_content=$(get_option "@nova-segment-$segment")
|
|
segment_colors=$(get_option "@nova-segment-$segment-colors" "#282a36 #f8f8f2")
|
|
IFS=' ' read -r -a segment_colors <<< $segment_colors
|
|
|
|
if [ "$segment_content" != "" ]; then
|
|
if [ $nerdfonts = true ]; then
|
|
tmux set-option -ga status-format[$row] "#[fg=${segment_colors[0]},bg=#${nerdfonts_color}]"
|
|
tmux set-option -ga status-format[$row] "$nerdfonts_right"
|
|
fi
|
|
|
|
tmux set-option -ga status-format[$row] "#[fg=${segment_colors[1]},bg=${segment_colors[0]}]"
|
|
tmux set-option -ga status-format[$row] "$(padding $padding)"
|
|
tmux set-option -ga status-format[$row] "$segment_content"
|
|
tmux set-option -ga status-format[$row] "$(padding $padding)"
|
|
fi
|
|
done
|
|
done
|