你们会不会有时候,感受键盘上的某几个键用起来不是很方便,打字打久了很容易手指头疼呢?php
例如你们使用vim编辑器时, 常常须要使用到esc键,而该键在左上角,很不方便的。再好比写程序的时候,常常会使用到shift键与其它键的组合等。把键盘按键进行必要的从新映射,能够提升生产率的。对键盘按键从新映射的大体过程以下:
第一步,经过 xev 工具得到须要修改的按键的 keycode 值;html
第二步,经过xmodmap工具修改由keycode到keysym的映射。(keycode与keysym的含义正文会说明)linux
功能:经过它能够知道键盘上每个按键的编码,即keycode, 这个键码与键盘硬件有关系,固定不变的。你想一想啊,键盘上这么多按键,怎么让计算机去区分啊?就是经过这个keycode值,每当咱们按下一个键时,内核中中断系统就会接收到一个keycode, 从而判断你按下了哪一个键。具体操做系统怎么处理这个按键,那就须要keycode值到keysym的映射来决定了。shell
如何安装:在个人debian系统上,已经默认存在了,这个工具在安装系统的时候应该就会安装上的,直接运行命令如何命令便可(若是没有自带的话, 我还真不知道怎么安装呢):express
yin@debian:~$ xev
运行命令后,出来一个空白的小窗口,这时咱们按下键盘上一个键以后 ,在shell终端就会出来该键的相关说明:vim
上图中显示了我keycode 50 对应 keysym: Control_L和keycode 66 对应 keysym: Shift_L的相关信息。(我已经从新映射以后的信息)bash
功能:用于修改按键keycode值到按键功能keysym的映射。dom
如何安装:它在个人debian系统上,也已经默认存在了,没有研究怎么安装,拿来直接用的。编辑器
什么是keysym呢? 即key symbol,我们能够把它理解了符号或功能,我按下这个键,我就想要获得一个符号对不对?例如我按下A键,就是想知道一个 a 或者 A吧,这个就是keysym. 再例如,我按下了control_L对应的键, 我就想获得control_L 符号或使用这个功能吧。 工具
从keycode到keysym的映射不是一一对应的,一个keycode值能够对应多个keysym:例如 a键(keycode为 )就对应的 a, 与对应的 A 。具体是这么规定的,举个例子来讲吧,例如A 键的映射以下:
1 keycode 38 = a A a A
它表示键盘上A键对应的keycode为38, 它被映射为的keysym为四个:a / A / a / A, 它们的含义分别为按如下组合时对应的:A键 / Shift + A键 / Mode_switch + A键 / Mode_switch + Shift + A 键。除了A键以外,其它的组合键称做修饰键 (modifier), 每个 keycode值最多应该能够映射6个或8个的keysym吧,反正够我们用了。前6个keysym的意义以下:
1 Key 2 Shift+Key 3 Mode_switch+Key 4 Mode_switch+Shift+Key 5 ISO_Level3_Shift+Key 6 ISO_Level3_Shift+Shift+Key
当咱们定义咱们本身的映射时,这6个或8个的keysym不须要所有都写满,你想用几个就写几个就能够了。假如我想用第一个和第三个keysym时,第二个keysym的值使用 NoSymbol 代替,它表示空。
如何映射呢? 直接 使用 keycode 值 = keysym 便可。例以下面是我本身设置的键盘映射: (使用!表示注释, 下面的内容位于 ~/.Xmodmap文件内)
1 ! 把esc键更换为Caps_Lock 2 keycode 9 = Caps_Lock NoSymbol Caps_Lock 3 4 !把Caps_Lock键更换为Shift_L 5 keycode 66 = Shift_L NoSymbol Shift_L 6 7 !把Shift_L键更换为Control_L键 8 keycode 50 = Control_L NoSymbol Control_L 9 10 ! 把Control_L键更换为Alt_L键 11 keycode 37 = Alt_L Meta_L Alt_L Meta_L 12 13 ! 把Alt_L键更换为ESC键 14 keycode 64 = Escape NoSymbol Escape 15 16 ! 把Enter键更换为Shift_R键 17 keycode 36 = Shift_R NoSymbol Shift_R 18 19 ! 把Shift_R键更换为Return 键 20 keycode 62 = Return NoSymbol Return
接下来讲说按键中的修饰符,即modifier. 例如咱们经常使用的shift/ ctrl /alt/等都起着修饰的做用,它们能够和别的按键进行组合 ,产生不一样的效果。
在咱们系统中,一共存在着8个修饰符:分别为: shift/ lock/ control/ mod1/ mod2/ mod3 /mod4/ mod5. 咱们能够把每个keysym 设置为修饰符,例如我把 a 设置为修饰符的control修饰符的话,把之后按 a + c 就能够表示复制了。 每个修饰符均可以对应多个keysym的, 下面是个人电脑的修饰符:
1 shift Shift_R (0x24), Shift_L (0x42) 2 lock Caps_Lock (0x9) 3 control Control_L (0x32), Control_R (0x69) 4 mod1 Alt_L (0x25), Alt_R (0x6c), Alt_L (0xcc), Meta_L (0xcd) 5 mod2 Num_Lock (0x4d) 6 mod3 7 mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) 8 mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
若是设置呢?经常使用的命令包括:clear/ remove/ add 操做,举例来讲:(下面的内容也是位于.Xmodmap文件中)
1 ! 把绑定到control修饰符的Control_L移除: 2 remove control = Control_L 3 4 ! 把绑定到control修饰符上的全部 keysym 都移除: 5 clear control 6 7 ! 如今添加Control_R 都shift 修饰符: 8 add shift = Control_R
须要说明的是: 修饰符是与 keysym 对应的keycode值绑定的,当咱们修改了与修饰符相关的按键以后,记得更新一下相关的修饰符,不然的话,修饰符仍是绑定在的物理按键上,而仍是绑定到你新映射的物理按键上。
如何使用xmodmap这个工具来配置按键映射呢? 有两种方法 ,一种是命令行的形式,一种是配置文件的形式。
1. 命令行形式:
当咱们输入xmodmap -h 时,会显示以下:
yin@debian:~$ xmodmap -h usage: xmodmap [-options ...] [filename] where options include: -display host:dpy X server to use -verbose, -quiet turn logging on or off -n don't execute changes, just show like make -e expression execute string -pm print modifier map -pk print keymap table -pke print keymap table as expressions -pp print pointer map -help print this usage message -grammar print out short help on allowable input -version print program version - read standard input
所以呢,咱们能够都过 -e 参数,运行咱们刚才介绍的命令,例如:
# a的物理按键对应的keycode值为38 # 把a按键映射成b按键 yin@debian:~$ xmodmap -e "keycode 38 = b B NoSymbol B"
2. 使用配置文件
咱们能够把配置文件放到~/目录下,命名为 .Xmodmap文件,当咱们定义好配置文件以后 ,使用命令 xmodmap ~/.Xmodmap 运行就即了。咱们能够把该命令增长到~/.bashrc文件中:
# 执行按键的从新映射 ---- 殷大侠 2018-12-18 if [ -f ~/.Xmodmap ]; then xmodmap ~/.Xmodmap; fi
额外说明: xmdomap软量级的键盘映射方案,电脑重启以后 就重置了,若是想要有更高级的需求,请使用 X keyborad extension。
附:个人.Xmodmap文件:
1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 修改相应的键盘映射: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2 ! 3 ! 把esc键更换为Caps_Lock 4 keycode 9 = Caps_Lock NoSymbol Caps_Lock 5 6 !把Caps_Lock键更换为Shift_L 7 keycode 66 = Shift_L NoSymbol Shift_L 8 9 !把Shift_L键更换为Control_L键 10 keycode 50 = Control_L NoSymbol Control_L 11 12 ! 把Control_L键更换为Alt_L键 13 keycode 37 = Alt_L Meta_L Alt_L Meta_L 14 15 ! 把Alt_L键更换为ESC键 16 keycode 64 = Escape NoSymbol Escape 17 18 ! 把Enter键更换为Shift_R键 19 keycode 36 = Shift_R NoSymbol Shift_R 20 21 ! 把Shift_R键更换为Enter键 22 keycode 62 = Return NoSymbol Return 23 24 25 ! 若是修改的按键涉及到了修饰键(modifier), 那么就须要更新一下相应的修饰键,由于它们是和keycode绑定的 26 ! 27 ! 更新modifier键以前的结果: 28 ! xmodmap: up to 4 keys per modifier, (keycodes in parentheses): 29 ! 30 ! shift Shift_L (0x32), Shift_R (0x3e) 31 ! lock Caps_Lock (0x42) 32 ! control Control_L (0x25), Control_R (0x69) 33 ! mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd) 34 ! mod2 Num_Lock (0x4d) 35 ! mod3 36 ! mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) 37 ! mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb) 38 39 !: 更新相应的修饰键的值: 40 clear shift 41 clear lock 42 clear control 43 clear mod1 44 add shift = Shift_L Shift_R 45 add lock = Caps_Lock 46 add control = Control_L Control_R 47 add mod1 = Alt_L Alt_R Meta_L 48 49 !更新后的修饰键以后的结果: 50 51 ! xmodmap: up to 4 keys per modifier, (keycodes in parentheses): 52 ! 53 ! shift Shift_R (0x24), Shift_L (0x42) 54 ! lock Caps_Lock (0x9) 55 ! control Control_L (0x32), Control_R (0x3e) 56 ! mod1 Alt_L (0x25), Alt_R (0x6c), Alt_L (0xcc), Meta_L (0xcd) 57 ! mod2 Num_Lock (0x4d) 58 ! mod3 59 ! mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) 60 ! mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb) 61 !
参考文献:
https://wiki.archlinux.org/index.php/Xmodmap
https://cs.gmu.edu/~sean/stuff/n800/keyboard/old.html