xkbで無変換にctrlを割り当てる

  • 14
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

僕はここ5年位、無変換にctrl、変換にenterを割り当てて開発をしています。(Mac)
ubuntuでどうやるのかわかっていなくて調べてできたので書いておきます。

2015年現在の新し目のubuntuでは、キーマップの変更はxkbを使うのが推奨されているようなので、それを使います。

https://wiki.archlinux.org/index.php/Keyboard_Configuration_in_Xorg_(日本語)

~/.xkbディレクトリに以下のようにファイルを設置して

% tree
.
├── keycodes/
│   └── mykeycodes
├── keymap/
│   └── mykbd
└── symbols/
    └── myswap

ファイルの中身はこんな感じ

% cat keycodes/mykeycodes
xkb_keycodes "mycodes" {

    <NFER> =   102;             // Muhenkan
    <XFER> =   100;             // Henkan
};



% cat keymap/mykbd
xkb_keymap {
  xkb_keycodes  { include "evdev+aliases(qwerty)+mykeycodes(mycodes)" };
  xkb_types     { include "complete" };
  xkb_compat    { include "complete+japan" };
  xkb_symbols   { include "pc+jp(106)+myswap(swapkeys)" };
  xkb_geometry  { include "pc(jp106)" };
};

% cat symbols/myswap
partial modifier_keys
xkb_symbols "swapkeys" {
  replace key <LCTL>  { [ Caps_Lock ] };
  replace key <CAPS> { [ Control_L ] };

  replace key <NFER> { [ Control_L ] };
  modifier_map Control { <NFER> };

  replace key <XFER> { [ Return ] };

  replace key <AB11> { [ underscore ] };

};


重要そうなのは、ディフォルトのkeycodesにNFERとXFERが入っていないので、 keycodes/mykeycodes で、それを追加する。
102やら100やらのkeycodeは xevなどで調べる。多分日本語キーボードならほぼ同じ。

keymap/mykbd ではmykeycodesと後述のmyswapを読み込む

symboles/myswap で実際に置き換えるキーを指定する。

上の例では、

  • ctrlとcapsを入れ替え
  • 無変換をctrl
  • 変換を改行
  • 右下のBackslashをunderscoreへ

としている。

で、これらを起動時に読み込ませないといけないのだけど、.xinitrc.xsessionrc やらに起動スクリプトを書いてみたけど、
ディスプレイが見つからないなどのエラーで実行できなかったので、起動時に手動で実行するスクリプトにした。
一緒にSandSの設定も読み込む

SandSの設定は以下を参考に。
http://qiita.com/ychubachi@github/items/95830219f1bdf912280b
https://gist.github.com/xr0038/11311831

# xkb_startup.sh

test -f $HOME/.xkb/keymap/mykbd && xkbcomp -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY 2> /dev/null

# sands

xmodmap -e 'keycode 255=space'
xmodmap -e 'keycode 65=Shift_L';
PID=`pidof xcape`
if [ -z ${PID} ]; then
  xcape -e '#65=space'
fi

このスクリプトを起動のたびにダブルクリックする。

本当は起動時に勝手に設定されて欲しくて、これわからないとスリープするたびにセッション切れてスクリプト実行し直さないといけないのでなんとかしたい。