【问题标题】:Create a custom setxkbmap option创建自定义 setxkbmap 选项
【发布时间】:2017-12-14 18:34:56
【问题描述】:

奇怪的是,这似乎应该是以前做过的事情:我想交换 1 上的 numberssymbols0 键位于我的键盘顶部,这样:

  • 当我按下 6 键时,输入的是 * 而不是 6
  • 当我点击 Shift+6 时,将显示数字 6 而不是 *

我还想进行其他一些修改,但很快发现其他人在使用setxkbmap 的选项之前已经完成了这些布局修改(例如caps:swapescape)。


鉴于上述情况,这是一个由 3 部分组成的问题:

  1. 我的键盘顶行是否有交换数字和符号的选项?
  2. 不管有没有,有没有什么办法可以不用手动浏览/usr/share/X11/xkb/rules/中的*.lst*.xml文件,就能查出这种东西是否存在?
  3. 最后,如果我要为 setxkbmap 创建一个选项,理想的方法是什么?我如何看待将我的选项回馈给社区?

至于问题3:

  • 我尝试创建选项但没有成功(setxkbmap 默默地失败了,我什至对自己的方法没有信心)。
  • 我找不到项目的托管位置。
  • 除了 man setxkbmap 和涉及该主题的各种博客文章之外,我找不到任何关于此的任何文档。

【问题讨论】:

  • “奇怪的是,这似乎应该是以前做过的事情”:是的;这就是标准法式布局的工作原理。 /usr/share/X11/xkb/symbols/fr 以正常、艰苦的方式定义键,即手动定义整个数字行。如果有“交换这两个级别”选项就好了,但我没听说过。

标签: linux keyboard keyboard-layout


【解决方案1】:

问题 2:

对于所有可用选项的列表,您可以执行localectl list-x11-keymap-options。这似乎只为您提供选项本身,而不是描述,因此更好的方法可能是在 XKB *.lst 文件上执行以下操作:

