2.9 KiB
2.9 KiB
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 と同等の挙動)。
- ASCII: 英数字とアンダースコア (
- ペースト 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
- 日付: 2026-04-29