Linuxで尊師スタイルの環境構築

# 対象となる読者
- 尊師なスタイルに憧れているLinuxユーザー
- fcitx環境でJIS・USキーボードを即座に切り替えたい人
- やり方を忘れた未来の自分

# あらすじ
1. 尊師スタイルしたい！
2. キーボード買った
3. 手動でIMEの設定だるい
4. Linux版Karabinerとかないんかな
5. ない
6. 作ろう

# 尊師スタイルとは
ノートPCの上に外付けキーボードを置いて使うことを尊師スタイルと言います。
名前の由来は聞き飽きたと思いますので省略します。

HHKB＆Macbookで尊師スタイルをしている人が圧倒的に多い気がします。羨ましい限りです。  

私のノートPCは、**Fujitsu Lifebook SH90/M**で、キーボードはJIS配列です。
私は１年前にUSキーボード信者になったため、US配列のノートPC欲しいなあと思いつつ、４年間使い続けているLifebookを手放すのは惜しいなあと思ってました。  
**なら尊師スタイルしかないな・・・** と思い立ったわけです。
しかし、ネットで調べても、尊師スタイルの記事はMacbookの記事ばかりで、Linuxユーザーのための記事が殆ど無かったので、ここに記事にしようと思い立ちました（~~Linuxユーザーはこれぐらいのことは難無く出来るとは思いますが~~）。


