#!/bin/sh # 快捷键速查 - 动态从 hyprctl binds 读取 modmask_to_str() { local mask=$1 local mods="" # bit 0: SHIFT (1), bit 2: CTRL (4), bit 3: ALT (8), bit 6: SUPER (64) [ $((mask & 64)) -ne 0 ] && mods="${mods}Super+" [ $((mask & 1)) -ne 0 ] && mods="${mods}Shift+" [ $((mask & 4)) -ne 0 ] && mods="${mods}Ctrl+" [ $((mask & 8)) -ne 0 ] && mods="${mods}Alt+" [ $((mask & 16)) -ne 0 ] && mods="${mods}Mod2+" [ $((mask & 32)) -ne 0 ] && mods="${mods}Mod3+" [ $((mask & 128)) -ne 0 ] && mods="${mods}Mod5+" echo "${mods%+}" } hyprctl binds 2>/dev/null | awk -v RS='' -F'\n' ' /^bindd/ { key=""; desc=""; mask=""; submap="" for (i=2; i<=NF; i++) { split($i, kv, ": ") if (kv[1] ~ /^[[:space:]]*modmask$/) mask=kv[2] if (kv[1] ~ /^[[:space:]]*key$/) key=kv[2] if (kv[1] ~ /^[[:space:]]*description$/) desc=kv[2] if (kv[1] ~ /^[[:space:]]*submap$/) submap=kv[2] } # 跳过鼠标绑定和无描述的 if (key ~ /^mouse/ || desc == "") next if (submap != "") next print mask "\t" key "\t" desc } ' | while IFS=$'\t' read -r mask key desc; do mod_str=$(modmask_to_str "$mask") if [ -n "$mod_str" ]; then printf " %-28s %s\n" "${mod_str}+${key}" "${desc}" else printf " %-28s %s\n" "${key}" "${desc}" fi done | fzf --prompt " 快捷键速查 > " --reverse --no-sort --bind 'esc:abort'