Ubuntu Desktupのキーボードと言語周り

# モチベーション：　日本語入力と英字キーボードの併用
もともと家の環境ではUbuntu + i3の構成を愛用していました。
キーボードは日本語キーボード、日本語入力はfcitx + Mozc、日本語モードへの切り替えはMACライクに無変換／変換。
「かな」キーとかは無変換／変換と打ち間違えることが多々あるので、物理的にキーボードから引っ剥がす、と。

たまに意図しないキーバインドが引っかかってしまうみたいでカタカナモードになられて困る、、という問題もあったのですが、とりあえず動くのでだましだまし使ってたのですが、、
身の回り環境を少しエルゴノミックにしようかなーと思って試しに買ってみたキーボードが英字キーボードでして。
せっかくなので英字キーボードに引っ越す前提で、しばらく日本語キーボードと英字キーボードの両方を繋いだ状態にして使い分けられる環境を作りたいなーと思うに至りました。

結構あれこれ試すことになったので、せっかくなので情報をまとめます。

# ボツ案１ setxkbmapによる切り替え
キーボードマップを単純に入れ替えるなら、以下でいいのですが、、、

```
$ setxkbmap us
```

使ってるうちに日本語キー配列に戻ってしまいます。
なんでだ、、と思って"watch setxkbmap -query"でながめてみてたのですが、Input Methodをmozcに切り替えたタイミングで日本語配列に切り替わってしまうらしく。
おそらくfcitxが設定を上書きしちゃうんですかね。

当初fcitxは入力モード切り替えだけで、キーボードレイアウトの切り替えはしないと思いこんでました。。
あらためて、きちんとfcitxを使う方法で考えてみます。

# ボツ案2 fcitx設定　＋　小細工
当初これをOKあんにしようと思ってたのですが、最終的に後述のMozc一本化案に至ったので、結局コレもボツ案です。
ただ、学びは色々あったので、詳細書いときます。

## fcitx設定 Input Methodの切り替えの考え方
そもそもfcitxの設定の意味をあんまり理解せず使ってましたので、軽くしらべてみました。
まずはGUIツールを開いてみます。

```
$ fcitx-configtool
```

## Inpput Methodとキーボードレイアウト
Mozcなどの日本語入力用の設定を追加する画面です。
![im.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/8437c5e5-f5b3-f045-ab9b-57741ade02f6.png)

１つ目の"Keboard - English(US)"では英字配列、2つ目の"Mozc"のときは日本語レイアウトでの入力となります。
日本語入力する時（Mozc使う時）に英字キーレイアウトを使うにはどうすればいいかというと、、

![im-lang2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/afae6288-926a-e1c1-6679-9ff270bf5220.png)
Mozcを選択した状態で下部のスパナマークをクリックするとキーレイアウトの変更ができるようです。
コレを変えると、Mozc状態で英字キーレイアウトで入力ができるようになります。
ちなみに、"Keyboard - English(US)"の方はキーレイアウト変更の概念はないようです（そりゃそうですが）。

とりあえず変え方はわかりましたが、都度GUIで変更していたらめんどくさくてしょうがないです。
さて、どうするか。

## Input Methodの切り替え
素直に考えると、日本語キーレイアウトのMozcと、英語キーレイアウトのMozcの２つのInput Methodを用意しておいて切り替える、というのがありますが、、、だめでした。
Input MethodとしてのMozcは1つしか登録できないようです。。
（Mozcの取り込みの部分を弄くればできなくもないかもですが、、）

別の方法を考える必要があります。

### 脱線 Input Methodの切り替えのキーバインド
fcixtでのInput Methodの切り替えのキーバインドは、fcixt-configtoolのGlobal Configタブで設定できます。
![2021-10-17_23:47:20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/c58f28b0-6f28-0a70-3d53-4a5ee2ede969.png)

下部にある”Show Advanced Options”をクリックすると、更に細かい設定ができます。
今回色々調べるまでは上記の設定でTrigger Input Methodに"無変換"と"変換"の2つのキーを登録していました。
MACのキーバインドに寄せようとしていたのですが、MACのよう”変換”を押すと日本語入力、”無変換”を押すと英語入力、とはならず、どちらをお押しても日本語入力／英語入力のスイッチになる、という状態でした。
今回もうちょっと調べて、日本語キーボードレイアウトのときはよりMACに似せる、英語キーボードレイアウトのときはLinuxの標準(？)ぽくCTL+Spaceでスイッチする、というような設定にしてみました。

![2021-10-17_23:47:25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/12d7a712-2e33-ad0b-9afd-6a01e2131a6c.png)

ちなみに、Input Methodの切り替えだけで、「Trigger」や「Scroll」、「Activate/Inactivate」と３つの表現があります。
- Trigger Input Method
- Extra key for trigger input method, Custom switch key
- Activate input method
- Inactivate input Method
- Scroll between Input Method

Input Methodは複数登録するものなので、切り替えて使うということで「Scroll」はピンとくるのですが、「Trigger」と「Activate/Inactivate」が意味わからん。。
設定ガチャガチャ変えて試していたのですが、結論としては、
- Input Methodに登録しているもののうち、一番上が「Not Triggered」であり「Inactivate」
- 二番目が「Triggered」であり「Activated」
ということみたいです。
実はInput Methodタブの下の方にInactivateの考え方はかいてあることに実験後に気が付き。
わからんよ、、、

