XKBを勉強してリベンジを試みる

なんか色々と試していたら入力周りがぶっ壊れた。
多分、知らない設定を知らぬ間に弄って元に戻せなくなったのだろうと思うが、日本語入力ではなくて直接入力にしても変換中みたいな下線が出てカーソルが動かずアルファベット以外のキーを打つまで未確定みたいな動きになってしまいました。
fcitxとfcitx-mozcを再インストールしたら一応その点については直ったので記事作成を再開します。

前回記事『カーソル&ポインタ操作を効率化する』で結局xmodmapじゃダメでした。という、やっぱり方方で書かれていた『今はxkbでやるべき』みたいな話は本当だったのか……と、いうところで終わってしまったのですが、ようやく見つけたこちらのドキュメント『Custom keyboard layout definitions - Community Help Wiki』。
まあ別にここでもxmodmapはダメと書かれているわけではなくて、載っている情報がひたすらxkbのことばかりでしたので、あぁやっぱりもうxmodmapは手が入っていないというか過去の遺産というか、放置みたいな感じなのだろうか? と勝手に筆者は解釈致しました。

実は筆者はxmodmapによるキーコンフィグを実施する以前にxkbでキーコンフィグをしていた時期もありまして、時代に逆行しとるやんけ、ってな感じなのですが、xkbってなんかムズいじゃないですか。
ただ、今回ちょっとキーコンフィグ周りで色々と調べて来て、まだ全然抜けだらけではあるものの、どれもこれもさっぱり分からんという感じだった以前よりかは幾分かマシな理解が出来るかもしれない、と思ってこの際xkbに再チャレンジしてみます。

まぁ、ふわふわとした筆者の現在の感想からすると、確かにいくつかのディレクトリに分かれて、各ディレクトリに設定ファイルが山ほどあるxkbは設定同士の組み合わせとかincludeのネストで追って行くが非常に大変ではあるのですが、ノリとしては世界各個の地域差を小ブロックにまとめて、必要な設定を組み合わせて各自の環境に合わせていく、という割ときっちり理屈で分割された設定群なのであるのだろうなぁ、というくらいの認識にはなりましたので、良く分からないBlackBoxだった以前よりかは怖いものではなくなった気がします。

そういう目で改めて色々なドキュメントを眺めていると、今まで使用されている定義の意味がさっぱり分からなくてちっとも理解できなかったものが、ある程度「こういうことかな?」と予想が付けられる部分も出てきたりしまして、一応「こうやったら出来そうだけど」というところまでは来ることが出来たので、今こうして忘れないうちにと記事化しています。

さて、キーボード等からの入力で発生するEventcodeと処理されるxmodmapのKeycodeにはいくつか謎に噛み合わない部分があったのですが、今回はそれのxkb版と言いますか、よりEventcodeとマッチしていて如何にも「今はxmodmapじゃなくてxkbなんです」という感じを裏付ける資料が見つかったので、まずはそれを貼り付けたいと思います。

この手の調べ物をしているとArchLinuxのドキュメントにお世話になることが多いのですが、しかし筆者のメインPCはXubuntuですので、Archとは違うところも多々あるわけです。
例えばxkbの設定を書く時に使っている『<XXXX>』という4桁の文字。これの定義がどこにあるのかさっぱり分かりません。Arch以外の情報も含めて、筆者の環境で実際にコレと思われる定義ファイルを指し示してくれている情報は皆無で、結局筆者は自力で見当を付けて探し出しました。

xkbの設定を書く時に使う4桁の文字をKeycodeにマッピングしている定義ファイルだと思われるものが、筆者の環境では「/usr/share/X11/xkb/keycodes/evdev」にありました。
ここにある定義はやはりxmodmapと同じようにEventcodeに対して+8オフセットされているものの、xmodmapよりもきっちりと定義が目一杯されており、xmodmapでは尻切れトンボだったEventcode248もKeycode256としてしっかり存在しています。
また、Eventcodeの方はその先もまだ続いてキーボードのEventcodeとしては0x2bcつまり700まで定義があったのですが、こちらのevdevファイルでもちゃんと708(+8オフセットされるので)まで定義があり、程よくマッチングしていました。

Keycode256の手前に「// Key codes below cannot be used in X」(ここから下はXでは使えないよ)と書かれていたのと、evdevの定義が<Innn>(nnnはKeycode10進数表現)という単純な形でコメントで対応するEventcodeが記載されているだけというシンプルな形になっていますので、ここではEventcode1〜248、Keycode9〜256の部分だけをコード順に並べて整理したものを貼り付けておきます。
なお、これは筆者の現時点の環境ではこうなっていた、というだけでも他でも同じ保証はありませんのでご了承ください。
あと、オマケでxmodmapの状態も対応させて貼り付けておきます。

