Windows/Ubuntuで日本語109キーボードのIMEオンオフ設定とCapsLock/左Ctrlキー配置を、Macキーボード風に変更する

## この記事の目的

Windows/Ubuntuにて、標準でIMEオンオフが割り当てられている「半角全角」キーは、日本語109キーボードでは上段「1」キーの左にあってホームポジションから遠いし「ESC」キー入力のつもりで押してしまうことも多い。MacOSのMacキーボードは「スペース」キーの左右にある「英数」「カナ・かな」キーにIMEオンオフが割り当てられていて使いやすい。
そこで、その操作感に似せて以下のように割り当てを変えてみた。

* IMEオン機能を「スペース」キー右隣りの「変換」キーに割り当てる
* IMEオフ機能を「スペース」キー左隣りの「無変換」キーに割り当てる
* IMEオンオフ機能を「Ctrl + スペース」キーに割り当てる(Ubuntuのキー割り当ての真似)
* 変換機能は「スペース」キーに割り当て済みなので、それを使うことにする
* 「変換」キーに割り当てられていた再変換機能は「Ctrl+変換」キーに割り当てる

さらに、Macキーボード配列に似せて

* 「全角半角」キーを「ESC」キーにマッピングする
* 「Caps英数」キーと「左Ctrl」キーのマッピングを入れ替える

# Windows編
## Windows MSIMEキー割り当てを変更する