# 使うキーボード
Topreクローンとして有名な[NiZ Plum 75](https://www.nizkeyboard.com/product/plum-75-keys-35g45g-electro-capacitive-keyboard-non-rgb/)を先日買いました。
HHKBも考えましたが、「矢印キーがない」という未開の地に3万円近く費やす勇気はありませんでした。。  
そんなことはさておき、NiZの簡単なレビューですが、メインで使っているRealForce 104UBと比べると音がとても軽やかです。
両方とも**静電容量無接点方式**ですが、Plumは高周波数帯が比較的小さく「ポコスコ」といった打鍵音で、[この動画](https://youtu.be/MmTD4DXuD8o?t=7m29s)のまんまです。
Fnキー位置が気に食わなかったり、タッチが軽すぎるといった問題も少しありますが、Windows専用ソフトと付属のバネでどうにかなります。


# やり方
## 環境
- ubuntu 16.04 LTS(Tweak Toolで外観Macぽくしてます)
- fcitx-mozc
- NiZ Plum 75(USBタイプ)

## fcitx-imlistのインストール（2018/9/2編集）
**※内蔵・外付けキーボードが同じ配列の場合はスキップしてください**  

「尊師スタイルじゃなくて普通にタイピングしたい！」といった場面もあると思うので、内蔵キーボードを常時殺しておくわけにはいきません。  
内蔵・外付けキーボードが双方同じ配列なら楽なのですが、使っているキーボードの配列によって、直接入力の配列をJISとUSにそれぞれ変更しなければなりません。  
下図のようにfcitx-configtoolで設定すればいいのですが、繋ぎ直す度にGUIで入力メソッドを設定し直すのは手間です。  
![config1.png](https://qiita-image-store.s3.amazonaws.com/0/206650/6c202ca3-b822-256a-7bf0-8d92e79d9ad9.png)
これをコマンドで設定できるツールが**fcitx-imlist**です。作者様ありがとうございます。  
以下のようにクローンを作ってインストールしてやります。

```shell

$ sudo apt-get install dh-autoreconf
$ sudo apt-get install glib-2.0
$ sudo apt-get install libperl-dev
$ sudo apt-get install libgtk2.0-dev

$ sudo apt-get install build-essential fcitx-libs-dev
$ git clone https://github.com/kenhys/fcitx-imlist
$ cd fcitx-imlist
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
```

最初の４行は環境によって必要ないかもしれません（私はここでつまづきました[^1]）。
[^1]: autoreconfが通らなかったのでエラーになり、最初の４行が必要でした。（参考：https://www.limemo.net/blog/2016/04/%E3%80%90%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%91%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A42%E3%81%A7%E3%80%8Cautoreconf-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E8%A6%8B.html）
これでfcitx-imlistのインストールは終わりです。


## 内蔵キーボードの名前
`xinput list`を端末に打ち込んでやります。
Windowsでいうデバイスマネージャーみたいなもんです。

```shell

$ xinput list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ CATEX TECH. 75EC-S                      	id=11	[slave  pointer  (2)]
⎜   ↳ ELAN Touchscreen                        	id=12	[slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad              	id=15	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Fujitsu FUJ02E3                         	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Fujitsu FUJ02B1                         	id=8	[slave  keyboard (3)]
    ↳ Power Button                            	id=9	[slave  keyboard (3)]
    ↳ CATEX TECH. 75EC-S                      	id=10	[slave  keyboard (3)]
    ↳ FJ Camera                               	id=13	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=14	[slave  keyboard (3)]
```

いろいろ出てきましたね。この中から、内臓キーボードのidと括弧の中の数字(以下：マスターNo.）を控えておいてください。後で使います。  
作者の環境では
AT Translated Set 2 keyboard    id=14	[slave  keyboard (3)]
となっていました。

## 肝心のコマンド
![IMEchange.png](https://qiita-image-store.s3.amazonaws.com/0/206650/bfefccce-33d3-5c87-5261-312503caf6f1.png)
上図の画面のfcitx configurationで設定した**入力メソッドオンオフ**は
/home/user/.config/fcitx/config　の3行目の変数**TriggerKey**に格納されます。

![config2.png](https://qiita-image-store.s3.amazonaws.com/0/206650/39a0addc-2d7d-2664-b06c-e3e762fb312d.png)
また、「入力メソッド」タブのmozcをクリックした際にキーボードレイアウトの画面が出てきます。このレイアウトは
/home/user/.config/fcitx/data/layout_override の1行目に記録されます。  
この２つのファイルの該当行をコマンドで書き換えてやればいいわけです。

尊師スタイルをONにするときは

```shell

$ xinput float 14
$ fcitx-imlist -s mozc
$ fcitx-imlist -s fcitx-keyboard-us
$ sed -i 's/mozc,jp/mozc,us/' /home/user/.config/fcitx/data/layout_override
$ sed -i -e '3c\TriggerKey=CTRL_SPACE' /home/user/.config/fcitx/config
```

を実行します。

- 1行目：内蔵キーボードを殺す
- 2,3行目： 直接入力をUS、日本語入力をmozcに変更
- 4行目：mozcを使う際のレイアウトをUS配列に変更
- 5行目：入力メソッド切り替えボタンをCtrl+Spaceに変更


同じように、尊師スタイルをOFFにするときは以下のコマンドを実行します。

```shell

$ xinput reattach 14 3
$ fcitx-imlist -s mozc
$ fcitx-imlist -s fcitx-keyboard-jp
$ sed -i 's/mozc,us/mozc,jp/' /home/user/.config/fcitx/data/layout_override
$ sed -i -e '3c\TriggerKey=CTRL_SPACE ZENKAKUHANKAKU' /home/user/.config/fcitx/config
```


- 1行目：内蔵キーボードを復活させる（ここで先程のマスターNo.が必要）
- 2,3行目： 直接入力をJIS、日本語入力をmozcに変更
- 4行目：mozcを使う際のレイアウトをJPS配列に変更
- 5行目：入力メソッド切り替えボタンをCtrl+Spaceと半角/全角に変更


IME切り替えが他のボタン（Alt空打ち）とかにしたい人はconfigの34,36行目の**ActivateKey,InactivateKey**を書き換えるコマンドを追加すれば可能です。

以上コマンドで、CUI上で尊師スタイルのON, OFFを切り替えることができます。

# 面倒くさいから.shを作った
上のコマンドをまとめました。
https://github.com/MTfirst/Sonshi-Changer
シェルスクリプトは今までまともなものを作ったことが無かったので、正直ここが一番難儀しました。もっと良い書き方があるかもしれません。
4行目で、grepを使って内蔵キーボードのidを取得しています。
他のデバイスと被らないよう、内蔵キーボード固有の名前をgrepに渡すよう、環境に応じて修正してください。

![sonshi-desktop.jpg](https://qiita-image-store.s3.amazonaws.com/0/206650/50da452c-373b-1b52-10dd-5083337c324b.jpeg)
こんな感じで動作します。  
**※たまに入力メソッドの切り替えボタンがうまく効かないことがあります。そのときはfcitxを再起動してみてください。**

# 現在

![sonshi-style.jpg](https://qiita-image-store.s3.amazonaws.com/0/206650/0bed3db2-0035-a1d7-5f31-3f8a64be8b72.jpeg)
こんな感じで使ってます。
NiZはデフォルトの状態だと少し野暮ったいので、しばらくしたらキートップの交換など諸々やっていこうと思います。
ガチガチに静音化してカフェでドヤるのが夢です。


# おわりに
キーボードの沼は深い

# 参考
- fcitx-imlistの作者のサイト
http://www.clear-code.com/blog/2015/6/6.html
- fcitx-imlistのインストール方法
https://www.clear-code.com/blog/2015/6/6.html
- xinputの使い方
https://askubuntu.com/questions/160945/is-there-a-way-to-disable-a-laptops-internal-keyboard
- ランチャーアイコンを作るのに拝借
https://twitter.com/_hp23/status/875773014750543873/photo/1