Seu roteiro está totalmente bem, há apenas algumas pequenas coisas que eu mudaria:
-
xmodmap
permite que você especifique várias expressões por linha de comando, então, em vez de chamá-lo quatro vezes, você pode chamá-lo apenas uma vez por função -
printf "%s\n" "$slock"
não imprimirá uma linha vazia seslock
estiver vazio -
grep -oP 'Scroll Lock:\s*\K\w+'
faz o mesmo que o seu comandosed
, mas se você insistir em usarsed
:sed -nr 's/.*Scroll Lock:\s*(\w+).*//p'
-
while :
é o mesmo quewhile true
- é uma questão de gosto, eu acho
Script com alterações
#!/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
Eu sugiro até mesmo alterar o atraso para sleep 1
- pessoalmente, acho que isso é rápido o suficiente, e economiza sua máquina em metade das chamadas. Experimente o que atende às suas necessidades.