xkeysnail meets Apple Wireless Keyboard (US)

## 概要
Ubuntuの環境設定で [xkeysnail](https://github.com/mooz/xkeysnail) というキーリマップツールを使った話です。

作者が [xkeysnail を作った話](https://qiita.com/mooz@github/items/c5f25f27847333dd0b37) をQiitaに書いているのと、他の方も [導入方法の記事](https://poyo.hatenablog.jp/entry/2018/06/23/020147) を詳細に書かれていたりするので、そのあたりの詳細は今回は書きません。
後者の記事にも書かれているように、xkeysnail に関する情報はまだまだ少ないので、こういう設定パターンもあるよ！という情報を増やすために今回の記事を書こうと思いました。
ThinkPadのキーボードを使って設定した記事はいくつかありましたが、Appleのキーボードを使った記事が見当たらなかったのです。

今回の設定で使ったキーボードは一世代前のApple Wireless Keyboard(US)ですが、現行で発売されている[Magic Keyboard](https://www.apple.com/shop/product/MLA22LL/A/magic-keyboard-us-english?fnode=9d)でも同様のキー配列なので同じ設定で使えるはずです。

## やりたいこと

ぼくはキーボードに日本語が書かれていてスタイリッシュでないと思っているのとEnterキーの形が気持ち悪くてJIS配列が嫌いで、US配列を使っているのですが、JIS配列に負けを認めざるを得ないのが英数入力とかな入力の切り替えです。

<img width="840" alt="Screen Shot 2020-03-12 at 18.24.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53708/73a757c9-ddaa-d52e-d5b7-69590d8b7986.png">

シフトキーの左右に入力切替用のキーがあって、「かな」を何回押してもかな入力のままなのでめちゃくちゃ便利です。(Windowsはかな入力と英数入力を同じキーで切り替えますが、今どっちで入力しているのか意識しないといけないので辛いです。)


そのため、US配列でもその切り替えが実現できるように [karabiner](https://pqrs.org/osx/karabiner/) を使って以下のようにマッピングを変えています。
<img width="1002" alt="Screen_Shot_2020-03-12_at_18_30_35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53708/6fb2d409-d899-43a1-9e11-92011ff80cb5.png">

これだと`command`が潰れてしまうので、左側のalt/optionキーを`command`に置き換えています。
よくcommandキーの設定を短押しで英数/かな切り替え、長押しで`command`と設定している人も見かけますが、ぼくのキー入力の癖ではその設定が合わず、意図せず`cmd+hoge`のショートカットを乱発させてしまい、まともに入力できないので諦めています。

caps lockキーを `esc` に割り当てているのはTouch Barのecsボタンでは感触に満足できず、物理ecsキーを押したいためで、caps lockくんには消えてもらいました。
caps lockは `ctl` でしょ！とかいろいろ派閥がありますが、ここでは戦争しないでください。

つまりこの設定を xkeysnail で実現したいという話です。

個人的にもう一つ気にしておきたいのが、macOSではかな入力で文字入力中に英数入力に切り替えることで、その入力を確定できるという仕様です。
何を言っているのか伝わりにくいと思いますが
<img width="223" alt="Screen Shot 2020-03-12 at 18.40.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53708/4c54f0ca-1e77-e64d-1716-9a9afd477d6b.png">
の状態で英数キーを押すと `入れたい` の文字が入力されてその後に英数入力に切り替わります。
UbuntuのMozcでこれと同じことをすると `入れたい` はキャンセルされて `この後に英数を` の文字だけが残った状態で英数入力に切り替わります。

どれだけの人がmacOSでこの仕様を使っているかわかりませんが、無意識のうちに自分は多用していて、Mozcだとまともに日本語が入力できないことに気づいたので、この仕様も実現したいです。

## 実現方法

設定ファイルはこのようになりました。

```python:config.py
import re
from xkeysnail.transform import *

define_modmap({
    Key.CAPSLOCK: Key.ESC,
    Key.LEFT_META: Key.MUHENKAN,
    Key.RIGHT_META: Key.HENKAN,
    Key.LEFT_CTRL: Key.LEFT_ALT,
    Key.LEFT_ALT: Key.LEFT_CTRL,
})
```

この設定でこのようにマッピングされます。

<img width="840" alt="Screen_Shot_2020-03-12_at_18_22_36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53708/0eb2a325-4622-4cba-f4e5-e9774a992971.png">

特に目新しい情報はなくて、注意するのはcommandキーが `LEFT_META` と `RIGHT_META` になっていることぐらいです。
macOSの`cmd+hoge`のショートカットは、`ctrl+hoge` で設定されていることが多いので、このように設定しています。macOSで `ctrl` を使っていたようなショートカットはUbuntuでも `ctrl` のままであることが多いので、そのショートカットはキーボードの位置が変わってしまうのですが、そこは諦めるかショートカットの設定の方で調整してください。

続いて、英数入力に切り替えた時に変換途中の文字を確定する部分です。
まず Mozc の設定の `キー設定 -> キー設定の選択 -> 編集...` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53708/331c6cbf-70ee-51fe-6733-0d1fdee1b0ab.png)

すると、このように入力状態毎にキー入力をした際にどのようなアクションを取るのかを設定する画面が出てくるので、`編集 -> エントリーを追加` で

| モード | 入力キー |コマンド |
|:----|:----|:----|
| 変換前入力中 | Right (右矢印キー) | 確定 |

の設定を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53708/20b30e5d-fd64-75ad-4ea0-12890ad94d26.png)

そして `config.py` に下3行の設定を追加してあげることで、英数キーを押したタイミングで `→ + 英数`が入力されるので、 `入力確定 + 英数入力切り替え` となり、期待する挙動を実現することができました。

```python:config.py
import re
from xkeysnail.transform import *

define_modmap({
    Key.CAPSLOCK: Key.ESC,
    Key.LEFT_META: Key.MUHENKAN,
    Key.RIGHT_META: Key.HENKAN,
    Key.LEFT_CTRL: Key.LEFT_ALT,
    Key.LEFT_ALT: Key.LEFT_CTRL,
})

# None の場合はすべてのアプリケーションで適用される
define_keymap(None, {
    K('muhenkan'): [K('right'), K('muhenkan')]
}, 'better input UX')

```

この設定だと、かな入力変換中でなくても、英数キーを押すことで`→`が発動するので、カーソルが右に1つ移動してしまう問題があるのですが、自分が思いつく限りでは`Right(→)`が一番無難な選択かなぁと思っています。
もしより良い選択肢があれば教えて下さい！！
(果たしてどれだけの人がこの問題で困っているのか…という疑問はありますが…)

Happy xkeysnail Life :tada: