XKBを使用したマルチ修飾子レイヤー(日本語キーボード)

XKBを使用したマルチ修飾子レイヤー(日本語キーボード)

私は次のキーボード(HHKB JP)を持っています。

ビデオ

私はLubuntu 14.04を使用しており、/usr/share/X11/xkb/symbols/us達成するために編集しました。カスタムレイアウト

次に、次のキーを5、6、7、...、および20レベルの修飾子として使用したいと思います。 (WindowsではAutoHotkeyを使用してこれを実行しましたが、現在はAutoHotkeyなしでは購入できません(少なくとも一部は)。)

ここに画像の説明を入力してください。

2つの質問があります。

  1. キーボードのいくつかの非標準キーの「名前」が何であるかわかりません(に追加するため/usr/share/X11/xkb/symbols/us)。
  2. 特に。xkbxmodmap9

私の質問は次のとおりです

  1. ミステリーキーの名前/コード(例:)をどのように知ることができますかkey <AC01>
  2. 特定のキーに修飾子レイヤーを好きなだけ追加する方法は?

注:XKBではこれはできません。これを達成するためのスクリプトツールがいくつかあることに気付くことを嬉しく思います。

答え1

RMLVOXKB レイアウトは、ルール、モデル、レイアウト、バリアント、オプションというモデルで定義されます。システムXKBデータベースは通常、次の場所にあります/usr/share/X11/xkb

/usr/share/X11/xkb/
├── compat       # ??? dark magic here, avoid
├── geometry     # as in physical, eg for generating layout maps
├── keycodes     # helpful for translating keycodes (from xev) to <FOO>
├── rules        # "evdev" is the important one; *.lst & *.xml are descriptions
├── symbols      # main layouts, variants, optional overrides
└── types        # ??? dark magic here, avoid

このkeycodesディレクトリは定義キー名は、キーが実際に生成するスキャンコードに似ているか派生しています <CAPS>。が表示されたら、現在のキーマップを構築するためにアクセスしたファイルを正確に表示します。ファイルとファイル内のセクションをロードしています。同様のツールを使用して特定のキーが生成するキーコードを確認すると、これらのファイルにはそのコードにマップされたキー名が表示されます。<AC01>setxkbmap -query -verbose 10keycodes: evdev+aliases(qwerty)../keycodes/evdevqwerty../keycodes/aliasesxev


