# 機能設計書 8-起動最適化

## 概要

本ドキュメントは、Doom Emacsの起動最適化システム（doom-start.el）の機能設計を記述する。このシステムは、Emacsの起動時間を大幅に短縮するための各種最適化と、インタラクティブセッションの初期化処理を担当する。

### 本機能の処理概要

**業務上の目的・背景**：Emacsは機能が豊富な反面、起動時間が長くなりがちである。Doom Emacsは、遅延読み込み、ランタイム最適化、インクリメンタルローディングなどの技術を活用し、1秒以内の起動を目指している。

**機能の利用シーン**：
- Emacsの起動時
- daemon起動時
- パッケージの遅延読み込み時

**主要な処理内容**：
1. ランタイム最適化（双方向テキスト、カーソル、スクロール等）
2. UI要素の無効化（メニューバー、ツールバー、スクロールバー）
3. エンコーディング設定（UTF-8）
4. MODE-local-vars-hook機構
5. インクリメンタルパッケージローディング
6. 起動ベンチマーク表示
7. プロファイル初期化

**関連システム・外部連携**：doom.el、gcmhパッケージ

**権限による制御**：特になし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 起動処理のため直接的な画面関連なし |

## 機能種別

起動処理 / パフォーマンス最適化

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| doom-incremental-first-idle-timer | number/nil | No | 初回遅延読み込み待機時間（秒） | 0以上 |
| doom-incremental-idle-timer | number | No | 遅延読み込み間隔（秒） | 0以上 |
| doom-incremental-packages | list | No | 遅延読み込みパッケージリスト | シンボルリスト |

### 入力データソース

- Emacsビルトイン変数
- システム情報
- ユーザー設定

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| doom-init-time | float | 起動時間（秒） |
| ベンチマーク表示 | message | パッケージ数・モジュール数・起動時間 |

### 出力先

- doom-init-time変数
- *Messages*バッファ（ベンチマーク時）

## 処理フロー

### 起動最適化シーケンス

```
1. ランタイム最適化
   └─ bidi-display-reordering = left-to-right
   └─ bidi-inhibit-bpa = t
   └─ cursor-in-non-selected-windows = nil
   └─ fast-but-imprecise-scrolling = t
   └─ inhibit-compacting-font-caches = t
   └─ read-process-output-max = 64KB
2. UI要素無効化
   └─ menu-bar-lines = 0
   └─ tool-bar-lines = 0
   └─ vertical-scroll-bars = nil
3. エンコーディング設定
   └─ UTF-8環境設定
4. gcmh-mode有効化
   └─ GC最適化
5. プロファイル初期化ファイル読み込み
```

### フローチャート

```mermaid
flowchart TD
    A[Emacs起動] --> B[doom-start.el読み込み]
    B --> C[ランタイム最適化適用]
    C --> D[UI要素無効化]
    D --> E[エンコーディング設定]
    E --> F[gcmh-mode有効化]
    F --> G{daemon?}
    G -->|Yes| H[即時パッケージ読み込み]
    G -->|No| I[doom-incremental-first-idle-timer待機]
    I --> J[インクリメンタルローディング開始]
    H --> K[プロファイル初期化]
    J --> K
    K --> L[doom-display-benchmark-h]
    L --> M[起動完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 初回遅延時間 | daemon時は0秒、通常時は2.0秒 | doom-incremental-first-idle-timer |
| BR-02 | 遅延読み込み間隔 | 0.75秒 | doom-incremental-idle-timer |
| BR-03 | GC閾値 | アイドル時64MB | gcmh-high-cons-threshold |
| BR-04 | プロセス出力バッファ | 64KB | read-process-output-max |
| BR-05 | macOSメニューバー | GUI時は有効、TTY時は無効 | doom--system-macos-p |

### インクリメンタルローディング

パッケージ読み込み順序:
1. アイドル状態を検知
2. doom-incremental-packagesから1つずつ読み込み
3. 入力があれば中断して再開をスケジュール
4. すべて読み込み完了まで繰り返し

## データベース操作仕様

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パッケージ読み込みエラー | require失敗 | エラーメッセージ表示、継続 |
| - | プロファイル初期化エラー | init.el不在 | 警告表示 |

### リトライ仕様

特になし

## トランザクション仕様

該当なし

## パフォーマンス要件

- 目標起動時間: 1秒以内
- GCによる一時停止を最小化
- 入力応答性の維持（インクリメンタルローディング）

## セキュリティ考慮事項

特になし

## 備考

- Emacs 29+ではネイティブコンパイルによる追加最適化
- Windows環境では追加の最適化設定あり

---

## コードリーディングガイド

### 推奨読解順序

#### Step 1: カスタムフックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | doom-start.el | `lisp/doom-start.el` | 8-24行目のフック定義 |

**主要フック**:
- **8-12行目**: `doom-first-input-hook` - 初回入力前
- **14-18行目**: `doom-first-file-hook` - 初回ファイルオープン前
- **20-24行目**: `doom-first-buffer-hook` - 初回バッファオープン前

#### Step 2: ランタイム最適化を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | doom-start.el | `lisp/doom-start.el` | 30-93行目の最適化設定 |

**主要設定**:
- **32行目**: auto-mode-case-fold = nil
- **37-38行目**: 双方向テキスト設定
- **43行目**: bidi-inhibit-bpa = t
- **47-48行目**: 非選択ウィンドウのカーソル非表示
- **53行目**: fast-but-imprecise-scrolling = t
- **59行目**: inhibit-compacting-font-caches = t
- **72行目**: read-process-output-max = 64KB
- **90-92行目**: gcmh設定

#### Step 3: UI無効化を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | doom-start.el | `lisp/doom-start.el` | 96-131行目のUI設定 |

**処理内容**:
- **108-113行目**: menu-bar/tool-bar/scroll-bar無効化
- **122-131行目**: macOS固有のメニューバー処理

#### Step 4: インクリメンタルローディングを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | doom-start.el | `lisp/doom-start.el` | 187-270行目 |

**主要変数・関数**:
- **187-204行目**: `doom-incremental-packages`
- **206-211行目**: `doom-incremental-first-idle-timer`
- **213-214行目**: `doom-incremental-idle-timer`
- **216-259行目**: `doom-load-packages-incrementally`
- **261-270行目**: `doom-load-packages-incrementally-h`

### プログラム呼び出し階層図

```
startup--load-user-init-file (advice)
    │
    └─ doom-startup
            │
            ├─ doom-profile-init-file読み込み
            │
            └─ doom-after-init-hook
                    │
                    └─ doom-load-packages-incrementally-h
                            │
                            └─ doom-load-packages-incrementally
                                    │
                                    ├─ (require PACKAGE)
                                    │
                                    └─ run-at-time (再帰)

doom-first-buffer-hook
    │
    └─ gcmh-mode
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| doom-start.el | `lisp/doom-start.el` | ソース | 起動最適化本体 |
| doom.el | `lisp/doom.el` | ソース | コアシステム |
| gcmh | packages | 外部パッケージ | GC最適化 |