InputEventCodeevdevKeycodexmodmapKeycode
keycode 8 =
KEY_ESC 1<ESC> = 9;keycode 9 = Escape NoSymbol Escape
KEY_1 2<AE01> = 10;keycode 10 = 1 exclam 1 exclam
KEY_2 3<AE02> = 11;keycode 11 = 2 quotedbl 2 quotedbl
KEY_3 4<AE03> = 12;keycode 12 = 3 numbersign 3 numbersign
KEY_4 5<AE04> = 13;keycode 13 = 4 dollar 4 dollar
KEY_5 6<AE05> = 14;keycode 14 = 5 percent 5 percent
KEY_6 7<AE06> = 15;keycode 15 = 6 ampersand 6 ampersand
KEY_7 8<AE07> = 16;keycode 16 = 7 apostrophe 7 apostrophe
KEY_8 9<AE08> = 17;keycode 17 = 8 parenleft 8 parenleft
KEY_9 10<AE09> = 18;keycode 18 = 9 parenright 9 parenright
KEY_0 11<AE10> = 19;keycode 19 = 0 asciitilde 0 asciitilde
KEY_MINUS 12<AE11> = 20;keycode 20 = minus equal minus equal
KEY_EQUAL 13<AE12> = 21;keycode 21 = asciicircum asciitilde asciicircum asciitilde
KEY_BACKSPACE 14<BKSP> = 22;keycode 22 = BackSpace BackSpace BackSpace BackSpace
KEY_TAB 15<TAB> = 23;keycode 23 = Tab ISO_Left_Tab Tab ISO_Left_Tab
KEY_Q 16<AD01> = 24;keycode 24 = q Q q Q
KEY_W 17<AD02> = 25;keycode 25 = w W w W
KEY_E 18<AD03> = 26;keycode 26 = e E e E
KEY_R 19<AD04> = 27;keycode 27 = r R r R
KEY_T 20<AD05> = 28;keycode 28 = t T t T
KEY_Y 21<AD06> = 29;keycode 29 = y Y y Y
KEY_U 22<AD07> = 30;keycode 30 = u U u U
KEY_I 23<AD08> = 31;keycode 31 = i I i I
KEY_O 24<AD09> = 32;keycode 32 = o O o O
KEY_P 25<AD10> = 33;keycode 33 = p P p P
KEY_LEFTBRACE 26<AD11> = 34;keycode 34 = at grave at grave
KEY_RIGHTBRACE 27<AD12> = 35;keycode 35 = bracketleft braceleft bracketleft braceleft
KEY_ENTER 28<RTRN> = 36;keycode 36 = Return NoSymbol Return
KEY_LEFTCTRL 29<LCTL> = 37;keycode 37 = Control_L NoSymbol Control_L
KEY_A 30<AC01> = 38;keycode 38 = a A a A
KEY_S 31<AC02> = 39;keycode 39 = s S s S
KEY_D 32<AC03> = 40;keycode 40 = d D d D
KEY_F 33<AC04> = 41;keycode 41 = f F f F
KEY_G 34<AC05> = 42;keycode 42 = g G g G
KEY_H 35<AC06> = 43;keycode 43 = h H h H
KEY_J 36<AC07> = 44;keycode 44 = j J j J
KEY_K 37<AC08> = 45;keycode 45 = k K k K
KEY_L 38<AC09> = 46;keycode 46 = l L l L
KEY_SEMICOLON 39<AC10> = 47;keycode 47 = semicolon plus semicolon plus
KEY_APOSTROPHE 40<AC11> = 48;keycode 48 = colon asterisk colon asterisk
KEY_GRAVE 41<TLDE> = 49;
alias <HZTG> = <TLDE>;// Hankaku/Zenkaku toggle
keycode 49 = Zenkaku_Hankaku Kanji Zenkaku_Hankaku Kanji
KEY_LEFTSHIFT 42<LFSH> = 50;keycode 50 = Shift_L NoSymbol Shift_L
KEY_BACKSLASH 43<BKSL> = 51;
alias <AC12> = <BKSL>;
keycode 51 = bracketright braceright bracketright braceright
KEY_Z 44<AB01> = 52;keycode 52 = z Z z Z
KEY_X 45<AB02> = 53;keycode 53 = x X x X
KEY_C 46<AB03> = 54;keycode 54 = c C c C
KEY_V 47<AB04> = 55;keycode 55 = v V v V
KEY_B 48<AB05> = 56;keycode 56 = b B b B
KEY_N 49<AB06> = 57;keycode 57 = n N n N
KEY_M 50<AB07> = 58;keycode 58 = m M m M
KEY_COMMA 51<AB08> = 59;keycode 59 = comma less comma less
KEY_DOT 52<AB09> = 60;keycode 60 = period greater period greater
KEY_SLASH 53<AB10> = 61;keycode 61 = slash question slash question
KEY_RIGHTSHIFT 54<RTSH> = 62;keycode 62 = Shift_R NoSymbol Shift_R
KEY_KPASTERISK 55<KPMU> = 63;keycode 63 = KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply XF86ClearGrab
KEY_LEFTALT 56<LALT> = 64;keycode 64 = Alt_L Meta_L Alt_L Meta_L
KEY_SPACE 57<SPCE> = 65;keycode 65 = space NoSymbol space
KEY_CAPSLOCK 58<CAPS> = 66;keycode 66 = Eisu_toggle Caps_Lock Eisu_toggle Caps_Lock
KEY_F1 59<FK01> = 67;keycode 67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
KEY_F2 60<FK02> = 68;keycode 68 = F2 F2 F2 F2 F2 F2 XF86Switch_VT_2
KEY_F3 61<FK03> = 69;keycode 69 = F3 F3 F3 F3 F3 F3 XF86Switch_VT_3
KEY_F4 62<FK04> = 70;keycode 70 = F4 F4 F4 F4 F4 F4 XF86Switch_VT_4
KEY_F5 63<FK05> = 71;keycode 71 = F5 F5 F5 F5 F5 F5 XF86Switch_VT_5
KEY_F6 64<FK06> = 72;keycode 72 = F6 F6 F6 F6 F6 F6 XF86Switch_VT_6
KEY_F7 65<FK07> = 73;keycode 73 = F7 F7 F7 F7 F7 F7 XF86Switch_VT_7
KEY_F8 66<FK08> = 74;keycode 74 = F8 F8 F8 F8 F8 F8 XF86Switch_VT_8
KEY_F9 67<FK09> = 75;keycode 75 = F9 F9 F9 F9 F9 F9 XF86Switch_VT_9
KEY_F10 68<FK10> = 76;keycode 76 = F10 F10 F10 F10 F10 F10 XF86Switch_VT_10
KEY_NUMLOCK 69<NMLK> = 77;keycode 77 = Num_Lock NoSymbol Num_Lock
KEY_SCROLLLOCK 70<SCLK> = 78;keycode 78 = Scroll_Lock NoSymbol Scroll_Lock
KEY_KP7 71<KP7> = 79;keycode 79 = KP_Home KP_7 KP_Home KP_7
KEY_KP8 72<KP8> = 80;keycode 80 = KP_Up KP_8 KP_Up KP_8
KEY_KP9 73<KP9> = 81;keycode 81 = KP_Prior KP_9 KP_Prior KP_9
KEY_KPMINUS 74<KPSU> = 82;keycode 82 = KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract XF86Prev_VMode
KEY_KP4 75<KP4> = 83;keycode 83 = KP_Left KP_4 KP_Left KP_4
KEY_KP5 76<KP5> = 84;keycode 84 = KP_Begin KP_5 KP_Begin KP_5
KEY_KP6 77<KP6> = 85;keycode 85 = KP_Right KP_6 KP_Right KP_6
KEY_KPPLUS 78<KPAD> = 86;keycode 86 = KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add XF86Next_VMode
KEY_KP1 79<KP1> = 87;keycode 87 = KP_End KP_1 KP_End KP_1
KEY_KP2 80<KP2> = 88;keycode 88 = KP_Down KP_2 KP_Down KP_2
KEY_KP3 81<KP3> = 89;keycode 89 = KP_Next KP_3 KP_Next KP_3
KEY_KP0 82<KP0> = 90;keycode 90 = KP_Insert KP_0 KP_Insert KP_0
KEY_KPDOT 83<KPDL> = 91;keycode 91 = KP_Delete KP_Decimal KP_Delete KP_Decimal
<LVL3> = 92;keycode 92 = ISO_Level3_Shift NoSymbol ISO_Level3_Shift
KEY_ZENKAKUHANKAKU 85keycode 93 =
KEY_102ND 86<LSGT> = 94;keycode 94 = less greater less greater bar brokenbar bar
KEY_F11 87<FK11> = 95;keycode 95 = F11 F11 F11 F11 F11 F11 XF86Switch_VT_11
KEY_F12 88<FK12> = 96;keycode 96 = F12 F12 F12 F12 F12 F12 XF86Switch_VT_12
KEY_RO 89<AB11> = 97; // backslash/underscorekeycode 97 = backslash underscore backslash underscore
KEY_KATAKANA 90<KATA> = 98; // Katakanakeycode 98 = Katakana NoSymbol Katakana
KEY_HIRAGANA 91<HIRA> = 99; // Hiraganakeycode 99 = Hiragana NoSymbol Hiragana
KEY_HENKAN 92<HENK> = 100; // Henkankeycode 100 = Henkan_Mode NoSymbol Henkan_Mode
KEY_KATAKANAHIRAGANA 93<HKTG> = 101; // Hiragana/Katakana togglekeycode 101 = Hiragana_Katakana Romaji Hiragana_Katakana Romaji
KEY_MUHENKAN 94<MUHE> = 102; // Muhenkankeycode 102 = Muhenkan NoSymbol Muhenkan
KEY_KPJPCOMMA 95<JPCM> = 103; // KPJPCommakeycode 103 =
KEY_KPENTER 96<KPEN> = 104;keycode 104 = KP_Enter NoSymbol KP_Enter
KEY_RIGHTCTRL 97<RCTL> = 105;keycode 105 = Control_R NoSymbol Control_R
KEY_KPSLASH 98<KPDV> = 106;keycode 106 = KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide XF86Ungrab
KEY_SYSRQ 99<PRSC> = 107;keycode 107 = Print Execute Print Execute
KEY_RIGHTALT 100<RALT> = 108;
alias <ALGR> = <RALT>;
keycode 108 = Alt_R Meta_R Alt_R Meta_R
KEY_LINEFEED 101<LNFD> = 109; // #define KEY_LINEFEED 101keycode 109 = Linefeed NoSymbol Linefeed
KEY_HOME 102<HOME> = 110;keycode 110 = Home NoSymbol Home
KEY_UP 103<UP> = 111;keycode 111 = Up NoSymbol Up
KEY_PAGEUP 104<PGUP> = 112;keycode 112 = Prior NoSymbol Prior
KEY_LEFT 105<LEFT> = 113;keycode 113 = Left NoSymbol Left
KEY_RIGHT 106<RGHT> = 114;keycode 114 = Right NoSymbol Right
KEY_END 107<END> = 115;keycode 115 = End NoSymbol End
KEY_DOWN 108<DOWN> = 116;keycode 116 = Down NoSymbol Down
KEY_PAGEDOWN 109<PGDN> = 117;keycode 117 = Next NoSymbol Next
KEY_INSERT 110<INS> = 118;keycode 118 = Insert NoSymbol Insert
KEY_DELETE 111<DELE> = 119;keycode 119 = Delete NoSymbol Delete
KEY_MACRO 112<I120> = 120; // #define KEY_MACRO 112keycode 120 =
KEY_MUTE 113<MUTE> = 121;
alias <I121> = <MUTE>; // #define KEY_MUTE 113
keycode 121 = XF86AudioMute NoSymbol XF86AudioMute
KEY_VOLUMEDOWN 114<VOL-> = 122;
alias <I122> = <VOL->; // #define KEY_VOLUMEDOWN 114
keycode 122 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume
KEY_VOLUMEUP 115<VOL+> = 123;
alias <I123> = <VOL+>; // #define KEY_VOLUMEUP 115
keycode 123 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume
KEY_POWER 116 /* SC System Power Down */<POWR> = 124;
alias <I124> = <POWR>; // #define KEY_POWER 116
keycode 124 = XF86PowerOff NoSymbol XF86PowerOff
KEY_KPEQUAL 117<KPEQ> = 125;
alias <I125> = <KPEQ>; // #define KEY_KPEQUAL 117
keycode 125 = KP_Equal NoSymbol KP_Equal
KEY_KPPLUSMINUS 118<I126> = 126; // #define KEY_KPPLUSMINUS 118keycode 126 = plusminus NoSymbol plusminus
KEY_PAUSE 119<PAUS> = 127;
alias <I127> = <PAUS>; // #define KEY_PAUSE 119
keycode 127 = Pause Break Pause Break
KEY_SCALE 120 /* AL Compiz Scale (Expose) */<I128> = 128; // #define KEY_SCALE 120keycode 128 = XF86LaunchA NoSymbol XF86LaunchA
KEY_KPCOMMA 121<I129> = 129; // #define KEY_KPCOMMA 121
alias <KPPT> = <I129>;
keycode 129 = KP_Decimal KP_Decimal KP_Decimal KP_Decimal
KEY_HANGEUL 122 KEY_HANGUEL KEY_HANGEUL<HNGL> = 130; // Hangul Latin toggle
alias <I130> = <HNGL>; // #define KEY_HANGEUL 122
keycode 130 = Hangul NoSymbol Hangul
KEY_HANJA 123<HJCV> = 131; // Hangul to Hanja conversion
alias <I131> = <HJCV>; // #define KEY_HANJA 123
keycode 131 = Hangul_Hanja NoSymbol Hangul_Hanja
KEY_YEN 124<AE13> = 132; // Yen
alias <I132> = <AE13>; // #define KEY_YEN 124
keycode 132 = backslash bar backslash bar
KEY_LEFTMETA 125<LWIN> = 133;
alias <LMTA> = <LWIN>;
alias <I133> = <LWIN>; // #define KEY_LEFTMETA 125
keycode 133 = Super_L NoSymbol Super_L
KEY_RIGHTMETA 126<RWIN> = 134;
alias <RMTA> = <RWIN>;
alias <I134> = <RWIN>; // #define KEY_RIGHTMETA 126
keycode 134 = Super_R NoSymbol Super_R
KEY_COMPOSE 127<COMP> = 135;
alias <MENU> = <COMP>;
alias <I135> = <COMP>; // #define KEY_COMPOSE 127
keycode 135 = Menu NoSymbol Menu
KEY_STOP 128 /* AC Stop */<STOP> = 136;
alias <I136> = <STOP>; // #define KEY_STOP 128
keycode 136 = Cancel NoSymbol Cancel
KEY_AGAIN 129<AGAI> = 137;
alias <I137> = <AGAI>; // #define KEY_AGAIN 129
keycode 137 = Redo NoSymbol Redo
KEY_PROPS 130 /* AC Properties */<PROP> = 138;
alias <I138> = <PROP>; // #define KEY_PROPS 130
keycode 138 = SunProps NoSymbol SunProps
KEY_UNDO 131 /* AC Undo */<UNDO> = 139;
alias <I139> = <UNDO>; // #define KEY_UNDO 131
keycode 139 = Undo NoSymbol Undo
KEY_FRONT 132<FRNT> = 140;
alias <I140> = <FRNT>; // #define KEY_FRONT 132
keycode 140 = SunFront NoSymbol SunFront
KEY_COPY 133 /* AC Copy */<COPY> = 141;
alias <I141> = <COPY>; // #define KEY_COPY 133
keycode 141 = XF86Copy NoSymbol XF86Copy
KEY_OPEN 134 /* AC Open */<OPEN> = 142;
alias <I142> = <OPEN>; // #define KEY_OPEN 134
keycode 142 = XF86Open NoSymbol XF86Open
KEY_PASTE 135 /* AC Paste */<PAST> = 143;
alias <I143> = <PAST>; // #define KEY_PASTE 135
keycode 143 = XF86Paste NoSymbol XF86Paste
KEY_FIND 136 /* AC Search */<FIND> = 144;
alias <I144> = <FIND>; // #define KEY_FIND 136
keycode 144 = Find NoSymbol Find
KEY_CUT 137 /* AC Cut */<CUT> = 145;
alias <I145> = <CUT>; // #define KEY_CUT 137
keycode 145 = XF86Cut NoSymbol XF86Cut
KEY_HELP 138 /* AL Integrated Help Center */<HELP> = 146;
alias <I146> = <HELP>; // #define KEY_HELP 138
keycode 146 = Help NoSymbol Help
KEY_MENU 139 /* Menu (show menu) */<I147> = 147; // #define KEY_MENU 139keycode 147 = XF86MenuKB NoSymbol XF86MenuKB
KEY_CALC 140 /* AL Calculator */<I148> = 148; // #define KEY_CALC 140keycode 148 = XF86Calculator NoSymbol XF86Calculator
KEY_SETUP 141<I149> = 149; // #define KEY_SETUP 141keycode 149 =
KEY_SLEEP 142 /* SC System Sleep */<I150> = 150; // #define KEY_SLEEP 142keycode 150 = XF86Sleep NoSymbol XF86Sleep
KEY_WAKEUP 143 /* System Wake Up */<I151> = 151; // #define KEY_WAKEUP 143keycode 151 = XF86WakeUp NoSymbol XF86WakeUp
KEY_FILE 144 /* AL Local Machine Browser */<I152> = 152; // #define KEY_FILE 144keycode 152 = XF86Explorer NoSymbol XF86Explorer
KEY_SENDFILE 145<I153> = 153; // #define KEY_SENDFILE 145keycode 153 = XF86Send NoSymbol XF86Send
KEY_DELETEFILE 146<I154> = 154; // #define KEY_DELETEFILE 146keycode 154 =
KEY_XFER 147<I155> = 155; // #define KEY_XFER 147keycode 155 = XF86Xfer NoSymbol XF86Xfer
KEY_PROG1 148<I156> = 156; // #define KEY_PROG1 148keycode 156 = XF86Launch1 NoSymbol XF86Launch1
KEY_PROG2 149<I157> = 157; // #define KEY_PROG2 149keycode 157 = XF86Launch2 NoSymbol XF86Launch2
KEY_WWW 150 /* AL Internet Browser */<I158> = 158; // #define KEY_WWW 150keycode 158 = XF86WWW NoSymbol XF86WWW
KEY_MSDOS 151<I159> = 159; // #define KEY_MSDOS 151keycode 159 = XF86DOS NoSymbol XF86DOS
KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */ KEY_SCREENLOCK KEY_COFFEE<I160> = 160; // #define KEY_COFFEE 152keycode 160 = XF86ScreenSaver NoSymbol XF86ScreenSaver
KEY_ROTATE_DISPLAY 153 /* Display orientation for e.g. tablets */ KEY_DIRECTION KEY_ROTATE_DISPLAY<I161> = 161; // #define KEY_ROTATE_DISPLAY 153keycode 161 = XF86RotateWindows NoSymbol XF86RotateWindows
KEY_CYCLEWINDOWS 154<I162> = 162; // #define KEY_CYCLEWINDOWS 154keycode 162 = XF86TaskPane NoSymbol XF86TaskPane
KEY_MAIL 155<I163> = 163; // #define KEY_MAIL 155keycode 163 = XF86Mail NoSymbol XF86Mail
KEY_BOOKMARKS 156 /* AC Bookmarks */<I164> = 164; // #define KEY_BOOKMARKS 156keycode 164 = XF86Favorites NoSymbol XF86Favorites
KEY_COMPUTER 157<I165> = 165; // #define KEY_COMPUTER 157keycode 165 = XF86MyComputer NoSymbol XF86MyComputer
KEY_BACK 158 /* AC Back */<I166> = 166; // #define KEY_BACK 158keycode 166 = XF86Back NoSymbol XF86Back
KEY_FORWARD 159 /* AC Forward */<I167> = 167; // #define KEY_FORWARD 159keycode 167 = XF86Forward NoSymbol XF86Forward
KEY_CLOSECD 160<I168> = 168; // #define KEY_CLOSECD 160keycode 168 =
KEY_EJECTCD 161<I169> = 169; // #define KEY_EJECTCD 161keycode 169 = XF86Eject NoSymbol XF86Eject
KEY_EJECTCLOSECD 162<I170> = 170; // #define KEY_EJECTCLOSECD 162keycode 170 = XF86Eject NoSymbol XF86Eject
KEY_NEXTSONG 163<I171> = 171; // #define KEY_NEXTSONG 163keycode 171 = XF86AudioNext NoSymbol XF86AudioNext
KEY_PLAYPAUSE 164<I172> = 172; // #define KEY_PLAYPAUSE 164keycode 172 = XF86AudioPlay XF86AudioPause XF86AudioPlay XF86AudioPause
KEY_PREVIOUSSONG 165<I173> = 173; // #define KEY_PREVIOUSSONG 165keycode 173 = XF86AudioPrev NoSymbol XF86AudioPrev
KEY_STOPCD 166<I174> = 174; // #define KEY_STOPCD 166keycode 174 = XF86AudioStop XF86Eject XF86AudioStop XF86Eject
KEY_RECORD 167<I175> = 175; // #define KEY_RECORD 167keycode 175 = XF86AudioRecord NoSymbol XF86AudioRecord
KEY_REWIND 168<I176> = 176; // #define KEY_REWIND 168keycode 176 = XF86AudioRewind NoSymbol XF86AudioRewind
KEY_PHONE 169 /* Media Select Telephone */<I177> = 177; // #define KEY_PHONE 169keycode 177 = XF86Phone NoSymbol XF86Phone
KEY_ISO 170<I178> = 178; // #define KEY_ISO 170keycode 178 =
KEY_CONFIG 171 /* AL Consumer Control Configuration */<I179> = 179; // #define KEY_CONFIG 171keycode 179 = XF86Tools NoSymbol XF86Tools
KEY_HOMEPAGE 172 /* AC Home */<I180> = 180; // #define KEY_HOMEPAGE 172keycode 180 = XF86HomePage NoSymbol XF86HomePage
KEY_REFRESH 173 /* AC Refresh */<I181> = 181; // #define KEY_REFRESH 173keycode 181 = XF86Reload NoSymbol XF86Reload
KEY_EXIT 174 /* AC Exit */<I182> = 182; // #define KEY_EXIT 174keycode 182 = XF86Close NoSymbol XF86Close
KEY_MOVE 175<I183> = 183; // #define KEY_MOVE 175keycode 183 =
KEY_EDIT 176<I184> = 184; // #define KEY_EDIT 176keycode 184 =
KEY_SCROLLUP 177<I185> = 185; // #define KEY_SCROLLUP 177keycode 185 = XF86ScrollUp NoSymbol XF86ScrollUp
KEY_SCROLLDOWN 178<I186> = 186; // #define KEY_SCROLLDOWN 178keycode 186 = XF86ScrollDown NoSymbol XF86ScrollDown
KEY_KPLEFTPAREN 179<I187> = 187; // #define KEY_KPLEFTPAREN 179keycode 187 = parenleft NoSymbol parenleft
KEY_KPRIGHTPAREN 180<I188> = 188; // #define KEY_KPRIGHTPAREN 180keycode 188 = parenright NoSymbol parenright
KEY_NEW 181 /* AC New */<I189> = 189; // #define KEY_NEW 181keycode 189 = XF86New NoSymbol XF86New
KEY_REDO 182 /* AC Redo/Repeat */<I190> = 190; // #define KEY_REDO 182keycode 190 = Redo NoSymbol Redo
KEY_F13 183<FK13> = 191;
alias <I191> = <FK13>; // #define KEY_F13 183
keycode 191 = XF86Tools NoSymbol XF86Tools
KEY_F14 184<FK14> = 192;
alias <I192> = <FK14>; // #define KEY_F14 184
keycode 192 = XF86Launch5 NoSymbol XF86Launch5
KEY_F15 185<FK15> = 193;
alias <I193> = <FK15>; // #define KEY_F15 185
keycode 193 = XF86Launch6 NoSymbol XF86Launch6
KEY_F16 186<FK16> = 194;
alias <I194> = <FK16>; // #define KEY_F16 186
keycode 194 = XF86Launch7 NoSymbol XF86Launch7
KEY_F17 187<FK17> = 195;
alias <I195> = <FK17>; // #define KEY_F17 187
keycode 195 = XF86Launch8 NoSymbol XF86Launch8
KEY_F18 188<FK18> = 196;
alias <I196> = <FK18>; // #define KEY_F18 188
keycode 196 = XF86Launch9 NoSymbol XF86Launch9
KEY_F19 189<FK19> = 197;
alias <I197> = <FK19>; // #define KEY_F19 189
keycode 197 =
KEY_F20 190<FK20> = 198;
alias <I198> = <FK20>; // #define KEY_F20 190
keycode 198 = XF86AudioMicMute NoSymbol XF86AudioMicMute
KEY_F21 191<FK21> = 199;
alias <I199> = <FK21>; // #define KEY_F21 191
keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle
KEY_F22 192<FK22> = 200;
alias <I200> = <FK22>; // #define KEY_F22 192
keycode 200 = XF86TouchpadOn NoSymbol XF86TouchpadOn
KEY_F23 193<FK23> = 201;
alias <I201> = <FK23>; // #define KEY_F23 193
keycode 201 = XF86TouchpadOff NoSymbol XF86TouchpadOff
KEY_F24 194<FK24> = 202;
alias <I202> = <FK24>; // #define KEY_F24 194
keycode 202 =
<LVL5> = 203;
alias <MDSW> = <LVL5>;
keycode 203 = ISO_Level5_Shift NoSymbol ISO_Level5_Shift
<ALT> = 204;keycode 204 = NoSymbol Alt_L NoSymbol Alt_L
<META> = 205;keycode 205 = NoSymbol Meta_L NoSymbol Meta_L
<SUPR> = 206;keycode 206 = NoSymbol Super_L NoSymbol Super_L
<HYPR> = 207;keycode 207 = NoSymbol Hyper_L NoSymbol Hyper_L
KEY_PLAYCD 200<I208> = 208; // #define KEY_PLAYCD 200keycode 208 = XF86AudioPlay NoSymbol XF86AudioPlay
KEY_PAUSECD 201<I209> = 209; // #define KEY_PAUSECD 201keycode 209 = XF86AudioPause NoSymbol XF86AudioPause
KEY_PROG3 202<I210> = 210; // #define KEY_PROG3 202keycode 210 = XF86Launch3 NoSymbol XF86Launch3
KEY_PROG4 203<I211> = 211; // #define KEY_PROG4 203keycode 211 = XF86Launch4 NoSymbol XF86Launch4
KEY_ALL_APPLICATIONS 204 /* AC Desktop Show All Applications */ KEY_DASHBOARD KEY_ALL_APPLICATIONS<I212> = 212; // #define KEY_DASHBOARD 204keycode 212 = XF86LaunchB NoSymbol XF86LaunchB
KEY_SUSPEND 205<I213> = 213; // #define KEY_SUSPEND 205keycode 213 = XF86Suspend NoSymbol XF86Suspend
KEY_CLOSE 206 /* AC Close */<I214> = 214; // #define KEY_CLOSE 206keycode 214 = XF86Close NoSymbol XF86Close
KEY_PLAY 207<I215> = 215; // #define KEY_PLAY 207keycode 215 = XF86AudioPlay NoSymbol XF86AudioPlay
KEY_FASTFORWARD 208<I216> = 216; // #define KEY_FASTFORWARD 208keycode 216 = XF86AudioForward NoSymbol XF86AudioForward
KEY_BASSBOOST 209<I217> = 217; // #define KEY_BASSBOOST 209keycode 217 =
KEY_PRINT 210 /* AC Print */<I218> = 218; // #define KEY_PRINT 210keycode 218 = Print NoSymbol Print
KEY_HP 211<I219> = 219; // #define KEY_HP 211keycode 219 =
KEY_CAMERA 212<I220> = 220; // #define KEY_CAMERA 212keycode 220 = XF86WebCam NoSymbol XF86WebCam
KEY_SOUND 213<I221> = 221; // #define KEY_SOUND 213keycode 221 = XF86AudioPreset NoSymbol XF86AudioPreset
KEY_QUESTION 214<I222> = 222; // #define KEY_QUESTION 214keycode 222 =
KEY_EMAIL 215<I223> = 223; // #define KEY_EMAIL 215keycode 223 = XF86Mail NoSymbol XF86Mail
KEY_CHAT 216<I224> = 224; // #define KEY_CHAT 216keycode 224 = XF86Messenger NoSymbol XF86Messenger
KEY_SEARCH 217<I225> = 225; // #define KEY_SEARCH 217keycode 225 = XF86Search NoSymbol XF86Search
KEY_CONNECT 218<I226> = 226; // #define KEY_CONNECT 218keycode 226 = XF86Go NoSymbol XF86Go
KEY_FINANCE 219 /* AL Checkbook/Finance */<I227> = 227; // #define KEY_FINANCE 219keycode 227 = XF86Finance NoSymbol XF86Finance
KEY_SPORT 220<I228> = 228; // #define KEY_SPORT 220keycode 228 = XF86Game NoSymbol XF86Game
KEY_SHOP 221<I229> = 229; // #define KEY_SHOP 221keycode 229 = XF86Shop NoSymbol XF86Shop
KEY_ALTERASE 222<I230> = 230; // #define KEY_ALTERASE 222keycode 230 =
KEY_CANCEL 223 /* AC Cancel */<I231> = 231; // #define KEY_CANCEL 223keycode 231 = Cancel NoSymbol Cancel
KEY_BRIGHTNESSDOWN 224<I232> = 232; // #define KEY_BRIGHTNESSDOWN 224keycode 232 = XF86MonBrightnessDown NoSymbol XF86MonBrightnessDown
KEY_BRIGHTNESSUP 225<I233> = 233; // #define KEY_BRIGHTNESSUP 225keycode 233 = XF86MonBrightnessUp NoSymbol XF86MonBrightnessUp
KEY_MEDIA 226<I234> = 234; // #define KEY_MEDIA 226keycode 234 = XF86AudioMedia NoSymbol XF86AudioMedia
KEY_SWITCHVIDEOMODE 227 /* Cycle between available video outputs (Monitor/LCD/TV-out/etc) */<I235> = 235; // #define KEY_SWITCHVIDEOMODE 227keycode 235 = XF86Display NoSymbol XF86Display
KEY_KBDILLUMTOGGLE 228<I236> = 236; // #define KEY_KBDILLUMTOGGLE 228keycode 236 = XF86KbdLightOnOff NoSymbol XF86KbdLightOnOff
KEY_KBDILLUMDOWN 229<I237> = 237; // #define KEY_KBDILLUMDOWN 229keycode 237 = XF86KbdBrightnessDown NoSymbol XF86KbdBrightnessDown
KEY_KBDILLUMUP 230<I238> = 238; // #define KEY_KBDILLUMUP 230keycode 238 = XF86KbdBrightnessUp NoSymbol XF86KbdBrightnessUp
KEY_SEND 231 /* AC Send */<I239> = 239; // #define KEY_SEND 231keycode 239 = XF86Send NoSymbol XF86Send
KEY_REPLY 232 /* AC Reply */<I240> = 240; // #define KEY_REPLY 232keycode 240 = XF86Reply NoSymbol XF86Reply
KEY_FORWARDMAIL 233 /* AC Forward Msg */<I241> = 241; // #define KEY_FORWARDMAIL 233keycode 241 = XF86MailForward NoSymbol XF86MailForward
KEY_SAVE 234 /* AC Save */<I242> = 242; // #define KEY_SAVE 234keycode 242 = XF86Save NoSymbol XF86Save
KEY_DOCUMENTS 235<I243> = 243; // #define KEY_DOCUMENTS 235
alias <OUTP> = <I235>;
keycode 243 = XF86Documents NoSymbol XF86Documents
KEY_BATTERY 236<I244> = 244; // #define KEY_BATTERY 236
alias <KITG> = <I236>;
keycode 244 = XF86Battery NoSymbol XF86Battery
KEY_BLUETOOTH 237<I245> = 245; // #define KEY_BLUETOOTH 237
alias <KIDN> = <I237>;
keycode 245 = XF86Bluetooth NoSymbol XF86Bluetooth
KEY_WLAN 238<I246> = 246; // #define KEY_WLAN 238
alias <KIUP> = <I238>;
keycode 246 = XF86WLAN NoSymbol XF86WLAN
KEY_UWB 239<I247> = 247; // #define KEY_UWB 239keycode 247 = XF86UWB NoSymbol XF86UWB
KEY_UNKNOWN 240<I248> = 248; // #define KEY_UNKNOWN 240keycode 248 =
KEY_VIDEO_NEXT 241 /* drive next video source */<I249> = 249; // #define KEY_VIDEO_NEXT 241keycode 249 = XF86Next_VMode NoSymbol XF86Next_VMode
KEY_VIDEO_PREV 242 /* drive previous video source */<I250> = 250; // #define KEY_VIDEO_PREV 242keycode 250 = XF86Prev_VMode NoSymbol XF86Prev_VMode
KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */<I251> = 251; // #define KEY_BRIGHTNESS_CYCLE 243keycode 251 = XF86MonBrightnessCycle NoSymbol XF86MonBrightnessCycle
KEY_BRIGHTNESS_AUTO 244 /* Set Auto Brightness: manual brightness control is off, rely on ambient */ KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO<I252> = 252; // #define KEY_BRIGHTNESS_AUTO 244keycode 252 = XF86BrightnessAuto NoSymbol XF86BrightnessAuto
KEY_DISPLAY_OFF 245 /* display device to off state */<I253> = 253; // #define KEY_DISPLAY_OFF 245keycode 253 = XF86DisplayOff NoSymbol XF86DisplayOff
KEY_WWAN 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */ KEY_WIMAX KEY_WWAN<I254> = 254; // #define KEY_WWAN 246keycode 254 = XF86WWAN NoSymbol XF86WWAN
KEY_RFKILL 247 /* Key that controls all radios */<I255> = 255; // #define KEY_RFKILL 247keycode 255 = XF86RFKill NoSymbol XF86RFKill
KEY_MICMUTE 248 /* Mute / unmute the microphone */<I256> = 256; // #define KEY_MICMUTE 248

