xkb:ファンクションキーに新しいシフトレベルを割り当てる

xkb:ファンクションキーに新しいシフトレベルを割り当てる

ファンクションキーをもっと活用しようとしています。ウィンドウマネージャで機能を割り当てることができるように物理F1キーがF12表示されます(たとえば、を押すたびにアクティブなチャットウィンドウに切り替えます)。F21F32F21F22

しかし、それでも一般的なファンクションキーにアクセスしたいので、物理Caps Lockキーを押しながらキー押しF1を生成できるようにしたいです。F1他の修飾子に関する限り同じであれば良いでしょShiftF1。簡単に言うと:Shift + F1Shift + F21

  • F1->F21
  • Caps+ F1->F1
  • Shift+ F1-> Shift + F1(変更されない)
  • Alt+ F1-> Alt + F1(変更されない)
  • など。

したがって、最初の2点だけをデフォルトのレイアウトに変更するだけです。

次のXKBフラグメントでこれを開始しようとしましたが、F21Fキーの生成中にF1押し続けると、元のFキーは生成されません。Caps Lock

partial
xkb_types "hyper" {
    virtual_modifiers Alt,Hyper;
    type "HYPER" {
        modifiers= Hyper+Control+Alt;
        map[Hyper]= Level2;
        map[Control+Alt]= Level3;
        level_name[Level1]= "Extra";
        level_name[Level2]= "Normal";
        level_name[Level3]= "Normal+Ctrl+Alt";
    };
};

partial function_keys
xkb_symbols "hyper_f21" {

    replace key <FK01> {
        type= "HYPER",
        symbols[Group1]= [           F21,             F1, XF86Switch_VT_1 ]
    };
    replace key <FK02> {
        type= "HYPER",
        symbols[Group1]= [           F22,             F2, XF86Switch_VT_2 ]
    };
    ...
};

partial modifier_keys
xkb_symbols "caps_hyper" {
    replace key <CAPS> {
        [ Hyper_L, Hyper_L ]
    };
    modifier_map Lock { <KPDL> };  # Not sure how to clear modifiers, so assign an unused key
    modifier_map Mod3 { <CAPS> };
};

ロードしようとすると、次の警告が表示されます。

Warning:          Type "HYPER" has 3 levels, but <FK01> has 5 symbols
                  Ignoring extra symbols

<FK01>基本的に5つのレベルがありますが、3つだけオーバーライドしたので、なぜエラーが発生するのか本当に理解できません。

F21この設定をテストしたときに物理キーを押したF1ときにHyper_L(およびMod3)設定されていることを確認しましたCaps Lock。ただし、Caps Lock+を押すと代わりにF1生成されます。Mod3 + F21F1

ベストアンサー1

いつものように、この問題は問題が公開された直後に修正されました。問題は簡単でした。Hyper_Lに割り当てられたデフォルト値を使用していました。逆にMod4変更するとうまくいきました。ただし、実際の修飾子がまだ必要であるため、まだバインドする必要があります。Caps LockHyper_RMod3

これで、目的のアクションを生成するための更新された構成は次のとおりです。

partial
xkb_types "hyper" {
    virtual_modifiers Alt,Hyper;

    type "HYPER" {
        modifiers= Shift+Control+Alt+Hyper;

        map[Shift]= Level2;
        preserve[Shift]= Shift;

        map[Control]= Level2;
        preserve[Control]= Control;

        map[Shift+Control]= Level2;
        preserve[Shift+Control]= Shift+Control;

        map[Alt]= Level2;
        preserve[Alt]= Alt;

        map[Shift+Alt]= Level2;
        preserve[Shift+Alt]= Shift+Alt;

        map[Control+Alt]= Level3;
        preserve[Control+Alt]= Control+Alt;

        map[Shift+Control+Alt]= Level2;
        preserve[Shift+Control+Alt]= Shift+Alt;

        map[Hyper]= Level2;

        level_name[Level1]= "Extra";
        level_name[Level2]= "Normal";
        level_name[Level3]= "Ctrl+Alt";
    };
};


partial function_keys
xkb_symbols "hyper_f21" {

    replace key <FK01> {
        type= "HYPER",
        symbols[Group1]= [           F21,             F1, XF86Switch_VT_1 ]
    };
    replace key <FK02> {
        type= "HYPER",
        symbols[Group1]= [           F22,             F2, XF86Switch_VT_2 ]
    };
    ...
};

partial modifier_keys
xkb_symbols "caps_hyper" {
    replace key <CAPS> {
        [ Hyper_R ]
    };
    # Remove Hyper (Hyper_L/Hyper_R) from Mod4, was added by "pc" layout
    modifier_map none { <HYPR> };
    # Now make physical caps lock (mapped to Hyper_R above) control Mod3.  Mod3 is
    # associated with the virtual modifier "Hyper" because the existing XKB config
    # links Hyper_L and Hyper_R with this virtual modifier.  Therefore Mod3 becomes
    # the virtual modifier "Hyper" because they both share the same keysym Hyper_R.
    modifier_map Mod3 { <CAPS> };
};

つまり、次のようになります。

  • F1->F21
  • Caps+ F1->F1
  • Shift+ F1-> Shift + F1(変更されない)
  • Alt+ F1-> Alt + F1(変更されない)
  • その他 - 残りは変更されません

おすすめ記事