for f in /usr/share/X11/xkb/rules/*.lst; do sed -ne '/^\! option$/{s///; :a' -e 'n;p;ba' -e '}' $f; done | sort -u

(sed reference)*

如果您正在寻找与交换号码相关的内容,您可以附加 | grep -i num,其中显示了使用小键盘/小键盘的几个选项。不幸的是,我认为所有布局都在模板中列出了与 字母数字 字符相关的数字,这意味着它们内置于区域布局本身(或变体,在 @ 的情况下) 987654332@).

问题一:

您可以采取三种方法。

使用xmodmap覆盖布局

您可以通过在您的家中创建 .Xmodmap 文件来覆盖映射来创建一种通用方法,如 Arch Wiki here 中所述。

这是一个示例配置:https://github.com/karma0/layouts/blob/master/home/.Xmodmap

步骤:

  1. .Xmodmap放到你家。
  2. xmodmap $HOME/.Xmodmap 添加到您的.profile

一种快速而肮脏但灵活的方法:

  1. 运行xkbcomp -xkb $DISPLAY xkbmap 以生成包含您当前配置的文件xkbmap
  2. 修改它以匹配所需的配置。这是一个例子:

原文:

key <AE01> {         [               1,          exclam ] };                                                                                                       
key <AE02> {         [               2,              at ] };                                                                                                       
key <AE03> {         [               3,      numbersign ] };                                                                                                       
key <AE04> {         [               4,          dollar ] };                                                                                                       
key <AE05> {         [               5,         percent ] };                                                                                                       
key <AE06> {         [               6,     asciicircum ] };                                                                                                       
key <AE07> {         [               7,       ampersand ] };                                                                                                       
key <AE08> {         [               8,        asterisk ] };                                                                                                       
key <AE09> {         [               9,       parenleft ] };                                                                                                       
key <AE10> {         [               0,      parenright ] };

修改:

key <AE01> {         [               exclam,        1 ] };                                                                                                         
key <AE02> {         [               at,            2 ] };                                                                                                         
key <AE03> {         [               numbersign,    3 ] };                                                                                                         
key <AE04> {         [               dollar,i       4 ] };                                                                                                         
key <AE05> {         [               percent,       5 ] };                                                                                                         
key <AE06> {         [               asciicircum,   6 ] };                                                                                                         
key <AE07> {         [               ampersand,     7 ] };                                                                                                         
key <AE08> {         [               asterisk,      8 ] };                                                                                                         
key <AE09> {         [               parenleft,     9 ] };                                                                                                         
key <AE10> {         [               parenright,    0 ] };
  1. 执行命令xkbcomp -w 0 xkbmap $DISPLAY加载新配置。
  2. 使用xinitrc 或类似方法获取在启动时运行的命令。

修改布局并添加新变体

  1. 打开您喜欢的布局文件(可能在/usr/share/X11/xkb/symbols 下)。我们将在此示例中使用 us 文件。
  2. 在文件中找到您最喜欢的变体; workman-intl 如果你和我一样。
  3. 假设您要复制workman-intl 布局,您可以复制该部分,并像我在此处所做的那样对其进行修改(请注意,这是从intl 模板复制/粘贴的,第一列和第二列是简单地交换):
 partial alphanumeric_keys                                                                                      
 xkb_symbols "workman-programmer" {
     include "us(workman-intl)"
     name[Group1]= "English (Workman, intl., with dead keys and num/sym swapped)";

     key <AE01> { [ exclam,         1,    exclamdown, onesuperior ] };
     key <AE02> { [ at,             2,   twosuperior, dead_doubleacute ] };
     key <AE03> { [ numbersign,     3, threesuperior, dead_macron ] };
     key <AE04> { [ dollar,         4,      currency, sterling ] };
     key <AE05> { [ percent,        5,      EuroSign, dead_cedilla ] };
     key <AE06> { [ dead_circumflex,6,    onequarter, asciicircum ] };
     key <AE07> { [ ampersand,      7,       onehalf, dead_horn ] };
     key <AE08> { [ asterisk,       8, threequarters, dead_ogonek ] };
     key <AE09> { [ parenleft,      9, leftsinglequotemark, dead_breve ] };
     key <AE10> { [ parenright,     0, rightsinglequotemark, dead_abovering ] };
};

xkb_symbols 行定义了变体的名称; include 行从文件中您选择的变体中借用了您需要的所有内容(这里是us 布局中的workman-intl 变体)。然后,您想要的定义如下。 4. 将您的新定义添加到/usr/share/xkb/rules/base.xmlvariantList 标记的末尾。这是我用的那个:

        <variant>                                                                                              
          <configItem>                                                                                         
            <name>workman-programmer</name>                                                                    
            <description>English (Workman, intl., with dead keys and num/sym swapped)</description>                  
           </configItem>                                                                                       
         </variant>
  1. 将新变体和描述添加到/usr/share/X11/xkb/rules/base.lst! variant 部分,如下所示:
      workman-programmer    us: English (Workman, intl., with dead keys and num/sys swapped)'
  1. 重新启动您的 Xorg 服务器。

  2. 设置setxkbmap 命令以使用新变体运行。这是此演示的一个:setxkbmap -layout us -variant workman-programmer -option

问题 3:

尽你所能,在你开始寻找位于xorg 生态系统中的xkb 文档之前,你不会找到文档。

最好的文章可能是这个:

https://www.charvolant.org/doug/xkb/html/index.html

引用:

在您阅读本文之前,请理解我从来不想写这份文件,我的资质严重不足,但我一直想读它,这是唯一的方法。

此外,这里还有一个链接列表,用于开始学习xkb 系统的所有复杂性xorghttps://www.x.org/wiki/XKB/

注意:大多数文档引用了xkb 中的相对路径,因为它安装在您的系统上。这通常位于/usr/share/X11/xkb


如果您愿意贡献,该项目位于 xorg 下,它在此处提供开发人员文档:https://www.x.org/wiki/guide/,或者更好的是,此处:https://www.x.org/wiki/Development/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2021-10-10
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多