yoi/tickets/tui-input-word-motion.md

43 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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