Linux 中的按键映射

Linux 中的按键映射

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

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

我还被告知,对于我的 Mac,我的HomeEndCtrl键没有达到我的预期。

答案1

扫描码和键码

一般来说,当有人这么说时,他们的意思是键上标记的功能与按下该键时发送到 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

请注意,这些文件是压缩的(.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

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

$ setkeycodes 1d9d 97 &

秀键

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

$ sudo 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

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

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

答案2

我使用 MacBook Pro,当我登录 UNIX 系统时,按键映射没有任何问题,因此默认设置几乎肯定没问题,不需要映射。我经常使用 Debian、Ubuntu、RedHat 和 Solaris 11。

然而,当人们这么说时,他们的意思是终端偏好设置在下面设置在里面键盘标签。您可以在那里编辑按键映射。

我所做的唯一更改是启用使用选项作为元

对于HomeEnd,我使用ctrl+A代表 Home,ctrl+E代表 End,因为我不喜欢 Home 和 End 键在键盘上的位置。我还将我的caps lock键更改为另一个ctrl键(在“键盘”下的“系统偏好设置”中),因为这是 ctrl 键的传统位置,它更舒适且更严肃,谁使用大写锁定?

相关内容