キー割り当ての変更

Emacs をよりよく使って行くにあたり,自分に合ったキーバインドを設定する.
が,その前にキー割り当てを変更した方がより良いキーバインドの設定ができるのではと思った.
( Ctrl キーとか Meta キーとか)

この変更は意外と簡単にできる.

よく聞くのは Ctrl キーと Caps Lock キー(英数キー)の入れ替え.
しかし,いろいろ調べてくうちに変換キーや無変換キーなどに割り当ててみようとも思った.

Caps Lock キーはデフォルトの Ctrl キーよりは押しやすいとはいえ,
小指で押すことには変わらない.
変換キーなどは親指で押せる.

以下には,変換キー・無変換キーを Ctrl に,ひらがなカタカナキーを Alt に変更する例を示す.
( Caps Lock キーに割り当てるのも同様にできる)

キー割り当て変更

1.割り当てたいキーのkeycodeとkeysymを調べる
keycode は物理的なキーを示す.
keysym はあるキーが押されたときにコンピュータ側が何のキーと解釈するかを示す.
(sym は symbol の略)
調べる方法は2つ.

keycode と keysym の対応一覧をみる方法

% xmodmap -pke

とすると以下のように出力される.

keycode   8 =
keycode   9 = Escape NoSymbol Escape NoSymbol Escape
:
:
keycode  24 = q Q q Q
:
:
keycode 100 = Henkan_Mode NoSymbol Henkan_Mode
keycode 101 = Hiragana_Katakana Romaji Hiragana_Katakana Romaji
keycode 102 = Muhenkan NoSymbol Muhenkan
keycode 103 = 
keycode 104 = KP_Enter NoSymbol KP_Enter
keycode 105 = Control_R NoSymbol Control_R
:
:

例えば,keycode 24の位置にあるキーが押されたらqと解釈しますよ.ということを表す.
2列目は Shift で修飾されている場合.つまり Shift + q なら Q .
3列目以降は調べてないのでわからない.

キーを押して,そのキーの keycode と 現在の keysym を見る方法

% xev

とすると,一瞬すごい速さで文字が流れていくが,
それが止まってからキーを押すことで,

:
:
KeyPress event, serial 36, synthetic NO, window 0x2a00001,
    root 0x165, subw 0x0, time 25099638, (495,290), root:(545,342),
    state 0x0, keycode 100 (keysym 0xff23, Henkan_Mode), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False
:
:

のように keycode と keysym を確認することができる.

2.keysym を変更する
変更を加える前に一度,

% xmodmap -pke > ~/.Xomdmap

して,デフォルトの設定をとっておく.

まずは試しに1つ変えてみる.

% xmodmap -e 'keycode 100 = Control_R Nosymbol Control_R'

とする.特に何か表示されるわけではないが,これにより変換キーが右Ctrlキーとして働くようになった.
(このとき,もの右Ctrlキーはそのまま.つまり,変換キーが存在しないことになる)
上記コマンドは代わりに

% xmodmap -e 'keysym Henkan_Mode = Control_R Nosymbol Control_R'

でもよさそう(未確認).


さて,これをまとめて行うため ~/.Xmodmap を編集する.
(実際には .Xmodmap という名前でなくてもいい)

先ほど全ての keycode - keysym のデフォルトの対応を出力していたはずなので,その下に設定を追加していく.
!と入力することで行末までコメントとなる.

! 変換・無変換キーをCtrlキーと交換,ひらがなカタカナキーをAltキーと交換
keycode 37 = Muhenkan NoSymbol Muhenkan
keycode 102 = Control_L NoSymbol Control_L

keycode 105 = Henkan_Mode NoSymbol Henkan_Mode
keycode 100 = Control_R NoSymbol Control_R

keycode 108 = Hiragana_Katakana Romaji Hiragana_Katakana Romaji
keycode 101 = Alt_R Meta_R Alt_R Meta_R

ファイルを編集したら

% xmodmap ~/.Xmodmap

で反映される.
デフォルトに戻したかったら,自分で加えた部分を消すなりコメントアウトするなりして,
もう一度上のコマンドを実行すればよい.

修飾キーの変更
基本的なキー割り当ての変更は上記でいいのだが,
それだけでは Ctrl のような修飾キーの変更を行うことができない.

