ChromeOS IME on Crostini

## はじめに

**この記事は執筆時点 ( 2023/2/3 ) の Experimental 機能についての記事です。
別途開発環境を用意できる方、もしくはクラッシュに見舞われてもへこたれない方向けの内容となっております。ご注意ください。😅**

現在、Chromebook ( ChromeOS ) におきましては、OS 側と Crostini ( Linux ) 側の IME は連携しておらず、シームレスな運用ができておりません。

これはもともと Chromebook の IME が OS のモジュールとしてではなく、[ブラウザ拡張機能 ( NaCl ) として実装されていたこと ( ※ 超初期は ibus ) ](https://bugs.chromium.org/p/chromium/issues/detail?id=171351) が要因の一つとして推測されます。

ただ、[NaCl のサポート終了が発表](https://developers-jp.googleblog.com/2017/06/goodbye-pnacl-hello-webassembly.html) された頃に、[IME を OS 側の Mojo サービスに移行する動き](https://bugs.chromium.org/p/chromium/issues/detail?id=837156) が出てきました。

[M88 の頃](https://qiita.com/htnk/items/44e180f8816e652620a7) には切替準備 ( Experimental flag **ChromeOS IME Service Decoder** ) が進んでいたことが見て取れます。

そして時を経て、[M98 の頃](https://qiita.com/htnk/items/2b27a4ddbc3e0cdb7c80) に **Crostini IME support** という Experimental flag が現れました。

ちょっと興味がわいたので時おり情報をあさっていたところ、[M108 から、限定的な IME サポートをテストする](https://bugs.chromium.org/p/chromium/issues/detail?id=826614) ということだったので、M108 Stable release を機会に試してみることにしました。

## 試行準備

**自分は Lenovo Chromebook 300e (arm64) with US配列 で試しました。Intel系やJIS配列は未試行です。**

まあ、リンク先を読んでみてもらえば分かるとは思いますが、念のために整理すると、

- `chrome://flags/` で `crostini-ime-support` をオン
- M108 にて Crostini を新規インストールした場合には既に `cros-im` モジュールはインストールされていましたが、入っていない場合には `sudo apt install cros-im` でモジュールを導入
- **注：** 既に Fcitx Mozc 等で運用していた場合はコンフリクトしてトラブル可能性がある ( GTK_IM_MODULE に競合IMEが設定されていないことを確認する必要があります。 `env | grep -E 'XMOD|_IM'` 等で確認して [`GTK_IM_MODULE=cros`](https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/vm_tools/cros_im/) でない場合は旧設定の残骸がどこかに残っている可能性があります。 )
- **注：** 現時点でのサポートは Electron アプリ ( VSCode, Discord など ) , Firefox, LibreOffice ( libreoffice-gtk が必要 ) などを含む Gtk アプリ ( Gtk3 Only ? ) に限定
- **注：** Qtのサポートは現在開発中
- **注：** XIMサーバー ( Android Studio など ) を介して他の ( GTK / Qt 以外の ) アプリをサポートする作業はまだ始まっていない

## US配列キーボードを使用してる方へ
現在、デフォルトでは Crostini 側の Linux アプリを使用の際に IME On/Off のショートカットである `Ctrl + space` や `Ctrl + Shift + space` が Crostini 側の Linux アプリに奪われてしまうので使用できません。
( ※ Crostini のデフォルトインターフェースとして使用されている「ターミナル」は OS 側の Web アプリ相当の造りなので別制御です )

開発チームも解決策を探っているようですが、暫定対策としてこちらの [Reddit 投稿](https://www.reddit.com/r/Crostini/wiki/enable-chrome-shortcuts-in-linux-apps/#wiki_related.3A_keyboard_shortcuts_in_default_terminal_app) を紹介されていました。
[Wayland の Accelerators](https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier/#accelerators) に関する機能を用いるようです。

こちらもリンク先を読んでみてもらえば分かるとは思いますが、念のために整理すると、

- `mkdir -p ~/.config/systemd/user/sommelier@.service.d/` で作成したディレクトリの下に `cros-sommelier-override.conf` ファイルを作成
- `mkdir -p ~/.config/systemd/user/sommelier-x@.service.d/` で作成したディレクトリの下に `cros-sommelier-x-override.conf` ファイルを作成
- 各々のファイルに
`[Service]`
`Environment="SOMMELIER_ACCELERATORS=Super_L,<Alt>bracketleft,<Alt>bracketright,<Control>space,<Control><Shift>space"`
と記述
- すべての Linux アプリを閉じ、シェルフの「ターミナル」アイコンを右クリックして「 Linux をシャットダウン」してから、Crostini を再起動すれば変更が適用される

ということです。

## 実行画面
VSCode と Gedit で試してみました。

**VSCode**
![Screenshot_OS-IME_VSCode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/bcb8ab92-84c9-a73b-e5e4-df0f871a1de4.png)

**Gedit**
![Screenshot_OS-IME_Gedit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/90e82408-564f-5829-2f1b-da51cb97f752.png)

**素晴らしい！ Wonderful！ Awesome！！ 👏**

## おわりに
ちょっと感慨深いものがあったので久しぶりに筆を執ってみました。

まあ、ニッチな内容なので閲覧数は少ないと思いますが、IME って OS と密接する特殊なアプリケーションで、かつ、ちょっとガラパゴス的な日本 ( もしくはアジア圏 ) の固有技術的なところもあって、開発リソースや権限が慢性的に不足している感があります。
個人的には、DX化やデジタル化を叫ぶならばその土台となる日本語入力技術に政府や企業はもう少し注力すべきではないかな？ と思ったりもします。
他国の言語に対して周囲はそう簡単にリソースを割かないと思いますので…

そんな中、現在までに日本語入力技術を積み上げられてこられた方々および現在進行形で携わってる方々のご尽力に感謝いたします。🙇