修飾子の質問はより困難です。参考資料のみ見る8ISOレベル、これがXKB制限であるか、それを使用する一般的なレイアウトではないかどうかはわかりません。 (追加調査の結果、追加の項目を追加するにはXKBコードを変更する必要があると確信しています。

            symbol    press this
level 1       a       key
level 2       A       shift+key
level 3       á       <level3>+key
level 4       Á       <level3>+shift+key
level 5       ??      <level5>+key
level 6       ??      <level5>+shift+key
level 7       ??      <level5>+<level3>+key
level 8       ??      <level5>+<level3>+shift+key

ご覧のとおり、8レベルのレイアウトには「新しい修飾子」キーとして機能するキーが2つだけです。/usr/share/X11/xkb/compat/level5とを参照してください/usr/share/X11/xkb/types/level5。レベル5の移動、ラッチング、およびロック動作は、で定義されているシンボルオプションを介してキーに関連付けられます/usr/share/X11/xkb/symbols/level5

自分で定義すればlevel9その後、修飾子は既存のレベルと組み合わせて8つの追加レベルを提供し、次に別のレベル修飾子が必要です。

            symbol    press this
level 9       ??      <level9>+key
level 10      ??      <level9>+shift+key
level 11      ??      <level9>+<level3>+key
level 12      ??      <level9>+<level3>+shift+key
level 13      ??      <level9>+<level5>+key
level 14      ??      <level9>+<level5>+shift+key
level 15      ??      <level9>+<level5>+<level3>+key
level 16      ??      <level9>+<level5>+<level3>+shift+key

ご覧のとおり、同時に多くのキーを押すことから始まります。使用ロックするそしてクラスプ変える変化減らすことはできますが、これは非常に複雑なレイアウトになります。レベルセレクタを追加することを想像してください。各追加セレクタは既存のレベルを2倍にします。


あなたが想定している「修飾子」は、特定のレベルを選択することができます。このように選択動作を定義して対応するキーのレベル3に配置すると、アクションが提供され、level3+key9次にlevel14_latch押すキーはそのキーのレベル14になります。

編集する:別の問題制作について具体的に質問を受けてデモンストレーションをしてみましたISO_Level4_{Shift,Latch,Lock}ISO_Level4_Latch既存のXKBキーシンボルと操作を使用します。この方法はレベル 4、6、7、8 で動作します。

答え2

古い質問ですが正解がなく、私だけの理由で問題に関心があって時間をかけて解決してみました。 XKBを構成するのは難しいかもしれませんが、確かに完了することができます。

最初の質問では、次の魔法コマンドを使用して、現在構成されているキーボードのすべてのキー名を含む画像を生成できます。

setxkbmap -print | xkbcomp - - | xkbprint -color -label name - - | ps2pdf - > keynames.pdf

pdfファイルkeynames.pdfを確認してください。

2番目の質問の場合は、XKB構成をさらに詳しく調べる必要があります。私は情報の最高のソースは次のとおりです。開発者ドキュメント。つまり、キーを「実際の修飾子」の組み合わせにマッピングし、これらの組み合わせをキーレベルにマッピングする必要があります。

シンボルファイルでは、たとえば次のように書きたいと思います。

key <AC01>  { [ a, A, b, B, c, C, d, D, e, E, f, F, g, G,
                h, i, j, k, l, m, n, o, p, q, r, s, t, u]}; 

これは、Aボタンに記号があることを意味します。1階に第二に、第二3番目のライトは、キーをさまざまなレベルにマッピングします。ただし、この例に示すように、一部の修飾キーの場合は、他のすべてのレベルが修飾キー+ Shiftキーを押すのと一致させることが合理的であり、一部のキーではShiftキーを押すか押さないと同じ記号が生成されます。 。これが私たちが達成したいものです。

XKBは、「実際」および「仮想」修飾子を使用して修飾子レベルを追跡します。仮想の名前は何でも持つことができ、私たちは16を持つことができます。ただし、各キーは「実際の」修飾子の組み合わせと一致する必要があり、多数のキーを使用して作業するため、実際の修飾子もすぐに使用できます。

状況を複雑にするために、Shift、Lock、Control、およびMod1からMod5までの8つの「実際の修飾子」の固定リストがあります。ただし、これらの組み合わせを使用できるため、理論的にはキーごとに2⁸=256の異なるレベルがあります。しかし、実際にはその一部がすでにオペレーティングシステムやプログラムで多様に使用されているため、選択には少し注意が必要です。 XKBの各キーのシンボルレベルも63または64に制限されていますが、使用できます。グループその数に4を掛けます。ここではグループを使用しません。

ControlとMod1 = Alt修飾子はオペレーティングシステムとプログラムに共通であるため、使用しません。 Mod4 = Superも使用されますが、他の修飾子と一緒に使用できます。私たちはまずタイプ修飾子の組み合わせをレベルにマップするファイル。 multimod_typeというファイルに次の内容を作成し、/usr/share/X11/xkb/typesに入れます。

default partial xkb_types "multimod_type" {

 // We use real modifiers Shift, Mod2, Mod3, Mod4, Mod5.
 // Mod1 = Alt, so we do not use this.
 // In addition, Mod4 = Super is used by the OS, which causes
 // problems in four places. 

type "MULTIMOD" {
modifiers = Shift + Mod2 + Mod3 + Mod4 + Mod5;
map[None] = 1;
map[Shift] = 2;
map[Mod2] = 3;
map[Mod2 + Shift] = 4;
map[Mod3] = 5;
map[Mod3 + Shift] = 6;
map[Mod3 + Mod2] = 7;
map[Mod3 + Mod2 + Shift] = 8;
map[Mod4 + Mod3] = 9;
map[Mod4 + Mod3 + Shift] = 10;
map[Mod4 + Mod3 + Mod2] = 11;
map[Mod4 + Mod3 + Mod2 + Shift] = 12;
map[Mod5] = 13;
map[Mod5 + Shift] = 14;
map[Mod5 + Mod2] = 15;
map[Mod5 + Mod2 + Shift] = 16;
map[Mod5 + Mod3] = 17;
map[Mod5 + Mod3 + Shift] = 18;
map[Mod5 + Mod3 + Mod2] = 19;
map[Mod5 + Mod3 + Mod2 + Shift] = 20;
map[Mod5 + Mod4 + Mod3] = 21;
map[Mod5 + Mod4 + Mod3 + Shift] = 22;
map[Mod5 + Mod4 + Mod3 + Mod2] = 23;
map[Mod5 + Mod4 + Mod3 + Mod2 + Shift] = 24;
// Mod4 = Super is used
map[Mod4 + Shift] = 25;
// Mod4 + Mod2 is used
map[Mod4 + Mod2 + Shift] = 26;
// Mod5 + Mod4 is used
map[Mod5 + Mod4 + Shift] = 27;
// Mod5 + Mod4 + Mod2 is used
map[Mod5 + Mod4 + Mod2 + Shift] = 28;
// Level names are only for description. The values are not used.
level_name[1] = "Base";
level_name[2] = "Shift";
level_name[3] = "Alt1";
level_name[4] = "Alt1 + Shift";
level_name[5] = "Alt2";
level_name[6] = "Alt2 + Shift";
level_name[7] = "Alt3";
level_name[8] = "Alt3 + Shift";
level_name[9] = "Alt4";
level_name[10] = "Alt4 + Shift";
level_name[11] = "Alt5";
level_name[12] = "Alt5 + Shift";
level_name[13] = "Alt6";
level_name[14] = "Alt6 + Shift";
level_name[15] = "Alt7";
level_name[16] = "Alt8";
level_name[17] = "Alt9";
level_name[18] = "Alt10";
level_name[19] = "Alt11";
level_name[20] = "Alt12";
level_name[21] = "Alt13";
level_name[22] = "Alt14";
level_name[23] = "Alt15";
level_name[24] = "Alt16";
level_name[25] = "Alt17";
level_name[26] = "Alt18";
level_name[27] = "Alt19";
level_name[28] = "Alt20";
};
};

名前が示すように、20の追加クリーンアップボタンがあり、そのうちの最初の6つはShiftで使用できます。

これを使用するには、シンボリックファイルの最小動作例を修正します。私はそれをmultimod_seと呼びます。通常どおり/usr/share/X11/xkb/symbolsに保存してください。

default partial alphanumeric_keys xkb_symbols "multimod_se" {

// Include your favourite symbols
include "se"

name[Group1]="Swedish with many modifiers on A";

key.type[Group1] = "MULTIMOD";

key <AC01>  { [ a, A, b, B, c, C, d, D, e, E, f, F, g, G,
                h, i, j, k, l, m, n, o, p, q, r, s, t, u]}; 

// ----- Modifiers -----
key.type = "ONE_LEVEL";
key.repeats = False;

// We will map F1-F10 and 1-9 and 0 to the modifier keys
// The keys F1-F6 produce different symbols with shift pressed
key <FK01> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2)]};
key <FK02> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3)]};
key <FK03> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3)]};
key <FK04> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod4)]};
key <FK05> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod4)]};
key <FK06> { [ Hyper_R ], actions = [SetMods(modifiers=Mod5)]};

