# 通知設計書 20-large-file検出通知

## 概要

本ドキュメントは、Doom Emacsにおける大きなファイル検出時の通知とパフォーマンス最適化機能の設計仕様を記述する。この機能は、大きなファイルを開いた際にユーザーに通知し、自動的にパフォーマンス調整を行う。

### 本通知の処理概要

Doom Emacsは、ファイルサイズが閾値を超えるファイルを開く際に、`doom-large-file-p`変数を設定し、`so-long-minor-mode`を有効化してパフォーマンスを最適化する。同時に、ユーザーに対して大きなファイルを開いたことを通知するメッセージを表示する。

**業務上の目的・背景**：大きなファイル（ログファイル、minified JavaScript、大規模なデータセットなど）をEmacsで開くと、構文ハイライト、自動補完、その他の機能がEmacsを著しく遅くする可能性がある。本機能により、大きなファイルを開いた際に自動的にパフォーマンス調整が行われ、Emacsのハングや応答遅延を防ぐことができる。

**通知の送信タイミング**：ファイルを開く際（find-file等）にファイルサイズをチェックし、`doom-large-file-size-alist`で設定された閾値を超えている場合に通知が表示される。チェックは`abort-if-file-too-large`関数のadviceとして、およびfind-file-hookで実行される。

**通知の受信者**：通知はEmacsのミニバッファに表示され、ファイルを開こうとしているユーザーが視認できる。

**通知内容の概要**：「Large file detected! Cutting a few corners to improve performance...」というメッセージが表示され、パフォーマンス調整が行われたことを通知する。

**期待されるアクション**：ユーザーは通知を確認し、一部の機能（構文ハイライト、flycheck等）が制限されていることを認識する。必要に応じて`so-long-minor-mode`を無効化して通常の編集モードに戻すことができる。

## 通知種別

ミニバッファメッセージ（情報）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 中 |
| リトライ | なし |

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

通知はファイルを開いたユーザーに対して表示される。

## 通知テンプレート

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

| 項目 | 内容 |
|-----|------|
| メッセージ | Large file detected! Cutting a few corners to improve performance... |

### 本文テンプレート

```
Large file detected! Cutting a few corners to improve performance...
```

### 添付ファイル

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

## テンプレート変数

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

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ファイル操作 | find-file | ファイルサイズ > 閾値 | ファイルを開く時 |
| ファイル操作 | find-file-other-window | ファイルサイズ > 閾値 | 別ウィンドウでファイルを開く時 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| doom-inhibit-large-file-detection = t | 大きなファイル検出が無効化されている場合 |
| doom-large-file-excluded-modes | 除外されたメジャーモードの場合 |
| ファイルサイズ <= 閾値 | ファイルサイズが閾値以下の場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ファイルを開く] --> B[abort-if-file-too-large advice]
    B --> C{doom-inhibit-large-file-detection?}
    C -->|Yes| D[通常処理]
    C -->|No| E{サイズ > 閾値?}
    E -->|No| D
    E -->|Yes| F[doom-large-file-p = size]
    F --> G[find-file-hook発火]
    G --> H[doom-optimize-for-large-files-h実行]
    H --> I{除外モード?}
    I -->|Yes| J[doom-large-file-pをクリア]
    I -->|No| K{so-long-minor-mode利用可能?}
    K -->|No| L[終了]
    K -->|Yes| M[so-long-minor-mode有効化]
    M --> N[message表示]
    N --> L
    D --> L
    J --> L
```

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

### 参照テーブル一覧

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

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

本機能はデータベースを使用しない。設定はEmacs Lisp変数として管理される。

### 更新テーブル一覧

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

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| so-long未ロード | so-longパッケージが利用不可 | 最適化をスキップ |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（ファイルを開く時に常時有効）

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

- 本機能にセキュリティリスクはない
- 大きなファイルの内容は通知に表示されない

## 備考

- デフォルト閾値は1.0MB（doom-large-file-size-alistで設定）
- 除外モードにはso-long-mode, special-mode, archive-mode, pdf-view-mode等が含まれる
- so-long-minor-modeは構文ハイライトを制限するが、完全には無効化しない
- doom-large-file-pはpermanent-local属性を持ち、メジャーモード変更後も維持される

---

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

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

### 推奨読解順序

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

大きなファイル関連の設定変数を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | doom-editor.el | `lisp/doom-editor.el` | doom-inhibit-large-file-detection変数（行5-6） |
| 1-2 | doom-editor.el | `lisp/doom-editor.el` | doom-large-file-p変数（行8-9） |
| 1-3 | doom-editor.el | `lisp/doom-editor.el` | doom-large-file-size-alist変数（行11-18） |
| 1-4 | doom-editor.el | `lisp/doom-editor.el` | doom-large-file-excluded-modes変数（行20-24） |

**読解のコツ**: doom-large-file-size-alistはファイルパターンと閾値（MB）のalistで、パターンマッチでファイルタイプごとの閾値を設定できる。

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

ファイルサイズチェックのadviceを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | doom-editor.el | `lisp/doom-editor.el` | doom--prepare-for-large-files-a関数（行30-45） |

**主要処理フロー**:
1. **行30**: defadvice!でabort-if-file-too-largeの:beforeに定義
2. **行37**: doom-inhibit-large-file-detectionのチェック
3. **行41-44**: サイズ > 閾値の場合doom-large-file-pをセット

#### Step 3: find-file-hookでの最適化を理解する

ファイルオープン後の最適化処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | doom-editor.el | `lisp/doom-editor.el` | doom-optimize-for-large-files-h関数（行47-56） |

**主要処理フロー**:
- **行48**: doom-large-file-pとbuffer-file-nameの確認
- **行51-52**: 除外モードの場合doom-large-file-pをクリア
- **行54-55**: so-long-minor-modeを有効化
- **行56**: メッセージを表示

#### Step 4: so-longの設定を理解する

so-longパッケージの設定を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | doom-editor.el | `lisp/doom-editor.el` | use-package! so-longブロック（行534-590） |

**主要処理フロー**:
- **行535**: doom-first-fileでglobal-so-long-modeを有効化
- **行569-570**: so-long-minor-modesからfont-lock-modeを除外
- **行573-575**: font-lock-maximum-decorationを1に制限

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

```
find-file / find-file-other-window
    │
    ├─ [defadvice! :before abort-if-file-too-large]
    │      │
    │      └─ doom--prepare-for-large-files-a
    │             │
    │             └─ [サイズ > 閾値] setq-local doom-large-file-p size
    │
    └─ [find-file-hook]
           │
           └─ doom-optimize-for-large-files-h
                  │
                  ├─ [除外モード] kill-local-variable 'doom-large-file-p
                  │
                  └─ [非除外モード]
                         │
                         ├─ so-long-minor-mode +1
                         │
                         └─ message "Large file detected!..."
```

### データフロー図

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

ファイルパス ───▶ abort-if-file-too-large ───▶ doom--prepare-for-large-files-a
     │                                              │
     └─ ファイルサイズ                              ├─ doom-large-file-size-alist参照
                                                     │
                                                     ├─ [サイズ > 閾値]
                                                     │      │
                                                     │      └─ doom-large-file-p = size
                                                     │
                                                     └─ find-file-hook
                                                            │
                                                            └─ doom-optimize-for-large-files-h
                                                                   │
                                                                   ├─ so-long-minor-mode有効化
                                                                   │
                                                                   └─ ミニバッファメッセージ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| doom-editor.el | `lisp/doom-editor.el` | ソース | 大きなファイル検出・最適化機能、so-long設定 |
