ゲストOSで「|」が入力できない〜「|」を別のキーに割り当てるの巻
ゲストOSにて、「|」が入力できない状況に遭遇。これだとパイプが使えないので、結構イタイ。
# loadkeys jp106
# dpkg-reconfigure keyboard-configuration
# service keyboard-setup restart
# dpkg-reconfigure locales
$ localectl set-keymap --no-convert jp106
いろいろ試したものの、効果あがらず。
おっかしぃーなぁと思っていたら、qemu 2.8 のバグらしい話をネットのどこかで見かけ、最新のqemuで試したら、「|」の入力ができますた。
ということで、最新のqemuを入れましょう・・・とすると、ネタが終わってしまうので、今回は『ゲストOS側で無理やり対処しましょう』という話。需要があるか、わかりませんが。
方針として、「|」のキーは完全に死んでる感じなので、別のキーに無理やり「|」を割り当ててしまう感じ。
題して、
【ゲストOSにて「|」を別のキーに割り当てる!】の巻
【第一関門】どのキーに割り当てるか? ・・・「チルダ」がダブっているでござる
通常、チルダ(~)は「Shift + ^」と打って入力する。
ところが、「Shift + 0」でも出たりする。
我ながら見つけて驚いたのだが、昔はここに「~」が印字されていた模様。
・http://www.kt.rim.or.jp/~aotaka/faq/win179.htm
とりあえず、どちらかに「|」を割り当てよう。
どっちにしようかなぁ、と思いつつ、「本来のキーから遠いところ」よりは「近い方」でいいかな、と思い、「~」キーに「|」を割り当てることとする。
【第ニ関門】キーマップテーブルはどうなってる? ・・・「xmodmap」で調べるで
とりあえず、ゲストOS上で、
$ xmodmap -pke
と、入力すると、keycodeとkeysymの対応表が表示される。
意味は次のようになる。
例えば「keycode 28」は「t T t T」がマッピングされている。
これは「keycode 28」に対応する物理的なキーが入力された場合、「t T t T」が出力される形となる。ちなみに、
「keycode 28」に対応する物理的なキーのみ → t
「keycode 28」に対応する物理的なキー +「shift」 → T
「keycode 28」に対応する物理的なキー +「mode_switch」 → t
「keycode 28」に対応する物理的なキー +「shift」+「mode_switch」 → T
といった感じで出力される。
「mode_switch」ってなんやねんという感じだが、どうも海外仕様っぽい。
とりあえず無視。
細かな話は、『Arch Linux : xmodmap:キーマップテーブル』が参考になるかと。
で、keycode の何番が物理的な「^」キーなのかだが、上表から推測するのもよいが、「xev」で調べることが可能だ。
【第三関門】「^」のkeycodeを調べるで ・・・「xev」
ゲストOSの端末にて、
$ xev
で、下図の赤丸にある黒枠のあたりを狙ってクリックし、キーを打ったりすると、そのウィンドウに渡されるイベントがピンク枠のところにえらい速さで出力される。
で、「^」キーの結果は、どうやら「keycode = 21」の模様。
ちなみに、
$ xev | grep keycode
でやると、非常に見やすかったりする。
そう、パイプが使えたらネ・・・
【第四関門】割当てテスト
「^」のkeycodeがわかったので、変更テスト。
ゲストOSの端末にて、
$ xmodmap -pke > ./.Xmodmap
で、現在にキーマップを「~/.Xmodmap」に作成。
ちなみにこのファイル名は任意。別に「.Xmodmap」でなくとも良い。
ただし、「.bash_history」とかシステムが作るファイルとバッティングしないように。
で、このファイルを編集。
keycode 21 = asciicircum asciitilde asciicircum asciitilde
↓
keycode 21 = asciicircum bar asciicircum asciitilde
で、このファイルを読み込む。
$ xmodmap ./.Xmodmap
成功すれば「Shift + ^」で、めでたく「|」が入力できるようになっている。
【最終関門】設定恒久化
ゲストOSを再起動させると、設定が戻ってしまう。
毎回、
$ xmodmap ./.Xmodmap
とするのは面倒なので、「.profile」にこれを書き込むことにする。
こういうやり方が正しいかはわからないが、これでゲストOSを再起動させても常に有効になる。
ちなみに、デストリによっては、「.profile」でない方が良い場合があるかも。
詳しくは
・bashの便利な機能を使いこなそう (2/2):bashの設定ファイル
で設定ファイルの優先順位を確認すると良さげ。参考になるかと。
また、「.bashrc」に書き込んだ場合、「bash」を一度起動させないと有効にならないので、おすすめはしない。
パイプの使用だけなら問題ないかもしれないけれども。
(終)
【外部サイト】
キーマップ関連
・Debian wiki:Keyboard configuration
・Debian wiki:ChangeLanguage
・Arch Linux :コンソールでのキーボード設定
・Xmodmap でお好みのキーバインド
.bashrc関連
・ユーザー追加時の標準シェル設定をあらかじめ定義したい:/etc/skel/
キーボード関連
・ カスタムキーマップで自作キーボードを自分の分身とする