Posted at

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

More than 3 years have passed since last update.

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-editorgnome-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

ubuntu 14.04 unity desktopでCtrlとCapsLockを入れ替え後に、Shift+英数(CapsLock)をCtrlへ変更する

Ubuntu:無変換・変換キーをMeta・Hyperキー化してAutoKeyでカスタマイズ可能な修飾キーにする方法