2014年9月20日土曜日

Ubuntu 14.04 で Ctrl と Caps キーを入れ替え その2

Ubuntu 14.04 で Ctrl と Caps キーを入れ替え 」で Ctrl と Caps キーを入れ替えてましたが、なぜか起動するたびに入れ替わっていたり入れ替わらなかったりなので、なんとかしてみました。

環境

Ubuntu 14.04 Desktop 日本語 Remix

Ctrl キーと Caps キーを入れ替える方法 (うまくいかない場合があります)

まずは、前回紹介した Ctrl キーと Caps キーを入れ替える方法です。 うまくいかない場合がたまにあります。

以下のように ~/.Xmodmap を設置

$ cat ~/.Xmodmap
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

手動で入れ替える場合は xmodmap コマンドでこのファイルを指定します。

$ xmodmap ~/.Xmodmap
  • コマンドを実行する度に Ctrl と Caps が入れ替わるのと元に戻るのを繰り返します。

~/.Xmodmap を設置するだけで PC 起動時は Ctrl と Caps が入れ替るはずなのですが、なぜか入れ替わったり入れ替わらなかったりします。

以下で Ctrl と Caps のキーコードに対応するキーマップを調べて、入れ替わっていなかったら強制的に入れ替えてみます。


Ctrl キーと Caps キーのキーコードを調べる

以降でいろいろ確認するために、Ctrl キーと Caps キーのキーコードを調べときます。

キーコードは物理的なキーに対応するコードとのことで、 xmodmap による入れ替えでも変わることは無いとのことです。

具体的な調べ方は省略しますが、xev コマンドで調べることができ、以下の通りでした。

  キーコード
10進数 16進数
Ctrl (左) 37 0x25
Caps 66 0x42
※ Ctrl キーは左右にひとつずつあり、左のものだけ調べてます。

現在のキーマップの状態をコマンドで調べる方法の確認

xmodmap の man コマンドを見ると、以下のあたりで調べられそうです。

$ man xmodmap
... snip ...
       -pm     This  option  indicates that the current modifier map should be
               printed on the standard output.   This is the default  mode  of
               operation if no other mode options are specified.

       -pk     This  option  indicates that the current keymap table should be
               printed on the standard output.

       -pke    This option indicates that the current keymap table  should  be
               printed  on the standard output in the form of expressions that
               can be fed back to xmodmap.
... snip ...

今回は xmodmap -pke で調べてみます。

~/.Xmodmap を設定しないで Ctrl と Caps を入れ替えていない状態

$ xmodmap -pke | egrep '^keycode +(37|66) +='
keycode  37 = Control_L NoSymbol Control_L
keycode  66 = Eisu_toggle Caps_Lock Eisu_toggle Caps_Lock

~/.Xmodmap を設置して Ctrl と Caps がうまく入れ替った状態

$ xmodmap -pke | egrep '^keycode +(37|66) +='
keycode  37 = Caps_Lock NoSymbol Caps_Lock
keycode  66 = Control_L NoSymbol Control_L
  • Ctrl と Caps を入れ替えたというよりは新しく上書きしたという状態のようです。

~/.Xmodmap を設置したのに Ctrl と Caps が入れ替っていない状態

$ xmodmap -pke | egrep '^keycode +(37|66) +='
keycode  37 = Control_L NoSymbol Control_L
keycode  66 = Eisu_toggle Caps_Lock Eisu_toggle Caps_Lock
  • ~/.Xmodmap を設定していない場合と同じ状態です。

Ctrl と Caps が入れ替わっていない場合に強制的に入れ替える

以下のようなスクリプトを用意します。 (実行権限も付与しときます)

#!/bin/bash

# うまくいかない場合はコメントをはずしてみて下さい
# sleep 5

logger "Before: "$(xmodmap -pke | egrep '^keycode +66 *=')
xmodmap -pke | egrep '^keycode +66 *= *Control_L +NoSymbol +Control_L *$' > /dev/null || xmodmap ~/.Xmodmap
logger "After:  "$(xmodmap -pke | egrep '^keycode +66 *=')
  • xmodmap -pke の出力を見て、キーコード 66 (Caps キー) のキーマップが期待通りではない場合は xmodmap ~/.Xmodmap を実行して、Ctrl と Caps を入れ替えます。
  • その前後のキーコード 66 (Caps キー) のキーマップをログに記録します。

Unity 起動時にこのスクリプトが実行されるように設定します。

  1. ターミナルウィンドウで gnome-session-properties を実行
  2. 「自動起動するアプリケーションの設定」で「追加」をクリック
  3. 「名前」は適当に入力
  4. 「コマンド」に SwapKeys.sh をフルパスで入力
  5. 「説明」は適当に入力
  6. 「追加」をクリック

~/.Xmodmap は設置したままにしておきます。


SwapKeys.sh によるキー入れ替え具合を確認

PC を再起動してデスクトップ表示後にログを確認します。

SwapKeys.sh が実行される前にすでに正常にキーが入れ替わっていた場合

$ grep keycode /var/log/syslog
Sep 17 21:43:39 TestPc logger: Before: keycode 66 = Control_L NoSymbol Control_L
Sep 17 21:43:39 TestPc logger: After:  keycode 66 = Control_L NoSymbol Control_L
  • SwapKyes.sh の実行前にすでに入れ替わっているので SwapKeys.sh は何もしていません。

SwapKeys.sh が実行される前になぜかキーが入れ替わっていなかった場合

$ grep keycode /var/log/syslog
Sep 17 21:58:28 TestPc logger: Before: keycode 66 = Eisu_toggle Caps_Lock Eisu_toggle Caps_Lock
Sep 17 21:58:28 TestPc logger: After:  keycode 66 = Control_L NoSymbol Control_L
  • SwapKeys.sh の実行前に入れ替わっていないので SwapKeys.sh が入れ替えてます。

0 件のコメント:

コメントを投稿