とりあえず以下のような設定にしました。
- Input Methodは先の例の通り1行目が”Keyboard - English(US)”、2行目が”Mozc”にした状態で
- ”変換”はActivate Input Methodに
- "無変換”はInactivate Input Methodに
- ”Extra key for trigger input method"を”Custom”にした状態で、”Ctrl+Space”をCustom switch keyに
- Scroll between input Methodは使わないのだけど、無効化が選択肢にないっぽいので、、ディフォのままで

まぁ、、、後述の通り、結局Mozc一本化案を取るので、使わなくなった設定ではありますが。

## Mozcのキーボードレイアウト設定切り替え
fcitx自体にコンフィグ変更用のコマンドがあるっぽくはあるのですが、今回のやりたいMozcのキーバインド設定だけ変える方法がなさそうな感じです。
設定がどこに保存されているかはみつけられたので、乱暴ですが、設定を変えてfcitxを再起動する方法を取ります。

スクリプトはこんな感じ。

```![2021-10-18_02:11:09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/28bde1a3-fbdc-4da8-f725-1f3d3ca1f4e2.png)

$cat /usr/local/bin/chkey 
#!/bin/bash
set -eu

KEYLANG=layout_override_us
while getopts jeu OPT
do
  case $OPT in
    "j" ) KEYLANG=layout_override_jp;;
    "e" ) KEYLANG=layout_override_us;;
    "u" ) KEYLANG=layout_override_us;;
  esac
done

cp ~/.config/fcitx/data/${KEYLANG} ~/.config/fcitx/data/layout_override
fcitx -r
```

事前に用意している設定はこんな感じ。

```
$cat ~/.config/fcitx/data/layout_override_en
default,us
mozc,us

$cat ~/.config/fcitx/data/layout_override_jp
default,us
mozc,jp
```

defaultの方を切り替えるほうがきれいかもしれませんが、、まぁとりあえずはいいか。
まぁこれで動きます。

## もひとひねり！！
タイプをミスって意図せず切り替えのキーバインドを叩いてしまうみたいで、入力がカタカナに切り替わってしまって難儀することがちょこちょことありました。
ココらへんはMozcの設定だと思うので、そこら辺を調べていたのですが、、、、
結果として、上記のInput Methodの切り替えなし(All Mozc)で今回やりたかったことが整理できましたので、その方法をまとめます。

キーボードレイアウト自体は、上記のスクリプトのままでOK。
ここは、日本語入力とアルファベット直接入力の部分の話です。

### Mozc上でのキーバインド
とりあえず、以下で設定GUIを呼び出せます。

```
$ /usr/lib/mozc/mozc_tool --mode=config_dialog
```

![2021-10-18_02:11:01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/54438314-cbb0-40cf-99fe-4f5975357b26.png)

GeneralタブのKeymap styleのCutomizeで、IMEのon/offをいじれば、日本語入力とアルファベット直接入力をちゃんと切り替えられるようになります。

IMEを含む設定いろいろのキーバインドは、GeneralタブのKeymap style - Customizeから設定。
まず、現状の設定をエクスポートして、それを書き換えてImportします。
![2021-10-18_02:11:01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/48ec3111-6d6b-063d-6af5-fc7f5a5ddb7e.png)

この画面下部のEditをクリックすると、エクスポートとインポートができます。
![2021-10-18_02:11:09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/b2339e62-5e48-b627-d2d9-a3c666517025.png)

IMEに関しての設定を行うキーバインドだけ、以下のように書き換えたファイルを作成して、Importしました。

```
status	key	command
Composition	Muhenkan	IMEOff
Composition	Henkan	IMEOn
Conversion	Muhenkan	IMEOff
Conversion	Henkan	IMEOn
DirectInput	Muhenkan	IMEOff
DirectInput	Henkan	IMEOn
Precomposition	Muhenkan	IMEOff
Precomposition	Henkan	IMEOn
Composition	Ctrl Space	IMEOff
Conversion	Ctrl Space	IMEOff
Precomposition	Ctrl Space	IMEOff
DirectInput	Ctrl Space	IMEOn
...
```

ディフォルトだと結構な数のキーバインドがあるのですが、他をいじるといつも無意識にやっている操作(バックスペースでの一文字削除)までできなくなるので、IME周りのディフォ設定を消して上に置き換えるだけにとどめます。
ついでに悪さするKanaのキーバインドも外しましたが、それは省略。

上記の設定を済ませた上で、fcitxでInput MethodをMozcだけにして、Imput Method切り替え用のキーバインドを全部外せば終了。
ただし、想定外のキーバインドでうっかり日本語入力から英語入力に戻れなくなった、、みたいな事故があると怖いので、一応2つ目に英語入力を登録しておき、いざとなったらGUIで切り替えられるようにしてあります。

以上で、
- キーボードレイアウト切り替え: chkeyスクリプトをコマンドラインから実施
- 日本語入力切り替え: Mozcの機能でIMEをON/OFFして実施、キーバインドは変換/無変換/Ctrl + Space
という使い方ができるようになりました。

# まとめ
そもそも日本語キーレイアウトと英語キーレイアウトのキーボードを併用する、というかなり変な状態のためのTipsではあるのですが、これまで放置してた問題が一通り一掃できました。
キーレイアウトの話と日本語入力の話がとっちゃになってるのでわかりにくくなってる感はありますが、、まぁ英字レイアウトにひこっこしたいLinuxユーザがいたときいのためのTipsということで。