在开发过程中,硬件键盘许多键位十分不便,因而我们需要对系统的键盘映射加以更改。
# Windows 键盘映射
这里主要说的是简单按键映射,即几个按键之间相互更换位置。
win+R打开`运行`,输入regedit打开注册表编辑器,进入路径“计算机/HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout”
新建一个二进制项,命名为"ScanCode Map"。
打开该项,按照以下内容的规则对二进制项内容进行设置。
## ScanCode Map 规则
首先需要注意,以下所有数据都是小端党(~~格列佛被欺负即视感~~),即数据高位写在高地址。如十六进制数据 0x007f365a,应当写为 5a 36 7f 00。如出现位数不足,数据高位以 0 补足即可。
- 输入 8 个 00 作为开头标识符。
- 4 个字节,表示映射键的总数,即所要做的键盘映射涉及几个按键(左右 Ctrl/Alt 均属于不同按键)。
- 按键的具体关系,4 个字节为一组。前两个是映射后键位的扫描码,后两个是键位原扫描码。具体码值见下表。如想要废除该键,映射后扫描码置为 0 即可。
- 4 个 00 作为结束标识符。
## 按键码值表
以下内容为上述 ScanCode Map 所需的按键码值表。
### 主键盘
| key | mark | key | mark | key | mark | key | mark |
| ----- | ---- | --- | ---- | -------- | ---- | ------- | ----- |
| ~/` | 29 | Tab | 0f | CapsLock | 3a | L-Shift | 2a |
| !/1 | 2 | q | 10 | a | 1e | z | 2c |
| @/2 | 3 | w | 11 | s | 1f | x | 2d |
| #/3 | 4 | e | 12 | d | 20 | c | 2e |
| $/4 | 5 | r | 13 | f | 21 | v | 2f |
| %/5 | 6 | t | 14 | g | 22 | b | 30 |
| ^/6 | 7 | y | 15 | h | 23 | n | 31 |
| &/7 | 8 | u | 16 | j | 24 | m | 32 |
| \*/8 | 9 | i | 17 | k | 25 | , | 33 |
| (/9 | 0a | o | 18 | l | 26 | >/. | 34 |
| )/0 | 0b | p | 19 | :/; | 27 | ? | 35 |
| \_/- | 0c | {/[ | 1a | "/' | 28 | R-Shift | 36 |
| +/= | 0d | }/] | 1b | Enter | 1c | L-Ctrl | 1d |
| \|/\ | | | | | | L-Alt | 38 |
| | | | | | | Sace | 39 |
| | | | | | | R-Alt | e0 38 |
| | | | | | | R-Ctrl | e0 1d |
### 小键盘
| key | mark | key | mark | key | mark | key | mark |
| ------- | ----- | --- | ---- | --- | ---- | ----- | ----- |
| NumLock | 45 | 8 | 48 | 1 | 4f | + | 4e |
| / | e0 35 | 9 | 49 | 2 | 50 | Enter | e0 1c |
| \* | 37 | 4 | 4b | 3 | 51 | | |
| - | 4a | 5 | 4c | 0 | 52 | | |
| 7 | 47 | 6 | 4d | . | 53 | | |
### 附加键盘
| key | mark | key | mark | key | mark | key | mark |
| ----------- | ----- | ------- | ----- | --------- | ----- | ---- | ----- |
| Scroll Lock | 46 | Page Up | e0 49 | Page Down | e0 51 | Up | e0 48 |
| Insert | e0 52 | Delete | e0 53 | Left | e0 46 | Down | e0 50 |
| Home | e0 47 | End | e0 4f | Right | e0 4d | | |
### 功能键
| key | mark | key | mark | key | mark | key | mark |
| --- | ---- | --- | ---- | --- | ---- | --- | ---- |
| Esc | 1 | F1 | 3b | F5 | 3f | F9 | 43 |
| | | F2 | 3c | F6 | 40 | F10 | 44 |
| | | F3 | 3d | F7 | 41 | F11 | 57 |
| | | F4 | 3e | F8 | 42 | F12 | 58 |
### 媒体键
| key | mark | key | mark | key | mark | key | mark |
| ---------- | ----- | ---------- | ----- | ----------- | ----- | ---- | ----- |
| Mute | e0 20 | Paly/Pasue | e0 22 | Volume Down | e0 2e | Stop | e0 24 |
| Next Track | e0 19 | Prev Track | e0 10 | Volume Up | e0 30 | | |
## Windows 其他热键映射
除了简单的键位位置调换,我们可能还需要一些快捷键的映射。这里采用 Autohotkeys,注意下载合适版本(p.s.即使不合适,编写好了之后运行,也会提醒你版本不对,然后提示下载对应版本的)
下载安装之后,打开应用,创建一个新脚本,路径自己设置,按以下方式进行编写。
### 简单更换按键
方法极为简单,如下:
```plaintext
A::B
B::A
```
其中 A 与 B 是需要更换位置的按键。
### 脚本运行
编写、保存和退出后,右键该脚本,run 一下,屏幕右下角就会出现一个绿底的 H 图标,即为正在运行。
如需开机运行,创建该脚本的快捷方式,打开文件夹中的开始菜单(`C:\\Users\\你的用户名\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs`),将快捷方式放进去,以后开机即可自动运行。
### 一个复杂设计
在[CS 自学指南](https://csdiy.wiki)中提到,这个[Autohotkey gist](https://gist.github.com/sedm0784/4443120)将 CapsLock 设置为以下功能:
- 在单独按下时,相当于 Escape
- 在与其他按键一起按下时,相当于 Ctrl
本功能相当方便。
使用方法:把 gist 中的内容(.ahk 文件)下载,作为脚本运行(或者代码复制下来自己建立脚本)。方法同上。
# Ubuntu 键盘映射
**首先注意,如果是宿主机 windows 且已经按照上述注册表方法在主机上作出键盘映射、想要在虚拟机中作出同步设置的,键盘映射会自动在虚拟机中生效,不需要在虚拟机中另做设置。如用的是热键 AutoHotkey,则需要在虚拟机中另行设置。因为 Windows 注册表的操作对整台电脑所有操作均起效果,而软件不能。**
环境:Ubuntu 22.04 LTS
网上提到的使用 xmodmap 更改映射的方法,尝试后发现虽然能显示已经更改,但在 vim 中没有任何反应,于是决定放弃此法。
油管上[这个视频](https://www.youtube.com/watch?v=ULu-CgadyYs&list=WL&index=1&t=587s)提到的方法,经测试,在 vim 中可行。
## 更换按键位置
如下:
```bash
# 进入对应文件夹
cd /usr/shared/X11/xkb/symbols
# 查看一下
ls
# 由于pc文件只有读权限,需要修改必须进入root权限,因此此处进入root用户修改
# 如无root权限进入编辑时,会警告正在编辑只读文件,并且编辑的内容无法保存
sudo -s
# 首次编辑之前一定要备份原始文件!切记!
cp pc pc_bkup
# 编辑pc文件
vim pc
# 退出root用户
exit
```
在编辑 pc 文件时,可以看到,每一行的构成如下:
```plaintext
key { [ Escape ] }
```
可以理解为键盘上的 Esc 键位是 Esc 键的功能。需要修改时,将中括号中内容修改。如:
调换两个案件(如 Esc 与 CapsLock ),即将二者(本处分别在第 4、第 22 行)中括号中内容互换即可。