introduce

xmodmap能够重新映射键盘上键的布局,通常情况下,你不会需要对键盘做重新映射,只有在特定情况下,比如emacs,需要频繁操作Ctrl键,但是偏偏US标准键盘上,Ctrl键的位置就很不合理,通常我们都会切换Caps_Lock和Ctrl_L的位置(以前的UNIX键盘Ctrl_R的位置就是在A键的旁边),达到方便操作的目的,下面文字主要是记录我自己的映射信息

一些特殊键的标准位置

下面是我的ubuntu上几个特殊键的位置,包括shift,ctrl,alt,super/win,menu键:

keycode 133 = Super_L NoSymbol Super_L$
keycode 134 = Super_R NoSymbol Super_R
keycode 135 = Menu NoSymbol Menu
keycode  50 = Shift_L NoSymbol Shift_L
keycode  62 = Shift_R NoSymbol Shift_R
keycode  66 = Caps_Lock NoSymbol Caps_Lock
keycode  37 = Control_L NoSymbol Control_L
keycode  105 = Control_R NoSymbol Control_R

你可以通过如下命令获取: $xmodmap -pke > xmodmap.out

我期望的效果

  • 切换CapsLock和Ctrl-L
  • 映射menu键为Ctrl-R
  • 映射Ctrl-R键为Shift-R
  • 取消menu键(当然你也可以把Shift-R键映射为menu,我嫌这个键容易错误触发中断工作,所以取消)

    设置xmodmap的方法

    你只需要在你的home目录下建立一个.Xmodmap的文件,在这个文件里面完成你的映射即可,无须其他操作(我的ubuntu是12.04)。重新映射键的三个主要步骤:

    取消原先键映射

    这里通过clear语法实现,下面是一些特殊键的表达[fn:1]

  clear Shift
  clear Lock
  clear Control
  clear Mod1
  clear Mod2
  clear Mod3
  clear Mod4
  clear Mod5

我主要关注shift、lock、control、mod1和mod4,其中mod1表示alt,mod4表示super,这里我只需要取消下面几个:

  clear Shift
  clear Lock
  clear Control
  clear Mod4

设定新的映射关系

  keycode  66 = Control_L
  keycode  37 = Caps_Lock
  keycode 133 = Super_L
  keycode 134 = Control_R
  keycode 135 = Control_R
  keycode 50  = Shift_L
  keycode 62  = Shift_R
  !keycode 62  = Menu
  keycode 105 = Shift_R

绑定映射关系

  !add mod1    = Alt_R Alt_L Meta_R Meta_L
  add Shift   = Shift_R Shift_L
  add Lock    = Caps_Lock
  add Control = Control_R Control_L
  add Mod4    = Super_R Super_L Menu

完成之后,保存你的xmodmap文件,可以通过如下命令立即生效:

$xmodmap ~/.Xmodmap

[fn:1]archlinux xmodmap setting https://wiki.archlinux.org/index.php/Xmodmap