ill-identified diary

所属組織の業務や見解とは一切無関係なアフィリエイト付きメモ帳。所属とは関係ないけどここを見て所属先にも興味を持っていただけると喜びます。

[xkb] Ubuntu 14.04 で Caps Lock を別のキーにする方法

概要

ubuntu 14.04 で xkb の設定を変えて

  • Caps Lock を 好きなキーに変える方法
  • 無変換キーをエスケープキーにする方法
  • 他のキーの機能も変更できるようにするヒント

を紹介します.

前置き

Caps Lock は使う機会の少ないキーなのに, なぜか市販の大抵のキーボードではデカく, 邪魔になる. そこで, 逆によく使うキーに置き換えてしまえばはかどる.

自分はこれまで xmodmap でキーバインドを変えてきたが, Ubuntu14.04 にしてからうまく動かなくなったので, 調べてみたところ, xkbでキーバインドを変更すると, そこで紹介されていたUse setxkbmap to swap the Left Shift and Left Controlで xkb の設定を変える方法が書かれていたので, それを参考に設定した.

xkb には, Caps LockctrlEsc置き換えるオプションが存在しており, これは設定ファイルを作成する必要もなく, ターミナルで1行コマンド打つだけでできる (本来の ctrl, Esc キーもそのまま使える). EmacsVim 使ってる人はこれだけでいい. このオプションについてはググればいくつも記事が見つかるのでここでは書かない. 自分は Vim を使っているが, エスケープと同じくらいよく使うキーがある. それはバックスラッシュ ( \ ) だ. TeX で頻繁に使うにも関わらず, 市販のキーボードではバックスラッシュが隅に追いやられている上に小さく, ミスタッチが多くなる. そこで, 今回は CapsLock をバックスラッシュに置き換える方法を紹介する. また, 自分のノートPCでは, エスケープキーが小さいので, ついでにやはり使わない無変換キーと半角/全角キー*1にエスケープキーを割り当てることにした.

xkb の構造

変更方法だけ知りたい人はここは飛ばしていいです.

xkb の設定は階層構造になっていて,

  1. geometry で物理キーボードの規格を指定する. 例えば英字キーボードと日本語用キーボードはキーの物理的な位置や数が違うので, ここで指定しなければならない. 正しく指定することで, キーコードを取得できる. 大抵の場合, ここをいじる必要はあまりない.
  2. type ではキー配置のレベルグループ を定義する.
    • レベルとは, 修飾キーの押下状態で1つのキーに複数の機能をもたせるための設定である. つまり, キーのレベル1には, 通常の入力 (例えば “a” ) を与え, レベル2 には Shift キー押下状態での機能を与える ( レベル1が “a” なら “A”). レベルは2より多く設定できるが, たいていは Shiftキーで判定するだけの2レベル.
    • グループとは,キーボード全体の配置を入れ替えるための設定. つまり, 英数入力と日本語入力の切り替えのことである. 普通の人は英数も日本語入力も同じキーボードでやってるはずだが, 同じキーでも違う入力になる (実際には日本語入力だとIMEを経由するので, グループの説明としては厳密には違う?). グループは 8個まで設定できる.
  3. compat で type に対応するキーマップを設定する.
  4. keycodes で, キーコードとキーシンボルの対応関係を設定する. キーコードは物理キーボードのキーに割り当てられた 1~3桁の数字. キーシンボルはそれに分かりやすい名称を与えたもの.
  5. symbols で, キーシンボルに 「a/A を入力する」「shift キーの機能をもたせる」といった役割を割り当てる.

という順に設定される. Caps Lock ctrl 等に置き換えるオプションは, 5に上書きされるイメージになる. 今回変更するのは, 5の symbols である.

参考: An Unreliable Guide to XKB Configuration

方法

ほとんどxkbでキーバインドを変更する と同じだが,

myswaps の内容は以下のようになる.

partial alphanumeric_keys
xkb_symbols "CAPSBSlash" {
    key <CAPS> { [ backslash, underscore ] };
};
partial alphanumeric_keys
xkb_symbols "HZTGMUHEtoESC" {
    key <HZTG> { [ Escape ] };
    key <MUHE> { [ Escape ] }; 
};

Caps Lock にバックスラッシュを割り当てるヴァリアントと, 半角全角/無変換, 無変換キーにエスケープを割り当てるヴァリアントを分けている. また, あまり重要でないが, key <CAPS> { [ backslash, undescore ] }; と書いているので本来のバックスラッシュキー同様, シフトキーを押すとアンダースコア(アンダーバー)が入力される.

mypad ファイルも, これを読み込むために以下のように書く.

xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)"  };
    xkb_types     { include "complete"   };
    xkb_compat    { include "complete"   };
    xkb_symbols   { include "pc+jp+inet(evdev)+myswaps(CAPSBSlash)+myswaps(HZTGMUHEtoESC)"};
    xkb_geometry  { include "pc(pc104)"  };
};

ただし, これはPCによって異なる可能性があるので, 必ず自分のPCの設定をコピーして, +myswaps(CAPSBSlash)+myswaps(HZTGMUHEtoESC)の部分だけ書き換えること.

最後に

xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 2> /dev/null

とターミナルに打ち込んで設定反映. 警告が大量に出るのでエラーメッセージは /dev/null に送っている. ログインのたびに設定が読み込まれるため, ~/.bashrc の最後にでも xkbcomp … を書き込めばよい.

2015/6/17 追記: .bashrc が読み込まれるのは bash が呼び出された時, つまりターミナルを開いた時点なので, Ubuntu ではログインした時点では反映されない. 起動するたびターミナルをすぐ開くような使い方なら問題ないが, GUI の充実している Ubuntu でそんな使い方をする人は少ないと思うので, .bashrc に使うのは悪手だった. そこで,

#! bin/sh
xkbcomp -I$HOME/.xkb $HOME/.xkb/keymap/mypad $DISPLAY 2>/dev/null

のような内容の .sh ファイルを作成して (chmod を忘れずに), PATH の通る適当なディレクトリに置いて, 「自動起動するアプリケーション」(gnome-session-properties) にこの hogehoge.sh を登録しておく方法が良い

キーコード, キーシンボルの探し方

ここも変更方法だけを知りたいなら不要です

ここでは, 応用のきくように, 他のキーも変更できる方法を紹介する. 基本的には, 上のやり方と同様にキーシンボルがわかればいいので, まずターミナルで

xev

を使い, キーコードを調べる. キーコードは 1~3桁の数字である. ここで表示される keysym とかは使わないので注意.

次に, キーシンボルを調べる. 現在の xkb の設定を知るには,

setxkbmap -print

を使用する.

xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete+japan"    };
    xkb_symbols   { include "pc+jp+inet(evdev)" };
    xkb_geometry  { include "pc(pc104)" };
};

のような出力が表示される.

xkb_keycodes に読み込まれたキーコード設定ファイルが書かれている. ファイルは evdev, aliases である. それぞれ, /usr/share/X11/xkb/keycodes/ 以下に存在するファイルである. aliases(qwerty) というのは, aliases ファイルのqwertyというヴァリアントを読み込むという意味である. よって, evdev ファイルと, aliases ファイルの

xkb_keycodes "qwerty" {
    ...;
    ...;
};

の箇所をキーコードで検索すれば, キーシンボルが分かる. ただし, aliases ファイルはキーシンボルのエイリアスを設定しているだけなので, 今回は evdev ファイルだけ見ればいい. キーシンボルは, <AB00> のような4文字の英数である.

次に, キーシンボル設定ファイルを確認する. xkb_symbols に対応するファイルは, 自分の場合, pc, jp inet(endev) だった. pc には基本的なキーシンボルの設定が, jp には日本語入力用のキーシンボル配置が書かれていた. inet にはマルチメディアファイルの再生停止, 音量調整キーの設定が書かれていた. 複数のファイルが読み込まれていることから分かるように, 設定を上書きできるので, 今回の例ではさらにもう1つ設定ファイルを作成してこのリストに追加した. あるいは, これを~/.xkb 以下にそのままコピーして, 書き換えた上で, xkbcomp した方が楽かもしれない. この手順は

xmodmap と setxkbmap。

が参考になったが, この筆者がやっているように, /usr/shre/x11/xkb のファイルを直接書き換えるのはおすすめしない. この記事の筆者のように, キーボードの設定に問題がある場合はやむを得ないかもしれないが, この設定ファイルを誤って設定するとキーボードがまともに入力できず, ログインができなくなることがあるのだ. ホームディレクトリに個人設定ファイルを入れておく方法を推奨する.

実際自分もそういうミスをやらかしてログインできなくなったのだが, 解決方法はある.

xkb は X window 上で動くものが対象なので, X なしでログインすればxkbの影響なしに作業できる: Ubuntu をリカバリーモードで起動し, ディスクの書き込み許可をした上で, 設定ファイルを元に戻せばいい. もちろんバックアップをとっておかないとこれも出来ないので, やはり直接書き換えるのは理由がない限り避けたほうが良い.

その他, ctrlやEscとCaps Lock を置き換えるだけなら, オプションで提供されているので, dconf-editor を使えるかもしれない. (How to permanently switch Caps Lock and Esc)

参考文献

*1:自分はctrl+space かカタカナ/ひらがなキーで入力を切り替えている.