変換キーを単体で押したときには確かに Ctrl として扱われるのだが,
変換キーを押しながら他のキーを押しても,そのキーは修飾されない.

修飾キーの変更にはさらに手順を踏む.

ためしに,次のコマンドを実行してみる.

% xmodmap -pm

すると,

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Eisu_toggle (0x42)
control     Control_R (0x64),  Control_L (0x66)
mod1        Alt_L (0x40),  Alt_R (0x65),  Alt_L (0xcc),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3     
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

というように,どのキーがどの修飾キーになっているのかを確認することができる.
この設定には xmodmap で remove や add ということをするのだが,この add をした時に実際に修飾キー反映されるらしい.

というわけで,具体的には以下ようにすれば良い.

:
:(デフォルトの設定)
:

!******************

! Original Settings
!******************
remove control = Control_L
remove control = Control_R
remove mod1 = Alt_R

keycode 37 = Muhenkan NoSymbol Muhenkan
keycode 102 = Control_L NoSymbol Control_L

keycode 105 = Henkan_Mode NoSymbol Henkan_Mode
keycode 100 = Control_R NoSymbol Control_R

keycode 108 = Hiragana_Katakana Romaji Hiragana_Katakana Romaji
keycode 101 = Alt_R Meta_R Alt_R

add control = Control_L
add control = Control_R
add mod1 = Alt_R

これで変換・無変換キーなを修飾キーとして働かせることができるわけだ.

SandSの導入

Ubuntu 13.10以前の場合

Spaceキーを押しながら他のキーを押すことでShiftキーの代わりに使える.
Spaceキーを単に押すだけなら普通にSpaceキーの機能まま.
(Spaceキーを押しっぱなしにして連続で空白を入力することはできなくなる)
$ sudo add-apt-repository ppa:yurivkhan/ahm
$ sudo apt-get update
$ sudo apt-get upgrade
upgrade時にxserver-xorg-input-evdevがアップグレードされれば成功.
設定を有効にするため/usr/share/X11/xorg.conf.d/10-evdev.conf(Ubuntu13.10の場合)の該当部分に変更を加える.
Section "InputClass"
    Identifier "evdev keyboard catchall"
    MatchIsKeyboard "on"
    MatchDevicePath "/dev/input/event*"
+   Option "TransMod" "65:50"
    Driver "evdev"
EndSection

変更後にマシンを再起動すれば完了.


Ubuntu 14.04の場合
xcapeというものを利用する.


しかし,xcapeをmakeする際に
No package 'x11' found
と出る.

そこで,
% sudo apt-get install libx11-dev
とする.

再度makeを試すと,今度は
No package 'xtst' found
と出る.

そこで,
% sudo apt-get install libxtst-dev

とする.
もう一度makeをしたら成功.

% ./xcape -d

を実行すると,押したキーのkey codeが出力される.
Spaceキーは(私の場合は)65.


以下内容を~/.zshrcなどに記述しておくと良い.
xmodmap -e 'keycode 255=space'
xmodmap -e 'keycode 65=Shift_L'
~/opt/xcape/xcape -e '#65=space'


メモ
(Ubuntu 12.04)
デフォルトでAltキー単体はショートカットに登録されていた.
「システム設定」→「キーボード」→「ショートカット」より
「HUDを表示するキー」を別の適当なキーに変えるか,無効にする.

私のノートPC(LIFE BOOK SH76/G)の「ひらがなカタカナキー」は
押されっぱなしの状態にならないようである.
(押しっぱなしにしていてもON/OFFが繰り返される)
そのため,修飾キーに使うことができない.
この動作は機種によるようである.
解決策を探すが,無理そうなら別のキーに割り当てることを考える.

WindowsではXKeymacsなるものを使うことによって,より簡単にキー割り当てを変更できる.
(Xkeymacsは,もともとWindowsあらゆるアプリケーション上でEmacsキーバインドが使えるようになるというという代物)
(Windows7の場合,レジストリもいじる必要がある)
Windowsの方で設定変えちゃえばVMWare上の仮想マシンをいじる必要なし.


以上により,手をホームポジションからほとんど動かさずにすむようになったが,
ちょっと窮屈なようにも感じる.慣れの問題か.

参考

Comments