# 画面設計書 13-Zen Mode

## 概要

本ドキュメントは、Doom EmacsにおけるZen Mode（集中執筆モード）画面の設計仕様を定義するものである。writeroom-modeパッケージを利用した集中作業環境について、そのUI変更仕様、テキストスケーリング、およびフルスクリーン機能を記載する。

### 本画面の処理概要

Zen Mode画面は、執筆や集中作業に最適化されたUIモードであり、余計な要素を非表示にしてテキスト編集に集中できる環境を提供する機能である。

**業務上の目的・背景**：通常のエディタ画面では、モードライン、行番号、サイドバーなど多くのUI要素が表示されており、長文執筆や集中が必要な作業時に気が散る原因となる。本機能は、これらの要素を一時的に非表示にし、テキストを画面中央に配置することで、執筆や深い思考を必要とする作業に適した環境を提供する。特にマークダウン、org-mode、reStructuredTextでの文書作成に効果的。

**画面へのアクセス方法**：`+zen/toggle`コマンド（または`writeroom-mode`）を実行してトグルする。フルスクリーンモードは`+zen/toggle-fullscreen`コマンドで有効化する。

**主要な操作・処理内容**：
1. 余白（マージン）の追加による中央寄せ表示
2. テキストサイズの拡大（デフォルト: 2段階拡大）
3. ウィンドウ分割線サイズの調整
4. mixed-pitch-modeによる可変幅フォント混在
5. フルスクリーンモードでの全画面表示

**画面遷移**：Zen Modeは通常の編集バッファ上でトグル可能なモードであり、モード切り替えにより同一バッファ上で表示が変化する。他の画面への遷移は通常通り可能。

**権限による表示制御**：本機能に権限による表示制御はない。全ユーザーが同一の機能を利用可能である。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | Zenモード（集中執筆環境） | 主機能 | writeroom-modeによる集中モード、テキストスケーリング |
| 4 | UI 設定 | 補助機能 | ウィンドウ分割線サイズ調整 |

## 画面種別

モード切替（編集画面のビュー変更）

## URL/ルーティング

Emacsモード: `writeroom-mode`
コマンド: `+zen/toggle`, `+zen/toggle-fullscreen`

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|---------|------|
| +zen-text-scale | 入力 | 整数 | テキスト拡大率（デフォルト: 2） |
| +zen-window-divider-size | 入力 | 整数 | ウィンドウ分割線サイズ（デフォルト: 4px） |
| +zen-mixed-pitch-modes | 入力 | リスト | mixed-pitch-modeを有効にするメジャーモードのリスト |
| マージン | 出力 | 整数 | visual-fill-column-modeによる左右マージン |
| テキストスケール | 出力 | 整数 | 適用されたテキストスケール値 |

## 表示項目

| 項目名 | 表示位置 | 説明 |
|--------|---------|------|
| 中央寄せテキスト | 画面中央 | visual-fill-columnによる中央配置 |
| 拡大テキスト | 全体 | text-scale-modeによる拡大表示 |
| 可変幅フォント | テキスト部分 | mixed-pitch-modeによる本文フォント |
| 固定幅フォント | コード部分 | mixed-pitch-modeによるコードフォント |

## イベント仕様

### 1-Zen Modeトグル

`+zen/toggle`（`writeroom-mode`のエイリアス）を実行すると、以下の処理が順次実行される：
1. writeroom-modeの有効化/無効化
2. テキストスケールの適用/解除（`+zen-enable-text-scaling-mode-h`）
3. mixed-pitch-modeの有効化/無効化（対象モードの場合）

### 2-フルスクリーントグル

`+zen/toggle-fullscreen`を実行すると、以下の処理が実行される：
1. 現在のウィンドウ構成を保存
2. フレームをフルスクリーンに変更
3. 他のウィンドウを削除
4. writeroom-modeを有効化
再度実行すると、保存されたウィンドウ構成に復元される。

### 3-テキストサイズ変更

`text-scale-adjust`コマンドでテキストサイズを変更すると、`visual-fill-column-adjust`がアドバイスにより自動実行され、マージンが再計算される。

### 4-ウィンドウ分割線調整

`global-writeroom-mode-hook`により、writeroom-mode有効時にウィンドウ分割線のサイズが`+zen-window-divider-size`（4px）に拡大される。無効化時は元のサイズに復元される。

## データベース更新仕様

本機能はデータベースを使用しない。表示設定はEmacsの変数として一時的に保持される。

## メッセージ仕様

| メッセージ種別 | メッセージ内容 | 表示条件 |
|--------------|--------------|---------|
| なし | - | Zen Modeはメッセージを表示しない |

