Большинство ноутбуков в эти дни имеет Страницу, up/Page вниз/еомой/клавиши End как оверлейные программы Fn клавиш со стрелками. Это всегда было незначительное раздражение, что Fn имеет с другой стороны клавиатуру, составляя однорукое использование Страницы, и т.д. почти невозможной.
Я недавно думал об идее использовать Scroll Lock в качестве модификатора, так, чтобы, если бы блокировка прокрутки идет, клавишами со стрелками всегда был бы Page и т.д. Вот мой сценарий:
#!/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
так часто?
В прошлом я выделил ключ (такой как Меню между правильным Alt и Ctrl) как ключ AltGr, и сделал xmodmap -e "keycode 111 = Up NoSymbol Prior"
, и т.д. Однако мой текущий ноутбук не имеет "свободного" ключа в том регионе. И я не знаком со способом заставить блокировку прокрутки действовать как модификатор AltGr.
Ваш сценарий прекрасен полностью, существуют только некоторые незначительные вещи, которые я изменил бы:
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
– лично, я нахожу, что безусловно достаточно быстро, и это сохраняет Вашу машину половина вызовов. Попробуйте то, что удовлетворяет Вашим потребностям.