2016-06-09

XKB で遊んでみよう (2)

xkb_keymap

xkb_keymap エントリーは、xkb で使われる設定一式です。中身は
  • xkb_keycodes
  • xkb_types
  • xkb_compat
  • xkb_symbols
の各エントリーからなります。おまけとして
  • xkb_geometry
というエントリーも存在しますが、単に各種設定ツールでキーボードの絵を表示するのに必要な情報が入ってるだけなので、キーマップをいじるという観点ではガン無視でオッケーです。

xkb_keycodes

デバイスから受け取ったスキャンコードに抽象的な名前、シンボル名を与えるための設定です。他のところの設定において、スキャンコードではなくここで設定されたシンボル名を使うことで、「Ctrl と Caps を入れ替える場合、US キーボードではスキャンコード 11 を Caps に、JP106キーボードの場合はスキャンコード 22 を Capsに」といった、キーボードとオプション設定の組み合わせ全てでスキャンコードを列挙する必要がなくなります。

ただし、抽象化の目的によって大きく分けて2種類のシンボル名が用意されています。一つは物理的な位置に基づくものです。最下段のキーは左から順に <AA00>, <AA01>, ... (ただし、最下段は特殊キーしかないのが普通なので、<AA00> 以外が使われることは稀)、下から2段目は <AB00> (左Shiftキーの位置), <AB01>, ... となっていきます。

もう一つは機能に基づくもので、<HKTG> (Hiragana-Katakana ToGgle) や <TLDE> (tilde) みたいなものがあります。ただし、あくまでもスキャンコードにシンボル名を与えるだけなので、<TLDE> が実際に ~ である必要はありません。というか、わざとややこしい例を出したのですが、<TLDE> は手前から5段目の右端のキー(US キーボードなら ~ キーがある位置)という、位置にあるキーのためのくシンボル名です。ややこしい。そういう意味であれば、単純に <AE00> にしとけと思うんですけどね。

日本語キーボードは、1 の隣は「半角/全角キー」なので、実際の設定ファイルからその当たりを抜き出すと
<TLDE> =  49;
alias <AE00> = <TLDE>;      // Some geometries use AE00
alias <HZTG> = <TLDE>;      // Hankaku_Zenkaku toggle
と書いてあると思います。

もう眠いので、続きはまた明日(以降のいつか)です。

2016-06-08

XKB で遊んでみよう (1)

元ネタは私の G+ポスト です。

Emacs を使ってるとどうしても小指が痛い。解決方法として

  1. Emacsを使わない
  2. 指の付け根でCtrlキーを押す
  3. フットペダルを使う
などが挙げられますが、
  1. Emacs以外は考えられない体にされてしまっている。
  2. 試してみてはいるけれど、ちょっとまだ慣れない
  3. あまり一般的でないハードウェアには依存したくない
などの理由により、X11 上でキーマップをゴニョゴニョしてなんとかしのげないかと考えるに至りました。

で、X11 上でキーマップをゴニョゴニョするといえば大昔は xmodmap 一択だったのですが、近年では XKB を使うのが一般的ではないかと思います。Fedora でモニョモニョしてた頃、とりあえずあら探しした記憶があるのですが、さすがに10年も触らないと忘れてしまいます。あと、個人的に X11 と djb の書いたコードは読まないことにしているので、こんなん書いている割に理解は浅いです。

XKB 使ってユーザーがキーマップをいじる場合、基本的に使うのは xkbcomp コマンドです。setxkbmap は xkbcomp の簡易ラッパーコマンドという認識でいいと思います。

setxkbmap, xkbcomp などで色々と検索すると何やら出てきますが、とりあえず「無変換」キーを Control キーとして (US キーボードで) 使うには

xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   {
                include "pc+us+inet(evdev)"
                key <MUHE> { [Control_L] };
                modifier_map Control { 
<MUHE> };
        };
        xkb_geometry  { include "pc(pc105)"     };
};

こんな感じのファイルを用意して xkbcomp FILE $DISPLAY 2>/dev/null を実行すれば OK です。setxkbmap -print で得られた結果に太字の部分を足しただけです。

この設定ファイルに複数設定を加えるて xkbcomp -m でそれを切り替えることにより、色んな設定を試せるのですが、細かいこと書くのは面倒になってきたので、次に続く(かどうか分かりません)

prometheusのrate()関数の罠

 久しぶりのAdventカレンダー挑戦、うまくいく気がしません。 閑話休題。実のところ、rate()関数というよりは、サーバー側のmetric初期化問題です。 さて、何らかのサーバーAがあったとして、それが更に他のサーバーBにRPCを送っているとします。サーバーBの方でホワイトボ...