## 例外処理

| 例外状態 | 処理内容 |
|---------|---------|
| +zen-text-scaleが0 | テキストスケーリングをスキップ |
| 対象外のメジャーモード | mixed-pitch-modeを有効化しない |
| フルスクリーン復元失敗 | fullscreen-restoreパラメータで元の状態を判定 |

## 備考

- writeroom-modeの`writeroom-global-effects`はnilに設定され、バッファローカルな効果のみ適用
- `writeroom-maximize-window`はnilに設定され、ウィンドウ最大化は行わない
- mixed-pitch-modeの対象モード: adoc-mode, rst-mode, markdown-mode, org-mode
- フルスクリーンモードは独自実装（`+zen/toggle-fullscreen`）で、writeroom-modeの標準フルスクリーンとは異なる

---

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

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

### 推奨読解順序

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

Zen Modeの設定変数とその役割を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/ui/zen/config.el` | 3-12行目: カスタム変数定義 |

**読解のコツ**: `+zen-`プレフィックスの変数がDoom独自の設定、`writeroom-`プレフィックスの変数がwriteroom-modeパッケージの設定。

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

writeroom-modeの初期化とフック設定を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/ui/zen/config.el` | 18-24行目: writeroom-modeの初期設定 |

**主要処理フロー**:
1. **22行目**: `writeroom-global-effects`をnilに設定（グローバル効果を無効化）
2. **23行目**: `writeroom-maximize-window`をnilに設定
3. **24行目**: ウィンドウ最大化を無効化

#### Step 3: テキストスケーリング処理を理解する

テキスト拡大機能の実装を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/ui/zen/config.el` | 26-31行目: テキストスケーリングフック |

**主要処理フロー**:
- **27-28行目**: `+zen-enable-text-scaling-mode-h`関数定義
- **29行目**: `+zen-text-scale`が0でない場合のみ適用
- **30行目**: writeroom-mode有効時は`+zen-text-scale`、無効時は0を設定
- **31行目**: マージン調整のため`visual-fill-column-adjust`を呼び出し

#### Step 4: ウィンドウ分割線調整を理解する

ウィンドウ分割線サイズ変更の実装を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config.el | `modules/ui/zen/config.el` | 33-46行目: ウィンドウ分割線フック |

**主要処理フロー**:
- **36-42行目**: writeroom-mode有効時は旧サイズを保存し、新サイズを適用
- **43-45行目**: 無効時は保存されたサイズに復元
- **46行目**: `window-divider-mode`を再有効化

#### Step 5: mixed-pitch-mode連携を理解する

可変幅フォント混在モードの連携を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | config.el | `modules/ui/zen/config.el` | 52-76行目: mixed-pitchパッケージ設定 |

**主要処理フロー**:
- **53行目**: writeroom-mode-hookでmixed-pitch-modeを連携
- **55-58行目**: `+zen-mixed-pitch-modes`に含まれるモードでのみ有効化
- **60-76行目**: 固定幅フォントを維持するフェイスのリスト追加

#### Step 6: フルスクリーン機能を理解する

フルスクリーントグル機能の実装を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 6-1 | autoload.el | `modules/ui/zen/autoload.el` | 7-29行目: `+zen/toggle-fullscreen`関数 |

**主要処理フロー**:
- **4行目**: `+zen/toggle`は`writeroom-mode`のエイリアス
- **15-22行目**: writeroom-mode有効時はフルスクリーン解除・ウィンドウ復元
- **23-27行目**: 無効時はウィンドウ構成保存・フルスクリーン化
- **28-29行目**: writeroom-modeをトグル

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

```
+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 (+1 or -1)
    │
    └─ global-writeroom-mode-hook
           └─ +zen-toggle-large-window-dividers-h
                  └─ window-divider-mode

+zen/toggle-fullscreen
    │
    ├─ current-window-configuration (保存)
    │
    ├─ modify-frame-parameters
    │      └─ fullscreen -> fullboth
    │
    └─ +zen/toggle
           └─ writeroom-mode
```

### データフロー図

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

+zen-text-scale    ───▶ text-scale-set         ───▶ 拡大テキスト表示
(デフォルト: 2)

+zen-mixed-pitch   ───▶ derived-mode-p判定     ───▶ mixed-pitch-mode
-modes                                               有効/無効

+zen-window-       ───▶ window-divider-        ───▶ 分割線サイズ
divider-size            default-*-width設定          変更

current-window-    ───▶ +zen--last-wconf保存   ───▶ 復元用構成
configuration                                        保持
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| 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` | 設定 | パッケージ依存関係定義 |
