41 lines
1.4 KiB
Bash
Executable File
41 lines
1.4 KiB
Bash
Executable File
#!/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'
|