我正在尝试将日语键盘上的键重新映射为 Alt、Super、Return 和 Shift。这是一个很好的描述我使用的键盘类型。(我实际上使用的是 Filco Majestouch 2 TKL 日语键盘)。这个想法是拥有一个完全正常的英语键盘,其中拇指下方的额外键被重新映射到 Alt、Return 等。我在 Ubuntu 下使用 xkb 来实现这一点。
键盘的底行如下所示:
<LCTL> <LWIN> <LALT> <MUHE> <SPCE> <HENK> <HKTG> <RALT> <MENU> <RCTL>
我希望它看起来像这样:
<LCTL> <LALT> <LWIN> <LALT> <SPCE> <RALT> <RTRN> <MENU> <RALT> <RCTL>
重新映射LWIN
、LALT
、RALT
和MENU
有效,但重新映射MUHE
、HENK
、 和HKTG
无效。
除此之外,我尝试重新映射AB11
到Shift_R
和。结果是AE13
什么也没做,就像、和 一样,但确实被重新映射到并按预期工作。BackSpace
AB11
MUHE
HENK
HKTG
AE13
BackSpace
到目前为止,我一直在使用basic
中定义的键码(据我所知)/usr/share/X11/xkb/keycodes/xfree86
。因此,我的键盘布局的符号文件开始如下:
default
xkb_symbols "basic" {
由于MUHE
、HENK
、HKTG
、AB11
和AE13
是在 中定义的/usr/share/X11/xkb/keycodes/evdev
,我认为我应该将其更改为evdev
,但这没有帮助:
default
xkb_symbols "evdev" {
我还需要做什么才能使用MUHE
etc?我需要确保输入系统的其他部分使用 evdev 吗?我不确定该怎么做。我使用的是 Ubuntu 14.04 32 位,但 18.04 64 位也出现了同样的情况。
这是我用来重新映射这些键的完整代码(我省略了布局中不相关的部分):
default
xkb_symbols "evdev" {
// Swap Caps Lock and Escape.
key <CAPS> { [ Escape ] };
// key <ESC> { [ Caps_Lock ] };
key <ESC> { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] };
key <LWIN> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Alt_L ]
};
key <LALT> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Super_L ]
};
key <MUHE> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Alt_L ]
};
// placeholder for <SPCE>
key <HENK> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Alt_R ]
};
key <HKTG> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Return ]
};
key <RALT> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Menu ]
};
key <MENU> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Alt_R ]
};
// LSGT is the extra key in the European layout that is found between the
// left Shift and Z.
key <LSGT> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Super_L ]
};
// Japanese keyboard bottom row:
// <LCTL> <LWIN> <LALT> <MUHE> <SPCE> <HENK> <HKTG> <RALT> <MENU> <RCTL>
// Desired bottom row:
// <LCTL> <LALT> <LWIN> <LALT> <SPCE> <RALT> <RTRN> <MENU> <RALT> <RCTL>
// Other extra Japanese keys:
// Between / and right shift: <AB11>
key <AB11> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Shift_R ]
};
// Between = and Backspace: <AE13>
key <AE13> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ BackSpace ]
};
// Modifier numbers:
// Mod1 = Alt
// Mod2 = Num_Lock
// Mod4 = Super
// Mod5 = ISO Level3 Shift
// Shift = Shift
// <AB11> is Shift
modifier_map Shift { Shift_L, Shift_R };
// <LALT> is Super, <LSGT> is Super too
modifier_map Mod4 { Super_L, Super_R };
// <MENU> is Alt, <LWIN> is Alt too
modifier_map Mod1 { Alt_L, Alt_R };
// we map a bunch of keys to ISO Level3 Shift
modifier_map Mod5 { ISO_Level3_Shift };
};
编辑:事实证明,我上面发布的代码(大部分?)是正确的,但是 xkb 中用于启用“多媒体”键和其他“不常见”键的某些机制破坏了上述映射。底行按钮现在可以工作了,但该AB11
键仍然不能用作附加Shift
键。不过,这还是有进步的。
以下是对这次“inet”破坏事件的描述下面的清单表明在我的案例中也发生了这种情况:
$ setxkbmap ef -print
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+ef+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
请注意:xkb_symbols { include "pc+ef+inet(evdev)" };
。这意味着它首先应用正常pc
布局(美国 QWERTY),然后应用我选择的任何布局(这里称为ef
,虽然我没有这样称呼它,我猜它只是一个变量名称,可重复用于所有布局),然后inet(evdev)
应用。在 中symbols/inet
,您可以找到此块:
xkb_symbols "evdev" {
key <HKTG> { [ Hiragana_Katakana ] };
key <HENK> { [ Henkan ] };
key <MUHE> { [ Muhenkan ] };
显然,这是适用的,因为我的键盘是“inet 键盘”;rules/base
你可以找到这个:
! $inetkbds = acer_c300 acer_ferrari4k acer_laptop \
...
pc105 \
...
以及下面的内容:
$inetkbds = +inet(%m)
那么现在的问题是如何让我的键盘不被视为键盘inet
?
或者,这可能是导致问题的原因吗? 里面rules/evdev
有这个块:
! model = symbols
$evdevkbds = +inet(evdev)+inet(%m)
applealu_jis = +inet(evdev)+macintosh_vndr/jp(alujiskeys)
* = +inet(evdev)
最后一行显然意味着无论您使用什么键盘,如果您根据evdev
所做的操作来布局键盘,那么您最终总会将其添加并覆盖您的符号xkb_symbols "evdev" {
。inet(evdev)
我对 xkb 不太了解,不知道具体是哪种情况,因此如果能提供一些指导我将非常感激。
我仍然不知道为什么无法重新映射AB11
。是否还缺少什么?我将其定义AB11
为Shift_R
,然后Shift
通过赋予它能力modifier_map Shift { Shift_L, Shift_R };
。然而,在中xev
,当我按下此按钮时,它确实被识别为Shift_R
,但状态仍然是0x0
(无修饰符),而不是0x1
应该是的(Shift):
KeyPress event, serial 38, synthetic NO, window 0xdc00001,
root 0x1ef, subw 0x0, time 1701230053, (441,592), root:(444,729),
state 0x0, keycode 97 (keysym 0xffe2, Shift_R), same_screen YES,
XKeysymToKeycode returns keycode: 62
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
似乎没有任何东西可以覆盖此键(或任何其他具有相同键码的键)inet(evdev)
。
答案1
谢谢你为我指明了正确的方向。经过半天的调整,我终于可以让它工作了。这是我的配置,请根据您的需要进行调整:
这以符号/我们的形式表示:
xkb_symbols“基本”{
...
key <AE13> {[ BackSpace, BackSpace ]};
key <AB11> {[ backslash, bar ]};
key <BKSL> {[ Return]};
};
这是在符号/inet中:
key <HKTG> { [ space ] };
key <HENK> { [ space ] };
key <MUHE> { [ space ] };
欢呼吧,胜利者