Xmodmap修改键盘映射

作为技术码农,总是系统自己编码时能够行云流水,所以机械键盘往往是居家旅行、码字编程必备工具。出于颜值,我选择了61键的蓝牙键盘:

../../_images/keyboard_61.png

不过,比较尴尬的是61键机械键盘由于缩略了很多按键,特别是我所购买的富勒61键G610机械键盘存在一个非常不合理的设计:2套键盘布局,默认键盘布局1无法输入 /? ,但是布局2则不能输入数字。这对于程序编码非常不友好。

注解

可能在平衡易用性和轻便性,对于编程使用,选择87键机械键盘更为合适。

为了能够解决紧凑型61键机械键盘的输入限制,需要把不常用的键盘按键替换成常用键。例如,将 向上键 更换成 /?

Xmodmap简介

在每次按下键盘时, Linux 内核都会生成一个 Code。 Code 同 keycodes表 比较,然后决定按下的是什么。

而 Xorg 使用自己的 Keycodes表 来参与这个过程。 每一个 Keycode 属于一个 keysym。 一个 keysym 就像一个 function 被 Keycode 调用执行。 Xmodmap 允许你编辑 keycode-keysym 之间的关系。

Xmodmap映射修改

  • 打印当前keymap表:

    xmodmap -pke
    

这个命令输出的是可阅读的映射配置,例如 keycode  57 = n N 表明 keycode 57 被映射到小写 n , 同时大写 N 映射于 57 + Shift

自定义映射表

  • 首先当前映射表输出记录到配置文件:

    xmodmap -pke > ~/.Xmodmap
    

这个配置文件就是个人使用的定制配置,在这个配置文件中修订,重新登陆X环境都会生效。

  • 修订 ~/.Xmodmap 之后,执行以下命令进行刷新测试:

    xmodmap ~/.Xmodmap
    
  • 对于通过 startx 命令启动Xorg时激活自己定制的映射表,请在 ~/.xinitrc 添加以下内容:

    if [ -f $HOME/.Xmodmap ]; then
        /usr/bin/xmodmap $HOME/.Xmodmap
    fi
    

我的修订案例(G610键盘)

  • 配置 ~/.Xmodmap 修改:

    keycode  64 = Alt_L Meta_L Alt_L Meta_L  # 左Alt键
    keycode 133 = Super_L NoSymbol Super_L  # command键(win键)
    keycode 114 = Right NoSymbol Right   # 向右方向键
    
  • 修改成:

    # 左Alt键和command键互换
    keycode  64 = Super_L NoSymbol Super_L
    keycode 133 = Alt_L Meta_L Alt_L Meta_L
    
    # 向右方向键改为`键
    keycode 114 = grave asciitilde grave asciitilde
    
    # 向上键修改成 /?
    keycode  111 = slash question slash question  # /?
    

上述配置修改实现的是:

左Alt键 <=> command键(win键)
向上键 => /?键
向右方向键 => `键

macOS的键盘映射

我也在macOS系统中使用上述G610机械键盘,同样也存在这个键盘映射的问题。不过,在macOS平台,这个问题解决比较方便,因为有一个开源的 macOS 键盘定制工具Kakabiner-Elements 工具可以非常灵活定制键盘特性,而且是图形工具,使用非常简便。