web-dev-qa-db-fra.com

modificateur de verrouillage de défilement pour les touches fléchées

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.

4
David784

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 fonction
  • printf "%s\n" "$slock" n'imprimera pas de ligne vide si slock est vide
  • grep -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

Script avec modifications

#!/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.

1
dessert