# 機能設計書 42-Zenモード（集中執筆環境）

## 概要

本ドキュメントは、Doom EmacsにおけるZenモード（集中執筆環境）の設計仕様を記述する。writeroom-modeとmixed-pitch-modeを基盤として、気を散らす要素を排除した集中執筆環境を提供する。

### 本機能の処理概要

**業務上の目的・背景**：ドキュメント作成や長文執筆において、UIの要素（モードライン、フリンジ、行番号等）が視覚的なノイズとなり、集中を妨げることがある。本機能は、執筆に集中するための「禅」のような静かな環境を提供し、テキストコンテンツのみに意識を向けられるようにする。特にOrg-mode、Markdown、reStructuredTextなどの文書作成モードで効果を発揮する。

**機能の利用シーン**：
- ブログ記事やドキュメントを集中して執筆する場合
- プレゼンテーション資料のテキストを考える場合
- 小説や論文などの長文を執筆する場合
- コードを書かず、純粋にテキストに集中したい場合

**主要な処理内容**：
1. writeroom-modeの有効化によるUI要素の非表示化
2. テキストのセンタリング表示（visual-fill-column）
3. テキストサイズの拡大（text-scale）
4. 可変幅フォント（mixed-pitch）の適用（特定モードのみ）
5. ウィンドウ分割線の拡大（視覚的な分離強化）
6. フルスクリーンモードの切り替え

**関連システム・外部連携**：
- writeroom-mode: 集中執筆環境の基盤パッケージ
- mixed-pitch-mode: 可変幅/固定幅フォント混在表示
- visual-fill-column-mode: 視覚的な行折り返し
- text-scale-mode: テキストサイズ調整

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 13 | Zen Mode | 主機能 | writeroom-modeによる集中モード、テキストスケーリング |

## 機能種別

UI制御 / 表示カスタマイズ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| +zen-text-scale | integer | No | テキスト拡大率（デフォルト: 2） | 整数 |
| +zen-window-divider-size | integer | No | ウィンドウ分割線のサイズ（デフォルト: 4） | 正の整数 |
| +zen-mixed-pitch-modes | list | No | mixed-pitchを有効にするモードのリスト | シンボルのリスト |

### 入力データソース

- ユーザーのキーボード入力（`+zen/toggle`コマンド）
- ユーザー設定（init.elまたはconfig.el）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| writeroom-mode | boolean | Zenモードの有効/無効状態 |
| text-scale-mode-amount | integer | 現在のテキスト拡大率 |
| mixed-pitch-mode | boolean | 可変幅フォントモードの状態 |

### 出力先

- バッファ表示（センタリング、フォント変更）
- ウィンドウ構成（分割線サイズ変更）
- フレーム（フルスクリーン時）

## 処理フロー

### 処理シーケンス

```
1. +zen/toggle呼び出し
   └─ writeroom-modeのトグル
2. writeroom-mode有効化時
   ├─ text-scale-set（テキスト拡大）
   ├─ visual-fill-column-adjust（マージン調整）
   ├─ mixed-pitch-mode有効化（対象モードの場合）
   └─ ウィンドウ分割線サイズ変更
3. writeroom-mode無効化時
   ├─ text-scale-set 0（テキストサイズリセット）
   ├─ mixed-pitch-mode無効化
   └─ ウィンドウ分割線サイズ復元
```

### フローチャート

```mermaid
flowchart TD
    A[+zen/toggle呼び出し] --> B{writeroom-mode状態}
    B -->|無効→有効| C[writeroom-mode有効化]
    B -->|有効→無効| D[writeroom-mode無効化]

    C --> E[テキストスケール設定]
    E --> F{対象モード?}
    F -->|Yes| G[mixed-pitch-mode有効化]
    F -->|No| H[スキップ]
    G --> I[ウィンドウ分割線拡大]
    H --> I
    I --> J[visual-fill-column調整]

    D --> K[テキストスケールリセット]
    K --> L[mixed-pitch-mode無効化]
    L --> M[ウィンドウ分割線復元]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | バッファローカル動作 | Zenモードはバッファごとに独立して動作 | 常時 |
| BR-02 | モード別mixed-pitch | org-mode, markdown-mode等でのみmixed-pitchを有効化 | +zen-mixed-pitch-modesに含まれるモード |
| BR-03 | グローバルエフェクト無効 | writeroom-global-effectsを無効化し、他バッファへの影響を防止 | 常時 |
| BR-04 | フルスクリーン復元 | フルスクリーンモード終了時は元の状態を復元 | +zen/toggle-fullscreen使用時 |

### 計算ロジック

テキストスケール設定:
```elisp
(when (/= +zen-text-scale 0)
  (text-scale-set (if writeroom-mode +zen-text-scale 0))
  (visual-fill-column-adjust))