あー作業大変だった。

xkbで使う謎の4文字(以下のものアリ)がどのキーのことを指しているのかこの表でだいたい分かるんじゃないでしょうか。
また、全てが載っているわけではありませんが、xkbに書くkeysymは軽く調べたところ、「/usr/include/X11/keysymdef.h」に定義されている文言から先頭の「XK_」を省いたものが使える模様です。

一方で筆者のやりたいこと、すなわち、一つのキーをレイアウト変更キーにして、レイアウト変更キーを押下したときのカーソル移動関連キーを登録する、というところはナント!
ArchLinuxのドキュメント『X keyboard extension - Level3』のところにほぼそっくりそのまま記載されていました。

ただですねぇ、この「ほぼそっくり」って言うと99%みたいな印象を受けてしまいますが、技術関係の99%って=そのままじゃダメ⇒ダメなところを探して対処しないと結局ダメ、なので99%なんてとんでもなくて実質せいぜい25%とかそんなもんです。

似て非なる文言の紛らわしさ、書いている人が「こんなん当たり前だろう」or「これはこのドキュメントの範囲を逸脱してるし」で除外される情報に大きな意味が隠されていたりして、結局はその周辺を全部洗って精査しないと使えるものにならない。(いつもそう)

このドキュメントで紛らわしいのやはり「Mod5」と「LevelThree」ですよね。
それに、仮にこの辺をきっちりしたとしても既存の設定とも噛み合いで上手く動かなかったりして、また原因追求の繰り返しです。
確かにほぼそのままなのに、1点繋がらないところがあるだけで全く動かないですからね。
本当に疲れた。

