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

例如大家使用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. 03爬虫 爬取hfutxc成绩

    #-*- coding:utf-8 -*- # -*- coding: utf-8 -*- #encoding:utf-8 import urllib import urllib2 import co ...

  2. [Vijos1763]Wormhole (贪心/模拟?)

    已经是NOIP考前的最后一天了 现在在杭州的宾馆里 因为自己没带电脑 因此用ADMAN的电脑 题目描述 一维的世界就是一个数轴.这个世界的狭小我们几乎无法想象. 在这个数轴上,有N个点.从左到右依次标 ...

  3. git常用命令2--- git rebase

    git rebase:简单而言就是把某个分支上的提交commit嫁接到另一个commit的后面,在这个过程中这些commit的base相对就改变了,也就叫变基. git rebase <upst ...

  4. HashMap源码分析和应用实例的介绍

    1.HashMap介绍 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射.HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.S ...

  5. JavaWeb之 JSP:自定义标签的创建和使用

    当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写一个普通的java类, ...

  6. elastic-job详解(一):数据分片

    数据分片的目的在于把一个任务分散到不同的机器上运行,既可以解决单机计算能力上限的问题,也能降低部分任务失败对整体系统的影响.elastic-job并不直接提供数据处理的功能,框架只会将分片项分配至各个 ...

  7. Ajax发送请求,并接受字符串

    前台: $.ajax({ type: 'POST', url: url, dataType: "json", success : function(data){ alert(&qu ...

  8. Servlet(4)—一个简单的Servlet实例

    简单实例 页面请求登陆,提交表单数据 <body> <form action="loginServlet" method="get"> ...

  9. Docker卸载高版本重装低版本后启动提示:driver not supported

    解决方法: mv /var/lib/docker /var/lib/docker.old 其实就是docker镜像文件夹目录作怪,新版本的目录无法与旧版本目录相兼容. 不过建议降级的用户这样操作: y ...

  10. linux下rocksdb的编译安装

    RocksDB起源于Facebook的实验室项目,实现了一个高性能的快速存储器,是基于C++编写的key value数据库,很多软件都是采用内置rocksdb的方式运行,所以需要我们提前安装rocks ...