Crostiniのfcitxで１文字ずつ勝手に確定される問題の解決方法（暫定）

# 追記：2020-08-17（２回目）

~~[QTerminal](https://wiki.archlinux.jp/index.php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E4%B8%80%E8%A6%A7#.E3.82.BF.E3.83.BC.E3.83.9F.E3.83.8A.E3.83.AB.E3.82.A8.E3.83.9F.E3.83.A5.E3.83.AC.E3.83.BC.E3.82.BF)というその名の通りQtを使うターミナルエミュレータを試したところ，無事に日本語入力をすることができた．特にこだわりがなければこれが最もシンプルな解決方法かもしれない．~~

Qterminalはシンプル過ぎて少々扱いが難しいので[Konsole](https://ja.wikipedia.org/wiki/Konsole)がおすすめ．依存パッケージが多いが多分これが一番使いやすいと思います．フルスクリーンにしても白いタイトルバーが残る場合はフルスクリーンボタン(F4キーに相当)を押してみてください．

# 本記事の内容

- Crostini上のターミナルエミュレータの文字が勝手に確定する問題の解決（暫定）

お急ぎの方は[結論だけご覧ください](#結論)

# 入力した文字列が確定される原因の調査

Crostiniではfcitxを使い日本語入力をする事ができる．
しかし，ターミナルエミュレータ上で勝手に入力した文字が確定される問題があった．

![non_qt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204952/1517c130-24e4-ccde-5b43-7cf843d1e668.gif)

ちなみに画面の録画には[Awesome Screenshot](https://chrome.google.com/webstore/detail/awesome-screenshot-screen/nlipoenfbbikpbjkfpfillcgkoblgpmj?hl=ja)を使った．Chromeの拡張機能だが
Linuxアプリケーションの録画もできる．

たちの悪いことに，いきなり治ったり，そうかと思えばまた問題が発生したりする．
また，ターミナルエミュレータを変えても問題が解決しないため，この問題に関しては正直お手上げであった．
せめて原因がわかれば…

# VSCodeが起動していると治る？

この問題に関しては諦めていたが，ネットサーフィンをしていて偶然素晴らしい記事を見つけた．

[fcitx-mozc on Chrome OSトラブル](https://scrapbox.io/hibi/fcitx-mozc_on_Chrome_OS%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB)

ScrapboxにLGTM機能があれば捨て垢を作って100回ぐらいLGTMボタンを押したのだが…無念

実際にVSCodeを起動させて確認するとfcitxは正常に機能した．

# これで解決？

これからはVSCodeを起動させてから端末を叩こう！
<br><br><br>とはならない．さすがに毎回VSCodeを起動するのは無駄過ぎる．

## 原因を調べよう

### VSCodeのログを見る

VSCodeを起動すると何故治るのか．何が解決に寄与しているのかを調べる．
VSCodeは端末から起動するときに

```
code --verbose
```
とオプションをつけることでログを表示することができる．よって

```
code --verbose 2>&1 | tee vscode.log
```

これでログを確認すれば…

```
                                                                        :
                                                                        :
[25373:0817/213940.007422:INFO:CONSOLE(1679)] "%cTRACE color: #888 [Decorations] getOrRetrieve -> FETCH エクスプローラー [object Object]", source: file:///usr/share/code/resources/app/out/vs/workbench/workbench.desktop.main.js (1679)
[25373:0817/213940.011875:INFO:CONSOLE(1679)] "%cTRACE color: #888 [Decorations] keepItem -> CANCEL previous エクスプローラー [object Object] undefined", source: file:///usr/share/code/resources/app/out/vs/workbench/workbench.desktop.main.js (1679)
[25373:0817/213940.016737:INFO:CONSOLE(1679)] "%cTRACE color: #888 [Decorations] getOrRetrieve -> FETCH エクスプローラー [object Object]", source: file:///usr/share/code/resources/app/out/vs/workbench/workbench.desktop.main.js (1679)
[25373:0817/213940.022710:INFO:CONSOLE(1679)] "%cTRACE color: #888 [Decorations] keepItem -> CANCEL previous エクスプローラー [object Object] undefined", source: file:///usr/share/code/resources/app/out/vs/workbench/workbench.desktop.main.js (1679)
[25373:0817/213940.037396:INFO:CONSOLE(1679)] "%cTRACE color: #888 [Decorations] getOrRetrieve -> FETCH エクスプローラー [object Object]", source: file:///usr/share/code/resources/app/out/vs/workbench/workbench.desktop.main.js (1679)
[25373:0817/213940.057228:INFO:CONSOLE(1679)] "%cTRACE color: #888 [Decorations] keepItem -> CANCEL previous エクスプローラー [object Object] undefined", source: file:///usr/share/code/resources/app/out/vs/workbench/workbench.desktop.main.js (1679)
[25373:0817/213940.069567:INFO:CONSOLE(1679)] "%cTRACE color: #888 [Decorations] getOrRetrieve -> FETCH エクスプローラー [object Object]", source: file:///usr/share/code/resources/app/out/vs/workbench/workbench.desktop.main.js (1679)
[25373:0817/213940.071169:INFO:CONSOLE(1679)] "%cTRACE color: #888 [Decorations] keepItem -> CANCEL previous エクスプローラー [object Object] undefined", source: file:///usr/share/code/resources/app/out/vs/workbench/workbench.desktop.main.js (1679)
[25373:0817/213940.076690:INFO:CONSOLE(1679)] "%cTRACE color: #888 [Decorations] getOrRetrieve -> FETCH エクスプローラー [object Object]", source: file:///usr/share/code/resources/app/out/vs/workbench/workbench.desktop.main.js (1679)
                                                                        :
                                                                        :

```

なるほど，わからん．

### fcitx-dbus-statusを使いたかった

[fcitx-dbus-status](https://github.com/clear-code/fcitx-dbus-status)
というツールが有り，これを使うとfcitxの状態の監視ができるらしい．
まずはCmakeをインストールし，

```
sudo apt install cmake 
```

その後，
公式の手順に従うとインストールできるらしい．が

```
git clone https://github.com/clear-code/fcitx-dbus-status.git
cd fcitx-dbus-status
mkdir build
cd build
cmake ..

                                :
                                :
CMake Error at CMakeLists.txt:5 (FIND_PACKAGE):
  By not providing "FindFcitx.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "Fcitx", but
  CMake did not find one.

  Could not find a package configuration file provided by "Fcitx" (requested
  version 4.2.9.2) with any of the following names:

    FcitxConfig.cmake
    fcitx-config.cmake

  Add the installation prefix of "Fcitx" to CMAKE_PREFIX_PATH or set
  "Fcitx_DIR" to a directory containing one of the above files.  If "Fcitx"
  provides a separate development package or SDK, be sure it has been
  installed.


-- Configuring incomplete, errors occurred!
See also "/home/tomohiromorita7/fcitx-dbus-status/build/CMakeFiles/CMakeOutput.log".
```

怒られた😢

### GUIツールキットが関係している？

ここである仮説を立てた．Linux上のGUIアプリケーションは主に

- GTK
- Qt

のどちらかを使用している（もちろん他にもある）．
このどちらかのアプリケーションを起動すれば解決するのではないかと考えた．

#### GTK

GTK使うアプリの代表として[mousepad](https://linuxappdata.com/software/3/)
を選んだ．これは，非常にシンプルで軽量なテキストエディタである．
公式のリポジトリにあるので普通にaptでインストールできる．

```
sudo apt install mousepad
```

mousepadを起動して端末の状態を調べようしたが…

![mousepad.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204952/068d24e5-84fa-b3c7-981d-d949ac6a14e0.gif)

普通にアプリケーションで同じ問題が発生した．えぇ…

#### Qt

次に，Qtを使うアプリとして[FeatherPad](https://wiki.archlinux.jp/index.php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E4%B8%80%E8%A6%A7/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88#.E3.83.86.E3.82.AD.E3.82.B9.E3.83.88.E3.82.A8.E3.83.87.E3.82.A3.E3.82.BF)を選んだ．
こちらも公式のリポジトリからインストールできる．

```
sudo apt install featherpad
```

早速起動してみると

![featherpad.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204952/79ac88de-0c46-0f8a-1c32-a23baa6df165.gif)

無事に日本語入力ができた．
次に，FeatherPadを開いた状態で端末に日本語入力をしてみる．

![with_qt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204952/4a2c34ca-68db-edf1-4b50-dd0ab05ec752.gif)

無事に日本語入力できた！！（画面が荒ぶっているのはご愛嬌）

# 結論

Qtを使用するアプリケーションがバックで動いていると解決する？

より踏み入った解決方法を模索したいが期末課題に追われているので今回はここまで．
ムネン　アトヲ　タノム

追記：2020-08-17
~~[QTerminal](https://wiki.archlinux.jp/index.php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E4%B8%80%E8%A6%A7#.E3.82.BF.E3.83.BC.E3.83.9F.E3.83.8A.E3.83.AB.E3.82.A8.E3.83.9F.E3.83.A5.E3.83.AC.E3.83.BC.E3.82.BF)はQtで動作するターミナルエミュレータである．動作を確認したところ，単体で正しく日本語入力ができた．現状はこれがベストプラクティスかもしれない．~~

追記：2020-08-17（2回目）
色々試した結果[Konsole](https://ja.wikipedia.org/wiki/Konsole)が一番使いやすいと思います．依存パッケージが多いのが玉に瑕ですがそれ以外は完璧だと思います．

# 参考文献

[fcitx-mozc on Chrome OSトラブル](https://scrapbox.io/hibi/fcitx-mozc_on_Chrome_OS%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB)
[fcitx-mozcの入力モードを外部プロセスから制御する](https://www.clear-code.com/blog/2018/9/6.html)
[テキストエディタ](https://wiki.archlinux.jp/index.php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E4%B8%80%E8%A6%A7#.E3.83.86.E3.82.AD.E3.82.B9.E3.83.88.E3.82.A8.E3.83.87.E3.82.A3.E3.82.BF)