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

В наши дни большинство ноутбуков имеют клавиши Page up / Page down / Home / End в виде Fn- оверлеев клавиш со стрелками. Всегда было небольшим раздражением то, что Fn находится на другой стороне клавиатуры, делая практически невозможным использование одной страницы и т. Д.

Недавно я подумал об идее использования Scroll Lock в качестве модификатора, так что, если 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 так часто?

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

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 - Лично я нахожу, что достаточно быстро, и это экономит вашей машине половину вызовов. Попробуйте то, что соответствует вашим потребностям.

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