Модификатор блокировки прокрутки для клавиш со стрелками
В наши дни большинство ноутбуков имеют клавиши Page up / Page down / Home / End в виде Fn- оверлеев клавиш со стрелками. Всегда было небольшим раздражением то, что Fn находится на другой стороне клавиатуры, делая практически невозможным использование одной страницы и т. Д.
Недавно я подумал об идее использования Scroll Lock в качестве модификатора, так что, если 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
так часто?
В прошлом я выделил клавишу (например, меню между правым 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
- Лично я нахожу, что достаточно быстро, и это экономит вашей машине половину вызовов. Попробуйте то, что соответствует вашим потребностям.