当人们在命令行上工作时指出 Linux 安装中的“键未正确映射”时,他们的意思是什么?
默认安装不行吗?需要哪些额外/特定的映射?
我还被告知,对于我的 Mac,我的Home和End和Ctrl键没有达到我的预期。
答案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),因此您必须解压缩它们(不必费心)或使用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
因此,如果您想更改“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。
然而,当人们这么说时,他们的意思是终端偏好设置在下面设置在里面键盘标签。您可以在那里编辑按键映射。
我所做的唯一更改是启用使用选项作为元。
对于Home和End,我使用ctrl+A代表 Home,ctrl+E代表 End,因为我不喜欢 Home 和 End 键在键盘上的位置。我还将我的caps lock键更改为另一个ctrl键(在“键盘”下的“系统偏好设置”中),因为这是 ctrl 键的传统位置,它更舒适且更严肃,谁使用大写锁定?