1. タスクトレイのMSIMEモードアイコンを右クリックして、ポップアップメニューの「プロパティ(R)」を選択する
![MSIME-main.PNG](https://qiita-image-store.s3.amazonaws.com/0/130677/237f9839-d2a6-1f5d-a268-1f53a7813028.png)

2. ダイアログの「詳細設定(A)」ボタンをクリックする
![MSIME-detail.PNG](https://qiita-image-store.s3.amazonaws.com/0/130677/fb43bfb1-73ac-ae45-b119-c3cb11302a52.png)

3. 詳細設定の編集操作のキー設定(Y)列右端の「変更(D)」ボタンをクリックする
![MSIME-keymap.PNG](https://qiita-image-store.s3.amazonaws.com/0/130677/980ec7f0-e992-c01a-5b90-ed25ef66afbd.png)

4. キー設定の「無変換」「変換」の機能割り当てを下表に従って変更する

キー |  「入力/変換済み文字なし」欄
-------|----------
Ctrl+SPACE | ー → IMEオン/オフ
ESC |  ー → IMEオフ
無変換 | かな切替 → IMEオフ
ひらがな | ひらがなキー → IMEオン
変換 | 再変換 → IMEオン
Ctrl+変換 |  メニュー → 再変換

## Windows GoogleIMEキー割り当てを変更する
MSIMEではなく、GoogleIMEを使っている場合はこちら

1. タスクトレイのGoogleIMEモードアイコンを右クリックして、ポップアップメニューの「プロパティ」を選択する
![googleIME-main.PNG](https://qiita-image-store.s3.amazonaws.com/0/130677/1c0fb6e9-8a0a-d0fc-868a-07d49656c71a.png)

2. ダイアログの「キー設定の選択」列右端の「編集...」をクリックする
![googleIME-keymap1.PNG](https://qiita-image-store.s3.amazonaws.com/0/130677/5af9e543-f2ef-0978-471e-e86d1d1a28c5.png)
![googleIME-keymap2.PNG](https://qiita-image-store.s3.amazonaws.com/0/130677/d86586bf-cdc5-64a9-ab35-22cdaa8a4cb7.png)

3. 日本語入力キー設定の「Henkan」「Muhenkan」の機能割り当てを下表に従って変更する

モード | 入力キー | コマンド
-------|---------|---------
直接入力 | Henkan | 再変換→IMEを有効化
直接入力 | Ctrl+Henkan | なし→再変換
入力文字なし | Escape | なし → キャンセル後 IME を無効化
入力文字なし | Ctrl+Henkan | なし→再変換
入力文字なし | Muhenkan | 次のかな文字種に入力変換 → IME を無効化
入力文字なし | Hiragana | なし → 次のかな文字種に入力変換
直接入力 | Ctrl+Space | IMEを有効化
入力文字なし | Ctrl+Space | 半角空白を入力 → IME を無効化
変換前入力中 | Ctrl+Space | 半角空白を入力 → IME を無効化
変換中 | Ctrl+Space | 全角空白を入力 → IME を無効化

## Windows Caps / Ctrl キー 入れ替え、半角全角キーをESCに置き換え.<a name="windows_swapcaps"></a>

Windowsのキーコード値は次の通り

|キー名称   | コード値
|----------|-----------
|左Ctrl    | 00 1d
|CapsLock  | 00 3a
|ESC       | 00 01
|半角・全角 | 00 29


このキーコード値の入れ替え設定をレジストリに登録してOSを再起動すればOK。
レジストリに登録するには、下記内容のレジストリ設定ファイルを作ってダブルクリックする。

### CapsをCtrl機能に割り当て
```reg:nocaps.reg
REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00
````

### CapsとCtrlを入れ替え
```reg:swapcaps.reg
REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,1d,00,3a,00,3a,00,1d,00,00,00,00,00
```
### CapsをCtrl機能に割り当て、半角全角をEsc機能に割り当て
```reg:nocaps+nohanzen.reg
REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,1d,00,3a,00,01,00,29,00,00,00,00,00
```

### CapsとCtrlを入れ替え、半角全角をEsc機能に割り当て
```reg:swapcaps+nohanzen.reg
REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,04,00,00,00,1d,00,3a,00,3a,00,1d,00,01,00,29,00,00,00,00,00
```

元に戻したい場合は、登録したレジストリキー「Scancode Map」を削除すればよい。

# Ubuntu編(16.04LTS+fcitx)

## Ubuntu 入力メソッドのオンオフキー割り当てを変更する

1. 画面の右上端にあるアイコントレイにあるキーボードアイコンをクリックし、ドロップダウンメニューの「現在の入力メソッドの設定」を選択する
![mozc-iconmenu.PNG](https://qiita-image-store.s3.amazonaws.com/0/130677/3b6ab747-0fca-02ef-b33b-02283caae9fb.png)

2. 入力メソッドの設定ダイアログの「全体の設定」タブを選び、最下行の「拡張オプションの表示」をチェックオンする
![im-main.png](https://qiita-image-store.s3.amazonaws.com/0/130677/71b4a22c-856f-83fd-b4ae-d589a74bfe5a.png)
![im-keymap1.png](https://qiita-image-store.s3.amazonaws.com/0/130677/afb5d504-e3e0-aa94-0b67-e479c7471069.png)

3. 「入力メソッドのオンオフ」列の「Zenkakuhankaku」ボタンを押して、fcitx-config-gtk3のポップアップダイアログに対してエスケープキーを入力して割り当てを解除する。「入力メソッドをオンに」列にて「変換」キーと「ひらがなカタカナ」キーを割り当てる。「入力メソッドをオフに」列にて「無変換」キーを割り当てる。
![im-keymap2.png](https://qiita-image-store.s3.amazonaws.com/0/130677/4a4e8811-4553-4168-e03f-d0ab6e89426d.png)

## Ubuntu Caps / Ctrl キー 入れ替え、半角全角キーをESCに置き換え.<a name="ubuntu_swapcaps"></a>

### xmodmap
過去の主流の方法でしたが、最近のUbuntuではMozcを起動すると設定がリセットされるので使えなくなりました。参考までに設定ファイル内容を残しておきます。

```:~/.Xmodmap
remove Lock    = Caps_Lock
remove Control = Control_L

keysym Caps_Lock = Control_L
keysym Control_L = Caps_Lock
!!keysym Escape = Zenkaku_Hankaku
keysym Zenkaku_Hankaku = Escape

add Lock = Caps_Lock
add Control = Control_L
```

### XKB
最近の方法です。引数の意味は ```man xkeyboard-config``` 参照。

```
$ setxkbmap -option ctrl:swapcaps,japan:hztg_escape
```
やはりMozcを起動すると設定がデフォルト値にリセットされるので、上記コマンドで動作を確認できたら、設定ファイル /etc/default/keyboard の XKBOPTIONS= に内容を書き込み、dpkg-reconfigure を実行してデフォルト値を書き換える。設定ウィザード画面が立ち上がり、キーボード種別について２〜３の確認を求められるが、すべてEnterを押して進んでいけば良い。 

```
$ sudoedit /etc/default/keyboard 
$ cat /etc/default/keyboard 
# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="jp"
XKBVARIANT=""
##  ctrl:nocaps          Caps Lock as Ctrl
##  ctrl:swapcaps        Swap Ctrl and Caps Lock
##  japan:hztg_escape    Make Zenkaku Hankaku an additional ESC
XKBOPTIONS="ctrl:swapcaps,japan:hztg_escape"

BACKSPACE="guess"
$ sudo dpkg-reconfigure keyboard-configuration
```

### dconf
参考資料によれば、GUIに対してキー入れ替えをするには dconf を使え、とあるのだが、私の環境（Ubuntu 16.04LTS + Unity）では、上記の [XKBOPTIONS設定](#xkb) を行えば、コンソールもXTERMもGUIもキー入れ替えが有効になるので必要なかった。色々と試行錯誤して、設定が重複して動作が怪しくなった場合には、下記の確認とリセットをやってみる価値あり。

```
### キー設定の確認
$ dconf read /org/gnome/desktop/input-sources/xkb-options

### キー設定のリセット
$ dconf reset /org/gnome/desktop/input-sources/xkb-options

### キー設定の変更
$ dconf write /org/gnome/desktop/input-sources/xkb-options "['ctrl:swapcaps','japan:hztg_escape']"
```

### 仮想マシン上のUbuntuでの問題点
VMware仮想マシンに入れたUbuntuでは、XKBOPTIONS= に ctrl:swapcaps を指定すると、VMwareが干渉して両キーともにCaps動作になってしまう。そこでゲストのUbuntu側ではキー割り当てを変更せず、ホストのWindows側にてキー割り当てを[本記事記載のレジストリ設定による方法](#windows_swapcaps)で変更することで解決した。ホストとゲストで同じキー割り当てが使えるので、これで良い。

# 参考資料
* Macの英数／かな切り替えに慣れたらWinの「半角／全角」が不便｜Mac
http://weekly.ascii.jp/elem/000/000/188/188160/

* キーボードの「Caps Lock」を「Ctrl」にする(Windows XP〜10)
http://l-w-i.net/t/windows/keyboard_001.txt

* Windows 2000 / XP / Vista / 7 / 8 / 10 CapsLockキーとCtrlキーを入れ替え、さらに半角・全角キーとESCキーを入れ替える
http://www.salutesound.com/~oss_keyswap.html

* LinuxでCapsLockをEscにしたりする
https://endaaman.me/memo/linux_keyboard_config

* CapsLockをCtrlにするまとめ
http://lambdalisue.hatenablog.com/entry/2013/09/27/212118

* XKBでCapsLockをEscに割り当てる(Ubuntuでキーマッピング変更)
http://qiita.com/oyas/items/a39baab89908294516a7

* CAPSキーをCTRLキーにする(Ubuntu 15.10)
http://kuma35-memo.readthedocs.io/en/latest/ctrl-nocaps.html

* Caps LockキーをCtrlキーにする(Ubuntu 15.10)
http://l-w-i.net/t/ubuntu/key_002.txt