Jim*_*Jim 3 linux osx keyboard keyboard-layout
当人们在命令行上工作时指出 Linux 安装中的“密钥未正确映射”是什么意思?
默认安装不行吗?需要哪些额外/特定的映射?
我还被告知,对于我的 Mac,我的Home和End和Ctrl键不符合我的预期。
一般来说,当有人这么说时,他们的意思是键上标记的功能与该键被按下时发送到 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),因此您必须解压缩它们(不要打扰)或使用zcat
或zless
查看它们:
$ 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
。