# 通知設計書 18-doom-fallback-buffer警告

## 概要

本ドキュメントは、Doom Emacsにおけるフォールバックバッファ（*scratch*バッファ）の削除保護機能と警告通知の設計仕様を記述する。この機能は、ユーザーがフォールバックバッファを削除しようとした際に警告メッセージを表示し、削除を阻止する。

### 本通知の処理概要

Doom Emacsでは、*scratch*バッファをフォールバックバッファとして特別に保護している。このバッファを削除しようとした場合、`doom-protect-fallback-buffer-h`関数が警告メッセージを表示し、削除操作をキャンセルする。

**業務上の目的・背景**：Emacsでは常に少なくとも1つのバッファが存在する必要があり、フォールバックバッファはその安全弁として機能する。全てのバッファを削除した場合や、不正なバッファ状態になった場合に、フォールバックバッファに自動的に切り替わることでEmacsの安定動作を維持する。本警告により、ユーザーが誤ってこの重要なバッファを削除することを防止する。

**通知の送信タイミング**：ユーザーがフォールバックバッファ（*scratch*）に対してkill-bufferまたはkill-current-bufferコマンドを実行した際に警告が表示される。`kill-buffer-query-functions`フックで事前にチェックが行われる。

**通知の受信者**：通知はEmacsのミニバッファに表示され、削除操作を行おうとしているユーザーが視認できる。

**通知内容の概要**：「Can't kill the fallback buffer.」というメッセージが表示され、削除が阻止されたことをユーザーに通知する。

**期待されるアクション**：ユーザーは警告を確認し、フォールバックバッファの削除を諦めるか、別のバッファを削除対象とする。

## 通知種別

ミニバッファメッセージ（警告）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（削除前チェック） |
| 優先度 | 高 |
| リトライ | なし |

### 送信先決定ロジック

通知はフォールバックバッファの削除を試みたユーザーに対して表示される。

## 通知テンプレート

### ミニバッファメッセージの場合

| 項目 | 内容 |
|-----|------|
| メッセージ | Can't kill the fallback buffer. |

### 本文テンプレート

```
Can't kill the fallback buffer.
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| N/A | - | - | メッセージ表示のため添付なし |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| N/A | メッセージは固定文字列 | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面操作 | kill-buffer | バッファがフォールバックバッファ | フォールバックバッファの削除試行時 |
| 画面操作 | kill-current-buffer | バッファがフォールバックバッファ | 現在のバッファがフォールバック時 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 通常バッファ削除時 | フォールバックバッファ以外の削除時は警告なし |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[kill-buffer/kill-current-buffer実行] --> B[kill-buffer-query-functions発火]
    B --> C[doom-protect-fallback-buffer-h実行]
    C --> D{現在バッファ = フォールバック?}
    D -->|No| E[nilを返す - 削除続行]
    D -->|Yes| F[message: Can't kill the fallback buffer.]
    F --> G[tを返す - 削除阻止]
    E --> H[通常の削除処理]
    G --> I[削除キャンセル]
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| N/A | - | データベースは使用しない |

### テーブル別参照項目詳細

本機能はデータベースを使用しない。

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| N/A | - | データベースは使用しない |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| エラーなし | - | 警告を表示して削除を阻止するだけ |

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（操作時に常時有効）

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

- 本機能にセキュリティリスクはない
- フォールバックバッファはシステム安定性のために保護される

## 備考

- フォールバックバッファ名は`doom-fallback-buffer-name`変数で設定（デフォルト: *scratch*）
- `doom-fallback-buffer`関数でフォールバックバッファを取得・作成できる
- バッファが存在しない場合は自動的に作成される

---

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

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

### 推奨読解順序

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

フォールバックバッファ関連の変数と関数を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | buffers.el | `lisp/lib/buffers.el` | doom-fallback-buffer-name変数（行33-35） |
| 1-2 | buffers.el | `lisp/lib/buffers.el` | doom-fallback-buffer関数（行49-53） |

**読解のコツ**: doom-fallback-buffer-nameは*scratch*に設定され、doom-fallback-buffer関数はこのバッファを取得または作成する。

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

削除保護フック関数を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | doom-ui.el | `lisp/doom-ui.el` | doom-protect-fallback-buffer-h関数（行151-153） |

**主要処理フロー**:
1. **行151-153**: `doom-protect-fallback-buffer-h`関数定義
2. **行152**: ドキュメント「Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'.」
3. **行153**: `(not (eq (current-buffer) (doom-fallback-buffer)))`で判定

#### Step 3: フックへの登録を理解する

kill-buffer-query-functionsへの登録を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | doom-ui.el | `lisp/doom-ui.el` | doom-init-ui-h関数内のフック登録（行734） |

**主要処理フロー**:
- **行734**: `(add-hook 'kill-buffer-query-functions #'doom-protect-fallback-buffer-h)`

#### Step 4: 削除時のadvice処理を理解する

kill-current-buffer時のadvice処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | doom-ui.el | `lisp/doom-ui.el` | doom--switch-to-fallback-buffer-maybe-a関数（行226-265） |

**主要処理フロー**:
- **行235-237**: フォールバックバッファ削除時にmessage表示
- **行236**: `(message "Can't kill the fallback buffer.")`

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

```
kill-buffer / kill-current-buffer
    │
    ├─ [kill-buffer-query-functions]
    │      │
    │      └─ doom-protect-fallback-buffer-h
    │             │
    │             └─ (not (eq (current-buffer) (doom-fallback-buffer)))
    │                    │
    │                    └─ [フォールバック時] → nil返却（削除阻止）
    │
    └─ [defadvice! :before-until #'kill-current-buffer]
           │
           └─ doom--switch-to-fallback-buffer-maybe-a
                  │
                  └─ [フォールバック時] message "Can't kill the fallback buffer."
```

### データフロー図

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

kill-buffer ───▶ kill-buffer-query-functions ───▶ 削除許可/拒否
    │                    │
    │                    └─ doom-protect-fallback-buffer-h
    │                           │
    │                           ├─ [通常バッファ] nil → 削除続行
    │                           │
    │                           └─ [フォールバック] t → 削除阻止
    │                                   │
    │                                   └─ ミニバッファメッセージ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| doom-ui.el | `lisp/doom-ui.el` | ソース | doom-protect-fallback-buffer-h関数、advice定義 |
| buffers.el | `lisp/lib/buffers.el` | ソース | doom-fallback-buffer-name、doom-fallback-buffer関数 |
