XKBでCapsLockをEscに割り当てる(Ubuntuでキーマッピング変更)


xmodmapコマンドで変更できるみたいですが、最近は、setxkbmapコマンドを使う方がいい?みたいなのでその方法を考えてみました。

# 環境
Ubuntu 15.10
IM: fcitx 4.2.9

# setxkbmapコマンド

調べた結果、以下のコマンドで実現できるみたいです。

    $ setxkbmap -option caps:escape

しかし、問題が2つありました。

- CapsLockを押すと、EscとCapsLock両方を入力したようになる
- 日本語を入力するために、入力メソッドを直接入力からmozcに変更すると、設定が無効になって元のCapsLockに戻ってしまう


# XKBの設定ファイルを書き換える

まず、ひとつ目の問題を解決するために、XKBの設定ファイルを直接編集することにしました。


## 現在の設定の確認

`$ setxkbmap -print`

結果：

    xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)"	};
        xkb_types     { include "complete"	};
        xkb_compat    { include "complete"	};
        xkb_symbols   { include "pc+jp+us:2+inet(evdev)+capslock(escape)"	};
        xkb_geometry  { include "pc(pc105)"	};
    };


xkb_symbols を見てみると、pc,jp,us,inet(のevdev),capslock(のescape)を読み込んでいることがわかります。


## 設定ファイルの編集

それぞれのオプションの細かい設定は、以下のフォルダ内のファイルに書かれていました。

`/usr/share/X11/xkb/symbols/`

ここを、編集します。
`/usr/share/X11/xkb/symbols/capslock` を開いて、32行目付近の

    partial hidden modifier_keys
    xkb_symbols "escape" {
        key <CAPS> { [ Escape ] };
    };

この部分を、以下のように書き換えます。

    partial hidden modifier_keys
    xkb_symbols "escape" {
        key <CAPS> { [ Escape, Escape ] };
    };

(この書き方でいいのか自信ないですが、とりあえず期待通りに動くようになります。)

## 設定を反映させる
設定を反映させるために、以下を実行し、PCを再起動してください。

    $ sudo rm -rf /var/lib/xkb/*

## 確認

    $ setxkbmap -option caps:escape

ちゃんと、CapsLockを押した時、Escを押した動作をすると思います。

# 入力メソッドを切り替えても、設定が消えないようにする

これは、dconfに設定することでうまく行きました。以下のコマンドを実行してください。

    $ dconf write /org/gnome/desktop/input-sources/xkb-options "['caps:escape']"

これは、`dconf-editor`や`gnome-tweak-tool`を使っても編集ができます。

これで入力メソッドを切り替えても常にCapsLockがEscに割り当てられた状態にできました。

# 応用

CapsLockをEscに割り当てる以外のこともできるように、いろいろメモしておきます。


setxkbmap -option で設定できるオプションの一覧は、以下のファイルに書かれています。

`/usr/share/X11/xkb/rules/base.lst`

ここから、欲しいオプションを探して使います。

それでも、この一覧にないキーマッピングを設定したい場合があると思います。
そこで、setxkbmap -option で指定できる独自のオプションを作ります。


## 一覧に新しいオプションを追加
`/usr/share/X11/xkb/rules/evdev`のoption一覧の最後に、自分で作ったオプション`user:keymap`を追加します。(baseに追加すると動かなかったのでevdevに追加します)

```:/usr/share/X11/xkb/rules/evdev
// 1040行目あたりから
! option    =>  symbols
   grp:shift_toggle  =   +group(shifts_toggle)
   altwin:menu       =   +altwin(menu)
   altwin:meta_alt   =   +altwin(meta_alt)
   altwin:alt_win    =   +altwin(alt_win)
   altwin:ctrl_win   =   +altwin(ctrl_win)
   ......
   user:keymap       =   +user(keymap)       // 追加
```

## symbolに新しい設定ファイルを作る
新しく`/usr/share/X11/xkb/symbols/user`というファイルを作ります。
内容は、`/usr/share/X11/xkb/symbols/`以下にあるファイル(例えば、capslock、ctrl、jp、inetなど)を参考にして書いてください。

例：

```:/usr/share/X11/xkb/symbols/user
// 独自のキーマップ設定
partial hidden modifier_keys
xkb_symbols "keymap" {
    key <ESC>  { [ Zenkaku_Hankaku ] };		// Escを全角半角キーに変更
    key <HZTG> { [ Escape ] };				// 全角半角キーをEscに変更
    key <HENK> { [ Return ] };				// 変換をEnterに変更
    key <MUHE> { [ BackSpace ] };			// 無変換をバックスペースに変更
};
```

## 確認
`$ sudo rm -rf /var/lib/xkb/*`を実行して再起動した後、以下を実行。

    $ setxkbmap -option user:keymap

ただしく設定が反映されていれば成功です。

`$ setxkbmap -print`を実行すると例えば以下のようになります。

    xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)"	};
        xkb_types     { include "complete"	};
        xkb_compat    { include "complete"	};
        xkb_symbols   { include "pc+jp+us:2+inet(evdev)+user(keymap)"	};
        xkb_geometry  { include "pc(pc105)"	};
    };


自分で作るときは、user、keymapの部分は好きなように変えてください。



# 参考
[Xorg でのキーボード設定 - ArchWiki](https://wiki.archlinuxjp.org/index.php/Xorg_%E3%81%A7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A)
[ubuntu 14.04 unity desktopでCtrlとCapsLockを入れ替え後に、Shift+英数(CapsLock)をCtrlへ変更する](https://forums.ubuntulinux.jp/viewtopic.php?id=16882)
[Ubuntu：無変換・変換キーをMeta・Hyperキー化してAutoKeyでカスタマイズ可能な修飾キーにする方法](http://did2memo.net/2015/07/19/ubuntu-xkb-muhenkan-henkan-meta-hyper/)