Linux下Bash热键脚本改写求助:CapsLock联动Unicode输入问题
解决Linux下Bash脚本检测CapsLock及Alt组合键输出问题
1. 检测CapsLock激活状态的逻辑
在Linux系统中,可通过xset q命令获取键盘状态,从中过滤Caps Lock的激活状态。判断逻辑如下:
if xset q | grep -q "Caps Lock:\s*on"; then # CapsLock处于激活状态 else # CapsLock未激活 fi
grep -q会静默执行,只要匹配到"Caps Lock: on"(忽略中间空格),就返回0,进入if分支。
2. 正确处理Alt+字母的按键组合
原脚本中read -n 1仅能读取单个字符,但Alt+字母的输入是ESC+对应字母的两字节序列(比如Alt+a是\033a),因此需要读取完整的两字节序列。可改用read -r -s -n 2来处理:-r禁止反斜杠转义,-s隐藏输入的ESC字符,-n 2指定读取两个字符。
同时,case分支无需添加*,直接匹配固定的两字节序列即可,比如$'\033A'对应Alt+A,$'\033a'对应Alt+a。
完整修改后的脚本
#!/bin/bash while : do # 读取Alt+字母的两字节序列,隐藏输入避免显示ESC字符 read -r -s -n 2 key_seq # 检测CapsLock状态并输出对应字符 if xset q | grep -q "Caps Lock:\s*on"; then case "$key_seq" in $'\033A') echo -e '\u00C5';; # Å(Alt+A,CapsLock激活) $'\033E') echo -e '\u00C6';; # Æ(Alt+E,CapsLock激活) $'\033O') echo -e '\u00D8';; # Ø(Alt+O,CapsLock激活) $'\033U') echo -e '\u016E';; # Ů(Alt+U,CapsLock激活) esac else case "$key_seq" in $'\033a') echo -e '\u00E5';; # å(Alt+a,CapsLock未激活) $'\033e') echo -e '\u00E6';; # æ(Alt+e,CapsLock未激活) $'\033o') echo -e '\u00F8';; # ø(Alt+o,CapsLock未激活) $'\033u') echo -e '\u016F';; # ů(Alt+u,CapsLock未激活) esac fi done
内容的提问来源于stack exchange,提问作者Blu3Rat
相关产品推荐
相关产品推荐

