detached 24c2966

feat(examples): color the focused window's dot from the state file's column and row, and trim the space before the active workspace number

commit
24c29665cc1a15c83c53ba1b1731ecd3dec4fe2b
author
brice · · 2026-10-05 19:06 UTC
parent
2f98a9a
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
1 file · +25 -14
M examples/bundle/left.sh +25 -14
@@ -1,8 +1,9 @@
11 #!/bin/bash
22 # Left: the active workspace as an accent block that fades into the bar, then
3-# the workspaces with one dot per window. The active workspace shows only its
4-# dots. On NeferWL it also shows the stash. Without NeferWL's state file it
5-# shows nothing.
3+# the workspaces with one dot per window, in layout order (left to right). The
4+# active workspace shows only its dots, and the focused window's dot is in the
5+# accent color. On NeferWL it also shows the stash. Without NeferWL's state file
6+# it shows nothing.
67 . "$(dirname "$0")/lib.sh"
78
89 DOT=$ICON_DOT STASH=$ICON_STASH
@@ -13,35 +14,45 @@ DOT=$ICON_DOT STASH=$ICON_STASH
1314
1415 draw() {
1516 # First line: "<active> <count>" of the focused output. Then one line per
16- # workspace: "<n> <windows> <stashed>".
17- local data active count n w s line pips
17+ # workspace: "<n> <windows> <stashed> <focused>", where <focused> is the
18+ # place (from 1) of the focused window in the workspace's layout order, or 0.
19+ # Windows are ordered by column, then row; floating ones (column 0) come last.
20+ local data active count n w s f line pips i color
1821 data=$(jq -r '
1922 .output as $o
2023 | (.outputs[] | select(.name == $o)) as $out
2124 | [.windows[] | select(.output == $o)] as $ws
25+ | (if .window.output == $o then .window.id else null end) as $focus
2226 | "\($out.active) \($out.count)",
2327 (range(1; $out.count + 1) as $n
24- | [$ws[] | select(.workspace == $n)] as $here
25- | "\($n) \($here | length) \([$here[] | select(.stash_count > 0)] | length)")' \
28+ | [$ws[] | select(.workspace == $n)]
29+ | sort_by([(if (.column // 0) > 0 then .column else 1000000 end), (.row // 0), .id]) as $here
30+ | (if $focus == null then null else ($here | map(.id) | index($focus)) end) as $at
31+ | "\($n) \($here | length) \([$here[] | select(.stash_count > 0)] | length) \(if $at == null then 0 else $at + 1 end)")' \
2632 "$NEFERWL_STATE" 2>/dev/null) || return
2733 read -r active count <<<"$(head -1 <<<"$data")"
2834 # The state file is data, not code: bash arithmetic runs command
2935 # substitutions, so only digits may reach it.
3036 [[ $active =~ ^[0-9]+$ && $count =~ ^[0-9]+$ ]] || return
3137
32- line="$(bg "$ACCENT")$(fg "$(ink "$ACCENT")")$BOLD $active $RESET$(fade "$ACCENT" "$BAR")$(bg "$BAR")"
33- while read -r n w s; do
34- [[ $n =~ ^[0-9]+$ && $w =~ ^[0-9]+$ && $s =~ ^[0-9]+$ ]] || continue
35- # One dot per window, at most 4.
38+ line="$(bg "$ACCENT")$(fg "$(ink "$ACCENT")")$BOLD $active $RESET$(fade "$ACCENT" "$BAR")$(bg "$BAR")"
39+ while read -r n w s f; do
40+ [[ $n =~ ^[0-9]+$ && $w =~ ^[0-9]+$ && $s =~ ^[0-9]+$ && $f =~ ^[0-9]+$ ]] || continue
41+ # One dot per window, at most 4; a focused window past the 4th lights the 4th.
3642 pips=""
37- ((w > 0)) && printf -v pips "$DOT%.0s" $(seq 1 $((w > 4 ? 4 : w)))
43+ for ((i = 1; i <= (w > 4 ? 4 : w); i++)); do
44+ color=$DIM
45+ ((n == active)) && color=$NEFERBAR_FOREGROUND
46+ ((i == (f > 4 ? 4 : f))) && color=$ACCENT
47+ pips+="$(fg "$color")$DOT"
48+ done
3849 if ((n == active)); then
3950 # The number is already in the accent block on the left.
40- line+="$(fg "$NEFERBAR_FOREGROUND") $pips"
51+ line+=" $pips"
4152 ((s > 0)) && line+="$(fg "$NEFERBAR_COLOR2") $STASH$s"
4253 line+=" "
4354 elif ((w > 0)); then
44- line+="$(fg "$NEFERBAR_FOREGROUND") $n $(fg "$DIM")$pips "
55+ line+="$(fg "$NEFERBAR_FOREGROUND") $n $pips "
4556 else
4657 line+="$(fg "$DIM") $n "
4758 fi
@@ -1,8 +1,9 @@
1 #!/bin/bash1 #!/bin/bash
2 # Left: the active workspace as an accent block that fades into the bar, then2 # Left: the active workspace as an accent block that fades into the bar, then
3-# the workspaces with one dot per window. The active workspace shows only its3+# the workspaces with one dot per window, in layout order (left to right). The
4-# dots. On NeferWL it also shows the stash. Without NeferWL's state file it4+# active workspace shows only its dots, and the focused window's dot is in the
5-# shows nothing.5+# accent color. On NeferWL it also shows the stash. Without NeferWL's state file
6+# it shows nothing.
6 . "$(dirname "$0")/lib.sh"7 . "$(dirname "$0")/lib.sh"
7 8
8 DOT=$ICON_DOT STASH=$ICON_STASH9 DOT=$ICON_DOT STASH=$ICON_STASH
@@ -13,35 +14,45 @@ DOT=$ICON_DOT STASH=$ICON_STASH
13 14
14 draw() {15 draw() {
15 # First line: "<active> <count>" of the focused output. Then one line per16 # First line: "<active> <count>" of the focused output. Then one line per
16- # workspace: "<n> <windows> <stashed>".17+ # workspace: "<n> <windows> <stashed> <focused>", where <focused> is the
17- local data active count n w s line pips18+ # place (from 1) of the focused window in the workspace's layout order, or 0.
19+ # Windows are ordered by column, then row; floating ones (column 0) come last.
20+ local data active count n w s f line pips i color
18 data=$(jq -r '21 data=$(jq -r '
19 .output as $o22 .output as $o
20 | (.outputs[] | select(.name == $o)) as $out23 | (.outputs[] | select(.name == $o)) as $out
21 | [.windows[] | select(.output == $o)] as $ws24 | [.windows[] | select(.output == $o)] as $ws
25+ | (if .window.output == $o then .window.id else null end) as $focus
22 | "\($out.active) \($out.count)",26 | "\($out.active) \($out.count)",
23 (range(1; $out.count + 1) as $n27 (range(1; $out.count + 1) as $n
24- | [$ws[] | select(.workspace == $n)] as $here28+ | [$ws[] | select(.workspace == $n)]
25- | "\($n) \($here | length) \([$here[] | select(.stash_count > 0)] | length)")' \29+ | sort_by([(if (.column // 0) > 0 then .column else 1000000 end), (.row // 0), .id]) as $here
30+ | (if $focus == null then null else ($here | map(.id) | index($focus)) end) as $at
31+ | "\($n) \($here | length) \([$here[] | select(.stash_count > 0)] | length) \(if $at == null then 0 else $at + 1 end)")' \
26 "$NEFERWL_STATE" 2>/dev/null) || return32 "$NEFERWL_STATE" 2>/dev/null) || return
27 read -r active count <<<"$(head -1 <<<"$data")"33 read -r active count <<<"$(head -1 <<<"$data")"
28 # The state file is data, not code: bash arithmetic runs command34 # The state file is data, not code: bash arithmetic runs command
29 # substitutions, so only digits may reach it.35 # substitutions, so only digits may reach it.
30 [[ $active =~ ^[0-9]+$ && $count =~ ^[0-9]+$ ]] || return36 [[ $active =~ ^[0-9]+$ && $count =~ ^[0-9]+$ ]] || return
31 37
32- line="$(bg "$ACCENT")$(fg "$(ink "$ACCENT")")$BOLD $active $RESET$(fade "$ACCENT" "$BAR")$(bg "$BAR")"38+ line="$(bg "$ACCENT")$(fg "$(ink "$ACCENT")")$BOLD $active $RESET$(fade "$ACCENT" "$BAR")$(bg "$BAR")"
33- while read -r n w s; do39+ while read -r n w s f; do
34- [[ $n =~ ^[0-9]+$ && $w =~ ^[0-9]+$ && $s =~ ^[0-9]+$ ]] || continue40+ [[ $n =~ ^[0-9]+$ && $w =~ ^[0-9]+$ && $s =~ ^[0-9]+$ && $f =~ ^[0-9]+$ ]] || continue
35- # One dot per window, at most 4.41+ # One dot per window, at most 4; a focused window past the 4th lights the 4th.
36 pips=""42 pips=""
37- ((w > 0)) && printf -v pips "$DOT%.0s" $(seq 1 $((w > 4 ? 4 : w)))43+ for ((i = 1; i <= (w > 4 ? 4 : w); i++)); do
44+ color=$DIM
45+ ((n == active)) && color=$NEFERBAR_FOREGROUND
46+ ((i == (f > 4 ? 4 : f))) && color=$ACCENT
47+ pips+="$(fg "$color")$DOT"
48+ done
38 if ((n == active)); then49 if ((n == active)); then
39 # The number is already in the accent block on the left.50 # The number is already in the accent block on the left.
40- line+="$(fg "$NEFERBAR_FOREGROUND") $pips"51+ line+=" $pips"
41 ((s > 0)) && line+="$(fg "$NEFERBAR_COLOR2") $STASH$s"52 ((s > 0)) && line+="$(fg "$NEFERBAR_COLOR2") $STASH$s"
42 line+=" "53 line+=" "
43 elif ((w > 0)); then54 elif ((w > 0)); then
44- line+="$(fg "$NEFERBAR_FOREGROUND") $n $(fg "$DIM")$pips "55+ line+="$(fg "$NEFERBAR_FOREGROUND") $n $pips "
45 else56 else
46 line+="$(fg "$DIM") $n "57 line+="$(fg "$DIM") $n "
47 fi58 fi

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 5

Tags 4

↑↓ moveenter openesc close