创build一个自定义的setxkbmap选项

奇怪的是,这似乎应该是以前做的事情:我想交换键盘上的10键上的数字符号 ,以便:

  • 当我按6键时,input*而不是6
  • 当我按Shift + 6时 ,数字6将显示而不是*

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


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

  1. 有没有在我的键盘的第一行交换数字和符号的选项?
  2. 无论有没有,有没有办法find这样的事情,而不必手动浏览/usr/share/X11/xkb/rules/*.lst*.xml文件?
  3. 最后,如果我要为setxkbmap创build一个选项,那么这将是一个理想的方法,我将如何看待将我的选项提供给社区?

至于问题3:

  • 我试图创build的选项没有成功( setxkbmap默默地失败,我甚至没有信心在我的方法)。
  • 我无法find项目的托pipe位置。
  • 除了man setxkbmap和涉及这个主题的各种博客文章之外,我还找不到任何这方面的文档。

问题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参考) *

如果您正在查找与交换数字有关的内容,可以追加| grep -i num | grep -i num ,揭示了使用数字键盘/键盘的几个选项。 不幸的是,我认为所有的布局都有与字母数字字符相关的模板中的数字 ,这意味着它们被内置到区域布局本身(或者在dvorak的情况下是变体)。

问题1:

有三种方法可以采取。

使用xmodmap覆盖布局

您可以创建一个多用途的方法,在家中创建一个.Xmodmap文件来覆盖映射,如Arch维基在这里所述 。

这是一个示例配置: 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. 将新的变体和描述添加到! variant /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 -optionsetxkbmap -layout us -variant workman-programmer -option

问题3:

尽可能地尝试,在开始查找位于xorg生态系统内的xkb文档之前,您不会找到文档。

这里最好写的是这个:

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

引用:

在你阅读本文之前,请明白我从来不想写这个文件,严重缺乏资格,但我一直想读它,这是唯一的方法。

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

注意:大部分文档都会在系统上安装xkb文件时引用相对路径。 这通常在/usr/share/X11/xkb


如果你想贡献,这个项目生活在xorg ,它提供了开发者文档在这里: https : //www.x.org/wiki/guide/ ,或更好的,在这里: https : //www.x.org/wiki /开发/