# 機能設計書 1-Doomコアシステム

## 概要

本ドキュメントは、Doom Emacsの中核となる初期化・設定管理システム（doom.el）の機能設計を記述する。このシステムはDoom Emacs全体の起動プロセス、グローバル変数の定義、フック管理、起動最適化を担当する。

### 本機能の処理概要

**業務上の目的・背景**：Doom Emacsは高速で拡張性の高いEmacs設定フレームワークとして設計されている。コアシステムは、従来のEmacsの遅い起動時間を大幅に短縮し、モジュール化されたアーキテクチャにより、ユーザーが必要な機能のみを有効化できる環境を提供する。これにより、開発者は効率的な編集環境を即座に利用開始できる。

**機能の利用シーン**：このコアシステムは、Emacsの起動時に自動的に読み込まれ、すべてのDoom Emacsセッション（インタラクティブ・非インタラクティブ両方）で使用される。ユーザーがEmacsを起動するたびに、この機能がDoom環境全体を初期化する。

**主要な処理内容**：
1. グローバル定数・変数の定義（doom-version、doom-emacs-dir、doom-user-dir等）
2. システム検出（OS種別、WSL環境等の判定）
3. 起動最適化（file-name-handler-alist一時無効化、モードライン遅延初期化）
4. カスタムフックの提供（doom-before-init-hook、doom-after-init-hook等）
5. セキュリティ設定（TLS/SSL設定の強化）
6. ネイティブコンパイル設定の最適化
7. モジュールシステムの初期化
8. プロファイル管理

**関連システム・外部連携**：doom-lib.el（標準ライブラリ）、doom-compat.el（互換性レイヤー）、doom-start.el（起動処理）、doom-straight.el（パッケージ管理）と連携する。

**権限による制御**：特にロールベースの権限制御はないが、非インタラクティブセッション（CLI）とインタラクティブセッション（GUI/TUI）で異なる初期化処理パスを取る。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 17 | Music Player | 補助機能 | EMM連携（コアシステム機能として参照） |
| 23 | Ophints | 主機能 | 操作対象リージョンのハイライト表示 |
| 29 | Deft | 主機能 | ノート検索・管理機能 |

## 機能種別

システム初期化 / 設定管理 / 環境構築

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| DOOMDIR | 環境変数(string) | No | ユーザー設定ディレクトリのパス | ディレクトリ存在確認 |
| DOOMPROFILE | 環境変数(string) | No | アクティブプロファイル名@バージョン | NAME@VERSION形式 |
| DOOMLOCALDIR | 環境変数(string) | No | ローカルストレージディレクトリ | ディレクトリ存在確認 |
| init-file-debug | boolean | No | デバッグモード有効化 | - |

### 入力データソース

- 環境変数（DOOMDIR、DOOMPROFILE、DOOMLOCALDIR、XDG_CONFIG_HOME、XDG_DATA_HOME、XDG_CACHE_HOME、XDG_STATE_HOME）
- Emacsビルトイン変数（emacs-major-version、system-type、user-emacs-directory）
- ファイルシステム（設定ファイル、プロファイルファイル）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| doom-version | string | Doom Emacsのバージョン（"3.0.0-pre"） |
| doom-emacs-dir | string | Doom Emacsのインストールディレクトリ |
| doom-user-dir | string | ユーザー設定ディレクトリ |
| doom-profile | cons | アクティブプロファイル（NAME . VERSION） |
| doom-init-time | float | 起動にかかった時間（秒） |
| doom-system | list | システム特性リスト（macos/linux/windows/bsd/wsl等） |

### 出力先

グローバル変数として設定され、Doom Emacs全体から参照可能。

## 処理フロー

### 処理シーケンス

```
1. Emacsバージョンチェック
   └─ Emacs 27.1未満の場合はエラーメッセージを表示して終了
2. バイトコード互換性チェック
   └─ コンパイル時と実行時のEmacsバージョンが異なる場合は警告
3. システム検出
   └─ doom-system定数の設定（macos/linux/windows/bsd）
   └─ WSL環境の検出と追加
4. 互換性レイヤー読み込み
   └─ doom-compat.elのrequire
5. 標準ライブラリ読み込み
   └─ doom-lib.elのrequire
6. ディレクトリ変数の初期化
   └─ doom-emacs-dir、doom-user-dir、doom-data-dir等の設定
7. 起動最適化の適用
   └─ file-name-handler-alistの一時無効化
   └─ 各種UI要素の遅延初期化
8. セキュリティ設定
   └─ TLS/SSL設定の強化
9. doom-initialize関数の実行
   └─ コンテキストの設定（cli/emacs）
   └─ 各種フックの登録
   └─ プロファイルの読み込み
```

### フローチャート

