Shift + ISO_Level3_Shift(別名AltGr)を使用する代わりに、xkbがレベル4修飾子またはロックにキーを設定できるかどうか疑問に思います。
レベル6、7、8と同じ問題です(「EIGHT_LEVEL」またはバリアントを使用)。
レベル3とレベル5はどちらも大丈夫ですが、他のものはなぜできませんか?
答え1
可能ですが、少しハッキーです。特定のキーシンボルが定義されていません。 ISO_Level3_{Shift,Latch,Lock}
(level5の場合でも同じ3つ)は、X11およびlibxkbcommonヘッダーでコンパイル時に定義されます。
compatibility
実行時にinterpret
セクションと;を介してactions
モジュールで有効になります。たとえば、現在のキーマップを確認してください。
$ xkbcomp $DISPLAY - | less
//....
xkb_compatibility "complete+ledcaps(shift_lock)" {
//....
interpret ISO_Level3_Shift+AnyOf(all) {
virtualModifier= LevelThree;
useModMapMods=level1;
action= SetMods(modifiers=LevelThree,clearLocks);
};
interpret ISO_Level3_Latch+AnyOf(all) {
virtualModifier= LevelThree;
useModMapMods=level1;
action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
};
interpret ISO_Level3_Lock+AnyOf(all) {
virtualModifier= LevelThree;
useModMapMods=level1;
action= LockMods(modifiers=LevelThree);
};
//....
interpret ISO_Level3_Shift+AnyOfOrNone(all) {
action= SetMods(modifiers=LevelThree,clearLocks);
};
interpret ISO_Level3_Latch+AnyOfOrNone(all) {
action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
};
interpret ISO_Level3_Lock+AnyOfOrNone(all) {
action= LockMods(modifiers=LevelThree);
};
//....
既存のキー記号がありますISO_Level2_Latch
。interpret
上記の既存の互換性セクションはありませんが、追加すると期待どおりに機能します。 (Shift
すでに存在しているためISO_Level2_Shift
必要ありません。Shift_Lock
またはCaps_Lock
置き換えられますISO_Level2_Lock
。) したがって、キーが必要な場合は、キー記号をShift_Latch
使用してISO_Level2_Latch
キーマップに追加します。
interpret ISO_Level2_Latch+AnyOf(all) {
useModMapMods=level1;
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
interpret ISO_Level2_Latch+AnyOfOrNone(all) {
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
ISO_Level4_Shift
この方法はレベル4、6、7、8で使用できますが、事前定義されたキー記号などはありません。これをコードに追加して再コンパイルしたり、使用されていない一部のキーシンボルの目的を変更して、レベル4シフト(またはラッチまたはロック)として解釈することができます。ヘッダファイルを調べてみると、libxkbcommon
XKBに知られているすべての主要なシンボル名が私たちの目的に適しているようです。
//....in xkbcommon/xkbcommon-keysyms.h:
//....
#define XKB_KEY_ISO_Fast_Cursor_Left 0xfe2c
#define XKB_KEY_ISO_Fast_Cursor_Right 0xfe2d
#define XKB_KEY_ISO_Fast_Cursor_Up 0xfe2e
#define XKB_KEY_ISO_Fast_Cursor_Down 0xfe2f
XKB_KEY_
XKBルールで参照できるキーシンボル名を取得するには、プレフィックスを削除してください。ISO_Fast_Cursor_Left
偽物を使ってみましょうISO_Level4_Latch
。
まず、次を使用して主キーマップを作成しますsetxkbmap -print
。次に、このファイルを編集し、それに上書きを追加し、最後に次を使用して変更されたキーマップをロードしますxkbcomp [file] $DISPLAY
。
$ setxkbmap -print > mykeymap.xkb
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us(altgr-intl)+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
このファイルを編集し、必要な上書きを入力します。
// Attempting to define and use a key as Level4 Shift/Latch/Lock.
// Plan: * activate lv5 shift on rctrl.
// * place latches on lv5 of keys 2,3,4,5 for corresponding level.
// * replace keys ASDF with 8-level versions and define symbols for test.
// * pressing RCtrl+4 then A should result in Á
// starting point: setxkbmap -layout us -variant altgr-intl -option '' -print
// load this file: xkbcomp myfile.xkb $DISPLAY
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat {
include "complete"
// add in interpretations
// ISO_Level3_Latch includes a +AnyOf stanza and a +AnyOfOrNone stanza (same for ISO_Level5_Latch)
// assume each additional latch needs both
interpret ISO_Level2_Latch+AnyOf(all) {
useModMapMods=level1;
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
interpret ISO_Level2_Latch+AnyOfOrNone(all) {
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
interpret ISO_Fast_Cursor_Left+AnyOf(all) {
// Level4 needs both Shift and LevelThree
useModMapMods=level1;
action= LatchMods(modifiers=Shift+LevelThree,clearLocks,latchToLock);
};
interpret ISO_Fast_Cursor_Left+AnyOfOrNone(all) {
// Level4 needs both Shift and LevelThree
action= LatchMods(modifiers=Shift+LevelThree,clearLocks,latchToLock);
};
};
xkb_symbols {
include "pc"
include "us(altgr-intl)"
include "inet(evdev)"
// latch keys
key <AE02> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ 2, at, twosuperior, dead_doubleacute, ISO_Level2_Latch, X, z, Z ]
};
key <AE03> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ 3, numbersign, threesuperior, dead_macron, ISO_Level3_Latch, X, z, Z ]
};
// no ISO_Level4_Latch so use ISO_Fast_Cursor_Left
key <AE04> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ 4, dollar, currency, sterling, ISO_Fast_Cursor_Left, X, z, Z ]
};
key <AE05> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ 5, percent, EuroSign, dead_cedilla, ISO_Level5_Latch, X, z, Z ]
};
// no ISO_Level6_Latch so use ISO_Fast_Cursor_Right
// no ISO_Level7_Latch so use ISO_Fast_Cursor_Up
// no ISO_Level8_Latch so use ISO_Fast_Cursor_Down
// eight-level keys ASDF for testing
key <AC01> {
type= "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1]= [ a, A, aacute, Aacute, agrave, Agrave, aring, Aring ]
};
key <AC02> {
type= "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1]= [ s, S, ssharp, section, ccedilla, Ccedilla, ntilde, Ntilde ]
};
key <AC03> {
type= "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1]= [ d, D, eth, ETH, thorn, THORN, t, T ]
};
key <AC04> {
type= "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1]= [ f, F, eacute, Eacute, x, X, z, Z ]
};
// ISO_Level3_Shift on Right Alt
include "level3(ralt_switch)"
// ISO_Level5_Shift on Right Ctrl
include "level5(rctrl_switch)"
};
xkb_geometry { include "pc(pc105)" };
};
これでクラスプをテストできます(上記の例では右クリックする必要があります。ISO_Level5_Shift
そうCtrl
でxkbcomp
ない場合は、コマンドを再実行してください)。
ISO_Level5_Shift+2
その後、a印刷する必要がありますA
ISO_Level5_Shift+3
その後、a印刷する必要がありますá
ISO_Level5_Shift+4
その後、a印刷する必要がありますÁ
ISO_Level5_Shift+5
その後、a印刷する必要がありますà
テストでは、RCtrl-as-level5-shiftが少し不安定で、常に正しく適用されていないことを確認しました。通常、xkbcomp
コマンドを1〜2回再実行すると機能します。Aまたは、キーを使用してFテストすると、Ctrl+Dシェルが終了する可能性があります。
一部のアプリは、私たちが借りたキーボード記号を認識していないので、奇妙なことをするかもしれません。たとえば、Firefoxは4
正しいラッチが有効になると偶数を印刷するため、キーシーケンスがrctrl+4 then a
発生します4Á
。これは3と5の実際のキーシンボルでは発生しないため、他のキーシンボルを借用するとFirefoxは何も印刷しないことに気づくでしょう。これまで、ほとんどの端末アプリケーションは期待どおりに動作しています。
答え2
私は同じ問題に直面して、より直接的な方法を見つけました。私のユースケースは、ワンクリックでレベル7にショートカットを取得することです。これは非常に一般的であり、ハッキングではありません。
追加のレベル名の場合、すでに使用されているShift、LevelThree、およびLevelFiveに加えて、仮想修飾子SuperまたはHyper(またはMeta)を使用することもできます。私はレベル7でHyperを使う予定です。 Super および Hyper の解釈は /usr/share/X11/compat/misc で定義され、デフォルト設定に含まれています。
追加のショートカットを追加するための新しいショートカットを作成します。タイプ。通常、8つのレベルで使用されるタイプはEIGHT_LEVELであり、/usr/share/X11/xkb/types/level5で定義されています。次の内容でlevel7_hyperというファイルを作成し、/usr/share/X11/xkb/typesに保存します。必要に応じて、同じレベルに複数のキーの組み合わせを設定できます。
default partial xkb_types "default" {
// Adds the shortcut Hyper to reach level 7
// and Hyper+Shift to reach level 8
virtual_modifiers LevelThree, LevelFive, Hyper;
type "EIGHT_LEVEL_HYPER" {
modifiers = Shift + LevelThree + LevelFive + Hyper;
map[None] = Level1;
map[Shift] = Level2;
map[LevelThree] = Level3;
map[Shift+LevelThree] = Level4;
map[LevelFive] = Level5;
map[Shift+LevelFive] = Level6;
map[Hyper] = Level7;
map[LevelThree+LevelFive] = Level7;
map[Shift+Hyper] = Level8;
map[Shift+LevelThree+LevelFive] = Level8;
level_name[Level1] = "Base";
level_name[Level2] = "Shift";
level_name[Level3] = "Alt Base";
level_name[Level4] = "Shift Alt";
level_name[Level5] = "X";
level_name[Level6] = "X Shift";
level_name[Level7] = "X Alt Base";
level_name[Level8] = "X Shift Alt";
};
};
シンボルファイルでこのタイプを使用するには、この最小操作例を変更します。たとえば、/usr/share/X11/xkb/symbols/level7se として保存します。
default partial alphanumeric_keys
xkb_symbols "level7se" {
// Include your favourite symbols
include "se"
name[Group1]="Level7-se";
key.type[Group1] = "EIGHT_LEVEL_HYPER";
// Copy in the lines from the symbols file of your choice and make
// your edits, here just the button A
key <AC01> { [ a, A, b, B, c, C, d, D ]};
// Modifier keys only have one level
key.type[Group1] = "ONE_LEVEL";
// Right Alt gives level 3
key <RALT> {[ ISO_Level3_Shift ]};
// Left Win key gives level 5
key <LWIN> {[ ISO_Level5_Shift ]};
// The button to the left of the number line (paragraph on Swedish
// keyboards. Tilde on some others?) gives level 7.
key <TLDE> {[ Hyper_R ]};
};
その後、次のように構成をロードできます。
setxkbmap -types complete+level7_hyper level7se
修飾キーはONE_LEVELタイプを使用するため、フルタイプも含める必要があります。
より多くのレベルのショートカットを取得するには、タイプファイルにその行を追加し、シンボルファイルにそのセクションを追加するだけです。