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に追加します)
// 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など)を参考にして書いてください。
例:
// 独自のキーマップ設定
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でカスタマイズ可能な修飾キーにする方法