我更喜欢 Dvorak 布局,所以我有一个漂亮的 USB Das 键盘,并且我为它分配了一个适合我在虚拟控制台和 X11 中使用的布局。我使用loadkeys
并install-keymap
安排它从启动开始生效,我对此非常满意。
然而,我的大多数同事更喜欢 Qwerty 布局,这是结对编程的障碍。我确实有一些可用的 USB 键盘可以连接来完成此任务,但它们在插入时都会采用我的 Dvorak 布局。
有没有办法告诉 udev(甚至只是 X11)为我的附加键盘使用 Qwerty 布局?它们具有不同的 USB 供应商和设备标识符,我可以用它们来区分它们。
我的系统是 Debian 测试版,udev 版本为 232。当我在磁盘故障后重新安装时,它感染了 systemd,因此我习惯的标准(SysV 风格)方法不起作用。
类似的问题每个键盘都有不同的键盘布局没有给我提供任何帮助。
答案1
一般背景:按键被分配了三组不同的“代码”,首先是扫码(任意硬件相关数字代表键盘上的键),然后关键代码(代表特定键的更抽象的数字,例如shift或1 / !),最后是键盘符号á
(按键符号,由按键或按键组合产生的实际符号)。
我最近了解到每个/dev/input/event*
设备都有自己的扫描码到键码映射。这些映射可以通过 iotcls ( EVIOCGKEYCODE_V2
, )读取和更改EVIOCSKEYCODE_V2
,但有趣的是,似乎没有通用工具可用于访问这些映射(我很快编写了一个简单的 C 程序转储它,因为我很好奇)。
然后,Linux 内核和 X 都将键码映射到键符号。对于内核来说,只有一种全局映射,即kbd
处理程序(或者对于非常虚拟的控制台至少有一种全局映射,我不确定不同的虚拟控制台是否可以有不同的映射)。 X 维护每个设备的映射。
因此,如果您希望虚拟控制台上的键盘之间存在差异,那么唯一的选择就是使用扫描码到键码映射。对于 Dvorak 与 Qwerty,只要您只是重新映射字母键,并且不想以不同的方式重新映射处于移位和非移位状态的符号,这实际上可能会起作用。
更新版本的 udev 使用硬件数据库 ( /etc/udev/hwdb.d
) 来初始化特殊的扫描码到键码映射,您可以添加自己的映射定制版本。
另一种方法是在虚拟控制台上使用 Dvorak 或 Qwerty,但设置 X 为每个使用不同的键码到键符号映射,如您链接的答案中所述,该答案对您没有帮助(可能是因为您不这样做)想要这个变体)。这种方法的优点是您还可以以不同的方式映射符号、死键、合成等。