创建自定义setxkbmap选项

时间:2017-07-10 21:33:40

标签: linux keyboard keyboard-layout

奇怪的是,这似乎应该是之前已经完成的事情:我想在 1上交换数字符号 / kbd> - 0 键盘顶部的键,以便:

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

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

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

  1. 是否可以选择在键盘顶行交换数字和符号?
  2. 是否存在,是否有办法在不必手动浏览*.lst中的*.xml/usr/share/X11/xkb/rules/文件的情况下查明是否存在此类内容?
  3. 最后,如果我要为setxkbmap创建一个选项,那么什么是理想的方法,我将如何看待将我的选项贡献回社区?
  4. 至于问题3:

    • 我试图创建该选项但没有成功(setxkbmap默默地失败,我对我的方法甚至没有信心。)
    • 我无法找到项目所在的位置。
    • 除了man setxkbmap以及涉及该主题的各种博客文章之外,我还无法找到任何相关文档。

1 个答案:

答案 0 :(得分:4)

问题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,显示使用小键盘/小键盘的几个选项。不幸的是,我认为所有布局都有与字母数字字符相关的模板中的数字,这意味着它们已经内置于区域布局本身(或者是变体,在这种情况下) dvorak)。

问题1:

您可以采取三种方法。

使用xmodmap

覆盖布局

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

以下是配置示例:https://github.com/karma0/layouts/blob/master/home/.Xmodmap

<强>步骤:

  1. .Xmodmap放入家中。
  2. 将行xmodmap $HOME/.Xmodmap添加到您的.profile
  3. 快速而肮脏但灵活的方法:

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

      原件:

      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或类似命令获取在启动时运行的命令。
      3. 修改布局并添加新变体

        1. 打开您最喜欢的布局文件(可能在/usr/share/X11/xkb/symbols下)。我们将在此示例中使用us文件。
        2. 在文件中找到您喜欢的变体; workman-intl如果你像我一样。
        3. 假设您要复制workman-intl布局,您可以复制该部分,并按照我在此处所做的方式进行修改(请注意,这是从intl模板中复制/粘贴的和第二列简单交换):
        4.  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行会从您在文件中所选的变体中借用您需要的所有内容(此处,它是workman-intl布局中的us变体)。然后,您想要的定义如下。   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. 将新版本和说明添加到! variant的{​​{1}}部分:
          2. /usr/share/X11/xkb/rules/base.lst
            1. 重新启动您的Xorg服务器。

            2. 设置 workman-programmer us: English (Workman, intl., with dead keys and num/sys swapped)' 命令以使用新变体运行。以下是此演示的内容:setxkbmap

            3. 问题3:

              尽可能尝试,在开始寻找位于setxkbmap -layout us -variant workman-programmer -option生态系统内的xkb文档之前,您不会找到文档。

              最好的写作可能就是这个:

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

              <强> QUOTE:

                

              在你读到这篇文章之前,请理解我从来没有想过写这篇文章,严重不合格,但我一直想读它,这是唯一的方法。

              此外,这里还有一个链接列表,以便开始学习xorg xkbxorg系统的所有复杂性:https://www.x.org/wiki/XKB/

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

              如果您希望投稿,此项目位于xorg下,该文件在此处提供开发人员文档:https://www.x.org/wiki/guide/或更好,在此处:https://www.x.org/wiki/Development/