参考的文章有
1:http://blog.csdn.net/laughing_sir/article/details/8718282
在终端输入
2:https://jiasule.v2ex.com/t/391081
3:http://blog.sina.com.cn/s/blog_680e2da40101btzf.html
前言: linux 下键盘 有3层 scancode,keycode,symbol 随便修改那一层都可以,我们现在是通过修改symbol的方式来修改的;
首先查看键值,可以通过xev | grep keycode(如果没有xev功能的话,可以网上下载一个,运行install.sh即可)
然后点击键盘,就可以得到对应按键的键值
比如
state 0x0, keycode 108 (keysym 0xff1b, Escape), same_screen YES,
XKeysymToKeycode returns keycode: 9
state 0x8, keycode 108 (keysym 0xff1b, Escape), same_screen YES,
XKeysymToKeycode returns keycode: 9
state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
查看的方法2:另外一种简便的方法查看键值可以查看:/usr/include/X11/keysymdef.h ,里面包含所有的符号名,在其中可以找到你想要的键名,里面也有些简短的注释。
查看的方法3:通过xmodmap -pk 来显示整个键盘的布局,我的电脑如下:
第一列是keycode 第二列表示keysym对应的值,第三列表示按下shift对应的内容;
第二步:把需要修改的键值改成你需要设置的键值,
得到键值之后,就在 “~” 目录下创建 .xmodmaprc(加.是为了隐藏文件) 文件,内容如下
keycode 10= 0x32 0x40
保存之后,在终端输入
xmodmap ~/.xmodmaprc
然后1键就变成2键了 同时!也会变成@ ^_^
其实,你不用每次都运行
xmodmap ~/.xmodmaprc
这个命令,可 以把上面的命令做成一个脚本程序,例如:在 /usr/bin/ 目录下创建 key文件,内容如下
然后把key程序添加到系统自动启动的程序里面就大功告成了!!!
注意:对于一些修饰符的键值设置比较麻烦
直接输入 xmodmap, 不带参数, 输出结果是你当前键盘的一些修饰键的信息
比如我的机器上的输出是这样的:
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), 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)
把键码(keycode) 事件 转换为 keysym.这是第一层
然后 再参考 修饰 映射 modifier,来确定按下ctrl shift 之类按键后的反应
所以以上表第二行的内容为例.它表示的是大小写切换键Capslock
lock Caps_Lock (0x42)
括号里的0x42 从十六进制转换到 十进制 就是 66 , 也就是 CapsLock 这个按键对应keycode 66
按下Capslock 后, 系统接受到 keycode 66 , 系统转换为 Caps_Lock 这个keysym.
然后按照 modifier 映射表 把 Caps_Lock 转换为 lock 功能, 就是大小写转换.
layer1 layer2 layer3
keycode keysym modifier
keycode 66 ----> Caps_Lock ----> lock
所以,要修改键位, 就要把这两层映射关系都要改掉. 但是修改之前,要知道被修改按键现有的对应关系.
可以使用 "xmodmap -pke " 来输出现在所有keycode -> keysym 的映射.
首先从修改 keycod -> keysym 入手.
比如 我的需求1:调换esc 和 ~
这两个键都不在modifier 里面, 所以直接调换一下这两个按键的keycode 和keysym 就可以了,
在你的.Xmodmap 文件里面写入
! first , exchange (1) esc (2) grave ,"~",
! keycode 9 = Escape NoSymbol Escape
! keycode 49 = grave asciitilde grave asciitilde
keycode 49 = Escape NoSymbol Escape
keycode 9 = grave asciitilde grave asciitilde
注: 感叹号! 在配置文件中是被当成注释,不运行的.
涉及到modifier的按键修改就麻烦一点了, 要用 add remove 来修改 modifier 映射
比如把 casplock 改成 delete. 我们要做的事情就要分成两步.
既要把 capslock 的keysym 改成 delete 的keysym , 又要把capslock 从 modifier中的lock 组里移除.
否则你直接运行
"xmodmap -e "keycode 66 = BackSpace BackSpace BackSpace BackSpace ""
你会发现, capslock 键已经可以当backspace 来删除之前的字符了.但同时, 它还起着 原来的Capslock的大小写切换功能,
再用"xmodmap"查看一下
shift Shift_L (0x32), Shift_R (0x3e)
lock BackSpace (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), 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)
你看.
lock BackSpace (0x42)
这个 keycode 66 的按键虽然keysym 已经改写成 backspace 了, 但是它依然表示一个大小写切换的功能.
所以先把CapsLock 从 lock 中移除, 然后再修改keysym
remove lock = Caps_Lock
keycode 66 = BackSpace BackSpace BackSpace BackSpace
这样键盘上的那个capslock 按键就完全改成backspace 了.
remove lock = Caps_Lock 这一句表示从 lock 组里移除Caps_Lock 这个keysym.
同样添加一个keysym 也是类似的语法 : add lock = Caps_Lock