# 画面設計書 28-Doom Quit

## 概要

本ドキュメントは、Doom EmacsのDoom Quit機能の画面設計について記述します。Doom Quitは、Emacs終了時にゲーム「DOOM」風のユーモラスな確認メッセージを表示する機能です。

### 本画面の処理概要

Doom Quitは、Emacsを終了しようとした際に、DOOMゲームシリーズの終了メッセージにインスパイアされたランダムな確認メッセージを表示します。これにより、誤操作による終了を防止しつつ、ユーザーに楽しい体験を提供します。

**業務上の目的・背景**：Emacsでの作業中、誤ってウィンドウを閉じたりC-x C-cを押してしまうことがあります。Doom Quitは、終了前に確認プロンプトを表示することで、未保存の作業を失うリスクを軽減します。DOOMゲームからのメッセージやポップカルチャーからの引用を使用することで、単調な確認ダイアログに遊び心を加えています。

**画面へのアクセス方法**：以下の操作でDoom Quit画面が表示されます：
- `SPC q q`（Evil使用時の終了コマンド）
- `C-x C-c`（標準的なEmacs終了コマンド）
- ウィンドウマネージャーからの終了操作

**主要な操作・処理内容**：
1. 終了コマンドを実行
2. `confirm-kill-emacs` が `+doom-quit-fn` を呼び出す
3. `+doom-quit-messages` からランダムにメッセージを選択
4. メッセージと「Really quit Emacs?」を組み合わせて表示
5. ユーザーがy/nで応答
6. yの場合はEmacsを終了、nの場合はキャンセル

**画面遷移**：
- 入力元：任意の画面から終了コマンド実行
- 出力先（y）：Emacs終了
- 出力先（n）：元の画面に戻る

**権限による表示制御**：権限による制御はありません。デーモンフレームの終了時にはこのプロンプトは表示されません（実際の終了ではないため）。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 26 | 終了時の確認ダイアログ | 主機能 | 終了確認メッセージ表示 |

## 画面種別

確認ダイアログ（ミニバッファ）

## URL/ルーティング

N/A（Emacsバッファ上で動作するため、URLの概念なし）

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|----------|------|
| +doom-quit-messages | 入力 | list | 終了確認メッセージのリスト |
| confirm-kill-emacs | 入力 | function | 終了確認関数 |

## 表示項目

### 終了確認メッセージ（デフォルト例）

| 出典 | メッセージ |
|------|----------|
| DOOM 1 | "Please don't leave, there's more demons to toast!" |
| DOOM 1 | "Let's beat it -- This is turning into a bloodbath!" |
| DOOM 1 | "Don't leave yet -- There's a demon around that corner!" |
| Portal | "Thank you for participating in this Aperture Science computer-aided enrichment activity." |
| Portal | "I don't know what you think you are doing, but I don't like it." |
| カスタム | "(setq nothing t everything 'permitted)" |
| カスタム | "Emacs will remember that." |
| カスタム | "Hey! Hey, M-x listen!" |
| カスタム | "It's not like I'll miss you or anything, b-baka!" |
| カスタム | "Wake up, Mr. Stallman. Wake up and smell the ashes." |

## イベント仕様

### 1-終了確認

Emacs終了時に確認プロンプトを表示します。

**処理フロー**：
1. 終了コマンドが呼び出される
2. `confirm-kill-emacs` が `+doom-quit-fn` を参照
3. `+doom-quit-fn` が実行される
4. `+doom-quit-messages` からランダムにメッセージを選択
5. `doom-quit-p` でメッセージを表示しy/n入力を待つ
6. ユーザーの応答に応じて終了またはキャンセル

## データベース更新仕様

N/A（データベースを使用しない）

## メッセージ仕様

| メッセージ種別 | 内容 | 表示条件 |
|---------------|------|----------|
| 確認プロンプト | "{ランダムメッセージ} Really quit Emacs?" | 終了コマンド実行時 |

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| デーモンフレーム終了 | 確認プロンプトを表示しない |
| リアルバッファなし | 確認プロンプトを表示しない場合がある |

## 備考

- `+doom-quit-messages` をカスタマイズして独自のメッセージを設定可能
- メッセージはイタリック体で表示される
- DOOMゲームからの引用が多く含まれる（http://doom.wikia.com/wiki/Quit_messages）

---

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

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

### 推奨読解順序

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

メッセージリストが中心的なデータ構造です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/ui/doom-quit/config.el` | `+doom-quit-messages` の定義（行3-29） |

**読解のコツ**: `defvar` で定義されたリストには、様々な出典からの終了メッセージが含まれています。バッククォート記法（`` ` ``）と`,`（カンマ）は、リスト内でLisp式を評価するために使用されています。

#### Step 2: 終了確認関数を理解する

終了確認処理の実装を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/ui/doom-quit/config.el` | `+doom-quit-fn` 関数（行32-38） |

**主要処理フロー**:
1. **行33**: `doom-quit-p` を呼び出し
2. **行34-37**: メッセージを構築
   - `(random (length +doom-quit-messages))` でランダムインデックスを生成
   - `nth` でメッセージを取得
   - `propertize` でイタリックフェイスを適用
3. **行38**: "Really quit Emacs?" を追加

#### Step 3: confirm-kill-emacsの設定を理解する

Emacs組み込み変数との連携を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/ui/doom-quit/config.el` | `confirm-kill-emacs` の設定（行41） |

**主要処理フロー**:
- **行41**: `confirm-kill-emacs` に `+doom-quit-fn` を設定

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

```
終了コマンド実行
    │
    └─ kill-emacs / save-buffers-kill-emacs
           │
           └─ confirm-kill-emacs 参照
                      │
                      └─ +doom-quit-fn
                              │
                              ├─ random でインデックス生成
                              │
                              ├─ nth でメッセージ取得
                              │
                              ├─ propertize でスタイル適用
                              │
                              └─ doom-quit-p
                                     │
                              ┌──────┴──────┐
                              │             │
                              ▼             ▼
                           y 入力        n 入力
                              │             │
                              ▼             ▼
                         Emacs終了     キャンセル
```

### データフロー図

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

終了コマンド ───▶ confirm-kill-emacs チェック
                              │
                              ▼
+doom-quit-messages ───▶ ランダム選択 ───▶ メッセージ
        │                                        │
        └─ ["Please don't leave...",            │
            "Let's beat it...",                 │
            ...]                                │
                                                ▼
                              format + propertize ───▶ 表示文字列
                                                            │
                                                            ▼
                                        "{メッセージ}  Really quit Emacs?"
                                                            │
                                                            ▼
                                              ミニバッファに表示
                                                            │
                                               ┌────────────┤
                                               │            │
                                               ▼            ▼
                                            y → t       n → nil
                                               │            │
                                               ▼            ▼
                                          終了継続      終了中止
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/ui/doom-quit/config.el` | ソース | メッセージ定義、終了確認関数 |
| README.org | `modules/ui/doom-quit/README.org` | ドキュメント | モジュール説明書、カスタマイズ例 |
| .doommodule | `modules/ui/doom-quit/.doommodule` | 設定 | Doomモジュールメタデータ |
