Skip to content

feat: 学習履歴のsurface最大文字数制限とCtrl+Delでの履歴削除を追加#64

Merged
togatoga merged 6 commits into
mainfrom
feat/learning-max-surface-ctrl-delete
Jul 18, 2026
Merged

feat: 学習履歴のsurface最大文字数制限とCtrl+Delでの履歴削除を追加#64
togatoga merged 6 commits into
mainfrom
feat/learning-max-surface-ctrl-delete

Conversation

@togatoga

@togatoga togatoga commented Jul 17, 2026

Copy link
Copy Markdown
Owner

概要

学習履歴まわりの2機能を追加します。

  1. 学習する変換結果の最大文字数制限max_surface_chars(既定50文字)を超える変換結果は学習しません。ライブ変換で文全体を確定するたびに1文まるごとがエントリになり学習キャッシュを圧迫するのを防ぎます。読みの長さは制限しません。
  2. Ctrl+Backspaceで学習履歴から削除 — 変換中に学習候補(📝)を選択して Ctrl+Backspace(macOSでは Ctrl+delete。Ctrl+Delete でも可)を押すと、そのエントリを学習履歴から削除できます。学習候補の選択中は候補ウィンドウのフッターに「Ctrl+Backspaceで履歴から削除」と表示して削除できることを明示します。
[learning]
max_surface_chars = 50  # 学習する変換結果の最大文字数

挙動の要点

  • 削除すると、同じ変換結果を接頭辞違いの読みで持つエントリもまとめて消え、次の変換で復活しません
  • 削除後は候補ウィンドウを開いたまま変換を作り直します。モデル・辞書など学習以外のソースが出す同じ候補は通常候補として残ります
  • 学習候補以外を選択中の Ctrl+Backspace / Ctrl+Delete は何もしません(変換のキャンセルは素の Backspace / Escape)。Ctrl+Alt 付きはアプリへ素通しします
  • 履歴削除のトリガーは変換候補リストで学習候補を選択したときのみ。入力中(サジェスト表示中)の Ctrl+Backspace は通常の文字削除のままです
  • 削除の永続化は既存の保存タイミング(IME切り替え・終了時)です

実装

  • karukan-engine: LearningCache に surface 上限ゲートと remove_suggestion()(接頭辞違いの読みを含む削除)を追加。上限2種は LearningConfig にまとめてコンストラクタで受け取り、後付けセッターを持たない
  • karukan-im: Candidatesource: Option<CandidateSource> を保持し、auxラベルと削除可否を読み出し時に導出(source_label フィールドと from_learning フラグは持たない)。変換状態の Ctrl+Backspace / Ctrl+Delete ハンドラ、auxフッター注釈、[learning] max_surface_chars 設定の配線
  • フロントエンド変更なし: macOS は delete(51)→XK_BackSpace / forward delete(117)→XK_Delete 変換と Ctrl 修飾の伝搬が既にあり、fcitx5 も ControlMask がそのまま流れる。ワイヤプロトコル変更なし(protocol_version 据え置き)

テスト

  • cargo test --workspace 全パス(engine 164+15+28 / im 240 / fcitx5 / cli)
  • 追加テスト: 上限の境界と設定→キャッシュ配線の回帰ガード、履歴削除(接頭辞違いエントリの一括削除・他ソースが出す同一候補の存続・非学習候補では何もしない・Ctrl+Alt の素通し・素のBackspaceのキャンセル維持・入力中は文字削除のまま)、フッター注釈の表示切替

🤖 Generated with Claude Code

togatoga and others added 4 commits July 17, 2026 09:05
Mozcの実装を参考に学習履歴まわりを拡張する。

- 変換結果(surface)が max_surface_chars(既定50文字)を超える確定は
  学習しない。ライブ変換の文全体確定で1文まるごとのエントリが
  キャッシュを圧迫するのを防ぐ(Mozc: kMaxStringLength相当)
- 変換中に学習候補を選択して Ctrl+Del でそのエントリを履歴から削除
  (Mozc: DeleteSelectedCandidate。ClearHistoryEntry + ConvertCancel と
  同じく完全一致で削除して入力状態に戻る)
