# 機能設計書 49-ワードラップ表示

## 概要

本ドキュメントは、Doom Emacsにおけるワードラップ表示機能の設計仕様を記述する。adaptive-wrap、visual-line-mode、visual-fill-column-modeを統合し、長い行を言語認識型のインデントで折り返し表示する機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：レガシーコードや外部ライブラリには、極端に長い行が含まれることがある。また、マークダウンやドキュメントファイルでは1行が論理的な段落を表すことも多い。これらのファイルを編集する際、水平スクロールは操作性を著しく低下させる。本機能は、バッファ内容を変更せずに長い行を視覚的に折り返し、コードの場合は適切なインデントを付与することで、可読性と編集効率を両立させる。

**機能の利用シーン**：
- 長い行を含むレガシーコードの閲覧・編集
- マークダウンやテキストファイルの編集
- 画面幅が限られた環境（ターミナル、分割ウィンドウ等）での作業
- fill-columnに基づいたソフトラップ

**主要な処理内容**：
1. visual-line-modeによる視覚的な行折り返し
2. adaptive-wrap-prefix-modeによるインデント継続
3. コード行に対する追加インデント（double/single/固定値）
4. fill-columnでのソフトラップ（オプション）
5. グローバルモードによる全バッファ適用

**関連システム・外部連携**：
- visual-line-mode: Emacs標準の視覚的行折り返し
- adaptive-wrap-prefix-mode: インデント継続表示
- visual-fill-column-mode: fill-columnでのソフトラップ
- dtrt-indent: インデント幅の自動検出

**権限による制御**：特になし（全ユーザーが利用可能）

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 画面関連なし（エディタ機能） |

## 機能種別

表示制御 / テキストレンダリング

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| +word-wrap-extra-indent | symbol/integer | No | 追加インデント（'double, 'single, 整数） | - |
| +word-wrap-fill-style | symbol | No | fill-column処理（'auto, 'soft, nil） | - |
| +word-wrap-disabled-modes | list | No | 無効にするメジャーモード | シンボルのリスト |
| +word-wrap-visual-modes | list | No | adaptive-wrapを使わないモード | シンボルのリスト |
| +word-wrap-text-modes | list | No | 追加インデントを使わないモード | シンボルのリスト |

### 入力データソース

- ユーザー設定（init.el/config.el）
- dtrt-indentによるインデント幅検出

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 折り返し表示 | display | 視覚的に折り返された行表示 |

### 出力先

- ウィンドウ（表示のみ、バッファ内容は変更しない）

## 処理フロー

### 処理シーケンス

```
1. +word-wrap-mode有効化
   ├─ メジャーモード判定
   │   ├─ visual-modes: adaptive-wrap無効
   │   └─ text-modes: 追加インデント無効
   └─ 既存モード状態保存
2. 必要なモード有効化
   ├─ adaptive-wrap-prefix-mode
   ├─ visual-line-mode
   └─ visual-fill-column-mode（fill-style設定時）
3. インデント調整
   └─ +word-wrap--adjust-extra-indent-a
4. 無効化時
   └─ 保存した状態に復元
```

### フローチャート

```mermaid
flowchart TD
    A[+word-wrap-mode有効化] --> B{モード種別判定}
    B -->|visual-modes| C[adaptive-wrap無効]
    B -->|text-modes| D[追加インデント無効]
    B -->|code-modes| E[追加インデント有効]

    C --> F[visual-line-mode有効化]
    D --> F
    E --> G[adaptive-wrap-prefix-mode有効化]
    G --> F

    F --> H{fill-style?}
    H -->|auto/soft| I[visual-fill-column-mode有効化]
    H -->|nil| J[ウィンドウ端で折り返し]

    I --> K[折り返し表示適用]
    J --> K

    K --> L{コード行?}
    L -->|Yes| M[追加インデント計算]
    L -->|No| N[インデントなし]

    M --> O[表示完了]
    N --> O
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | visual-modes判定 | org-modeなどでadaptive-wrapを無効 | +word-wrap-visual-modesに含まれる場合 |
| BR-02 | text-modes判定 | text-mode系では追加インデントなし | +word-wrap-text-modesに含まれる場合 |
| BR-03 | コメント・文字列判定 | コメントや文字列内では追加インデントなし | doom-point-in-string-or-comment-p |
| BR-04 | special-mode除外 | 特殊モードではグローバルモード無効 | mode-class = special |

### 計算ロジック

追加インデント計算:
```elisp
(defun +word-wrap--calc-extra-indent (p)
  (if (not (or +word-wrap--major-mode-is-text
               (doom-point-in-string-or-comment-p p)))
      (pcase +word-wrap-extra-indent
        ('double
         (* 2 (symbol-value +word-wrap--major-mode-indent-var)))
        ('single
         (symbol-value +word-wrap--major-mode-indent-var))
        ((and (pred integerp) fixed)
         fixed)
        (_ 0))
    0))
