Skip to content

Commit bf8d352

Browse files
authored
Merge pull request #363 from izzygomez/izzygomez/update-mode-indicator-segment
Update mode indicator segment for modern usage.
2 parents abdf080 + 2867398 commit bf8d352

File tree

6 files changed

+199
-20
lines changed

6 files changed

+199
-20
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Some examples of segments available that you can add to your tmux status bar are
4141
* Date and time
4242
* Hostname
4343
* tmux info
44+
* tmux mode indicator (normal/prefix, mouse, copy modes)
4445
* CWD in pane
4546
* Current X keyboard layout
4647
* Network download/upload speed

lib/powerline.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ __process_scripts() {
9595
local script="$TMUX_POWERLINE_DIR_SEGMENTS/${powerline_segment[0]}.sh"
9696
fi
9797

98-
export TMUX_POWERLINE_CUR_SEGMENT_BG="${powerline_segment[1]}"
99-
export TMUX_POWERLINE_CUR_SEGMENT_FG="${powerline_segment[2]}"
98+
export TMUX_POWERLINE_CUR_SEGMENT_BG=$(__normalize_color "${powerline_segment[1]}")
99+
export TMUX_POWERLINE_CUR_SEGMENT_FG=$(__normalize_color "${powerline_segment[2]}")
100100
source "$script"
101101
local output
102102
output=$(run_segment)

segments/mode_indicator.sh

Lines changed: 190 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,196 @@
1-
# Indicator of pressing TMUX prefix, copy and insert modes.
1+
# Segment that indicates status of various tmux modes. The list of supported
2+
# modes & a brief description of each is as follows:
3+
#
4+
# - Normal mode: The default mode when you are simply using tmux.
5+
#
6+
# - Prefix mode: The mode when the tmux prefix key is pressed.
7+
#
8+
# - Mouse mode: While not definitionally a mode according to `man tmux`, this is
9+
# a mode in the sense that it changes the behavior of tmux, & can be toggled
10+
# on & off via the `tmux set-option -g mouse {on,off}` command; see `man tmux`
11+
# for more details.
12+
#
13+
# - Copy mode: The mode when text is being copied. By default this is triggered
14+
# by pressing the prefix key followed by '['; see `man tmux` for more details.
15+
#
16+
# Normal & prefix modes toggle between each other, so they occupy the same
17+
# section of this segment. The other modes are independent of each other, so
18+
# they each have their own part of the segment. By default, all modes are
19+
# enabled, the text color for each node defaults to whatever foreground color is
20+
# set in the user's theme, & the below list defines the default text for each
21+
# mode & separator. These can all be overridden in `config.sh`.
222

3-
prefix_pressed_text="PREFIX PRESSED"
4-
insert_mode_text="INSERT"
5-
copy_mode_text="COPY"
6-
normal_mode_text="NORMAL"
7-
separator=""
23+
# Default values for the settings that this segment supports.
24+
NORMAL_AND_PREFIX_MODE_ENABLED_DEFAULT="true"
825

9-
prefix_mode_fg="colour226"
10-
normal_mode_fg="colour16"
11-
copy_mode_fg="colour82"
12-
bg="colour33"
26+
NORMAL_MODE_TEXT_DEFAULT="normal"
27+
NORMAL_MODE_TEXT_COLOR_DEFAULT="$TMUX_POWERLINE_CUR_SEGMENT_FG"
28+
29+
PREFIX_MODE_TEXT_DEFAULT="prefix"
30+
PREFIX_MODE_TEXT_COLOR_DEFAULT="$TMUX_POWERLINE_CUR_SEGMENT_FG"
31+
32+
MOUSE_MODE_ENABLED_DEFAULT="true"
33+
34+
MOUSE_MODE_TEXT_DEFAULT="mouse"
35+
MOUSE_MODE_TEXT_COLOR_DEFAULT="$TMUX_POWERLINE_CUR_SEGMENT_FG"
36+
37+
COPY_MODE_ENABLED_DEFAULT="true"
38+
39+
COPY_MODE_TEXT_DEFAULT="copy"
40+
COPY_MODE_TEXT_COLOR_DEFAULT="$TMUX_POWERLINE_CUR_SEGMENT_FG"
41+
42+
SEPARATOR_TEXT_DEFAULT=""
43+
44+
generate_segmentrc() {
45+
read -d '' rccontents <<EORC
46+
# Whether the normal & prefix mode section should be enabled. Should be {"true, "false"}.
47+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_AND_PREFIX_MODE_ENABLED="${NORMAL_AND_PREFIX_MODE_ENABLED_DEFAULT}"
48+
# Normal mode text & color overrides. Defaults to "normal" & the segment foreground color set in the theme used.
49+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_MODE_TEXT="${NORMAL_MODE_TEXT_DEFAULT}"
50+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_MODE_TEXT_COLOR=""
51+
# Prefix mode text & color overrides. Defaults to "prefix" & the segment foreground color set in the theme used.
52+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_PREFIX_MODE_TEXT="${PREFIX_MODE_TEXT_DEFAULT}"
53+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_PREFIX_MODE_TEXT_COLOR=""
54+
# Whether the mouse mode section should be enabled. Should be {"true, "false"}.
55+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_ENABLED="${MOUSE_MODE_ENABLED_DEFAULT}"
56+
# Mouse mode text & color overrides. Defaults to "mouse" & the segment foreground color set in the theme used.
57+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_TEXT="${MOUSE_MODE_TEXT_DEFAULT}"
58+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_TEXT_COLOR=""
59+
# Whether the copy mode section should be enabled. Should be {"true, "false"}.
60+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_ENABLED="${COPY_MODE_ENABLED_DEFAULT}"
61+
# Copy mode text & color overrides. Defaults to "copy" & the segment foreground color set in the theme used.
62+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_TEXT="${COPY_MODE_TEXT_DEFAULT}"
63+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_TEXT_COLOR=""
64+
# Separator text override. Defaults to " • ".
65+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_SEPARATOR_TEXT="${SEPARATOR_TEXT_DEFAULT}"
66+
EORC
67+
echo "$rccontents"
68+
}
1369

1470
run_segment() {
15-
prefix_indicator="#[bg=${bg}]#{?client_prefix,#[fg=${prefix_mode_fg}]${prefix_pressed_text},#[fg=${normal_mode_fg}]${normal_mode_text}}"
16-
normal_or_copy_indicator="#[bg=${bg}]#{?pane_in_mode,#[fg=${copy_mode_fg}]${copy_mode_text},#[fg=${normal_mode_fg}]${insert_mode_text}}";
17-
echo $prefix_indicator "#[fg=${normal_mode_fg}]${separator}" $normal_or_copy_indicator
71+
__process_settings
72+
73+
# Colors.
74+
normal_text_color="#[fg=$TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_MODE_TEXT_COLOR]"
75+
prefix_text_color="#[fg=$TMUX_POWERLINE_SEG_MODE_INDICATOR_PREFIX_MODE_TEXT_COLOR]"
76+
mouse_text_color="#[fg=$TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_TEXT_COLOR]"
77+
copy_text_color="#[fg=$TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_TEXT_COLOR]"
78+
79+
# Separator.
80+
separator="#[fg=$TMUX_POWERLINE_CUR_SEGMENT_FG]$TMUX_POWERLINE_SEG_MODE_INDICATOR_SEPARATOR_TEXT"
81+
82+
# Populate segment.
83+
segment=""
84+
__normal_and_prefix_mode_indicator
85+
__mouse_mode_indicator
86+
# Copy mode should always be populated last; see comments in
87+
# __copy_mode_indicator for more details.
88+
__copy_mode_indicator
89+
90+
echo $segment
91+
return 0
92+
}
93+
94+
__normal_and_prefix_mode_indicator() {
95+
if [ "$TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_AND_PREFIX_MODE_ENABLED" != "true" ]; then
96+
return 0
97+
fi
98+
99+
normal_mode="$normal_text_color$TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_MODE_TEXT"
100+
prefix_mode="$prefix_text_color$TMUX_POWERLINE_SEG_MODE_INDICATOR_PREFIX_MODE_TEXT"
101+
normal_and_prefix_indicator="#{?client_prefix,$prefix_mode,$normal_mode}"
102+
103+
if [ -z "$segment" ]; then
104+
segment+="$normal_and_prefix_indicator"
105+
else
106+
segment+="$separator$normal_and_prefix_indicator"
107+
fi
108+
}
109+
110+
__mouse_mode_indicator() {
111+
if [ "$TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_ENABLED" != "true" ]; then
18112
return 0
113+
fi
114+
115+
# Mouse mode status - check window, then session, then global settings.
116+
mouse_mode_status=$(tmux show-options -w | grep mouse | cut -d ' ' -f2) # Window-level options
117+
if [ -z "$mouse_mode_status" ]; then
118+
mouse_mode_status=$(tmux show-options | grep mouse | cut -d ' ' -f2) # Session-level options
119+
if [ -z "$mouse_mode_status" ]; then
120+
mouse_mode_status=$(tmux show-options -g | grep mouse | cut -d ' ' -f2) # Global options
121+
fi
122+
fi
123+
124+
if [ "$mouse_mode_status" != "on" ]; then
125+
return 0
126+
fi
127+
128+
mouse_indicator="$mouse_text_color$TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_TEXT"
129+
130+
if [ -z "$segment" ]; then
131+
segment+="$mouse_indicator"
132+
else
133+
segment+="$separator$mouse_indicator"
134+
fi
135+
}
136+
137+
__copy_mode_indicator() {
138+
if [ "$TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_ENABLED" != "true" ]; then
139+
return 0
140+
fi
141+
142+
# Note that so long as the *_COPY_MODE_ENABLED flag is set, this will always
143+
# add a non-empty section to the segment, regardless of whether copy mode is
144+
# actually active. This is because this block of code uses tmux's #()/#{}
145+
# syntax for command substitution that doesn't get evaluated until runtime,
146+
# so for the purposes of this shell script it's always non-empty.
147+
#
148+
# Because of this, __copy_mode_indicator should always be called last
149+
# (i.e. it will always be the rightmost section of the segment), otherwise
150+
# the separator will be printed even if copy mode isn't active.
151+
copy_mode="$copy_text_color$TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_TEXT"
152+
if [ -z "$segment" ]; then
153+
segment+="#{?pane_in_mode,$copy_mode,}"
154+
else
155+
segment+="#{?pane_in_mode,$separator$copy_mode,}"
156+
fi
157+
}
158+
159+
__process_settings() {
160+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_AND_PREFIX_MODE_ENABLED" ]; then
161+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_AND_PREFIX_MODE_ENABLED="${NORMAL_AND_PREFIX_MODE_ENABLED_DEFAULT}"
162+
fi
163+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_MODE_TEXT" ]; then
164+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_MODE_TEXT="${NORMAL_MODE_TEXT_DEFAULT}"
165+
fi
166+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_MODE_TEXT_COLOR" ]; then
167+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_NORMAL_MODE_TEXT_COLOR="${NORMAL_MODE_TEXT_COLOR_DEFAULT}"
168+
fi
169+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_PREFIX_MODE_TEXT" ]; then
170+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_PREFIX_MODE_TEXT="${PREFIX_MODE_TEXT_DEFAULT}"
171+
fi
172+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_PREFIX_MODE_TEXT_COLOR" ]; then
173+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_PREFIX_MODE_TEXT_COLOR="${PREFIX_MODE_TEXT_COLOR_DEFAULT}"
174+
fi
175+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_ENABLED" ]; then
176+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_ENABLED="${MOUSE_MODE_ENABLED_DEFAULT}"
177+
fi
178+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_TEXT" ]; then
179+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_TEXT="${MOUSE_MODE_TEXT_DEFAULT}"
180+
fi
181+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_TEXT_COLOR" ]; then
182+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_MOUSE_MODE_TEXT_COLOR="${MOUSE_MODE_TEXT_COLOR_DEFAULT}"
183+
fi
184+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_ENABLED" ]; then
185+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_ENABLED="${COPY_MODE_ENABLED_DEFAULT}"
186+
fi
187+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_TEXT" ]; then
188+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_TEXT="${COPY_MODE_TEXT_DEFAULT}"
189+
fi
190+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_TEXT_COLOR" ]; then
191+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_COPY_MODE_TEXT_COLOR="${COPY_MODE_TEXT_COLOR_DEFAULT}"
192+
fi
193+
if [ -z "$TMUX_POWERLINE_SEG_MODE_INDICATOR_SEPARATOR_TEXT" ]; then
194+
export TMUX_POWERLINE_SEG_MODE_INDICATOR_SEPARATOR_TEXT="${SEPARATOR_TEXT_DEFAULT}"
195+
fi
19196
}

segments/vcs_branch.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ __parse_git_branch() {
6464
branch=${branch#refs\/heads\/}
6565
branch=$(__truncate_branch_name $branch)
6666

67-
echo -n "#[fg=colour${git_colour}]${branch_symbol} #[fg=colour${TMUX_POWERLINE_CUR_SEGMENT_FG}]${branch}"
67+
echo -n "#[fg=colour${git_colour}]${branch_symbol} #[fg=${TMUX_POWERLINE_CUR_SEGMENT_FG}]${branch}"
6868
}
6969

7070
# Show SVN branch.
@@ -85,7 +85,7 @@ __parse_svn_branch() {
8585

8686
local branch=$(echo "${svn_url}" | grep -E -o '[^/]+$')
8787
branch=$(__truncate_branch_name $branch)
88-
echo "#[fg=colour${svn_colour}]${branch_symbol} #[fg=colour${TMUX_POWERLINE_CUR_SEGMENT_FG}]${branch}"
88+
echo "#[fg=colour${svn_colour}]${branch_symbol} #[fg=${TMUX_POWERLINE_CUR_SEGMENT_FG}]${branch}"
8989
}
9090

9191
__parse_hg_branch() {
@@ -101,7 +101,7 @@ __parse_hg_branch() {
101101

102102
local branch=$(echo "$summary" | grep 'branch:' | cut -d ' ' -f2)
103103
branch=$(__truncate_branch_name $branch)
104-
echo "#[fg=colour${hg_colour}]${branch_symbol} #[fg=colour${TMUX_POWERLINE_CUR_SEGMENT_FG}]${branch}"
104+
echo "#[fg=colour${hg_colour}]${branch_symbol} #[fg=${TMUX_POWERLINE_CUR_SEGMENT_FG}]${branch}"
105105
}
106106

107107

segments/vcs_modified.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ __parse_svn_stats() {
6161

6262
#print
6363
if [[ $modified -gt 0 ]] ; then
64-
local ret="#[fg=colour${TMUX_POWERLINE_CUR_SEGMENT_FG}${modified}"
64+
local ret="#[fg=${TMUX_POWERLINE_CUR_SEGMENT_FG}${modified}"
6565
fi
6666
if [[ $conflicted -gt 0 ]] ; then
6767
local ret="#[fg=colour${svn_colour}${conflicted} ${ret}"

themes/default.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ if [ -z $TMUX_POWERLINE_LEFT_STATUS_SEGMENTS ]; then
8484
TMUX_POWERLINE_LEFT_STATUS_SEGMENTS=(
8585
"tmux_session_info 148 234" \
8686
"hostname 33 0" \
87+
#"mode_indicator 165 0" \
8788
#"ifstat 30 255" \
8889
#"ifstat_sys 30 255" \
8990
"lan_ip 24 255 ${TMUX_POWERLINE_SEPARATOR_RIGHT_THIN}" \
@@ -107,7 +108,7 @@ if [ -z $TMUX_POWERLINE_RIGHT_STATUS_SEGMENTS ]; then
107108
"load 237 167" \
108109
#"tmux_mem_cpu_load 234 136" \
109110
"battery 137 127" \
110-
#"air ${TMUX_POWERLINE_SEG_AIR_COLOR} 255" \
111+
#"air ${TMUX_POWERLINE_SEG_AIR_COLOR} 255" \
111112
"weather 37 255" \
112113
#"rainbarf 0 ${TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR}" \
113114
#"xkb_layout 125 117" \

0 commit comments

Comments
 (0)