Linux 中的键映射

Jim*_*Jim 3 linux osx keyboard keyboard-layout

当人们在命令行上工作时指出 Linux 安装中的“密钥未正确映射”是什么意思?

默认安装不行吗?需要哪些额外/特定的映射?

我还被告知,对于我的 Mac,我的HomeEndCtrl键不符合我的预期。

slm*_*slm 6

扫描码和键码

一般来说,当有人这么说时,他们的意思是键上标记的功能与该键被按下时发送到 Linux 内核的“代码”不匹配。您可以将其视为密钥已标记,Home但内核正在向内核发送Ctrl密钥的“代码” 。

真正发生的事情的低得多的部分是每个键都分配了一个扫描码。

来自扫描码维基百科页面的摘录

扫描码(或扫描码)是大多数计算机键盘发送到计算机以报告按下了哪些键的数据。键盘上的每个键都分配有一个数字或数字序列。

这些扫描码被 Linux 内核映射成键码。正是这些密钥代码通常与应用程序通信。如果您想了解更多详细信息,这是另一个扫描码资源

注意:这是一种过度简化,但我只是试图让您对这一层有一个大致的了解。关键是按键被按下,生成扫描码,Linux 内核看到这些扫描码并发出键码。

设置键码

您可以使用工具更改扫描码键码映射setkeycodes

setkeycodes scancode keycode ...

setkeycodes 命令一次读取两个参数,每对参数由一个扫描码(以十六进制给出)和一个键码(以十进制给出)组成。对于每个这样的对,它告诉内核键盘驱动程序将指定的扫描码映射到指定的键码。

键码映射保存在键映射文件中。在我的 Fedora 系统上,我的美国键盘映射文件位于此处,/lib/kbd/keymaps/i386/qwerty/us.map.gz. 我通过使用以下命令进行了一些侦查找到了它:

$ locate map.gz|grep us
/lib/kbd/keymaps/amiga/amiga-us.map.gz
/lib/kbd/keymaps/atari/atari-us.map.gz
/lib/kbd/keymaps/i386/qwerty/br-latin1-us.map.gz
/lib/kbd/keymaps/i386/qwerty/is-latin1-us.map.gz
/lib/kbd/keymaps/i386/qwerty/us-acentos.map.gz
/lib/kbd/keymaps/i386/qwerty/us.map.gz
/lib/kbd/keymaps/i386/qwertz/cz-us-qwertz.map.gz
/lib/kbd/keymaps/mac/all/mac-us.map.gz
/lib/kbd/keymaps/sun/sunt5-cz-us.map.gz
/lib/kbd/keymaps/sun/sunt5-us-cz.map.gz
Run Code Online (Sandbox Code Playgroud)

请注意,这些文件是压缩的 (.gz),因此您必须解压缩它们(不要打扰)或使用zcatzless查看它们:

$ zless /lib/kbd/keymaps/i386/qwerty/us.map.gz
# us.map
keymaps 0-2,4-6,8-9,12
alt_is_meta
include "qwerty-layout"
include "linux-with-alt-and-altgr"
include "compose.latin1"
include "euro1.map"
strings as usual

keycode   1 = Escape
keycode   2 = one              exclam
keycode   3 = two              at               at               nul              nul
keycode   4 = three            numbersign
        control keycode   4 = Escape
keycode   5 = four             dollar           dollar           Control_backslash
keycode   6 = five             percent

...
...

keycode  97 = Control
Run Code Online (Sandbox Code Playgroud)

因此,如果您想更改“Control”键(键码 97)并将其设置为“Left Control”键的扫描码(扫描码 0x1d 0x9d),您可以使用以下命令:

$ setkeycodes 1d9d 97 &
Run Code Online (Sandbox Code Playgroud)

显示键

您还可以使用以下命令查看键映射到的键码showkey

$ showkey -a

Press any keys - Ctrl-D will terminate this program

1    49 0061 0x31
2    50 0062 0x32
3    51 0063 0x33
a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
^[OH 27 0033 0x1b
     79 0117 0x4f
     72 0110 0x48
^D    4 0004 0x04
Run Code Online (Sandbox Code Playgroud)

“^[OH”是我按下我的HOME键。

注意 1:ascii' dump mode (showkey -a`) 中时,showkey 根据当前的键盘映射将按下的键的十进制、八进制和十六进制值打印到标准输出。

注意2:sudo运行时可能需要使用showkey