Ubuntu 18.04 下通过 XKB 修改键盘映射, 实现自定义按键
XKB : 全称 X Keyboard Extension, 是 Liunx 下管理键盘输入的一套较为复杂的系统. Ubuntu 18.04采用这套系统来支持图形界面下的键盘管理.
key code : 键盘上按键的物理代号或者说是物理座标, 比如Q键是 <AD01>, 我们可以改变它的映射,让Q键变成A键, 但是这个键的 Key code 还是 <AD01>。
key symbols : 表示按键的实际意义, 比如 <AD01> 只是一个键盘上按键的位置, 而字母Q是一个具有实际意义的符号, 当 key code 和 key symbols 建立关联后, 按下 <AD01> 位置的按键, 就会输入一个字母 Q.
按键和符号建立了联系, 可是, 我们一个按键上可不止一种符号. 比如, 小写的 q 和 大写的 Q 都是在一个按键上, 这就需要引入以下的概念了
level : 我们键盘上的按键, 通常都是通过切换 level 来实现的, 比如 小写字母是 level 1 , 而大写字母是 level 2. 通常只有 2 个 level , 但是我们也可以增加更多的 level 来让一个按键可以表示更多的意义.
group : 作用类似于 level, 但一般是用于切换整个字符集. 比如要用键盘输入日语啥的.
modifier key : 起修饰作用的键, 比如常见的 Shift, Ctrl, Caps Lock 都属于修饰键.
基本的配置修改步骤
这里以我自己的使用习惯为例, 介绍一下 xkb 的比较简单的配置修改方式. 注意这并不是唯一的修改方式.
使用命令查看当前的键盘方案 : setxkbmap -print
我这里显示的是:
$ setxkbmap -print
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
留意 xkb_symbols 这行, 其中显示是 pc + us. 说明我们需要修改的就是这两个 symbols 文件 inet 一般用不到.
根据之前介绍的概念, 我们修改按键映射, 其实就是修改 key code 和 key symbols 之间的映射关系, 这个映射关系主要保存在以下路径下:
配置文件的位置 : /usr/share/X11/xkb/symbols/
在以上路径下可以找到 pc 和 us 两个文件.
强调一下: 注意备份原始的配置文件, 否则改键失败有可能只能重装系统了
使用 vim 等编辑器打开 pc 文件, 会看到类似如下结构
default partial alphanumeric_keys modifier_keys
xkb_symbols "pc105" {
include "pc(editing)"
key <LCTL> { [ Control_L ] };
};
其中前两行的部分是这个区块的头, 可以类比与编程语言中函数或方法的概念. 那这两行其实就是函数(方法)的声明(签名).
花括号中的部分是主体内容.
include 的功能就是其字面意思, 将其他部分的内容包含进来. 小括号左边的部分即例子中的 pc , 其实就是当前我们编辑的这个文件, 当然他也可以是别的 symbols 文件夹下的文件名. 而小括号内的部分是前面的名称指定的文件中的一个区块名称. 这里引入的是 pc 中的 editing 区块, 它其实就在这个文件的最后面. 而我们当前所在的区块, 按照这种命名方式就应该是 pc(pc105) 了.
第四行就是定义按键实际意义的部分了. 左边的格式固定为 key <key code>, 表示要定义哪个物理按键. 右边的花括号中包含其按键意义, 一个中括号是一个 group, 也可以定义多个 group, 可以这样跟在后面写, 中括号内是不同 Level 的意义, level 的个数最多支持 8 个:
key <xxx> { [ level 1 , level 2, level3, ... ],
[ level 1 , level 2 ] }
我要在 pc(pc105) 中找到 Key <CAPS> 的设置项, 把 symbols 改为 [ Mode_switch ]. 这样, 就把大小写切换键改为模式切换键. (模式切换键可以用于将一个按键的符号意义切换到 group 2)
至此, 所有 CAPS + AnyKey 会被映射到这个键的 Group1 符号组. (模式切换键也可以按照同样的思路改为其他按键, 只要自己觉得习惯, 并且和现有的其他组合键尽量避免冲突即可)
下来需要将我需要的功能绑定到对应的按键上了, 需要编辑 us 文件, 这是 English us 键盘布局. 这个文件的结构与 pc 类似, 只不过要长得多.
虽然 us 文件很长, 但是我所要实现的功能只需要关注 us(basic) 区块就足够了.
key <AD08> { [ i, I ] }; 这行, 我需要让 Caps Lock + i 变成方向键上, 我只需将其改成 :
key<AD08>{ [ i, I ], [ Up ] };
第二个中括号就是 group 2 了, 其中只包含一个 Up, 就是说这个 group 中只有一个 Level 1.
同样的道理, 找到别的键, 并设置好自己想要的映射. 我使用的映射是:
// 默认都是按住 Mode_switch 键 (即改后的 Caps Lock) 的i -->Upj -->Leftk -->Downl -->Rightu -->Homeo -->End[ -->Prior (PageUp);-->Next (PageDown)d -->BackSpacef -->Delete// 在 Poker 2 这种紧凑的键盘上, 数字键 1-0 以及 -=键依次加上 F1 - F12 键
全部配置完之后, 保存.
注意: 接下来的步骤有可能导致系统不能正常使用. 没有 Linux 使用经验的朋友请在高手指导下操作, 或者做好重装系统的准备.
现在需要让系统重新编译配置文件, 我们进入以下路径: /usr/share/X11/xkb/rules , 将该路径下所有的 .xml 文件都删除. 然后 重启电脑, 再重新登录到图形界面. 如果一切顺利, 此时按键修改完成.
你很有可能碰到以下两种情况:
键盘还是原先的老样子, 按键并没有修改成功 恭喜你, 虽然没有成功, 但至少不算最糟. 这种情况, 没有一般, 一定是由于某些配置步骤遗漏, 致使 group 2 没有被正常触发. 用户登录界面, 即输密码的界面右上角, 有个星星状图标, 点以下打开屏幕虚拟键盘, 看看 Caps Lock 键有没有按照预期发生改变, 比如 Mode_switch 按键在这里会显示 AltGr. 仔细检查配置文件后重新来过.
键盘上的所有按键都完全没有任何反应, 只有鼠标能动 呵呵, 这种情况我真的只能呵呵了, 由于水平有限, 我自己的解决方案是, 用 ubuntu 启动 U 盘启动, 进入试用, 然后通过挂载上来的原磁盘, 找到配置文件仔细检查, 这种问题一般是由于格式错误, 括号写反等低级错误导致, 也有是因为配置了一种 xkb 不支持的映射, 找到他们, 尝试修改, 重新再试. 如果实在搞不定, 直接恢复成之前备份的配置文件, 放弃改键吧. xkb 的难用是出了名的. 替换完后删掉 .xkm 文件重启就 OK 了.
鄙人自己的键位配置为:
物理键位 Esc --> 效果为 CapsLock
物理键位 Shift+Esc --> 效果为 `(数字1左面那个键)
物理键位 ~`(波浪键) --> 效果为 Esc
物理键位 Shift+~`(波浪键) --> 效果为 ~
物理键位 CapsLock -->效果为 ModeSwitch (单独按下没有用, 必须配合其他键使用, 和Shift键类似)
以下几个键位全部是和物理键位CapsLock(即效果键位ModeSwitch)有关的, 同时按下ModeSwitch和另外的键才生效:
ModeSwitch + h --> 方向键← (同vim中的h,j,k,l)
ModeSwitch + j --> 方向键↓ (同vim中的h,j,k,l)
ModeSwitch + k --> 方向键↑ (同vim中的h,j,k,l)
ModeSwitch + l --> 方向键→ (同vim中的h,j,k,l)
ModeSwitch + y --> Home键
ModeSwitch + o --> End键
ModeSwitch + i --> Insert键
ModeSwitch + d --> Backspace键
ModeSwitch + f --> Delete键
ModeSwitch + c --> Esc键
ModeSwitch + m --> Enter键
ModeSwitch + Backspace --> Delete键
Shift + Backspace --> Delete键
最后按如下参考步骤配置即可:
sudo cp -rf /usr/share/X11/xkb /usr/share/X11/xkb.bak # 备份xkb文件夹以放心大胆操作
cd /usr/share/X11/xkb/rules # 进入rules目录, 并删除目录下的xml文件
sudo rm -rf *.xml
cd /usr/share/X11/xkb/symbols
sudo vi pc # 将文末的pc配置文件粘贴入覆盖原pc文件即可
sudo vi us # 将文末的us配置文件粘贴覆盖原us文件的前58行即可, 只覆盖前58行, 其余保留不动
接下来重启电脑即可
贴上鄙人的pc和us这两个文件的内容:(文章太长, 简书不让发布, 于是将pc和us两个文件放于下一篇)
网友评论