在 xkb 中重新映射日语键盘上的日语键的具体步骤是什么?

在 xkb 中重新映射日语键盘上的日语键的具体步骤是什么?

我正在尝试将日语键盘上的键重新映射为 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>

重新映射LWINLALTRALTMENU有效,但重新映射MUHEHENK、 和HKTG无效。

除此之外,我尝试重新映射AB11Shift_R和。结果是AE13什么也没做,就像、和 一样,但确实被重新映射到并按预期工作。BackSpaceAB11MUHEHENKHKTGAE13BackSpace

到目前为止,我一直在使用basic中定义的键码(据我所知)/usr/share/X11/xkb/keycodes/xfree86。因此,我的键盘布局的符号文件开始如下:

default
xkb_symbols "basic" {

由于MUHEHENKHKTGAB11AE13是在 中定义的/usr/share/X11/xkb/keycodes/evdev,我认为我应该将其更改为evdev,但这没有帮助:

default
xkb_symbols "evdev" {

我还需要做什么才能使用MUHEetc?我需要确保输入系统的其他部分使用 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。是否还缺少什么?我将其定义AB11Shift_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         ]       };

欢呼吧,胜利者

相关内容