#!/bin/bash # A script to display Hyprland keybindings defined in your configuration # using walker for an interactive search menu. # Fetch dynamic keybindings from Hyprland # # Also do some pre-processing: # - Remove standard Omarchy bin path prefix # - Remove uwsm prefix # - Map numeric modifier key mask to a textual rendition # - Output comma-separated values that the parser can understand dynamic_bindings() { hyprctl -j binds | \ jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' | \ sed -r \ -e 's/null//' \ -e 's,~/.local/share/omarchy/bin/,,' \ -e 's,uwsm app -- ,,' \ -e 's/@0//' \ -e 's/,@/,code:/' \ -e 's/^0,/,/' \ -e 's/^1,/SHIFT,/' \ -e 's/^4,/CTRL,/' \ -e 's/^5,/SHIFT CTRL,/' \ -e 's/^8,/ALT,/' \ -e 's/^9,/SHIFT ALT,/' \ -e 's/^12,/CTRL ALT,/' \ -e 's/^13,/SHIFT CTRL ALT,/' \ -e 's/^64,/SUPER,/' \ -e 's/^65,/SUPER SHIFT,/' \ -e 's/^68,/SUPER CTRL,/' \ -e 's/^69,/SUPER SHIFT CTRL,/' \ -e 's/^72,/SUPER ALT,/' } # Parse and format keybindings # # `awk` does the heavy lifting: # - Set the field separator to a comma ','. # - Joins the key combination (e.g., "SUPER + Q"). # - Joins the command that the key executes. # - Prints everything in a nicely aligned format. parse_bindings() { awk -F, ' { # Combine the modifier and key (first two fields) key_combo = $1 " + " $2; # Clean up: strip leading "+" if present, trim spaces gsub(/^[ \t]*\+?[ \t]*/, "", key_combo); gsub(/[ \t]+$/, "", key_combo); # Use description, if set action = $3; if (action == "") { # Reconstruct the command from the remaining fields for (i = 4; i <= NF; i++) { action = action $i (i < NF ? "," : ""); } # Clean up trailing commas, remove leading "exec, ", and trim sub(/,$/, "", action); gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, "", action); gsub(/^[ \t]+|[ \t]+$/, "", action); gsub(/[ \t]+/, " ", key_combo); # Collapse multiple spaces to one # Escape XML entities gsub(/&/, "\\&", action); gsub(//, "\\>", action); gsub(/"/, "\\"", action); gsub(/'"'"'/, "\\'", action); } if (action != "") { printf "%-35s → %s\n", key_combo, action; } }' } dynamic_bindings | \ sort -u | \ parse_bindings | \ walker --dmenu --theme keybindings -p 'Keybindings'