web-dev-qa-db-ja.com

矢印キーのスクロールロック修飾子

最近のほとんどのラップトップには Page up/Page down/Home/End キーとして Fn 矢印キーのオーバーレイ。それは常にマイナーな迷惑でした Fn キーボードの反対側にあり、片手で Page up などほとんど不可能。

私は最近、使用するアイデアを考えました 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の頻繁な実行に問題はありますか?

過去に私はキー(たとえば Menu 右の間 Alt そして Ctrl)として AltGr キー、および完了xmodmap -e "keycode 111 = Up NoSymbol Prior"など。ただし、現在のラップトップには、その地域に「無料」キーがありません。そして、私はスクロールロックを次のように動作させる方法に慣れていません AltGr 修飾子。

4
David784

あなたのスクリプトはまったく問題ありません。私が変更したいいくつかのマイナーなことがあります。

  • xmodmapを使用すると、コマンドラインごとに複数の式を指定できるため、4回呼び出すのではなく、関数ごとに1回だけ呼び出すことができます
  • 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に変更することをお勧めします。個人的には、十分に高速であることがわかり、マシンの呼び出しを半分に節約できます。ニーズに合ったものを試してください。

1
dessert