发表时间:2008-11-12
最后修改:2008-12-05
定义一个符合自己键盘的映射关系图
作为一个Linux用户当然是要全方位的自定义自己的系统了,今天中午在期中复习的时候就拨弄了一下我的笔记本键盘布局。毕竟是个笔记本键盘,所以很多时候键盘上的那些奇怪的符号键是无法很好使用的。
系统环境 写道
Ubuntu 8.04
Linux Kernel 2.6.24-21-generic
Gnome 2.22.3
注意不同的内核对键盘支持还不相同。
我的状况 写道
笔记本:Acer 5583
键盘上的特殊键:
<€> 需要输出 欧元符号
<$> 需要输出 美元符号
在数字输入Lock关闭的情况下
<Fn>+<J> 需要输出 1
<Fn>+<K> 需要输出 2
<Fn>+<L> 需要输出 3
<Fn>+<U> 需要输出 4
<Fn>+<I> 需要输出 5
<Fn>+<O> 需要输出 6
<Fn>+<7> 需要输出 7
<Fn>+<8> 需要输出 8
<Fn>+<9> 需要输出 9
<Fn>+<M> 需要输出 0
<Fn>+<.> 需要输出 .
等等,还有一些超恶心的组合键,当然如果安排好的话,可以很大提高用户的使用。
在这里,我并不一一讲到每个的具体配置,只要大家掌握了原理就可以自行配置了。
参考资料 写道
整个思路是:
- 需要先明确键盘上的键确实有效
- 进入终端模式tty1,输入showkey
- 敲击需要定义的键位,如果屏幕上有回显则表示系统捕获了输入信号
- 记住对应的信号,当然一般是多个信号(因为有KeyPress、KeyRelease)一般记录一个就好了
- 明确需要映射到的keycode的具体值
- 启动Terminal
- 输入xmodmap -pke
- 这时候会显示详细的前后映射关系
- 如果没有理想的keysym,建议自己定义并添加进去
- 做输入信号和keycode的映射
- 假如信号为X,keycode为C
- 输入命令 sudo setkeycodes X C
- 搞定
上面的思路简单,但是说涉及的方面是绝对不少的。其中含有多个命令的使用和操作,还有一些自动化的处理。
现在我来讲讲我遇到的一些实际问题和具体的解决方式。
- 信号的捕获
- 进入showkey时,一般一敲击键盘就会有至少两个信号,我只取了第一个
- 不要担心组合键的信号,虽然会显示的又多又乱但是如果你认真观察各个信号出来的时机是可以找到需要的信号的
- 大家可以简单实验,单独输入<M>和<Fn>+<M>的对于<M>的信号是不同的。我的系统分别是:0x32和0x52
- 当然还有另外的捕获办法,在gnome中输入xev,然后在“Even Tester”可以看到一些原始的有效的对应关系信息
- keycode的存储和调用
- 在这里我使用了脚本的方式来存所有的配置调用
脚本 写道
xmodmap /home/wpc/workspace/MyLib/Shell/bin/keycode-sym.conf
keycode-sym.conf 写道
keycode 221
= dollar
keycode 239
= EuroSign cent
! keycode 79 = KP_Home KP_7
! keycode 80 = KP_Up KP_8
! keycode 81 = KP_Prior KP_9
! keycode 82 = KP_Subtract XF86_Prev_VMode
! keycode 83 = KP_Left KP_4
! keycode 84 = KP_Begin KP_5
! keycode 85 = KP_Right KP_6
! keycode 86 = KP_Add XF86_Next_VMode
! keycode 87 = KP_End KP_1
! keycode 88 = KP_Down KP_2
! keycode 89 = KP_Next KP_3
! keycode 90 = KP_Insert KP_0
!keycode 91 = KP_Delete KP_Decimal
keycode 79 = 7
keycode 80 = 8
keycode 81 = 9
keycode 83 = 4
keycode 84 = 5
keycode 85 = 6
keycode 87 = 1
keycode 88 = 2
keycode 89 = 3
keycode 90 = 0
keycode 91 = KP_Decimal
- 然后将这个东西放到Xsession中就可以了。
- keycode的映射
- 这个很讨厌,如果你不加sudo的输入,系统提示并不是权限问题而是没有IO。
- 系统要自动调用,我们不可能在命令中间加sudo
- 不过我们又不想天天去点击启动
- 我写了一个脚本,按照第一篇的提示放在了指定的文件夹并做了一些映射
keyboard-mapping 写道
#! /bin/sh
/usr/bin/setkeycodes e033 112
/usr/bin/setkeycodes e034 85
- keyboard-mapping脚本文件的具体创建:
keyboard-mapping创建过程 写道
$ sudo vim /etc/init.d/keyboard-mapping
.........
$ sudo chmod +x /etc/init.d/keyboard-mapping
$ sudo ln -s /etc/init.d/keyboard-mapping /etc/rc2.d/S99keyfix
大家可以注意到我前后做了映射然后又添加了可执行权限最后又映射到了rc2.d文件夹中
- 只有放在这个地方才不需要输入sudo,而且系统可以成功执行
- 在第三步中大家可能很疑惑一个东西:
- /usr/bin/setkeycodes e033 112 这个112到底映射到什么地方了?在
keycode-sym.conf中我并没有定义一个112的具体sym.其实那个85
也是.确实是这个问题,我的e033就是<€>键,而e034就是<$>键,它们实际被映射到了239
和221.这个到底是怎么回事我也不清楚,这里确实很混乱。那么我们该如何去setkeycodes呢?因为85-->221, 112-->239.我没有找到规律,网上也都没有这方面的讲述。既然我们不能知道具体的映射,我就是采用了另外一个思路:先用
/usr/bin/setkeycodes e033 112来
定义信号和code,然后使用xev去捕获实际上的keycode(为239)。然后针对239来做定义。这其中大家需要注意:由于这个映射的无规律性,你很可能映射到了有效的keycode上面,你需要小心。
以上是我的小结。主要卡在了keycode的映射上面,首先是无规律的胡乱投影,然后又是不能sudo操作。
如果大家想好好配置一下,建议认真看看参考资料。