2014年1月

一般的键盘中,Caps按键位于“A”的左侧,长期占据着键盘上的一个重要位置。而它的使用繁率确非常的低。对于Linux下的用户,尤其使用Emacs与Vim的用户,Control按键是使用非常多的一个按键,所以将Caps变为Control是一个很好的想法。

码农神器HHKB Pro2的键位设计就是把Control放在了“A”键的左侧。

HHKB Pro2

在Linux下面,可以利用xmodmap交换键盘上面的键位。

  1. 获取keycode,通过命令 xev |grep keycode 可以获取按键的keycode.

    xev |grep state 0x10, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES, state 0x12, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES, state 0x10, keycode 37 (keysym 0xffe3, Control_L), same_screen YES, state 0x14, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,

  2. 编辑 ~/.xmodmaprc ,填写如下内容

    clear Lock clear Control keycode 37 = Control_L keycode 66 = Control_L keycode 108 = Caps_Lock add Control = Control_L Control_R

将Caps与左Ctrl全部设置为Control_L,将右Alt设置为了Caps_Lock

  1. 使用命令 xmodmap ~/.xmodmaprc 生效

  2. 通过 xmodmap -pke |grep -i Control 查看修改后是否生效

通过以上步骤可以将键盘上面的铵键交换。但是,我发现当键盘USB重插时设置就不生效了,需要重新执行 xmodmap ~/.xmodmaprc

发现udev可以提供让设备在指定条件下执行指定的脚本。规则配置位于 /etc/udev/rules.d

在这个目录下新建个文件,比方说20-usb-keyboards.rules,格式为

#!bash
ACTION=="add", ATTRS{idVendor}=="1006", ATTRS{idProduct}=="0022", OWNER=="imbugs", RUN+="/home/imbugs/.udev.sh"

你需要把里面的内容替换一下,首先需要知道你的键盘的 USB 设备号,用 lsusb 可以看到,例如我的键盘对应的是这行

#!bash
Bus 003 Device 012: ID 046a:010d Cherry GmbH

里面的 046a:010d 分别对应 ATTRS{idVendor}ATTRS{idProduct}

后面的 OWNERRUN 好理解,是用户名和要执行的脚本

RUN 里的 /home/imbugs/.udev.sh 可以这么写

#!bash
#!/bin/bash
sudo -u imbugs /usr/bin/xmodmap -display :0 /home/imbugs/.xmodmaprc >/dev/null 2>&1 &

注意 OWNER 是判断条件,而非赋值,无论如何 RUN 里的脚本都是以 root 身份执行的。 为了让 /etc/udev/rules.d 里的配置生效,还需要命令

#!bash
sudo udevadm control --reload-rules

现在重装插拔 USB 键盘应该都能正常了