Minecraft で日本語などの IME 入力を、普通のテキストボックスと同じ感覚で使えるようにする MOD。
現在の対応:
| バージョン | ローダー | 対応 OS |
|---|---|---|
| 1.20.1 | Forge 47.x | Windows のみ |
| 26.2 | Forge 65.x | 全プラットフォーム |
26.2 は Minecraft 自体が GLFW の入力メソッド対応を備えているため、OS 固有の処理が不要です。1.20.1 は同梱される GLFW に入力メソッド対応が無く、Windows の API を直接利用するため Windows 専用です。
| 症状 | 原因 | 対応 |
|---|---|---|
| 変換中の文字(未確定文字列)がテキスト欄に出ない | GLFW 3.3.1 が WM_IME_* を一切処理しないため、未確定文字列がゲームに届く経路が存在しない |
ウィンドウプロシージャをフックして IMM32 から直接読み取り、キャレット位置にインライン描画 |
| 変換候補ウィンドウが画面の隅に出る | ImmSetCandidateWindow が呼ばれていないので既定位置になる |
候補ウィンドウをキャレットの真下に追従させる |
| 変換中の文字が画面の変な位置に二重に出る | Windows が独自に未確定文字列を描画している | WM_IME_STARTCOMPOSITION を IME ウィンドウへ渡さず、自前描画に一本化 |
| IME を ON にしたままだと WASD などで動けなくなる | IME が握ったキーは VK_PROCESSKEY になり、GLFW がイベントごと破棄する |
テキスト欄にフォーカスが無い間は IME をウィンドウから切り離す |
| 変換の途中でクリックすると入力が消える | 未確定文字列はどこにも保存されていない | 離脱の瞬間に、入力していた欄へそのまま確定する |
| 変換途中の文字が別の検索欄に移動する | 未確定文字列はゲーム全体で 1 つの状態なので、フォーカスが移ると付いていってしまう | 同上。フォーカスが移る前に確定させる |
| 変換を確定するまで検索結果が絞り込まれない | IME のキー入力はゲームに届かないので、画面が「文字が入力された」ことに気づけない | 未確定のまま検索に反映する(下記) |
| どの文節を変換中か分からない | — | 変換対象の文節をハイライト、確定済みの文節に下線を表示 |
未確定文字列はテキスト欄の中に表示されるため、長い文章でも欄の横スクロールが正しく追従します。
「ダークオーク」を探すとき、「ダーク」と打った変換確定前の段階で候補が絞り込まれます。クリエイティブインベントリの Search Items、JEI の検索窓、レシピ本の検索窓で機能します。
入力欄に保存されている値そのものは一切変更していないため、確定しても破棄しても文字が重複したり消えたりすることはありません(変換中は「未確定文字を含んだ値」を報告しているだけです)。
net.minecraft.client.gui.components.EditBox を使う入力欄すべてに自動的に効きます。個別対応のコードは書いていません。
- チャット欄
- クリエイティブインベントリの Search Items
- レシピ本の検索窓
- JEI の検索窓(
GuiTextFieldFilterがEditBoxを継承しているため) - サーバー追加画面、ワールド名、コマンドブロック など
これらは EditBox を使わず自前でテキストを描画しているため、個別に対応しています。
- 看板(通常・吊り看板の両方、4 行すべて)
- 本と羽ペン(本文および署名時のタイトル)
いずれも変換中の文字がその場に表示され、候補ウィンドウがカーソルに追従します。
看板は「表示幅」、本のページは「行数と文字数」で上限が決まっているため、変換中の文字がそのまま全部入るとは限りません。そこで確定時に入りきらない部分に色を付けて、どこで切れるかが見えるようにしています。
- 水色: 次の行 / 次のページへ送られる
- 赤: 収まりきらず捨てられる
看板では残りの行に実際どれだけ入るかを幅で計算しているため、長く変換すると途中で水色から赤へ切り替わります。下の行に既に文字があれば、そのぶん赤の始まりが早くなります。
色は設定で変更できます。
IME とは独立した、テキスト入力そのものの改善です。日本語に限らず半角英数字でも動作し、文字が確定した時点で処理されます。設定で個別に無効化できます。
| 機能 | 内容 |
|---|---|
| 看板の自動折り返し | 行の幅に入らない文字を次の行へ送ります。バニラは黙って捨てます |
| 本の自動次ページ | ページに入らない文字を次のページへ送ります(必要ならページを追加) |
config/imehotfix.properties(初回起動時に生成。項目が増えた場合は起動時に追記されます)
| キー | 既定 | 効果 |
|---|---|---|
disableImeOutsideTextFields |
true |
テキスト欄にフォーカスが無い間 IME を切り離す。WASD が効かなくなる問題の対策なので通常は変更しない |
suppressSystemCompositionWindow |
true |
Windows 既定の未確定文字列ウィンドウを隠す。IME が候補を出さなくなる場合はここを false に |
inlinePreedit |
true |
未確定文字列をテキスト欄内に描画する。false にすると描画を Windows 側へ返す |
pinCandidateWindowToCaret |
true |
候補ウィンドウをキャレットに追従させる |
filterWithComposition |
true |
変換確定前の文字でも検索を絞り込む |
commitCompositionOnBlur |
true |
クリックやフォーカス移動で入力欄を離れるとき、未確定文字列をその欄へ確定する |
cancelCompositionOnFocusLoss |
true |
画面が閉じるなど、確定先が無くなった場合に未確定文字列を破棄する |
highlightOverflow |
true |
確定時に入りきらない部分に色を付ける |
verboseLogging |
false |
IME のウィンドウメッセージをすべてログに出す(診断用) |
| キー | 既定 | 効果 |
|---|---|---|
targetTint |
0x40FFFFFF |
変換中の文節の背景 |
targetUnderline |
0xFFFFFFFF |
変換中の文節の下線 |
clauseUnderline |
0xFFA0A0A0 |
確定済みの文節の下線 |
errorUnderline |
0xFFFF5555 |
IME が解釈できなかった入力の下線 |
overflowWrapTint |
0x6033CCFF |
次の行 / ページへ送られる部分の背景 |
overflowDropTint |
0x60FF3333 |
捨てられる部分の背景 |
#RRGGBB 形式でも指定できます。
| キー | 既定 | 効果 |
|---|---|---|
signAutoWrap |
true |
看板の自動折り返し |
bookAutoPage |
true |
本の自動次ページ |
26.2 のバニラは既に IME に対応しています。この MOD が置き換えるのは以下です。
| バニラ 26.2 | この MOD | |
|---|---|---|
| 未確定文字の表示 | 入力欄の外に浮かぶ白いボックス | 入力欄の中にインライン表示 |
| 変換確定前の検索 | 反映されない | 反映される |
| 看板の自動折り返し | 無し | あり |
| 本の自動次ページ | 無し | あり |
| 入りきらない文字の可視化 | 無し | あり |
26.2 の本と羽ペンでのみ、以下が確認されています。検索窓・看板・チャットでは発生しません。
- 未確定文字が長くなると、下線が前半に付かないことがある
- 未変換のまま長く打ち続けると、変換が勝手に確定されることがある
回避したい場合は config/imehotfix.properties の inlinePreedit を false にしてください。本を含むすべての箇所でバニラの表示(浮動ボックス)に戻ります。
1.20.1 は JDK 17、26.2 は JDK 25 が必要です。
cd forge-1.20.1 # または forge-26.2
gradlew build # 成果物は build/libs/
gradlew runClient # 開発クライアントを起動
core/ MC に一切依存しない共通実装(Java 8 文法)
forge-1.20.1/ Windows の IMM32 を直接利用する実装
forge-26.2/ MC 自身の入力メソッド機能に乗る実装
core は Minecraft の API を一切参照しません。プラットフォーム差は ImeBackend の実装を差し替えることで吸収しており、26.2 対応では core を 1 行も変更していません。詳細と移植時の注意点は IMPLEMENTATION_PLAN.md を参照してください。
- 1.20.1: Windows のみ、64bit JVM 必須。macOS / Linux では何もせずバニラの挙動になります(クラッシュはしません)
- 26.2: プラットフォーム制限なし
- いずれもクライアント専用。サーバーには不要です
GNU Lesser General Public License v3.0 or later (LICENSE / LICENSE.GPL)