箭头键的滚动锁定修饰符

箭头键的滚动锁定修饰符

如今,大多数笔记本电脑的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如此频繁地运行有问题吗?

过去,我曾专门将一个键(例如MenuAlt和之间的键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– 就我个人而言,我发现这已经足够快了,并且可以节省一半的调用次数。尝试适合您需求的方法。

相关内容