最初はxmodmapのときと同じノリで[F24]キーをレイアウト変更キーにしようかと思っていたのですが、どうにも思ったように動いてくれなくて、xevとかで確認してもKeySymが0x00 NoSymbolになってしまって全く効いていません。
ちょっと色々と調べて頭こんがらがって、もう当初の理由を忘れてしまいましたが、結果的に[F24]キーは使わないことにして[LVL3]キーという「// Fake keycodes for virtual keys」とコメントされている本来存在しない架空のキーを割り当てることにしました。
架空のキーなのでEventcodeの方に定義が無かったのですが、コード値をダイレクトに記述したらそれでもOKだったようなので、これを採用しました。
[LVL3]キーは架空キーなので既存の設定が存在しておらず、そのため既存の設定に邪魔されることが無かったので思いの動きがそのまま実現出来たのだと思います。

しかし、問題はそれだけに留まりません。
カーソルキーは範囲選択や単語送り等で[Ctrl][Shift][Alt]と同時に使用することが多々あるのですが、どうも[Alt][Shift]を絡めると筆者が設定していない全く別のキーが入力されてしまいます。
既存の設定が邪魔しているようなので、それも潰すように変更を加えます。

そうして、ようやくそれなりにまともに動いた設定がこちら。

partial modifier_keys
xkb_symbols "gihi" {
	key <LALT> { [ Alt_L, Alt_L ] };
	key <LVL3> { [ISO_Level3_Shift ] };
	modifier_map Mod5 { ISO_Level3_Shift };
	key.type = "THREE_LEVEL";
	key <AD07> { [ u, U, Left ] };
	key <AD08> { [ i, I, Right ] };
	key <AD09> { [ o, O, Up ] };
	key <AD10> { [ p, P, Down ] };
	key <AC07> { [ j, J, Left ] };
	key <AC08> { [ k, K, End ] };
	key <AC09> { [ l, L, Prior ] };
	key <AC10> { [ semicolon, plus, Down ] };
	key <AB07> { [ m, M, Home ] };
	key <AB08> { [ comma, less, End ] };
	key <AB09> { [ period, greater, Prior ] };
	key <AB10> { [ slash, question, Next ] };
	key <HOME> { [ Home, Home, Right ] };
	key   <UP> { [ Up, Up, Prior ] };
	key <PGUP> { [ Prior, Prior, Up ] };
	key <LEFT> { [ Left, Left, Home ] };
	key <RGHT> { [ Right, Right, End ] };
	key  <END> { [ End, End, Right ] };
	key <DOWN> { [ Down, Down, Next ] };
};