// We can bind buttons to include shift in order to get a
// shortcut to a modifier button + shift
key <FK07> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod5)]};
key <FK08> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod5+Shift)]};
key <FK09> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod5)]};
key <FK10> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod5+Shift)]};
key <AE01> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod5)]};
key <AE02> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod5+Shift)]};
key <AE03> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod4+Mod5)]};
key <AE04> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod4+Mod5+Shift)]};
key <AE05> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod4+Mod5)]};
key <AE06> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod4+Mod5+Shift)]};

// The following four must be defined with shift
key <AE07> { [ Hyper_R ], actions = [SetMods(modifiers=Mod4+Shift)]};
key <AE08> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod4+Shift)]};
key <AE09> { [ Hyper_R ], actions = [SetMods(modifiers=Mod4+Mod5+Shift)]};
key <AE10> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod4+Mod5+Shift)]};
};

これにより、F1〜F10、1〜9、および0が追加の修飾キーであるキーマップが生成されます。ボタンAで押すと、文字auが印刷され、ShiftでAGも印刷されます。コマンドを使用してタイプファイルでシンボルをロードする

setxkbmap -types complete+multimod_type multimod_se

標準タイプファイルを含みます。十分これは、含まれているシンボルファイルの他の種類と組み合わせて、ONE_LEVEL型を修飾キーとして使用するためです。

いくつかのコメント: 修飾子を処理する標準的な方法は、ルールを使用することです。互換性これはファイルですが、これには各修飾キーに対して異なる操作を行わない一意のシンボルが必要です。上記のように、シンボルファイルに直接修飾子ルールを定義することでこの問題を解決できます。ご覧のとおり、すべての修飾キーには Hyper_R 記号があります。

追加のキーが必要な場合は、オペレーティングシステムまたはプログラムで他のものを表すために使用されていないMod1、Control、およびLockの組み合わせを含めることもできます。

関連情報