如今,大多数笔记本电脑的Page up/ Page down/ Home/End键都与Fn箭头键重叠。它位于键盘的另一侧,这一直是个小麻烦,几乎不可能Fn单手使用Page up等。
我最近想到了一个主意,使用它Scroll Lock作为修饰符,这样如果滚动锁定处于打开状态,则箭头键将始终处于Page up打开状态。这是我的脚本:
#!/bin/bash
xmodmap -e 'add mod3 = Scroll_Lock'
arrow() {
echo "arrow mode";
xmodmap -e "keycode 111 = Up NoSymbol Up"
xmodmap -e "keycode 116 = Down NoSymbol Down"
xmodmap -e "keycode 113 = Left NoSymbol Left"
xmodmap -e "keycode 114 = Right NoSymbol Right"
}
page() {
echo "page mode";
xmodmap -e "keycode 111 = Prior NoSymbol Prior"
xmodmap -e "keycode 116 = Next NoSymbol Next"
xmodmap -e "keycode 113 = Home NoSymbol Home"
xmodmap -e "keycode 114 = End NoSymbol End"
}
arrow;
trap 'arrow; exit 255;' EXIT SIGINT
slock0="";
echo $slock;
while true; do
slock="$(xset -q | sed -ne '/Scroll Lock/s/^.*Scroll Lock: \([a-z]*\).*$/\1/p')";
if [ "$slock" != "$slock0" ]; then
slock0="$slock";
if [ "$slock" == "on" ]; then
page
else
arrow
fi
fi
sleep 0.5
done
我只是好奇是否有更优雅的方法来做到这一点?xmodmap
如此频繁地运行有问题吗?
过去,我曾专门将一个键(例如Menu右Alt和之间的键Ctrl)用作AltGr键,然后按 完成xmodmap -e "keycode 111 = Up NoSymbol Prior"
等。但是,我现在的笔记本电脑在该区域没有“空闲”键。而且我不知道如何让滚动锁定像修饰键一样起作用AltGr。
答案1
你的脚本完全没问题,我只需要修改一些小地方:
xmodmap
允许你在每个命令行上指定多个表达式,因此每个函数只需调用一次,而不是调用四次printf "%s\n" "$slock"
slock
如果为空,则不会打印空行grep -oP 'Scroll Lock:\s*\K\w+'
与您的命令相同sed
,但如果您坚持使用sed
:sed -nr 's/.*Scroll Lock:\s*(\w+).*/\1/p'
while :
和while true
——我想这是个人品味问题
有改动的脚本
#!/bin/bash
xmodmap -e 'add mod3 = Scroll_Lock'
arrow() {
echo "arrow mode"
xmodmap -e "keycode 111 = Up NoSymbol Up" \
-e "keycode 116 = Down NoSymbol Down" \
-e "keycode 113 = Left NoSymbol Left" \
-e "keycode 114 = Right NoSymbol Right"
}
page() {
echo "page mode"
xmodmap -e "keycode 111 = Prior NoSymbol Prior" \
-e "keycode 116 = Next NoSymbol Next" \
-e "keycode 113 = Home NoSymbol Home" \
-e "keycode 114 = End NoSymbol End"
}
arrow
trap 'arrow; exit 255;' EXIT SIGINT
printf "%s\n" "$slock"
while :; do
slock="$(xset -q | grep -oP 'Scroll Lock:\s*\K\w+')"
if [ "$slock" != "$slock0" ]; then
slock0="$slock"
if [ "$slock" = "on" ]; then
page
else
arrow
fi
fi
sleep 0.5
done
我建议甚至将延迟更改为sleep 1
– 就我个人而言,我发现这已经足够快了,并且可以节省一半的调用次数。尝试适合您需求的方法。