```

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | 特になし | - |

### リトライ仕様

リトライ処理は不要。

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

トランザクション処理は不要。表示のみの機能。

## パフォーマンス要件

- 折り返し計算: リアルタイム
- 追加インデント計算: 行ごとに実行

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

特になし。

## 備考

- `+word-wrap-extra-indent`のデフォルトは`'double`（インデント幅の2倍）
- `+word-wrap-fill-style`が`'soft`の場合、auto-fill-modeを強制無効化
- text-mode-hookからvisual-line-modeを削除し、+word-wrap-modeに置換

---

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

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

### 推奨読解順序

#### Step 1: 設定変数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/editor/word-wrap/config.el` | 設定変数定義 |

**読解のコツ**:
- **3-11行目**: `+word-wrap-extra-indent`変数
- **13-23行目**: `+word-wrap-fill-style`変数
- **25-28行目**: `+word-wrap-disabled-modes`変数
- **30-33行目**: `+word-wrap-visual-modes`変数
- **35-38行目**: `+word-wrap-text-modes`変数
- **40-42行目**: text-mode-hookの置換

#### Step 2: マイナーモードを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | autoload.el | `modules/editor/word-wrap/autoload.el` | モード定義 |

**主要処理フロー**:
- **32-97行目**: `+word-wrap-mode`定義
- **17-29行目**: `+word-wrap--calc-extra-indent`（インデント計算）
- **12-15行目**: `+word-wrap--adjust-extra-indent-a`（advice）

#### Step 3: グローバルモードを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | autoload.el | `modules/editor/word-wrap/autoload.el` | グローバルモード |

**主要処理フロー**:
- **99-106行目**: `+word-wrap--enable-global-mode`
- **109-111行目**: `+global-word-wrap-mode`定義

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

```
+word-wrap-mode (マイナーモード)
    │
    ├─ モード判定
    │   ├─ +word-wrap-visual-modes チェック
    │   ├─ +word-wrap-text-modes チェック
    │   └─ fill-style チェック
    │
    ├─ dtrt-indent連携
    │   └─ +word-wrap--major-mode-indent-var設定
    │
    ├─ モード有効化
    │   ├─ adaptive-wrap-prefix-mode
    │   ├─ visual-line-mode
    │   └─ visual-fill-column-mode
    │
    └─ インデント調整advice
           └─ +word-wrap--adjust-extra-indent-a
                  └─ +word-wrap--calc-extra-indent

+global-word-wrap-mode (グローバルモード)
    │
    └─ +word-wrap--enable-global-mode
           ├─ special-mode除外チェック
           ├─ disabled-modes除外チェック
           └─ +word-wrap-mode有効化
```

### データフロー図

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

メジャーモード         ┌──────────────────────┐
インデント設定  ──────▶│ モード判定           │
                      └──────────────────────┘
                               │
                               ▼
                      ┌──────────────────────┐
                      │ インデント幅取得      │
                      │ (dtrt-indent)        │
                      └──────────────────────┘
                               │
                               ▼
                      ┌──────────────────────┐
行内容          ──────▶│ 追加インデント計算   │
(コード/コメント)      └──────────────────────┘
                               │
                               ▼
                      ┌──────────────────────┐
折り返し表示   ◀───── │ adaptive-wrap       │
                      │ visual-line-mode    │
                      └──────────────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/editor/word-wrap/config.el` | ソース | 設定変数定義、text-mode-hook置換 |
| autoload.el | `modules/editor/word-wrap/autoload.el` | ソース | マイナーモード定義、インデント計算 |
