Extend shell bar config command

This commit is contained in:
David Heinemeier Hansson
2026-05-27 11:20:42 +02:00
parent 8914d30be7
commit 3986522d6e
3 changed files with 150 additions and 13 deletions
+60 -4
View File
@@ -1,8 +1,8 @@
#!/bin/bash
# omarchy:summary=Mutate the user shell.json bar layout
# omarchy:args=add <plugin> [left|center|right] | drop <plugin> | show
# omarchy:examples=omarchy config shell bar add omarchy.tailscale | omarchy config shell bar drop omarchy.tailscale | omarchy config shell bar show
# omarchy:args=add <plugin> [left|center|right] | drop <plugin> | position <top|bottom|left|right> | transparent <true|false> | show
# omarchy:examples=omarchy config shell bar add omarchy.tailscale | omarchy config shell bar position top | omarchy config shell bar transparent true | omarchy config shell bar show
set -euo pipefail
@@ -11,7 +11,7 @@ OMARCHY_ROOT="${OMARCHY_PATH:-}"
DEFAULTS_FILE="$OMARCHY_ROOT/config/omarchy/shell.json"
usage() {
echo "Usage: omarchy-config-shell-bar add <plugin> [left|center|right] | drop <plugin> | show" >&2
echo "Usage: omarchy-config-shell-bar add <plugin> [left|center|right] | drop <plugin> | position <top|bottom|left|right> | transparent <true|false> | show" >&2
}
fail() {
@@ -40,7 +40,7 @@ case "$command" in
exit 1
fi
jq . "$(source_file)"
jq '.bar // {}' "$(source_file)"
;;
add)
if (( $# < 2 || $# > 3 )); then
@@ -93,6 +93,62 @@ case "$command" in
trap - EXIT
omarchy-shell -q shell rescanPlugins >/dev/null 2>&1 || true
;;
position)
if (( $# != 2 )); then
usage
exit 1
fi
position="${2:-}"
[[ $position =~ ^(top|bottom|left|right)$ ]] || fail "position must be top, bottom, left, or right"
mkdir -p "$(dirname "$CONFIG_FILE")"
source="$(source_file)"
tmp=$(mktemp)
trap 'rm -f "$tmp"' EXIT
jq --arg position "$position" '
def object_or_empty: if type == "object" then . else {} end;
object_or_empty
| .version = 1
| .bar = (.bar | object_or_empty)
| .bar.position = $position
' "$source" >"$tmp"
mv "$tmp" "$CONFIG_FILE"
trap - EXIT
;;
transparent)
if (( $# != 2 )); then
usage
exit 1
fi
transparent="${2:-}"
[[ $transparent =~ ^(true|false)$ ]] || fail "transparent must be true or false"
mkdir -p "$(dirname "$CONFIG_FILE")"
source="$(source_file)"
tmp=$(mktemp)
trap 'rm -f "$tmp"' EXIT
jq --argjson transparent "$transparent" '
def object_or_empty: if type == "object" then . else {} end;
object_or_empty
| .version = 1
| .bar = (.bar | object_or_empty)
| .bar.transparent = $transparent
' "$source" >"$tmp"
mv "$tmp" "$CONFIG_FILE"
trap - EXIT
;;
drop)
if (( $# != 2 )); then
usage
+72 -7
View File
@@ -40,14 +40,79 @@ _omarchy_complete() {
candidates+=("--all" "--json" "--markdown" "--check")
fi
if (( ${#candidates[@]} == 0 )) && [[ -x $bin_dir/$prefix ]]; then
local args enum
args=$(grep -m 1 '^# omarchy:args=<' "$bin_dir/$prefix" 2>/dev/null)
enum="${args#*<}"
enum="${enum%%>*}"
if (( ${#candidates[@]} == 0 )); then
local command_prefix command_path first_arg_index n j
for ((n = COMP_CWORD - 1; n >= 0; n--)); do
command_prefix="omarchy"
for ((j = 1; j <= n; j++)); do
part="${COMP_WORDS[j]}"
[[ -z $part || $part == -* ]] && continue
command_prefix+="-$part"
done
if [[ $enum == *"|"* && $enum != *" "* ]]; then
read -r -a candidates <<<"${enum//|/ }"
command_path="$bin_dir/$command_prefix"
if [[ -x $command_path ]]; then
first_arg_index=$((n + 1))
break
fi
done
if [[ -n ${command_path:-} && -x $command_path ]]; then
local args spec alt token actual alts value match current_arg_index
args=$(grep -m 1 '^# omarchy:args=' "$command_path" 2>/dev/null)
args="${args#*omarchy:args=}"
current_arg_index=$((COMP_CWORD - first_arg_index))
alts="${args// | /$'\n'}"
while IFS= read -r alt; do
read -r -a spec <<<"$alt"
match=true
for ((j = 0; j < current_arg_index; j++)); do
token="${spec[j]:-}"
actual="${COMP_WORDS[first_arg_index + j]:-}"
if [[ -z $token ]]; then
match=false
break
fi
if [[ $token == \<*\> || $token == \[*\] ]]; then
value="${token#<}"
value="${value#\[}"
value="${value%>}"
value="${value%\]}"
if [[ $value == *"|"* ]]; then
[[ " ${value//|/ } " == *" $actual "* ]] || match=false
fi
elif [[ $token != "$actual" ]]; then
match=false
fi
done
[[ $match == true ]] || continue
token="${spec[current_arg_index]:-}"
[[ -n $token ]] || continue
if [[ $token == \<*\> || $token == \[*\] ]]; then
value="${token#<}"
value="${value#\[}"
value="${value%>}"
value="${value%\]}"
if [[ $value == *"|"* ]]; then
read -r -a spec <<<"${value//|/ }"
for actual in "${spec[@]}"; do
[[ -n ${seen[$actual]:-} ]] && continue
seen[$actual]=1
candidates+=("$actual")
done
fi
else
[[ -n ${seen[$token]:-} ]] && continue
seen[$token]=1
candidates+=("$token")
fi
done <<<"$alts"
fi
fi
+18 -2
View File
@@ -139,9 +139,25 @@ pass "shell config moves existing widgets without duplicates"
HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar show | jq -e '
def ids: map(.id // .);
.bar.layout.right | ids == ["omarchy.tray", "local.first", "omarchy.tailscale", "omarchy.bluetooth"]
(.layout.right | ids == ["omarchy.tray", "local.first", "omarchy.tailscale", "omarchy.bluetooth"]) and
has("version") | not
' >/dev/null
pass "shell config shows bar json"
pass "shell config shows only bar json"
HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar position bottom
jq -e '
.bar.position == "bottom" and
.plugins == []
' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null
pass "shell config sets bar position"
HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar transparent true
jq -e '
.bar.transparent == true and
.bar.position == "bottom" and
.plugins == []
' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null
pass "shell config sets bar transparency"
HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar drop local.left
jq -e '