在开发过程中,硬件键盘许多键位十分不便,因而我们需要对系统的键盘映射加以更改。
Windows 键盘映射
这里主要说的是简单按键映射,即几个按键之间相互更换位置。
win+R打开运行
,输入regedit打开注册表编辑器,进入路径“计算机/HKEY_LOCAL_MACHINELayout”
新建一个二进制项,命名为“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.即使不合适,编写好了之后运行,也会提醒你版本不对,然后提示下载对应版本的)
下载安装之后,打开应用,创建一个新脚本,路径自己设置,按以下方式进行编写。
简单更换按键
方法极为简单,如下:
A::B
B::A
其中 A 与 B 是需要更换位置的按键。
脚本运行
编写、保存和退出后,右键该脚本,run 一下,屏幕右下角就会出现一个绿底的 H 图标,即为正在运行。
如需开机运行,创建该脚本的快捷方式,打开文件夹中的开始菜单(C:\\Users\\你的用户名\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs
),将快捷方式放进去,以后开机即可自动运行。
一个复杂设计
在CS 自学指南中提到,这个Autohotkey gist将 CapsLock 设置为以下功能:
- 在单独按下时,相当于 Escape
- 在与其他按键一起按下时,相当于 Ctrl
本功能相当方便。
使用方法:把 gist 中的内容(.ahk 文件)下载,作为脚本运行(或者代码复制下来自己建立脚本)。方法同上。
Ubuntu 键盘映射
首先注意,如果是宿主机 windows 且已经按照上述注册表方法在主机上作出键盘映射、想要在虚拟机中作出同步设置的,键盘映射会自动在虚拟机中生效,不需要在虚拟机中另做设置。如用的是热键 AutoHotkey,则需要在虚拟机中另行设置。因为 Windows 注册表的操作对整台电脑所有操作均起效果,而软件不能。
环境:Ubuntu 22.04 LTS
网上提到的使用 xmodmap 更改映射的方法,尝试后发现虽然能显示已经更改,但在 vim 中没有任何反应,于是决定放弃此法。
油管上这个视频提到的方法,经测试,在 vim 中可行。
更换按键位置
如下:
# 进入对应文件夹
cd /usr/shared/X11/xkb/symbols
# 查看一下
ls
# 由于pc文件只有读权限,需要修改必须进入root权限,因此此处进入root用户修改
# 如无root权限进入编辑时,会警告正在编辑只读文件,并且编辑的内容无法保存
sudo -s
# 首次编辑之前一定要备份原始文件!切记!
cp pc pc_bkup
# 编辑pc文件
vim pc
# 退出root用户
exit
在编辑 pc 文件时,可以看到,每一行的构成如下:
key<Esc> { [ Escape ] }
可以理解为键盘上的 Esc 键位是 Esc 键的功能。需要修改时,将中括号中内容修改。如:
调换两个案件(如 Esc 与 CapsLock ),即将二者(本处分别在第 4、第 22 行)中括号中内容互换即可。
2023.7.5