# 機能設計書 5-エディタ設定

## 概要

本ドキュメントは、Doom Emacsのエディタ設定システム（doom-editor.el）の機能設計を記述する。このシステムは、ファイル操作、テキスト編集、フォーマット、クリップボード、自動保存、最近使ったファイル管理など、テキスト編集に関するすべての設定を管理する。

### 本機能の処理概要

**業務上の目的・背景**：Doom Emacsは、効率的なテキスト編集を実現するために、Emacsのデフォルト設定を大幅に改善している。大きなファイルの最適化、スマートな自動保存、履歴管理など、開発者の生産性を向上させる機能を提供する。

**機能の利用シーン**：
- ファイルの開閉・保存時
- テキストの編集・フォーマット時
- ウィンドウ・バッファの操作時
- セッション間の状態復元時

**主要な処理内容**：
1. 大規模ファイルの最適化（doom-large-file-p、so-long-mode）
2. ファイル操作設定（シンボリックリンク解決、ディレクトリ自動作成）
3. バックアップ・自動保存設定
4. インデント・フォーマット設定
5. クリップボード管理
6. recentf（最近使ったファイル）管理
7. savehist（履歴永続化）管理
8. saveplace（カーソル位置復元）管理
9. smartparens（括弧自動補完）設定
10. better-jumper（ジャンプ履歴）設定

**関連システム・外部連携**：doom.el、doom-ui.el、各種編集支援パッケージ

**権限による制御**：特になし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 本機能は内部設定のため直接的な画面関連なし |

## 機能種別

エディタ設定 / ファイル管理 / 履歴管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| doom-large-file-size-alist | alist | No | ファイルサイズ閾値 | 正規表現とサイズ |
| doom-large-file-excluded-modes | list | No | 最適化除外モード | シンボルリスト |
| doom-inhibit-large-file-detection | boolean | No | 大規模ファイル検出無効化 | - |

### 入力データソース

- ファイルシステム
- ユーザー設定
- Emacsセッション状態

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| doom-large-file-p | boolean/number | 大規模ファイルフラグ（サイズ） |
| recentf-list | list | 最近使ったファイル一覧 |
| savehist-minibuffer-history | list | ミニバッファ履歴 |
| save-place-alist | alist | カーソル位置履歴 |

### 出力先

- キャッシュファイル（recentf、savehist、saveplace）
- バックアップディレクトリ
- 自動保存ディレクトリ

## 処理フロー

### 大規模ファイル最適化

```
1. ファイルオープン（find-file）
2. doom--prepare-for-large-files-a (abort-if-file-too-large :before)
   └─ ファイルサイズと doom-large-file-size-alist を比較
   └─ 閾値超過時は doom-large-file-p をセット
3. doom-optimize-for-large-files-h (find-file-hook)
   └─ doom-large-file-p が設定されている場合
   └─ so-long-minor-mode を有効化
   └─ 最適化メッセージを表示
```

### フローチャート

```mermaid
flowchart TD
    A[ファイルオープン] --> B{ファイルサイズ確認}
    B -->|閾値以下| C[通常処理]
    B -->|閾値超過| D[doom-large-file-p設定]
    D --> E{除外モード?}
    E -->|Yes| C
    E -->|No| F[so-long-minor-mode有効化]
    F --> G[最適化メッセージ]
    G --> C
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 大規模ファイル閾値 | デフォルト1.0MB | doom-large-file-size-alist |
| BR-02 | バックアップ無効 | make-backup-files = nil | デフォルト |
| BR-03 | 自動保存有効 | auto-save-default = t | デフォルト |
| BR-04 | インデントスペース | indent-tabs-mode = nil、tab-width = 4 | デフォルト |
| BR-05 | 行幅 | fill-column = 80 | デフォルト |
| BR-06 | recentf上限 | recentf-max-saved-items = 200 | デフォルト |

### 計算ロジック

大規模ファイル判定:
```elisp
(> size (* 1024 1024
           (assoc-default filename doom-large-file-size-alist
                          #'string-match-p)))
```

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

該当なし（ファイルベース）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ファイル読み込みエラー | 大規模ファイル処理失敗 | so-long-modeで軽減 |
| - | 自動保存エラー | ディレクトリ不在 | 自動作成 |

### リトライ仕様

特になし

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

該当なし

## パフォーマンス要件

- 大規模ファイル検出による自動最適化
- font-lock-maximum-decoration = 1（大規模ファイル時）
- so-long-minor-modeによる機能制限

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

- ロックファイル無効化（create-lockfiles = nil）
- バックアップファイルのパーミッション管理

## 備考

- Emacs 29+では高速な長行検出が利用可能
- POSIX準拠の最終改行（require-final-newline = t）

---

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

### 推奨読解順序

#### Step 1: 大規模ファイル処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | doom-editor.el | `lisp/doom-editor.el` | 5-56行目の大規模ファイル検出 |

**主要変数・関数**:
- **5-6行目**: `doom-inhibit-large-file-detection`
- **8-9行目**: `doom-large-file-p`
- **11-18行目**: `doom-large-file-size-alist`
- **20-24行目**: `doom-large-file-excluded-modes`
- **30-45行目**: `doom--prepare-for-large-files-a`
- **47-56行目**: `doom-optimize-for-large-files-h`

#### Step 2: ファイル操作設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | doom-editor.el | `lisp/doom-editor.el` | 59-95行目のファイル設定 |

**主要設定**:
- **61-62行目**: シンボリックリンク解決
- **66行目**: 同一ファイル警告抑制
- **70-79行目**: ディレクトリ自動作成
- **86-95行目**: バックアップ設定

#### Step 3: 自動保存設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | doom-editor.el | `lisp/doom-editor.el` | 97-146行目の自動保存 |

#### Step 4: ビルトインパッケージを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | doom-editor.el | `lisp/doom-editor.el` | 238-388行目のuse-package設定 |

**主要パッケージ**:
- **238-279行目**: autorevert
- **286-325行目**: recentf
- **328-360行目**: savehist
- **363-388行目**: saveplace

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

```
find-file-hook
    │
    ├─ doom--prepare-for-large-files-a
    │       └─ doom-large-file-size-alist参照
    │
    └─ doom-optimize-for-large-files-h
            └─ so-long-minor-mode 有効化

doom-first-file-hook
    │
    ├─ recentf-mode
    │
    └─ save-place-mode

doom-first-input-hook
    │
    ├─ savehist-mode
    │
    ├─ better-jumper-mode
    │
    └─ smartparens-global-mode
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| doom-editor.el | `lisp/doom-editor.el` | ソース | エディタ設定本体 |
| doom.el | `lisp/doom.el` | ソース | コアシステム |
