文節伸縮・選択仕様
本ドキュメントは、Akaza における文節の伸縮操作(Shift+→ / Shift+←)と 文節選択(← / →)の実装仕様をまとめたものです。 実装の挙動を基準として記述しています。
用語
- 文節: 変換候補が提示される単位(例:
わたし|は|がっこう) - 選択中の文節: カーソル/ハイライトが当たっている文節
- 読み(かな): 変換対象となる文字列(ひらがな)
文節伸縮(Shift+→ / Shift+←)
- Shift+→ は 選択中の文節の読みを右へ1文字伸ばす。
- Shift+← は 選択中の文節の読みを左へ1文字伸ばす。
- 文節の伸縮に伴って 隣接文節は逆方向に1文字縮む。
- 伸縮後も 選択中の文節のフォーカスは維持する。
文節選択(← / →)
- ← / → は 選択中の文節を左右に移動する。
- 文節が2つ以上ある場合、押下ごとに 必ず選択が変わる。
- 端に到達した場合は 反対側に回り込む(ラップする)。
- 文節が0または1の場合、選択は変わらない。
例
右に伸ばす(Shift+→)
入力: わたしはがっこう
初期: わたし|は|がっこう
-
選択:
わたし
Shift+→ 1回:わたしは|がっこう
(次の文節「は」から1文字移動) -
選択:
は
Shift+→ 1回:わたし|はが|っこう
(次の文節「がっこう」から1文字移動)
左に伸ばす(Shift+←)
入力: わたしはがっこう
初期: わたし|は|がっこう
-
選択:
は
Shift+← 1回:わた|しは|がっこう
(左の文節「わたし」から末尾1文字を移動) -
選択:
がっこう
Shift+← 1回:わたし|はがっこう
端の挙動
- 右端の文節で Shift+→ を押しても、文節構成は変化しない。
- 左端の文節で Shift+← を押した場合:
- 左端が1文字なら変化しない
- 左端が2文字以上なら末尾1文字を右隣へ移動する
- 例:
- 初期:
わだ|た|そ(左端が2文字)- 選択:
わだ - Shift+← 1回:
わ|だた|そ
- 選択:
- 初期:
わ|た|そ(左端が1文字)- 選択:
わ - Shift+← 1回:
わ|た|そ(変化なし)
- 選択:
- 初期:
例外/注意点
- 伸縮によって 隣接文節が消滅する場合は、文節数が減る。
- サロゲートやマルチバイト文字は 1文字単位で扱う。
- 変換候補が空の場合は 現状維持とする。
force_selected_clause
変換エンジンに「強制的な分節境界」を渡すための内部状態。
Shift+矢印による文節伸縮の結果は、force_selected_clause に保持され、
次回の変換に反映される。
- 格納内容: 文字列内の範囲(
Range<usize>)の配列。各範囲は1文節を表す。 - 更新タイミング: Shift+→ / Shift+← の操作時。
- 消去タイミング:
- 生入力が変わったとき(
on_raw_input_change内) - 明示的にクリアしたとき(
clear_force_selected_clause)
- 生入力が変わったとき(
- 適用タイミング:
engine.convert(..., Some(&force_selected_clause))で再変換に使用。
- 文節選択への影響:
force_selected_clauseがある場合、再変換してもcurrent_clauseは維持される(set_clauses内の条件分岐)。