mirror of
https://github.com/basecamp/omarchy.git
synced 2025-08-03 23:29:23 +00:00

* fix: Use dynamic bindings list in omarchy-menu-keybindings We can use `hyprctl binds` to get a dynamic list of the currently-set key bindings. This allows for a custom user configuration that is split into arbitrary config files, and which makes use of `unbind` to remove default Omarchy key bindings. * chore: Support optional description for key bindings If the description is present, use it in the key bindings menu, instead of displaying some version of the dispatched command. * chore: Add some key binding description strings
87 lines
2.6 KiB
Bash
Executable File
87 lines
2.6 KiB
Bash
Executable File
#!/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);
|
|
gsub(/'"'"'/, "\\'", action);
|
|
}
|
|
|
|
if (action != "") {
|
|
printf "%-35s → %s\n", key_combo, action;
|
|
}
|
|
}'
|
|
}
|
|
|
|
dynamic_bindings | \
|
|
sort -u | \
|
|
parse_bindings | \
|
|
walker --dmenu --theme keybindings -p 'Keybindings'
|