From d238c12fdbfdb123fbaa73528550289bca79c714 Mon Sep 17 00:00:00 2001 From: "Hauzer S. Lee" Date: Fri, 6 Dec 2024 21:01:57 +0800 Subject: [PATCH 1/3] feat: port dual-line status bar support feature from tmux-powerline --- tmux-power.tmux | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tmux-power.tmux b/tmux-power.tmux index 905d2fc..4f19b93 100755 --- a/tmux-power.tmux +++ b/tmux-power.tmux @@ -43,6 +43,8 @@ set_defaults() { g3='#444444' g4='#626262' status_interval='1' + + status_lines='1' } # Theme resolution @@ -70,6 +72,15 @@ resolve_theme_colors() { # Status bar assembly +set_dual_status_lines() { + if [ "$status_lines" = "2" ]; then + tmux_set status 2 + tmux_set status-format[0] "#[list=on align=#{status-justify}]#[list=left-marker]<#[list=right-marker]>#[list=on]#{W:#[range=window|#{window_index} #{E:window-status-style}#{?#{&&:#{window_last_flag},#{!=:#{E:window-status-last-style},default}}, #{E:window-status-last-style},}#{?#{&&:#{window_bell_flag},#{!=:#{E:window-status-bell-style},default}}, #{E:window-status-bell-style},#{?#{&&:#{||:#{window_activity_flag},#{window_silence_flag}},#{!=:#{E:window-status-activity-style},default}}, #{E:window-status-activity-style},}}]#[push-default]#{T:window-status-format}#[pop-default]#[norange default]#{?window_end_flag,,#{window-status-separator}},#[range=window|#{window_index} list=focus #{?#{!=:#{E:window-status-current-style},default},#{E:window-status-current-style},#{E:window-status-style}}#{?#{&&:#{window_last_flag},#{!=:#{E:window-status-last-style},default}}, #{E:window-status-last-style},}#{?#{&&:#{window_bell_flag},#{!=:#{E:window-status-bell-style},default}}, #{E:window-status-bell-style},#{?#{&&:#{||:#{window_activity_flag},#{window_silence_flag}},#{!=:#{E:window-status-activity-style},default}}, #{E:window-status-activity-style},}}]#[push-default]#{T:window-status-current-format}#[pop-default]#[norange list=on default]#{?window_end_flag,,#{window-status-separator}}}" + tmux_set status-format[1] "#[align=left range=left #{E:status-left-style}]#[push-default]#{T;=/#{status-left-length}:status-left}#[pop-default]#[norange default]#[nolist align=right range=right #{E:status-right-style}]#[push-default]#{T;=/#{status-right-length}:status-right}#[pop-default]#[norange default]" + tmux_set status-format[1] "#[align=left range=left #{E:status-left-style}]#[push-default]#{T;=/#{status-left-length}:status-left}#[pop-default]#[norange default]#[align=centre]#{P:#{?pane_active,#[reverse],}#{pane_index}[#{pane_width}x#{pane_height}]#[default] }#[nolist align=right range=right #{E:status-right-style}]#[push-default]#{T;=/#{status-right-length}:status-right}#[pop-default]#[norange default]" + fi +} + configure_status_bar() { tmux_set status-interval "$status_interval" tmux_set status on @@ -87,6 +98,8 @@ configure_status_bar() { tmux_set status-left-length 150 tmux_set status-right-bg "$G0" tmux_set status-right-length 150 + + set_dual_status_lines } build_left_status() { From f165ee9ff992dfc6caa71793c969a792654994b1 Mon Sep 17 00:00:00 2001 From: "Hauzer S. Lee" Date: Wed, 17 Jun 2026 01:41:24 +0800 Subject: [PATCH 2/3] refactor(tmux-power): split dual-line status bar into build functions --- tmux-power.tmux | 64 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/tmux-power.tmux b/tmux-power.tmux index 4f19b93..834778b 100755 --- a/tmux-power.tmux +++ b/tmux-power.tmux @@ -72,15 +72,6 @@ resolve_theme_colors() { # Status bar assembly -set_dual_status_lines() { - if [ "$status_lines" = "2" ]; then - tmux_set status 2 - tmux_set status-format[0] "#[list=on align=#{status-justify}]#[list=left-marker]<#[list=right-marker]>#[list=on]#{W:#[range=window|#{window_index} #{E:window-status-style}#{?#{&&:#{window_last_flag},#{!=:#{E:window-status-last-style},default}}, #{E:window-status-last-style},}#{?#{&&:#{window_bell_flag},#{!=:#{E:window-status-bell-style},default}}, #{E:window-status-bell-style},#{?#{&&:#{||:#{window_activity_flag},#{window_silence_flag}},#{!=:#{E:window-status-activity-style},default}}, #{E:window-status-activity-style},}}]#[push-default]#{T:window-status-format}#[pop-default]#[norange default]#{?window_end_flag,,#{window-status-separator}},#[range=window|#{window_index} list=focus #{?#{!=:#{E:window-status-current-style},default},#{E:window-status-current-style},#{E:window-status-style}}#{?#{&&:#{window_last_flag},#{!=:#{E:window-status-last-style},default}}, #{E:window-status-last-style},}#{?#{&&:#{window_bell_flag},#{!=:#{E:window-status-bell-style},default}}, #{E:window-status-bell-style},#{?#{&&:#{||:#{window_activity_flag},#{window_silence_flag}},#{!=:#{E:window-status-activity-style},default}}, #{E:window-status-activity-style},}}]#[push-default]#{T:window-status-current-format}#[pop-default]#[norange list=on default]#{?window_end_flag,,#{window-status-separator}}}" - tmux_set status-format[1] "#[align=left range=left #{E:status-left-style}]#[push-default]#{T;=/#{status-left-length}:status-left}#[pop-default]#[norange default]#[nolist align=right range=right #{E:status-right-style}]#[push-default]#{T;=/#{status-right-length}:status-right}#[pop-default]#[norange default]" - tmux_set status-format[1] "#[align=left range=left #{E:status-left-style}]#[push-default]#{T;=/#{status-left-length}:status-left}#[pop-default]#[norange default]#[align=centre]#{P:#{?pane_active,#[reverse],}#{pane_index}[#{pane_width}x#{pane_height}]#[default] }#[nolist align=right range=right #{E:status-right-style}]#[push-default]#{T;=/#{status-right-length}:status-right}#[pop-default]#[norange default]" - fi -} - configure_status_bar() { tmux_set status-interval "$status_interval" tmux_set status on @@ -98,8 +89,6 @@ configure_status_bar() { tmux_set status-left-length 150 tmux_set status-right-bg "$G0" tmux_set status-right-length 150 - - set_dual_status_lines } build_left_status() { @@ -163,6 +152,51 @@ build_right_status() { tmux_set status-right "$RS" } +configure_dual_status_bars() { + tmux_set status 2 + build_status_format_0 + build_status_format_1 +} + +build_status_format_0() { + # Normal window format (with style fallbacks for last/bell/activity/silence) + local win_normal="#{W:" + win_normal+="#[range=window|#{window_index} #{E:window-status-style}" + win_normal+="#{?#{&&:#{window_last_flag},#{!=:#{E:window-status-last-style},default}}, #{E:window-status-last-style},}" + win_normal+="#{?#{&&:#{window_bell_flag},#{!=:#{E:window-status-bell-style},default}}, #{E:window-status-bell-style}," + win_normal+="#{?#{&&:#{||:#{window_activity_flag},#{window_silence_flag}},#{!=:#{E:window-status-activity-style},default}}, #{E:window-status-activity-style},}}" + win_normal+="]" + win_normal+="#[push-default]#{T:window-status-format}#[pop-default]" + win_normal+="#[norange default]#{?window_end_flag,,#{window-status-separator}}" + + # Current (focused) window format — same style fallback chain but for current + local win_current="#[range=window|#{window_index} list=focus" + win_current+=" #{?#{!=:#{E:window-status-current-style},default},#{E:window-status-current-style},#{E:window-status-style}}" + win_current+="#{?#{&&:#{window_last_flag},#{!=:#{E:window-status-last-style},default}}, #{E:window-status-last-style},}" + win_current+="#{?#{&&:#{window_bell_flag},#{!=:#{E:window-status-bell-style},default}}, #{E:window-status-bell-style}," + win_current+="#{?#{&&:#{||:#{window_activity_flag},#{window_silence_flag}},#{!=:#{E:window-status-activity-style},default}}, #{E:window-status-activity-style},}}" + win_current+="]" + win_current+="#[push-default]#{T:window-status-current-format}#[pop-default]" + win_current+="#[norange list=on default]#{?window_end_flag,,#{window-status-separator}}" + win_current+="}" + + tmux_set status-format[0] \ + "#[list=on align=#{status-justify}]#[list=left-marker]<#[list=right-marker]>#[list=on]${win_normal},${win_current}" +} + +build_status_format_1() { + local fmt_left="#[align=left range=left #{E:status-left-style}]#[push-default]" + fmt_left+="#{T;=/#{status-left-length}:status-left}#[pop-default]#[norange default]" + + local fmt_center="#[align=centre]" + fmt_center+="#{P:#{?pane_active,#[reverse],}#{pane_index}[#{pane_width}x#{pane_height}]#[default] }" + + local fmt_right="#[nolist align=right range=right #{E:status-right-style}]#[push-default]" + fmt_right+="#{T;=/#{status-right-length}:status-right}#[pop-default]#[norange default]" + + tmux_set status-format[1] "${fmt_left}${fmt_center}${fmt_right}" +} + # Window, pane, and message styles configure_ui_styles() { @@ -315,8 +349,12 @@ main() { load_tmux_options resolve_theme_colors configure_status_bar - build_left_status - build_right_status + if [[ "$status_lines" == "1" ]]; then + build_left_status + build_right_status + else + configure_dual_status_bars + fi configure_ui_styles tmux_flush } From cc2f1e43ea6c28e3f244e9dfa0797c254c3e43bf Mon Sep 17 00:00:00 2001 From: "Hauzer S. Lee" Date: Thu, 18 Jun 2026 18:10:00 +0800 Subject: [PATCH 3/3] fix(tmux-power): always build status-left/right in dual-line mode --- tmux-power.tmux | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tmux-power.tmux b/tmux-power.tmux index 834778b..2f56055 100755 --- a/tmux-power.tmux +++ b/tmux-power.tmux @@ -349,10 +349,9 @@ main() { load_tmux_options resolve_theme_colors configure_status_bar - if [[ "$status_lines" == "1" ]]; then - build_left_status - build_right_status - else + build_left_status + build_right_status + if [[ "$status_lines" == "2" ]]; then configure_dual_status_bars fi configure_ui_styles