Select-menu options gain an optional third field rendered under the label, filtered alongside it, and returned with the selection. The plugin picker uses it to show every plugin's id and act on the id the selection hands back, replacing the duplicate-name label suffix. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
100 lines
2.6 KiB
Bash
Executable File
100 lines
2.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Pick one option from a menu
|
|
# omarchy:group=menu
|
|
# omarchy:name=select
|
|
# omarchy:args=prompt [option...] [-- menu args...]
|
|
# omarchy:examples=omarchy menu select Format jpg png|omarchy-menu-select Resolution 4k 1080p 720p -- --width 400
|
|
|
|
# An option may lead with an icon, as "<glyph><TAB><label>", and may trail a
|
|
# subtext shown under the label, as "<glyph><TAB><label><TAB><subtext>". The
|
|
# menu shows the glyph but never returns it. A plain option returns the label
|
|
# alone; an option with a subtext returns "<label><TAB><subtext>", so callers
|
|
# with same-named rows get the subtext back as the stable key.
|
|
|
|
set -euo pipefail
|
|
|
|
if (( $# < 1 )); then
|
|
echo "Usage: omarchy-menu-select <prompt> [option...] [-- menu args...]" >&2
|
|
exit 1
|
|
fi
|
|
|
|
prompt="$1"
|
|
shift
|
|
|
|
options=()
|
|
menu_width=""
|
|
menu_maxheight=""
|
|
|
|
while (( $# > 0 )); do
|
|
if [[ $1 == "--" ]]; then
|
|
shift
|
|
while (( $# > 0 )); do
|
|
case "$1" in
|
|
--width)
|
|
shift
|
|
if (( $# == 0 )); then
|
|
echo "omarchy-menu-select: --width requires a value" >&2
|
|
exit 1
|
|
fi
|
|
menu_width="$1"
|
|
;;
|
|
--height|--maxheight)
|
|
arg="$1"
|
|
shift
|
|
if (( $# == 0 )); then
|
|
echo "omarchy-menu-select: $arg requires a value" >&2
|
|
exit 1
|
|
fi
|
|
menu_maxheight="$1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
break
|
|
fi
|
|
|
|
options+=("$1")
|
|
shift
|
|
done
|
|
|
|
if (( ${#options[@]} == 0 )) && [[ ! -t 0 ]]; then
|
|
mapfile -t options
|
|
fi
|
|
|
|
if (( ${#options[@]} == 0 )); then
|
|
echo "Usage: omarchy-menu-select <prompt> [option...] [-- menu args...]" >&2
|
|
exit 1
|
|
fi
|
|
|
|
selection_file=$(mktemp)
|
|
done_file=$(mktemp)
|
|
rm -f "$done_file"
|
|
trap 'rm -f "$selection_file" "$done_file"' EXIT
|
|
|
|
options_json=$(perl -MEncode=decode -MJSON::PP=encode_json -e 'print encode_json([map { decode("UTF-8", $_) } @ARGV])' "${options[@]}")
|
|
payload=$(perl -MEncode=decode -MJSON::PP=encode_json,decode_json -e '
|
|
my $payload = {
|
|
mode => "select",
|
|
prompt => decode("UTF-8", $ARGV[0]),
|
|
options => decode_json($ARGV[1]),
|
|
selectionFile => decode("UTF-8", $ARGV[2]),
|
|
doneFile => decode("UTF-8", $ARGV[3])
|
|
};
|
|
$payload->{width} = int($ARGV[4]) if length($ARGV[4] // "");
|
|
$payload->{maxHeight} = int($ARGV[5]) if length($ARGV[5] // "");
|
|
print encode_json($payload)
|
|
' "$prompt" "$options_json" "$selection_file" "$done_file" "$menu_width" "$menu_maxheight")
|
|
|
|
omarchy-shell shell summon omarchy.menu "$payload" >/dev/null
|
|
|
|
while [[ ! -e $done_file ]]; do
|
|
sleep 0.05
|
|
done
|
|
|
|
if [[ -s $selection_file ]]; then
|
|
cat "$selection_file"
|
|
else
|
|
exit 1
|
|
fi
|