linux - 使用更多修饰符重新映射键盘

标签 linux keyboard keyboard-layout

我正在寻找一种方法来为我的键盘添加一个“布局”。我已经在使用将 altgr 用于本地字母的布局。我想添加的是用大写锁定激活的镜像右侧键盘(在 http://xkcd.com/mirrorboard.xkb 中描述)

不幸的是,ISO_LEVEL3_SHIFT 已被本地字母表占用。 (AFAIK) 如果我使用 mode_shift 更改组,我不能再在一个组中使用超过 2 个级别。有没有办法为 altgr 和 mode_shift 创建不同的组?

最佳答案

对于每个键码定义,您最多可以有八个键符。这些被成对地分为四组。有一系列键符 ISO_Next_GroupISO_Prev_GroupISO_First_GroupISO_Last_Group,按下时会循环键符通过在 keysym 组中敲击键来输出。这些键是您获得多种布局的方式。

例如,假设 ISO_Next_Group 已绑定(bind)到键码并分配给修饰符,那么对于此定义:

keycode 53 = x X   Greek_xi Greek_XI   multiply U2297   U24E7 U24CD

按下带有标签“X”的键盘键,输入“x”。按 ISO_Next_Group 键后,我得到“ξ”。再按一次,我得到“×”。再按一下,“ⓧ”。最后,第四次按下它可以恢复正常。


花了几天时间(因为 Xkb¹ 的文档太糟糕了;终于找到了一个不错的指南 here ),您可以创建一个包含如下条目的符号定义文件:

    key <SPCE> {
// Level  I      II       III    IV
        [ space, space,   U2395, U2592 ],    // Group 1
        [ U2423, emspace, U2420, hairspace ] // Group 2
    };

    key <RALT> {
        [ Mode_switch, Mode_switch ]
    };

    key <RCTL> {
        [ ISO_Level3_Shift, ISO_Level3_Shift ]
    };

方括号括起一个组。通常,第一组是活跃的。可以使用 ISO_Group_Shift,即 Mode_switch,临时将组递增 1。在一个组中,发出的符号以递增的级别定义。第一级是一个裸按键。 Shift 将当前级别加一。 ISO_Level3_Shift 将级别设置为 III。

上面的示例将七个符号映射到空格键和各种 shift 键,例如:

空间 ⟨ ⟩ U+0020 空间
Shift+空格 ⟨ ⟩ U+0020 空格
R。 Alt+空格 ⟨␣⟩ U+2423 开箱
R。 Alt+Shift+空格 ⟨⟩ U+2003 EM 空格
R。 Ctl+空格 ⟨⎕⟩ U+2395 APL FUNCTIONAL SYMBOL QUAD
R。 Ctl+Shift+空格 ⟨▒⟩ U+2592 中色
R。 Alt+R。 Ctl.+space ⟨␠⟩ U+2420 SYMBOL FOR SPACE
R。 Alt+R。 Ctl.+Shift+空格 ⟨⟩ U+200A 头发空间

V 级还有一个键 ISO_Level5_Shift。因此一组至少可以有六个符号。使用模式切换键,这意味着您可以将键盘配置为键入大约 1,200 个不同的符号,但此时按住如此多的修饰符可能会使一些键变弱。

附言所有命名符号的名称都存储在 /usr/include/X11/keysymdef.h 中。


¹ 事实证明,xmodmap(1) 有问题并且已弃用。

关于linux - 使用更多修饰符重新映射键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1557689/

相关文章:

azure 堡垒 : Alt Gr key is mistaken for Alt key

c# - 更改其他进程的键盘布局

linux - 在 Linux 中获取当前事件的键盘布局(语言)

linux - 自定义 Gnome Archive Manager 7z 命令

linux - 我们使用 openstack keypair 命令到 vm 时的路径是什么

java - 如何获取没有设定长度的数组的特定组成部分?

macos - 用于辅助键盘的 OSX HID 过滤器?

python 基维 : hide virtual keyboard in Text Input Field

linux - 尝试将 adxl345 编译为 4.4.54-ti-r93 内核中的模块但出现错误

linux - Debian 有单一来源来获取多个内核的 linux-headers 吗?