```mermaid
flowchart TD
    A[Emacs起動] --> B{Emacsバージョン >= 27.1?}
    B -->|No| C[エラー表示・終了]
    B -->|Yes| D[システム検出]
    D --> E[doom-compat.el読み込み]
    E --> F[doom-lib.el読み込み]
    F --> G[ディレクトリ変数初期化]
    G --> H{daemonp?}
    H -->|Yes| I[daemon用設定]
    H -->|No| J[起動最適化適用]
    I --> K[doom-initialize]
    J --> K
    K --> L{noninteractive?}
    L -->|Yes| M[CLI初期化]
    L -->|No| N[対話型初期化]
    M --> O[doom-before-init-hook実行]
    N --> O
    O --> P[プロファイル読み込み]
    P --> Q[doom-finalize]
    Q --> R[doom-after-init-hook実行]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 最小Emacsバージョン | Emacs 27.1以上が必須、28.1以上を推奨 | 常時 |
| BR-02 | バイトコード互換性 | コンパイル時と実行時のEmacsメジャーバージョンが一致 | doom syncが必要な場合に警告 |
| BR-03 | daemon起動時最適化スキップ | daemon起動時は一部の起動最適化をスキップ | daemonp が true |
| BR-04 | プロファイルディレクトリ構造 | XDG仕様に準拠したディレクトリ配置 | doom-profile が設定時 |

### 計算ロジック

起動時間の計測:
```elisp
(setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))
```

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

該当なし（ファイルベースの設定管理）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| doom-nosync-error | 初期化エラー | プロファイルのinit.elが存在しない | `doom sync`を実行 |
| doom-font-error | フォントエラー | 指定フォントが見つからない | フォント設定を確認 |
| doom-hook-error | フックエラー | フック実行中のエラー | スタックトレースを確認 |
| doom-context-error | コンテキストエラー | 無効なコンテキストの使用 | doom-contextの値を確認 |

### リトライ仕様

特になし。エラー発生時は適切なエラーメッセージを表示して処理を中断。

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

該当なし（ステートレスな初期化処理）

## パフォーマンス要件

- 起動時間目標: 1秒以内（SSD環境）
- file-name-handler-alistの一時無効化による高速化
- 遅延読み込み（autoload）の活用
- ネイティブコンパイルによる最適化（利用可能な場合）

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

- TLS 1.2/1.3の強制（gnutls-algorithm-priority）
- 最小DH素数ビット長の設定（gnutls-min-prime-bits: 3072）
- 証明書検証の有効化（非インタラクティブ時）
- package.elの無効化（straight.elによる安全なパッケージ管理）

## 備考

- Doom Emacs v3.0.0では大規模なアーキテクチャ変更が予定されており、一部の変数・関数は非推奨となっている
- Windows環境では$HOME環境変数が未設定の場合、%USERPROFILE%から自動設定される

---

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

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、Doom Emacsで使用される主要なデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | doom-lib.el | `lisp/doom-lib.el` | doom-module構造体、doom-module-context構造体の定義 |
| 1-2 | doom.el | `lisp/doom.el` | doom-system定数、ディレクトリ変数群の定義 |

**読解のコツ**: `cl-defstruct`で定義される構造体（doom-module、doom-module-context）は、モジュールの状態を保持するために使用される。各フィールドの意味を把握することが重要。

#### Step 2: エントリーポイントを理解する

処理の起点となる関数を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | doom.el | `lisp/doom.el` | `doom-initialize`関数（793-892行目）がメインエントリーポイント |

**主要処理フロー**:
1. **795行目**: `doom-context-push 'startup`でコンテキスト設定
2. **796-804行目**: daemon起動時のログ設定
3. **806-834行目**: インタラクティブセッションの初期化（doom-start.el読み込み）
4. **836-878行目**: CLI セッションの初期化
5. **882行目**: `doom-before-init-hook`の実行

#### Step 3: 起動最適化処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | doom.el | `lisp/doom.el` | 417-555行目の起動最適化セクション |

**主要処理フロー**:
- **422-453行目**: file-name-handler-alistの一時無効化
- **461-473行目**: スプラッシュ・スクラッチバッファの最適化
- **489-493行目**: TTY初期化の遅延
- **504-507行目**: モードライン表示の遅延

#### Step 4: セキュリティ設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | doom.el | `lisp/doom.el` | 684-708行目のセキュリティ設定 |

**主要処理フロー**:
- **688-695行目**: gnutls設定（TLSバージョン、暗号スイート）
- **698行目**: 最小DH素数ビット長
- **704-708行目**: tlsプログラムのフォールバック設定

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

```
early-init.el
    │
    └─ doom.el (require)
           │
           ├─ doom-compat.el (require) -- 互換性関数の提供
           │
           ├─ doom-lib.el (require) -- 標準ライブラリ
           │
           └─ doom-initialize()
                  │
                  ├─ [interactive] doom-start.el (require)
                  │       └─ doom-profile-init-file (load)
                  │
                  └─ [noninteractive] doom-cli.el (require)
                          └─ CLI処理
```

### データフロー図

```
[入力]                    [処理]                         [出力]

環境変数 ─────────────▶ doom.el ─────────────────────▶ doom-*変数
(DOOMDIR等)               │                              (グローバル設定)
                          │
system-type ──────────▶ システム検出 ───────────────▶ doom-system
                          │                              (OS情報リスト)
                          │
early-init.el ────────▶ doom-initialize ────────────▶ doom-init-time
                          │                              (起動時間)
                          │
$DOOMDIR/init.el ─────▶ モジュール初期化 ───────────▶ doom-modules
                                                         (モジュール一覧)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| doom.el | `lisp/doom.el` | ソース | コアシステムのメイン実装 |
| doom-lib.el | `lisp/doom-lib.el` | ソース | 標準ライブラリ・ユーティリティ関数 |
| doom-compat.el | `lisp/doom-compat.el` | ソース | 旧Emacsバージョンとの互換性 |
| doom-start.el | `lisp/doom-start.el` | ソース | インタラクティブセッション初期化 |
| doom-cli.el | `lisp/doom-cli.el` | ソース | CLIフレームワーク |
| early-init.el | `early-init.el` | ソース | Emacs 27+の早期初期化 |
