README.md (3719B)
1 # pim - A Lightweight Minimalist Text Editor written in Rust 2 3 `pim` は、Rustで開発されるテキストエディタである。初期実装として `nano` のようなミニマリズムと省メモリ設計(オンデマンド読み込み)を採用しつつ、内部構造は `vim` のようなモード管理(ステートマシン)が可能なアーキテクチャを採用する。 4 5 ## 1. 動作環境・技術スタック 6 7 * **Language**: Rust (Edition 2024) 8 * **TUI Framework**: `ratatui` 9 * **Terminal Control (Backend)**: `crossterm` 10 * **Target OS**: Linux, macOS, Windows 11 12 --- 13 14 ## 2. コア仕様 (Specifications) 15 16 ### 2.1. モード管理 (State Machine) 17 起動時は常に `Normal` モードから開始する。入力されたキーイベントは直接テキストバッファに渡されず、現在のモードに応じて `Action` に変換されてから処理される。 18 19 * **Normal モード** 20 * `i`: `Insert` モードへ移行 21 * `h`, `j`, `k`, `l`: カーソル移動 22 * `w`: ファイルの保存 23 * `u`: Undo (前回の保存時点までロールバック) 24 * `q`: エディタの終了 25 * **Insert モード** 26 * `Esc`: `Normal` モードへ移行 27 * 一般文字キー: カーソル位置への文字挿入 28 * `Backspace`: 文字の削除 29 30 ### 2.2. 省メモリ設計 (On-demand File I/O) 31 1. **行インデックス化**: ファイルオープン時、各行の開始バイト位置のみを記録し、メモリ消費を抑える。 32 2. **オンデマンド描画**: 画面の表示範囲のみを `seek` して読み込む。 33 3. **差分バッファ管理**: 編集内容は `HashMap` で管理し、元の巨大ファイルを読み書きする負荷を最小化する。 34 35 ### 2.3. データ保護 (Swap File & Safety) 36 1. **スワップファイル**: 編集内容は自動的に `.swp` ファイルへ同期(Insertモード終了時にバッチ書き込み)。 37 2. **リカバリ機能**: クラッシュ後の再起動時に未保存の変更を復元可能。 38 3. **アトミック保存**: 保存時は一時ファイルを作成してから置換し、改行コードは常に `LF` に統一される。 39 40 --- 41 42 ## 3. 実装ステップ (Implementation Roadmap) 43 44 ### フェーズ 1: ターミナル制御とモード遷移の確立 (土台) 45 * [x] Rawモードの有効化とオルタネイトスクリーンの展開 46 * [x] 画面最下部へのステータスバー(現在の `Mode` 表示)の配置 47 * [x] キー入力イベントから `Action` への変換およびモード遷移のテスト 48 49 ### フェーズ 2: 巨大ファイルのインデックス化と部分読み込み (閲覧) 50 * [x] ファイルをスキャンし、改行コードを元に `LineIndex` を生成するロジックの実装 51 * [x] ターミナルの行数分だけファイルを `seek` して読み込む描画ロジックの実装 52 * [x] 矢印キー(または `j`/`k`)によるスクロール移動の実装 53 * [x] 行番号の表示実装 54 55 ### フェーズ 3: 差分バッファの動的適用 (編集) 56 * [x] `DeltaBuffer` のデータ構造の定義 57 * [x] スワップファイル(`.swp`)による自動保存とリカバリプロンプトの実装 58 * [x] ビジュアルカーソルの実装と行内移動(`h`/`l`)の対応 59 * [x] Insertモード終了時の一括スワップ同期(パフォーマンス最適化) 60 61 ### フェーズ 4: アトミックな書き込み (保存) 62 * [x] 常に `LF` 形式での保存ロジックの実装 63 * [x] `u` キーによる保存単位のロールバック(ハイブリッド・スワップ管理) 64 * [x] 終了時の未保存変更チェックとクリーンアップ 65 66 --- 67 68 ## 4. 使い方 69 70 ```bash 71 cargo run -- <filename> 72 ```