```

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | warning | window-divider-modeが無効 | 分割線サイズ変更をスキップ |

### リトライ仕様

リトライ処理は実装されていない。

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

トランザクション処理は不要。

## パフォーマンス要件

- モード切り替え: 即座（視覚的な遅延なし）
- フォント変更: フレーム再描画に依存

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

特になし。

## 備考

- `+zen-text-scale`を0に設定するとテキストスケーリングを無効化可能
- `+zen-mixed-pitch-modes`に追加のモードを追加可能
- フルスクリーンモードは`+zen/toggle-fullscreen`で別途切り替え

---

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

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

### 推奨読解順序

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

モジュールの設定変数を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/ui/zen/config.el` | 設定変数（+zen-text-scale, +zen-mixed-pitch-modes等） |

**読解のコツ**: `defvar`で定義されている変数がカスタマイズポイント。これらの値を変更することでZenモードの動作を調整できる。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | autoload.el | `modules/ui/zen/autoload.el` | コマンド定義（+zen/toggle, +zen/toggle-fullscreen） |

**主要処理フロー**:
1. **4行目**: `+zen/toggle`は`writeroom-mode`のエイリアス
2. **6-29行目**: `+zen/toggle-fullscreen`でフルスクリーン切り替えとウィンドウ構成保存・復元

#### Step 3: writeroom-mode設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/ui/zen/config.el` | writeroom-modeの設定とフック |

**主要処理フロー**:
- **18-24行目**: writeroom-global-effectsの無効化
- **26-31行目**: テキストスケーリングフック（+zen-enable-text-scaling-mode-h）
- **33-46行目**: ウィンドウ分割線サイズ変更フック

#### Step 4: mixed-pitch設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config.el | `modules/ui/zen/config.el` | mixed-pitch-modeの設定 |

**主要処理フロー**:
- **52-58行目**: writeroom-modeフックでmixed-pitchを有効化
- **60-76行目**: 固定幅フォントを維持するフェイスの設定

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

```
+zen/toggle (ユーザーコマンド)
    │
    └─ writeroom-mode
           │
           ├─ writeroom-mode-hook
           │      │
           │      ├─ +zen-enable-text-scaling-mode-h
           │      │      └─ text-scale-set
           │      │      └─ visual-fill-column-adjust
           │      │
           │      └─ +zen-enable-mixed-pitch-mode-h
           │             └─ mixed-pitch-mode
           │
           └─ global-writeroom-mode-hook
                  └─ +zen-toggle-large-window-dividers-h
                         └─ window-divider-mode

+zen/toggle-fullscreen (ユーザーコマンド)
    │
    ├─ current-window-configuration (保存)
    │
    ├─ modify-frame-parameters (フルスクリーン化)
    │
    └─ +zen/toggle
           └─ writeroom-mode
```

### データフロー図

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

ユーザー操作          ┌──────────────────────┐
(M-x +zen/toggle) ───▶│ writeroom-mode       │ ───▶ UI要素の非表示
                      └──────────────────────┘
                               │
                               ▼
                      ┌──────────────────────┐
                      │ text-scale-set       │ ───▶ テキスト拡大
                      └──────────────────────┘
                               │
                               ▼
                      ┌──────────────────────┐
                      │ mixed-pitch-mode     │ ───▶ フォント変更
                      │ (対象モードのみ)      │
                      └──────────────────────┘
                               │
                               ▼
                      ┌──────────────────────┐
                      │ window-divider設定    │ ───▶ 分割線拡大
                      └──────────────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/ui/zen/config.el` | ソース | モジュール設定、writeroom-mode/mixed-pitch設定 |
| autoload.el | `modules/ui/zen/autoload.el` | ソース | コマンド定義 |
| packages.el | `modules/ui/zen/packages.el` | 設定 | 依存パッケージ定義（writeroom-mode, mixed-pitch） |