"gihi"というのは筆者が勝手に付けた名前ですので気にしないでください。
この設定を既存にプラスして読み込ませることでまあ、当初やりたかったことは実現はできました。
なお今回、[U,.P]にもカーソル関連キーを追加定義しており、またカーソルキーを[Home][End][PgUp][PgDn]に、[Home][End][PgUp][PgDn]をカーソル移動キーに切り替えられるように定義しています。
これらはどこを使っても良いという利便性向上のための重複定義です。

<LALT>キーを再定義しているのが既存設定の邪魔が原因でして、これをしないと[Alt][Shift]押下時に[Meta]キーが発動してしまって[O][L]がカーソルキーではなく[Alt_L]入力になってしまったり、[;]もなんかのボタン押下か分からん変なイベントが発生するようになってしまっていました。
なので、[Shift]押しても変わらず[Alt_L]として働け、と念押ししています。

んでudevのhwdbの方に、

KEYBOARD_KEY_7008a=84	#変換

84ってのが架空のキー[LVL3]のEventcodeです。xmodmapやxkbでは+8されて92ね。

インプレッション

これだけやってもダメなもんはダメでして、xmodmapのときよりかは若干マシな挙動をしていますが、相変わらずWine上のアプリにもVirtualBOXでも全く効かず、Kateでは単独カーソル操作こそ出来るようになったものの[Ctrl][Shift][Alt]を絡めるとKateのショートカットの方が発動してしまって「キーシーケンス Ctrl+J はあいまいです。「設定」から「キーボードショートカットの設定」メニューを選び、解決してください。アクションは設定されません。」などと怒られてしまいます。
xevで見ている限りは完全にコンフィグ出来ていそうなんですけどね。

とにかくちゃんと動いてくれるアプリが少な過ぎてとてもじゃないがこれをメインで使って行こうとはとても思えませんね。
誰だ、過去記事『Xubuntuのキーボード設定をお勉強』で『最近は高級キーボードなんかでキーコンフィグを自在に設定出来て、[Fn]キーを押したときに全く異なるレイアウト定義も出来るなんていう製品が増えて来ましたが、Linux上の設定で似たようなことが実現できるわけです。』とかのたもうてたやつは!
実用に足らんぞぃ!

残念ながらxmodmapもxkbも限定的なキーコンフィグしか出来なくて(筆者のスキル不足の可能性もまだ残ってはいます)使い物になりませんでしたが、udevのhwdbコンフィグだけがガチで使えますので、こちらでどうにかできるところだけをコンフィグする方向に軌道修正しようかと思います。

骨折り損のくたびれ儲け。
それでも、Windowsに戻りたいとは1mmも思いませんが。

2024-02-13

この記事のタグ

PC

Linux/BSD

トライ