модификатор блокировки прокрутки для клавиш со стрелками

Большинство ноутбуков в эти дни имеет Страницу, up/Page вниз/еомой/клавиши End как оверлейные программы Fn клавиш со стрелками. Это всегда было незначительное раздражение, что Fn имеет с другой стороны клавиатуру, составляя однорукое использование Страницы, и т.д. почти невозможной.

Я недавно думал об идее использовать Scroll Lock в качестве модификатора, так, чтобы, если бы блокировка прокрутки идет, клавишами со стрелками всегда был бы Page и т.д. Вот мой сценарий:

#!/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 так часто?

В прошлом я выделил ключ (такой как Меню между правильным Alt и Ctrl) как ключ AltGr, и сделал xmodmap -e "keycode 111 = Up NoSymbol Prior", и т.д. Однако мой текущий ноутбук не имеет "свободного" ключа в том регионе. И я не знаком со способом заставить блокировку прокрутки действовать как модификатор AltGr.

4
задан 13 December 2017 в 18:49

1 ответ

Ваш сценарий прекрасен полностью, существуют только некоторые незначительные вещи, которые я изменил бы:

  • xmodmap позволяет Вам указывать несколько выражений на командную строку, таким образом, вместо того, чтобы назвать она четыре раза Ваш может назвать его только однажды на функцию
  • 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
ответ дан 1 December 2019 в 10:36

Другие вопросы по тегам:

Похожие вопросы: