也许我遗漏了一些东西,但 xkb 似乎没有从 /usr/share/X11/xkb/symbols/inet 加载 microsoft4000 部分。
$ setxkbmap -print -verbose 10
Setting verbose level to 10
locale is C
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
Success.
Applied rules from evdev:
rules: evdev
model: microsoft4000
layout: us
options: caps:escape
Trying to build keymap using the following components:
keycodes: evdev+aliases(qwerty)
types: complete
compat: complete
symbols: pc+us+inet(evdev)+capslock(escape)
geometry: microsoft(natural)
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us+inet(evdev)+capslock(escape)" };
xkb_geometry { include "microsoft(natural)" };
};
现在,在 inet 中,有一个来自 microsoft4000 键盘的部分
// Microsoft Natural Ergonomic Keyboard 4000
partial alphanumeric_keys
xkb_symbols "microsoft4000" {
include "inet(media_nav_common)"
key <I192> { [ XF86Launch1 ] };
key <I193> { [ XF86Launch2 ] };
key <I194> { [ XF86Launch3 ] };
key <I195> { [ XF86Launch4 ] };
key <I196> { [ XF86Launch5 ] };
// Missing because of lack of support from kbd driver: Zoom in and
// slider.
};
但它似乎被忽略了。如果我用 xev end press launch keys 1-5 监控按键,我会得到以下结果:
$ xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
192 XF86Launch5
193 XF86Launch6
194 XF86Launch7
195 XF86Launch8
196 XF86Launch9
应该类似于 XF86Launch1-5?这是错误还是我遗漏了什么?
我在 Ubuntu 16.04 上运行。
答案1
真正的问题是,你能用这些钥匙做你想做的事吗?
重启或重新登录后,它们是否始终是相同的键?您可以将它们设置为快捷键(带或不带修饰符)吗?XKB 是否认为该键与以下键一样重要XF86Launch1或XF86Launch5不那么重要:
- 它始终是那么关键吗?
- 你能告诉软件X到执行函数Y按下该键时?(启动媒体播放器、最大化当前窗口或您希望该键执行的任何其他功能)
这是一个错误吗?
也许。它肯定不会加载
inet(microsoft4000)
符号(这是您引用microsoft4000
的部分/usr/share/X11/xkb/symbols/inet
)。看起来这可以从模型定义中包含或作为单独的选项,但没有规则(在/usr/share/X11/xkb/rules/evdev*
)。更改为microsoft7000
模型可能会更接近您的预期。...但可能不是。这些键的确切定义并不重要——只要它们被定义为可识别的、彼此不同的事物,XKB 就完成了它的工作。为此,您的键似乎工作得很好。我怀疑符号
inet(microsoft4000)
日期从 2006 年起但后来被更广泛的部分取代inet(evdev)
。
您之所以看到XF86Launch5等等,是因为该inet(evdev)
部分定义了这些键:
// Evdev Standardized Keycodes
partial alphanumeric_keys
xkb_symbols "evdev" {
...
key <FK14> { [ XF86Launch5 ] };
key <FK15> { [ XF86Launch6 ] };
key <FK16> { [ XF86Launch7 ] };
key <FK17> { [ XF86Launch8 ] };
key <FK18> { [ XF86Launch9 ] };
};
...并/usr/share/X11/xkb/keycodes/evdev
确认它们被翻译为键码192-196
:
default xkb_keycodes "evdev" {
...
<FK14> = 192;
<FK15> = 193;
<FK16> = 194;
<FK17> = 195;
<FK18> = 196;
...
无论如何,我们还是加载它吧!
首先,告诉 GNOME 设置不要动键盘:
gsettings set org.gnome.settings-daemon.plugins.keyboard active false
# change false to true to reenable
然后运行此测试:
setxkbmap -print |
sed -e '/xkb_symbols/s/"[[:space:]]/+inet(microsoft4000)&/' |
xkbcomp - $DISPLAY
该管道转储您的setxkbmap -print
输出,并将定义sed
添加inet(microsoft4000)
到符号行中:
xkb_symbols { include "pc+us+inet(evdev)+capslock(escape)+inet(microsoft4000)" };
...然后将其通过管道传输xkbcomp
到 Xserver 进行编译和安装。现在xev
应该向您显示XF86Launch1-5
密钥。
如果可行,您可以通过几种方式使其成为永久性的改变。
您可以保留
gsettings
禁用状态,并将setxkbmap ... | sed ... | xkbcomp ...
管道添加到将在登录时运行的脚本中$HOME/.xprofile
。(或者,将 sed 输出重定向到$HOME/.config/my-xkb-map
,您只需要xkbcomp
在登录时使用该命令。)您可以编辑
/usr/share/X11/xkb/rules/evdev*
以将符号文件添加为官方选项。evdev
是选项到文件的转换;evdev.lst
列出每个选项的描述;evdev.xml
是描述的 XML 版本。我相信您需要正确输入evdev.xml
GUI 工具才能显示新选项,但只evdev.lst
需要setxkbmap
理解它。但是,这些系统文件的更改可能会被未来的更新覆盖,因此请制作备份或sed
脚本或patch
文件以在必要时将它们重新添加。
XKB 很棒!让我们让这些键做些完全不同的事情!
哇哦,牛仔。你当然可以创建您自己的定制如果需要的话。将该inet(microsoft4000)
符号子句复制到另一个文件并按您喜欢的方式定义这些键 。F13?? XF86AudioMicMute
请参阅超级用户答案末尾的资源以获取更多 XKB 兔子洞。