前言

正如我之前博客中提到过的,我是一个重度vim用户.

如果你也和我一样是个vim爱好者或者是emacs用户,那你想必知道Caps_lock键对我们并没有什么卵用.所以很多用户都会将Caps_lock键和Ctrl对换.

在Linux中,我们的工具是xmodmap

xmodmap

介绍

xmodmap是在Linux桌面环境Xorg中用于修改按键映射关系的工具.

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

而Xorg使用自己的Keycodes表来参与这个过程.每一个Keycode可以调用一系列keysym.一个keysym就像一个function被Keycode调用执行.

我们并不能改变每个按键对应的keycode,但是我们可以通过Xmodmap来编辑keycode-keysym的对应关系。

说了那么多,那么什么是keymap表呢?下面我们来看看.

keymap表

查看完整keymap表

1
2
$ xmodmap -pke
keycode 57 = n N

每条Keymap之后都跟随要被映射的keysyms.下面的例子表明keycode 57被映射到小写n,同时大写N映射于57 + Shift.

每个keysym列都对应指定的键组合:

  1. Key
  2. Shift+Key
  3. mode_switch+Key
  4. mode_switch+Shift+Key
  5. AltGr+Key
  6. AltGr+Shift+Key

在keysym组合没有被指定时,使用NoSymbol代替.

查看按键对应的keymap表

上面我们知道如何查看完整的keymap表.如果我想知道具体某个键的keymap信息呢?

执行如下命令后,再按下键盘上的按键,将逐条显示对应的keymap表:keycode值 keysyms.

1
xev | awk -F'[ ) ]+' '/^KeyPress/ { a[NR+2]  } NR in a { printf "%-3s %s\n", $5, $8  }'

处理方法列表

以Linux Mint为例:处理方法列表放在

1
/usr/include/X11/keysymdef.h

语法

上面说了辣么多,下面我们看看如何使用xmodmap改变我们的映射关系.

Example

一般步骤分为以下两步: 1. 修改.Xmodmap 2. 修改~/.xinitrc f [ -f $HOME/.Xmodmap ]; then /usr/bin/xmodmap $HOME/.Xmodmap fi 下面我们来看下具体的例子.

交换Caps_lock和左Ctrl的位置

1
2
3
4
5
6
7
8
9
!
! Swap Caps_Lock and Control_L
!
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

交换backslash和BackSpace

1
2
keycode 22 = backslash bar backslash bar
keycode 51 = BackSpace BackSpace BackSpace BackSpace

我们甚至可以通过xmodmap来改变鼠标的映射关系.有兴趣的可以阅读我们的[参考链接](### 参考链接)

参考链接

笔力有限,甚是惭愧.精心筛选,值得一读.