# TUI: 入力欄の単語単位カーソル移動・削除 ## 背景 TUI の入力欄では現在、`Left/Right` で1文字単位の移動、`Home/End` で行端への移動ができるが、単語単位で飛ぶ手段がない。`Backspace` も1文字ずつしか消せない。長めの行を編集するときに左右キーや Backspace を押し続けることになりテンポが悪い。 シェルやエディタで広く使われている `Ctrl+Left` / `Ctrl+Right` での単語単位移動と、`Ctrl+Backspace` での単語単位削除を提供したい。 ## 要件 - `Ctrl+Left` で1単語ぶん後ろ(左)にカーソルが飛ぶ。 - `Ctrl+Right` で1単語ぶん前(右)にカーソルが飛ぶ。 - 「単語」の境界は文字種ベースで判定する: - **ASCII**: 英数字とアンダースコア (`_`) - **ひらがな** (U+3040..U+309F) - **カタカナ** (U+30A0..U+30FF, U+31F0..U+31FF, 半角カナ U+FF65..U+FF9F) - **漢字** (CJK Unified Ideographs: U+3400..U+4DBF, U+4E00..U+9FFF, U+F900..U+FAFF, U+20000..U+2FFFF) - **その他の単語文字**: 上記に該当せず `char::is_alphanumeric()` が true(アクセント付きラテン、キリル、ハングル等をひとまとめ) - 上記以外(空白・句読点・改行)は区切り。 - 同じ種別の連続は1単語、種別が切り替わる位置で境界となる。形態素解析は使わない(送り仮名の途中で切れることは許容、VSCode/emacs と同等の挙動)。 - ペースト atom (`Atom::Paste`) は不可分な1単語として扱う(カーソルが内部に入らない既存の不変条件を維持する)。 - 既存の `Ctrl+Home/End` (履歴のスクロール)や `Ctrl+[` / `Ctrl+]` (ターンジャンプ)と衝突しないこと。 - 既存の `Left/Right`(1文字移動)と `Backspace`(1文字削除)の挙動は変えない。 - `Ctrl+Backspace` でカーソルから1単語ぶん手前を削除する。境界判定は `Ctrl+Left` と同じ(同じロジックを共有)。 ## 完了条件 - `crates/tui` で `Ctrl+Left` / `Ctrl+Right` が単語単位移動として動作する。 - `Ctrl+Backspace` で単語単位削除が動作する。 - 単語境界の判定にユニットテストが付いている(空・連続スペース・`\n` をまたぐ・Paste をまたぐ・ひらがな/カタカナ/漢字/ASCII の混在)。 - 既存テストが通る。 ## 範囲外 - `Ctrl+Delete` / `Alt+d` などによる単語単位の前方削除(別チケット候補)。 - `Alt+Left/Right` など他の単語移動キーバインドの追加。 - 形態素解析による日本語の単語分割(辞書サイズ・起動コストの観点で TUI には過剰)。送り仮名や複合語の途中で切れる挙動は許容する。 ## Review - 状態: Approve - レビュー詳細: [./tui-input-word-motion.review.md](./tui-input-word-motion.review.md) - 日付: 2026-04-29