Skip to content

feat: Slack風の絵文字入力モードを追加#316

Open
nyanko3141592 wants to merge 4 commits intomainfrom
feature/emoji-input
Open

feat: Slack風の絵文字入力モードを追加#316
nyanko3141592 wants to merge 4 commits intomainfrom
feature/emoji-input

Conversation

@nyanko3141592
Copy link
Copy Markdown
Collaborator

Summary

  • 日本語入力中に全角コロン (設定で変更可) を押すと、Slack/Discord 互換のショートネームで絵文字を検索・挿入できる絵文字入力モードを追加
  • 変換中 (.composing / .previewing / .selecting) にトリガーを打っても composing を保持したまま絵文字を挿入する「入れ子モード」対応
  • 設定ウィンドウ「カスタマイズ」タブから ON/OFF と起動トリガー文字をカスタマイズ可能

使い方

  • 日本語モードで を打つと が markedText に表示される
  • 続けて smile のように英字を入力するとインクリメンタルに絵文字候補が絞り込まれる
  • ↑↓で候補選択、Enter または もう一度 で確定
  • Escape または空の状態で Backspace でキャンセル
  • 変換中に打った場合は composing を破棄せず、絵文字を合流させて変換継続可能

実装ハイライト

  • InputState.emojiInput(String).emojiInputNested(String) を追加
  • 共通ロジックは handleEmojiInputEvent ヘルパに集約
  • 絵文字データは iamcal/emoji-data (MIT License) の emoji.json を使用フィールドのみに絞り込み 1.3MB → 136KB にスリム化してバンドル
  • 候補ウィンドウの幅計算を annotation 実幅ベースに修正(絵文字がクリップされる副作用も修正)

Test plan

  • 設定ウィンドウ > カスタマイズ > 「絵文字入力」セクションが表示される
  • 日本語モードで何も入力していない状態で → 絵文字モード突入
  • :smile → 😄 候補が表示され Enter で確定
  • ↑↓で候補移動
  • 変換中の「こんにちは」に :thumbsup → Enter で「こんにちは👍」が composing のまま残る
  • Escape で :query が破棄され composing が復活する
  • 設定で絵文字入力を OFF にすると が通常入力として扱われる
  • トリガー文字を などに変更して動作する
  • Core のユニットテスト (EmojiDictionary 6件 + InputState 18件) が通る

🤖 Generated with Claude Code

Naoki Takahashi and others added 4 commits April 18, 2026 17:33
日本語モードで全角コロン「:」(設定で変更可)を押すと絵文字入力モードへ
遷移し、shortname で絵文字候補を検索して挿入できる機能を追加した。

- iamcal/emoji-data (1911件) を Core パッケージにバンドル
- InputState に .emojiInput(String) ケースを追加
- Config に EmojiInputEnabled / EmojiInputTrigger を追加
- ConfigWindow「カスタマイズ」タブに絵文字入力セクションを追加
- 候補ウィンドウの幅計算で annotation 実幅を考慮 (副作用調整込み)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
以前は変換中に「:」を押すと composing が確定されて絵文字モードへ
遷移していたが、composing を保持したまま絵文字を合流させるよう変更。

- InputState に .emojiInputNested(String) を追加
- .composing / .previewing / .selecting から「:」で nested モードへ
- nested モードでは markedText を「composing + :query」と連結表示
- 絵文字確定時は composing に絵文字を追加して .composing に戻る
- 確定誤認を防ぐため nested の composing 部分は .unfocused (薄い下線)
- 未使用になった .commitMarkedTextAndEnterEmojiInputMode を削除
- 共通ロジックは handleEmojiInputEvent ヘルパに集約

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- emoji.json を使用フィールド (unified/short_names/sort_order) のみに
  絞り込み、サイズを 1.3MB → 136KB (89.6%削減)
- EmojiDictionary.search と InputState の絵文字関連遷移に対する
  ユニットテストを追加 (計24件)
- InputState.event() の emoji 関連デフォルト引数に、InputController
  以外の経路から誤発動しないための設計意図をコメントで追記
- README に絵文字入力機能の説明と、iamcal/emoji-data (MIT License)
  のサードパーティデータ表記を追加

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- RawEmoji の snake_case プロパティ (short_names/sort_order) を
  CodingKeys 経由で camelCase にマッピング
- handleEmojiInputEvent の cyclomatic_complexity 警告を既存の event と
  同じパターンで lint 無効化コメントを追加
- 実装で自明に担保される冗長テスト 2 件を削除
  - testEmojiDictionaryEntriesLoaded (他の search テストでロード担保済み)
  - testMultiCharTriggerDoesNotFireOnSingleKey (実装上不可な動作)
- disabled 時に composing 中の「:」が通常入力として扱われる
  エッジケーステストを追加

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant