modificador de bloqueio de rolagem para teclas de seta

4

Atualmente, a maioria dos laptops tem as teclas Page up / Abaixo / Início / End como Fn sobreposições das teclas de seta. Sempre foi um aborrecimento menor que Fn está do outro lado do teclado, tornando quase impossível o uso da Page up etc.

Pensei recentemente na idéia de usar o Scroll Lock como um modificador, de modo que se o scroll lock estiver ativado, as teclas de seta sempre serão Page up etc. Aqui é meu 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]*\).*$//p')";
    if [ "$slock" != "$slock0" ]; then 
        slock0="$slock";
        if [ "$slock" == "on" ]; then
            page
        else
            arrow
        fi
    fi
    sleep 0.5
done

Estou curioso para saber se existe uma maneira mais elegante de fazer isso? Existe um problema com a execução de xmodmap com tanta frequência?

No passado eu dediquei uma chave (como Menu entre a Alt e Ctrl ) como o AltGr key, e done xmodmap -e "keycode 111 = Up NoSymbol Prior" , etc. No entanto, meu laptop atual não tem uma chave "livre" nessa região. E eu não estou familiarizado com uma maneira de fazer o bloqueio de rolagem agir como o modificador AltGr .

    
por David784 19.07.2016 / 21:33

1 resposta

1

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 se slock estiver vazio
  • grep -oP 'Scroll Lock:\s*\K\w+' faz o mesmo que o seu comando sed , mas se você insistir em usar sed :

    sed -nr 's/.*Scroll Lock:\s*(\w+).*//p'
    
  • while : é o mesmo que while 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.

    
por dessert 02.06.2018 / 18:29