linux系统下键盘按键的重新映射——xmodmap工具和xev工具
发布日期:2021-08-23 22:52:31 浏览次数:1 分类:技术文章

本文共 6093 字,大约阅读时间需要 20 分钟。

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

   例如大家使用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 键的映射如下:

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     Key2     Shift+Key3     Mode_switch+Key4     Mode_switch+Shift+Key5     ISO_Level3_Shift+Key6     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_L12 13 ! 把Alt_L键更换为ESC键14 keycode 64 = Escape NoSymbol Escape15 16 ! 把Enter键更换为Shift_R键17 keycode 36 = Shift_R NoSymbol Shift_R18 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_L3 4 ! 把绑定到control修饰符上的所有 keysym 都移除:5 clear control6 7 ! 现在添加Control_R 都shift 修饰符:8 add shift = Control_R

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

 

3. 配置

如何使用xmodmap这个工具来配置按键映射呢? 有两种方法 ,一种是命令行的形式,一种是配置文件的形式。

1. 命令行形式:

当我们输入xmodmap -h 时,会显示如下:

yin@debian:~$ xmodmap -husage:  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-18if [ -f ~/.Xmodmap ]; then xmodmap ~/.Xmodmap; fi

 

 

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

 

附:我的.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_L11 12 ! 把Control_L键更换为Alt_L键13 keycode 37 = Alt_L Meta_L Alt_L Meta_L14 15 ! 把Alt_L键更换为ESC键16 keycode 64 = Escape NoSymbol Escape17 18 ! 把Enter键更换为Shift_R键19 keycode 36 = Shift_R NoSymbol Shift_R20 21 ! 把Shift_R键更换为Enter键22 keycode 62 = Return NoSymbol Return23 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 shift41 clear lock42 clear control43 clear mod144 add shift = Shift_L Shift_R45 add lock = Caps_Lock46 add control = Control_L Control_R47 add mod1 = Alt_L Alt_R  Meta_L48 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://blog.csdn.net/weixin_33804582/article/details/86031112 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:关于开源的网络爬虫/网络蜘蛛larbin结构分析
下一篇:SQL Server 2014内存优化表的使用场景(转载)

发表评论

最新留言

不错!
[***.144.177.141]2024年03月29日 07时42分00秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java list二分查找_java中的ArrayList和LinkedList的二分查找速度比 | 学步园 2019-04-21
php中的变量名称用什么表示,PHP变量,方法,类等名称中的有效字符是什么? 2019-04-21
pic32mx是什么cpu_PIC32MX单片机外设库使用(Ⅰ)- 系统时钟及I/O口基本设置 2019-04-21
用c 在mysql上存图片_C 批量保存图片进 mysql 利用MYSQL_BIND插入longblob 2019-04-21
mysql 1045 28000_mysql报关于用户密码1045(28000),几种处理方法 (zhuan) 2019-04-21
solr比mysql的优势_Solr与Elasticsearch的优缺点比较总结和归纳 2019-04-21
华为博士招聘上机考试题目_牛客网-华为-2020届校园招聘上机考试-3 2019-04-21
python中for可以做变量名吗_Python中使用动态变量名的方法 2019-04-21
mysql 日期转换天数_MySQL 日期操作 增减天数、时间转换、时间戳 2019-04-21
java对象去重复_JAVA中List对象去除重复值的方法 2019-04-21
java bss_[转] .bss段和.data段的区别 2019-04-21
java上传图片损坏_大神求助 上传图片后 图片损坏 2019-04-21
java socket唯一标识符_Java Socket编程之常识网络基础知识 2019-04-21
java给xyz大小排序_java递归实现string xyz排序 2019-04-21
arctime必须要java_Arctime使用教程 Arctime常见问题解答 2019-04-21
mysql pxc mysql5.7_mysql之PXC5.7.18集群系列——1. Percona XtraDB Cluster 搭建 2019-04-21
mysql 自适应字段宽度_box-sizing解决自适应布局容器宽度问题 2019-04-21
java 配置文件配置路径_Java读取配置文件路径设置 2019-04-21
vux 选择器_vue中的scoped分析以及在element-UI和vux中的应用 2019-04-21
java cache 有效期_springboot cache 自定义过期时间及自定义缓存key前缀 2019-04-21