La plupart des ordinateurs portables ont Page up/Page down/Home/End clés comme Fn superpositions des touches fléchées. Cela a toujours été une gêne mineure que Fn est de l'autre côté du clavier, en utilisant d'une seule main le Page up etc. presque impossible.
J'ai récemment pensé à l'idée d'utiliser Scroll Lock comme modificateur, de sorte que si le verrouillage du défilement est activé, les touches fléchées seront toujours Page up etc. Voici mon script:
#!/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
Je suis simplement curieux de savoir s'il existe une façon plus élégante de le faire? Y a-t-il un problème avec l'exécution de xmodmap
si fréquemment?
Dans le passé, j'ai consacré une clé (comme Menu entre droite Alt et Ctrl) comme AltGr clé, et fait xmodmap -e "keycode 111 = Up NoSymbol Prior"
, etc. Cependant, mon ordinateur portable actuel n'a pas de clé "gratuite" dans cette région. Et je ne connais pas un moyen de faire agir le verrou de défilement comme le AltGr modificateur.
Votre script est très bien, il y a juste quelques petites choses que je changerais:
xmodmap
vous permet de spécifier plusieurs expressions par ligne de commande, donc au lieu de l'appeler quatre fois, vous ne pouvez l'appeler qu'une seule fois par fonctionprintf "%s\n" "$slock"
n'imprimera pas de ligne vide si slock
est videgrep -oP 'Scroll Lock:\s*\K\w+'
fait la même chose que votre commande sed
, mais si vous insistez pour utiliser sed
:
sed -nr 's/.*Scroll Lock:\s*(\w+).*/\1/p'
while :
est le même que while true
- c'est une question de goût je suppose#!/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
Je suggère même de changer le délai en sleep 1
- personnellement, je trouve cela de loin assez rapide, et cela économise la moitié des appels à votre appareil. Essayez ce qui convient à vos besoins.