大家会不会有时候,感觉键盘上的某几个键用起来不是很方便,打字打久了很容易手指头疼呢?

例如大家使用vim编辑器时, 经常需要使用到esc键,而该键在左上角,很不方便的。再比如写程序的时候,经常会使用到shift键与其它键的组合等。把键盘按键进行必要的重新映射,可以提高生产率的。对键盘按键重新映射的大致过程如下: 
第一步,通过 xev 工具获得需要修改的按键的 keycode 值;

第二步,通过xmodmap工具修改由keycode到keysym的映射。(keycode与keysym的含义正文会说明)

1. xev工具:

功能:通过它可以知道键盘上每一个按键的编码,即keycode, 这个键码与键盘硬件有关系,固定不变的。你想想啊,键盘上这么多按键,怎么让计算机去区分啊?就是通过这个keycode值,每当我们按下一个键时,内核中中断系统就会接收到一个keycode, 从而判断你按下了哪个键。具体操作系统怎么处理这个按键,那就需要keycode值到keysym的映射来决定了。

如何安装:在我的debian系统上,已经默认存在了,这个工具在安装系统的时候应该就会安装上的,直接运行命令如何命令即可(如果没有自带的话, 我还真不知道怎么安装呢):

yin@debian:~$ xev

运行命令后,出来一个空白的小窗口,这时我们按下键盘上一个键之后 ,在shell终端就会出来该键的相关说明:

上图中显示了我keycode 50 对应 keysym: Control_L和keycode 66 对应 keysym: Shift_L的相关信息。(我已经重新映射之后的信息)

2. xmodmap工具

功能:用于修改按键keycode值到按键功能keysym的映射。

如何安装:它在我的debian系统上,也已经默认存在了,没有研究怎么安装,拿来直接用的。

什么是keysym呢? 即key symbol,咱们可以把它理解了符号或功能,我按下这个键,我就想要得到一个符号对不对?例如我按下A键,就是想知道一个 a 或者 A吧,这个就是keysym. 再例如,我按下了control_L对应的键, 我就想得到control_L 符号或使用这个功能吧。

从keycode到keysym的映射不是一一对应的,一个keycode值可以对应多个keysym:例如 a键(keycode为 )就对应的 a, 与对应的 A 。具体是这么规定的,举个例子来说吧,例如A 键的映射如下:

 keycode   = 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的意义如下:

     Key
Shift+Key
Mode_switch+Key
Mode_switch+Shift+Key
ISO_Level3_Shift+Key
ISO_Level3_Shift+Shift+Key

当我们定义我们自己的映射时,这6个或8个的keysym不需要全部都写满,你想用几个就写几个就可以了。假如我想用第一个和第三个keysym时,第二个keysym的值使用   NoSymbol   代替,它表示空。

如何映射呢? 直接 使用  keycode 值 = keysym 即可。例如下面是我自己设置的键盘映射: (使用!表示注释, 下面的内容位于 ~/.Xmodmap文件内)

 ! 把esc键更换为Caps_Lock
keycode = Caps_Lock NoSymbol Caps_Lock !把Caps_Lock键更换为Shift_L
keycode = Shift_L NoSymbol Shift_L !把Shift_L键更换为Control_L键
keycode = Control_L NoSymbol Control_L ! 把Control_L键更换为Alt_L键
keycode = Alt_L Meta_L Alt_L Meta_L ! 把Alt_L键更换为ESC键
keycode = Escape NoSymbol Escape ! 把Enter键更换为Shift_R键
keycode = Shift_R NoSymbol Shift_R ! 把Shift_R键更换为Return 键
keycode = Return NoSymbol Return

接下来说说按键中的修饰符,即modifier.  例如我们常用的shift/ ctrl /alt/等都起着修饰的作用,它们可以和别的按键进行组合 ,产生不同的效果。

在我们系统中,一共存在着8个修饰符:分别为: shift/ lock/ control/ mod1/ mod2/ mod3 /mod4/ mod5. 我们可以把每一个keysym 设置为修饰符,例如我把 a 设置为修饰符的control修饰符的话,把以后按 a + c 就可以表示复制了。 每一个修饰符都可以对应多个keysym的, 下面是我的电脑的修饰符:

 shift       Shift_R (0x24),  Shift_L (0x42)
lock Caps_Lock (0x9)
control Control_L (0x32), Control_R (0x69)
mod1 Alt_L (0x25), Alt_R (0x6c), Alt_L (0xcc), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)

如果设置呢?常用的命令包括:clear/ remove/ add 操作,举例来说:(下面的内容也是位于.Xmodmap文件中)

 ! 把绑定到control修饰符的Control_L移除:
remove control = Control_L ! 把绑定到control修饰符上的所有 keysym 都移除:
clear control ! 现在添加Control_R 都shift 修饰符:
add shift = Control_R

需要说明的是: 修饰符是与 keysym 对应的keycode值绑定的,当我们修改了与修饰符相关的按键之后,记得更新一下相关的修饰符,否则的话,修饰符还是绑定在的物理按键上,而还是绑定到你新映射的物理按键上。

3. 配置

如何使用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文件中:

# 执行按键的重新映射   ---- 殷大侠 --
if [ -f ~/.Xmodmap ]; then xmodmap ~/.Xmodmap; fi

额外说明:  xmdomap软量级的键盘映射方案,电脑重启之后 就重置了,如果想要有更高级的需求,请使用 X keyborad extension。

附:我的.Xmodmap文件:

 1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  修改相应的键盘映射:  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2 !
3 ! 把esc键更换为Caps_Lock
keycode = Caps_Lock NoSymbol Caps_Lock 6 !把Caps_Lock键更换为Shift_L
keycode = Shift_L NoSymbol Shift_L !把Shift_L键更换为Control_L键
keycode = Control_L NoSymbol Control_L ! 把Control_L键更换为Alt_L键
keycode = Alt_L Meta_L Alt_L Meta_L ! 把Alt_L键更换为ESC键
keycode = Escape NoSymbol Escape ! 把Enter键更换为Shift_R键
keycode = Shift_R NoSymbol Shift_R ! 把Shift_R键更换为Enter键
keycode = Return NoSymbol Return ! 如果修改的按键涉及到了修饰键(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 !: 更新相应的修饰键的值:
clear shift
clear lock
clear control
clear mod1
add shift = Shift_L Shift_R
add lock = Caps_Lock
add control = Control_L Control_R
add mod1 = Alt_L Alt_R Meta_L !更新后的修饰键之后的结果:
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

https://linux.die.net/man/1/xmodmap

http://xahlee.info/linux/linux_xmodmap_tutorial.html

linux系统下键盘按键的重新映射——xmodmap工具和xev工具的更多相关文章

  1. LINUX系统下添加映射存储LUN

    LINUX系统下添加映射存储LUN(无需重启) 背景:Oracle rac环境 添加新实例,重新划分存储空间,从存储映射新的LUN. 问题:映射后,linux操作系统无法识别新的LUN,不能重启系统, ...

  2. Linux系统下Redis安装(二)

    上一篇随笔,已经成功开启了Redis-server,客户端已经可以正常对redis进行正常操作. 但是,redis-server开启的同时,一个大大doc黑屏也在那里开启着,接下来就对讲解如何在Lin ...

  3. linux系统下,11款常见远程桌面控制软件

    linux系统下,11款常见远程桌面控制软件 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图: 常见功能: 1.提供全屏,窗口化的远程控制.支持高分辨率下的 ...

  4. 【转载】Linux系统下命令行连接蓝牙设备 查看查找 蓝牙

    Linux系统下命令行连接蓝牙设备 2018年11月26日 10:47:27 Zz笑对一切 阅读数:741   1.打开系统蓝牙 sudo service bluetooth start 1 进入bl ...

  5. 深入理解linux系统下proc文件系统内容

    深入理解linux系统下proc文件系统内容 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统. Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它 ...

  6. Linux系统下 为命令配置别名

    1.什么是别名 在管理和维护Linux系统的过程中,将会使用到大量命令,有一些很长的命令或用法经常被用到,重复而频繁的输入某个很长命令或用法是不可取的.这时可以使用 别名 功能将这个过程简单化. Li ...

  7. linux系统下,11款常见远程桌面控制软件(转载)

    远程控制能够给人们带来很多便利,本文介绍了11款常见的Linux系统下的远程桌面控制工具,总有一款能适合您. 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图 ...

  8. Linux系统下如何优雅地关闭Java进程?

    资料出处: http://www.sohu.com/a/329564560_700886 https://www.cnblogs.com/nuccch/p/10903162.html 前言 Linux ...

  9. linux系统下重要的分区及其作用

    下面列出来的是linux系统下重要的分区及其作用/bin :bin是binary的缩写;/boot :存放启动Linux时使用的一些核心文件;/root :root(超级管理员)的用户主目录;/sbi ...

随机推荐

  1. ab测试工具

    我们可以模拟100个并发用户,对一个页面发送1000个请求 输入命令:ab -n1000 -c100 http://www.jb51.net/ 结果: ##首先是apache的版本信息 This is ...

  2. 软件开发 [CJOJ 1101] [NOIP 模拟]

    Description 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块 ...

  3. 开车旅行 [NOIP 2012]

    Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 i ...

  4. 模板-gcd

    GCD int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); } EXGCD void ex_gcd(int a, int b, int & ...

  5. Linux之ssh登录

    作业三:ssh登录,scp上传.下载,ssh秘钥登录,修改ssh server端的端口为8888然后进行登录和scp测试 1.ssh登录 [root@localhost network-scripts ...

  6. 00、Word Count

    1.开发环境 1.eclipse-jee-neon-3 2.scala-ide:http://download.scala-ide.org/sdk/lithium/e46/scala212/stabl ...

  7. [Algorithm] Fibonacci Sequence - Anatomy of recursion and space complexity analysis

    For Fibonacci Sequence, the space complexity should be the O(logN), which is the height of tree. Che ...

  8. Win7 32位下cocos2dx android开发调试环境

    1.使用环境 win7 32位 + vs2010 2.软件准备(下方绿色文字带链接) cocos2dx-v2.2.2 jdk7 android sdk android ndk adt bundle a ...

  9. git强制提交本地分支覆盖远程分支

    git push origin 分支名 --force eg: cd 代码目录 git push origin master --force 运行结果: Total 0 (delta 0), reus ...

  10. phpStorm中如何不让其自动添加封闭大括号?

    Settings > Editor > General->Smart Keys.