- 学習候補の選択中はauxテキスト(候補ウィンドウのフッター)に
  「Ctrl+Delで履歴から削除」を表示(Mozc: FillFooter と同文言)
- いずれも config.toml の [learning] で設定可能
  (max_surface_chars = 50)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Macキーボードの「delete」はBackspace(XK_BackSpace)なので、
  Ctrl+Delete(forward delete)に加えて Ctrl+Backspace でも
  学習履歴を削除できるようにする。素のBackspaceは従来どおり
  変換キャンセル
- 削除成功時、Mozcは ConvertCancel で候補ウィンドウが一瞬閉じて
  再表示されるが、karukanはウィンドウを開いたまま該当候補だけを
  リストからその場で取り除く(選択位置は維持、再推論なし)。
  リストが空になった場合のみMozc同様キャンセルにフォールバック

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
実際に押すキーはどちらのOSでもBackspace位置のキー
(macOSの「delete」キーの実体もBackspace)なので、
forward deleteと紛らわしいMozc流の「Ctrl+Del」表記をやめて
「Ctrl+Backspaceで履歴から削除」に統一する。
Ctrl+Delete(forward delete)のバインドは引き続き有効。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
コードレビューで見つかった学習履歴削除まわりの不具合を修正。

- 削除後に候補をその場で消すのをやめ、mozcのcancel-and-reconvertと
  同様に変換を作り直す。これによりモデル/辞書/フォールバックも出す
  表層(dedupで隠れていた分)が通常候補として復活する
- 履歴削除を接頭辞対応(remove_suggestion)にし、同一表層のprefix双子を
  まとめて削除。次変換での復活を防ぐ
- Ctrl+Delete/Ctrl+Backspaceは、選択が学習候補でなければ何もしない
  (mozcのDoNothing)に統一。キャンセルは素のBackspace/Escapeが担う
- Ctrl+Alt+Delete/Backspaceは履歴を消さずアプリへ素通り
- 入力中(Composing)のサジェスト窓でもCtrl+Backspaceで先頭の学習候補を
  削除できるようにし、文字が消える不具合を修正
- max_surface_charsの設定→キャッシュ配線に回帰テストを追加

あわせて候補生成のマッピング共通化などのクリーンアップを実施。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@togatoga
togatoga force-pushed the feat/learning-max-surface-ctrl-delete branch 4 times, most recently from 47ece15 to 4b373ad Compare July 18, 2026 07:59
機能変更なしのリファクタリング(-41行)。

- Candidateのsource_label/from_learningを廃止し、CandidateSource自体を
  source: Option<CandidateSource>として保持。ラベルと削除可否は読み出し
  時に導出(source_label()/is_deletable())し、2つの派生値が食い違う
  余地をなくす。enumはcore/candidate.rsへ移動
- 学習キャッシュの上限2種をLearningConfigにまとめ、new/loadの引数に。
  set_max_surface_charsセッターを廃止し、設定値の適用漏れを型で防ぐ
- 削除方式の作り直し化で不要になったCandidateList::remove_selectedと
  LearningCache::remove(exact一致版)を削除
- CLAUDE.md/READMEの履歴削除の記述を現仕様(作り直し・prefix双子削除・
  非学習候補はDoNothing・サジェスト窓対応)に同期

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@togatoga
togatoga force-pushed the feat/learning-max-surface-ctrl-delete branch from 4b373ad to eb159b2 Compare July 18, 2026 08:01
入力中(Composing)の Ctrl+Backspace によるサジェスト先頭の学習候補
削除を撤回し、従来どおりの文字削除に戻す。削除ヒントが表示されず
押す動機のない場面で、文字を消す意図のキーが不可逆な履歴削除に
化けるのを避ける。履歴削除は変換候補リストで学習候補を選択して
Ctrl+Backspace の一本道のみとする。

あわせて README / default.toml の学習まわりの記述をユーザー視点に
整理(内部用語・実装挙動の説明を削除)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@togatoga
togatoga merged commit 7747e2a into main Jul 18, 2026
19 checks passed
@togatoga
togatoga deleted the feat/learning-max-surface-ctrl-delete branch July 18, 2026 08:40
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