人生シーケンスブレイク

シーケンスブレイク(Sequence breaking、シークエンスブレイクとも)とは、テレビゲームにおいて開発が想定している攻略ルートを逸脱し、ショートカットする行為のことである。

Ubuntuでもctrl+hでbackspaceにする

macOSでもctrl + hでBackspaceにしている macOSでctrl+hでbackspaceにする - 人生シーケンスブレイク が、UbuntuでもBackspaceにしたくなった。

xkbでの実現方法

現在のxkbmapの設定を確認

$ setxkbmap -print
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)"  };
    xkb_types     { include "complete"   };
    xkb_compat    { include "complete"   };
    xkb_symbols   { include "pc+us(dvorak)+us:2+inet(evdev)" };
    xkb_geometry  { include "pc(pc105)"  };
};

今のxkb設定を書き出す

# 既存の設定をエクスポート
$ xkbcomp $DISPLAY default.xkb

# 変更用にファイルをコピー
$ cp default.xkb ctrlh2backspace.xkb

xkbファイル内の編集

先程コピーしたctrlh2backspace.xkbファイルを編集する。

グループの確認

xkb_symbols "pc+us(dvorak)+us:2+inet(evdev)" {

    name[group1]="English (Dvorak)";
    name[group2]="English (US)";

複数の配列を利用している場合には、groupも複数記述されている。
自分はDvorakユーザーなのでgroup1のみ編集する。

型の追加

既存の ALPHABETIC にctrl時のlevelを追加した型を追加する。

    type "ALPHABETIC" {
        modifiers= Shift+Lock;
        map[Shift]= Level2;
        map[Lock]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Caps";
    };
    type "ALPHABETIC_LEVEL3" {
        modifiers= Shift+Lock+Control;
        map[Shift]= Level2;
        map[Lock]= Level2;
        map[Control]= Level3;
        level_name[Level1]= "Base";
        level_name[Level2]= "Caps";
        level_name[Level3]= "Control";
    };

LControl とすると、各アプリデフォルトのctrl+h(Chromeでいうとctrl+hで履歴画面表示など)をオーバーライドできないので Control にした方が良かった。

ctrl + h時にBackspaceにする

各キーのlevelごとに、出力するキーを記述している箇所があるのでlevel3としてBackspaceをマッピングする。

    key <AC06> {
        type= "ALPHABETIC",
        symbols[Group1]= [               d,               D ],
        symbols[Group2]= [               h,               H ]
    };
    key <AC07> {
        type= "ALPHABETIC_LEVEL3",
        symbols[Group1]= [               h,               H, BackSpace ],
        symbols[Group2]= [               j,               J ]
    };

デフォルトのxkbとの差分

❯ diff ./default.xkb ctrlh2backspace.xkb
320a321,329
>     type "ALPHABETIC_LEVEL3" {
>         modifiers= Shift+Lock+Control;
>         map[Shift]= Level2;
>         map[Lock]= Level2;
>         map[Control]= Level3;
>         level_name[Level1]= "Base";
>         level_name[Level2]= "Caps";
>         level_name[Level3]= "Control";
>     };
1309,1310c1318,1319
<         type= "ALPHABETIC",
<         symbols[Group1]= [               h,               H ],
---
>         type= "ALPHABETIC_LEVEL3",
>         symbols[Group1]= [               h,               H, BackSpace ],

適用する

$ xkbcomp ctrlh2backspace.xkb $DISPLAY

をすると即時反映される。

参考情報

丁寧に書いてあって非常に助かりました 🙏🏻

新たな悩みごと

ctrl+hをBackspaseとしたことで、Japanese(mozc)で日本語入力中にctrl+hしても後退してくれなくなった。 Backspace した際には従来通り動作してくれるが、上手く認識しない様子。

こちらの解決方法も模索中。。。