Add dispatch shortcuts to help menu (#5756)

* feat: dispatch shortcuts from help menu

* Retain uwsm launch wrapping

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
This commit is contained in:
Michal Slota
2026-05-11 15:40:04 +02:00
committed by GitHub
co-authored by David Heinemeier Hansson
parent 5738583319
commit c6ecdd1000
+51 -15
View File
@@ -112,7 +112,6 @@ parse_keycodes() {
# #
# Also do some pre-processing: # Also do some pre-processing:
# - Remove standard Omarchy bin path prefix # - Remove standard Omarchy bin path prefix
# - Remove uwsm prefix
# - Map numeric modifier key mask to a textual rendition # - Map numeric modifier key mask to a textual rendition
# - Output comma-separated values that the parser can understand # - Output comma-separated values that the parser can understand
dynamic_bindings() { dynamic_bindings() {
@@ -121,8 +120,6 @@ dynamic_bindings() {
sed -r \ sed -r \
-e 's/null//' \ -e 's/null//' \
-e 's,~/.local/share/omarchy/bin/,,' \ -e 's,~/.local/share/omarchy/bin/,,' \
-e 's,uwsm app -- ,,' \
-e 's,uwsm-app -- ,,' \
-e 's/@0//' \ -e 's/@0//' \
-e 's/,@/,code:/' \ -e 's/,@/,code:/' \
-e 's/^0,/,/' \ -e 's/^0,/,/' \
@@ -145,7 +142,7 @@ dynamic_bindings() {
# Hardcoded bindings, like the copy-url extension and such # Hardcoded bindings, like the copy-url extension and such
static_bindings() { static_bindings() {
echo "SHIFT ALT,L,Copy URL from Web App,extension,copy-url" echo "SHIFT ALT,L,Copy URL from Web App,sendshortcut,SHIFT ALT,L,"
} }
# Parse and format keybindings # Parse and format keybindings
@@ -154,8 +151,8 @@ static_bindings() {
# - Set the field separator to a comma ','. # - Set the field separator to a comma ','.
# - Joins the key combination (e.g., "SUPER + Q"). # - Joins the key combination (e.g., "SUPER + Q").
# - Joins the command that the key executes. # - Joins the command that the key executes.
# - Prints everything in a nicely aligned format. # - Prints display text and dispatch metadata as tab-separated fields.
parse_bindings() { parse_binding_records() {
awk -F, ' awk -F, '
{ {
# Combine the modifier and key (first two fields) # Combine the modifier and key (first two fields)
@@ -167,6 +164,13 @@ parse_bindings() {
# Use description, if set # Use description, if set
action = $3; action = $3;
dispatcher = $4;
# Reconstruct the dispatcher arg from the remaining fields
arg = "";
for (i = 5; i <= NF; i++) {
arg = arg $i (i < NF ? "," : "");
}
if (action == "") { if (action == "") {
# Reconstruct the command from the remaining fields # Reconstruct the command from the remaining fields
@@ -177,6 +181,7 @@ parse_bindings() {
# Clean up trailing commas, remove leading "exec, ", and trim # Clean up trailing commas, remove leading "exec, ", and trim
sub(/,$/, "", action); sub(/,$/, "", action);
gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, "", action); gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, "", action);
gsub(/(^|[[:space:]])uwsm(-app| app)[[:space:]]+--[[:space:]]+/, "", action);
gsub(/^[ \t]+|[ \t]+$/, "", action); gsub(/^[ \t]+|[ \t]+$/, "", action);
gsub(/[ \t]+/, " ", key_combo); # Collapse multiple spaces to one gsub(/[ \t]+/, " ", key_combo); # Collapse multiple spaces to one
@@ -189,15 +194,15 @@ parse_bindings() {
} }
if (action != "") { if (action != "") {
printf "%-35s → %s\n", key_combo, action; printf "%-35s → %s\t%s\t%s\n", key_combo, action, dispatcher, arg;
} }
}' }'
} }
prioritize_entries() { prioritize_entries() {
awk ' awk -F '\t' '
{ {
line = $0 line = $1
prio = 50 prio = 50
if (match(line, /Terminal/)) prio = 0 if (match(line, /Terminal/)) prio = 0
if (match(line, /Tmux/)) prio = 1 if (match(line, /Tmux/)) prio = 1
@@ -248,14 +253,14 @@ prioritize_entries() {
if (match(line, /Apple Display/)) prio = 98 if (match(line, /Apple Display/)) prio = 98
if (match(line, /XF86/)) prio = 99 if (match(line, /XF86/)) prio = 99
# print "priority<TAB>line" # print "priority<TAB>record"
printf "%d\t%s\n", prio, line printf "%d\t%s\n", prio, $0
}' | }' |
sort -k1,1n -k2,2 | sort -k1,1n -k2,2 |
cut -f2- cut -f2-
} }
output_keybindings() { output_binding_records() {
build_keymap_cache build_keymap_cache
{ {
@@ -264,16 +269,47 @@ output_keybindings() {
} | } |
sort -u | sort -u |
parse_keycodes | parse_keycodes |
parse_bindings | parse_binding_records |
prioritize_entries prioritize_entries
} }
output_keybindings() {
output_binding_records | cut -f1
}
dispatch_binding() {
local dispatcher="$1"
local arg="$2"
case "$dispatcher" in
exec)
[[ -n $arg ]] && hyprctl dispatch exec "$arg"
;;
"") return 1 ;;
*)
if [[ -n $arg ]]; then
hyprctl dispatch "$dispatcher" "$arg"
else
hyprctl dispatch "$dispatcher"
fi
;;
esac
}
if [[ $1 == "--print" || $1 == "-p" ]]; then if [[ $1 == "--print" || $1 == "-p" ]]; then
output_keybindings output_keybindings
else else
records=$(output_binding_records)
monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height') monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')
menu_height=$((monitor_height * 40 / 100)) menu_height=$((monitor_height * 40 / 100))
selection=$(cut -f1 <<<"$records" |
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height")
output_keybindings | if [[ -n $selection ]]; then
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height" record=$(awk -F '\t' -v selection="$selection" '$1 == selection { print; exit }' <<<"$records")
dispatcher=$(cut -f2 <<<"$record")
arg=$(cut -f3- <<<"$record")
dispatch_binding "$dispatcher" "$arg"
fi
fi fi