# バッチ設計書 20-doom emacs

## 概要

本ドキュメントは、Doom EmacsまたはEmacsサンドボックスを起動するコマンド「doom emacs」のバッチ設計書です。一時的なサンドボックス環境でEmacsを起動し、通常の設定に影響を与えずにテストや検証を行うことができます。

### 本バッチの処理概要

doom emacsは、Doom Emacsを一時的なサンドボックス環境で起動するコマンドです。また、--replオプションでEmacs Lisp REPLを起動することもできます。

**業務上の目的・背景**：Doom Emacsの開発・デバッグ・テストでは、既存の設定を壊さずに新しい設定や機能を試す必要があります。本コマンドは、一時ディレクトリにサンドボックス環境を構築し、ユーザーのローカル設定（フォント、設定、バイナリスクリプト）をシンボリックリンクで共有しながら、独立したEmacs環境を提供します。これにより、実験的な変更を安全にテストできます。

**バッチの実行タイミング**：手動実行（随時）。テスト、デバッグ、またはREPLでの対話的な操作が必要な場合に実行します。

**主要な処理内容**：
1. 一時サンドボックスディレクトリの作成
2. XDG関連ディレクトリのシンボリックリンク作成
3. early-init.elの生成（環境変数の復元）
4. Emacsプロセスの起動
5. または--replモードでElispインタプリタの起動

**前後の処理との関連**：独立したコマンドとして動作します。サンドボックス環境は一時ディレクトリに作成され、通常のDoom Emacs設定には影響しません。

**影響範囲**：一時ディレクトリにサンドボックス環境を作成します。既存のユーザー設定やDoom Emacs本体には影響しません。

## バッチ種別

プロセス起動 / サンドボックス

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（手動） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Emacsインストール済み | invocation-nameで参照されるEmacsが利用可能 |
| Doomインストール済み | Doom Emacsのearly-init.elが存在すること |
| シンボリックリンク対応 | サンドボックス構築にシンボリックリンクを使用 |

### 実行可否判定

Emacsの起動に失敗した場合はエラーコードを返します。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --repl | Boolean | No | false | Emacs Lisp REPLを起動 |
| args | List | No | - | Emacsに渡す追加引数 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| 標準入力 | テキスト | --replモードでのLisp式（パイプ入力時） |
| 環境変数 | 文字列 | HOME, DOOMDIR, DOOMPROFILE, XDG_*等 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 一時ディレクトリ | ディレクトリ | サンドボックス環境 |
| Emacsプロセス | プロセス | 起動されたEmacs |
| 標準出力 | テキスト | --replモードでの評価結果 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| サンドボックス | {temporary-file-directory}/doom.run/ |
| early-init.el | {サンドボックス}/.emacs.d/early-init.el |

## 処理フロー

### 処理シーケンス

```
1. REPLモードの判定
   └─ --repl指定時はREPLモードへ
2. パイプ入力の確認
   └─ 入力があれば直接評価
3. サンドボックス環境の構築
   └─ 一時ディレクトリ作成
   └─ XDGディレクトリのシンボリックリンク作成
4. early-init.elの生成
   └─ 環境変数の復元コード
   └─ 実際のearly-init.elのロード
5. Emacsの起動
   └─ HOME=サンドボックスでemacs起動
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{--repl?}
    B -->|Yes| C{パイプ入力あり?}
    C -->|Yes| D[入力を直接評価]
    C -->|No| E[REPLループ開始]
    B -->|No| F[一時ディレクトリ作成]
    F --> G[既存ディレクトリ削除]
    G --> H[.emacs.dディレクトリ作成]
    H --> I[XDGディレクトリのシンボリックリンク作成]
    I --> J[early-init.el生成]
    J --> K[HOME変更してEmacs起動]
    D --> L[終了]
    E --> M{:quit入力?}
    M -->|Yes| L
    M -->|No| N[式を評価]
    N --> O[結果表示]
    O --> E
    K --> L
```

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

### 操作別データベース影響一覧

データベース操作は行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | error | Emacs起動失敗 | Emacsのインストール状態を確認 |
| - | error | REPL評価エラー | Lisp式の構文を確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | N/A |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

サンドボックス環境の作成に失敗した場合は、一時ディレクトリの権限を確認してください。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1プロセス |
| 目標処理時間 | Emacs起動時間依存 |
| メモリ使用量上限 | Emacsプロセス依存 |

## 排他制御

同一サンドボックスディレクトリへの同時アクセスは避けてください。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| REPLプロンプト | REPL起動時 | "(elisp) $ " |
| REPLエラー | 評価エラー時 | "There was an unexpected error" |
| REPL終了 | :quit入力時 | "Goodbye!" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| N/A | N/A | N/A |

## 備考

- `:benchmark nil`によりベンチマーク出力は無効化されています
- サンドボックス環境では以下のXDGディレクトリがシンボリックリンクされます：
  - XDG_DATA_HOME (.local/share)
  - XDG_STATE_HOME (.local/state)
  - XDG_BIN_HOME (.local/bin)
  - XDG_CONFIG_HOME (.config)
  - XDG_CACHE_HOME (.cache)
- REPLは`:quit`または`:q`で終了できます
- パイプ入力が与えられた場合（標準入力にデータがある場合）は、REPLループに入らずに直接評価して終了します
- TODO: 将来的にはサンドボックス機能、異なるEmacsバージョン/Doomバージョンでの起動などが計画されています
- 現在はEmacs 29以降で利用可能な`--init-directory`オプションの代わりに、HOME環境変数を変更してサンドボックスを実現しています
