# 画面設計書 16-Goyo（集中執筆モード）

## 概要

本ドキュメントは、space-vimにおけるGoyo（集中執筆モード）画面の設計を記述したものである。goyo.vimプラグインによって提供されるディストラクションフリー（気が散らない）の執筆モード画面について、その構成・機能・操作方法を詳細に解説する。

### 本画面の処理概要

Goyo画面は、ステータスライン、行番号、その他のUI要素を一時的に非表示にし、テキスト編集に集中できる環境を提供する特殊な表示モードである。画面中央にテキストコンテンツのみを配置し、周囲にマージンを設けることで、シンプルで集中しやすい執筆環境を実現する。

**業務上の目的・背景**：文章作成やMarkdown編集において、周囲のUI要素が視覚的なノイズとなり、集中力を妨げることがある。特に長文の執筆や、クリエイティブなライティング作業では、シンプルな画面環境が生産性向上に寄与する。Goyo画面は、執筆に必要な最小限の表示のみを残し、「書く」ことに集中できるZen（禅）モードを提供する。

**画面へのアクセス方法**：
- `SPC g y` または `:Goyo` - 集中執筆モードをトグル

**主要な操作・処理内容**：
1. **ディストラクションフリー表示**：ステータスライン、タブライン、行番号等の非表示
2. **中央配置**：テキストコンテンツを画面中央に配置
3. **マージン設定**：上下左右に余白を設けた表示
4. **トグル操作**：通常モードと集中モードの切り替え
5. **Limelight連携**：カーソル行以外を暗くする機能との連携（オプション）

**画面遷移**：
- エディタ画面 → Goyo画面（`:Goyo`または`SPC g y`）
- Goyo画面 → エディタ画面（`:Goyo`または`SPC g y`で再度トグル）

**権限による表示制御**：本画面に権限による表示制御は存在しない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 82 | goyo | 主機能 | ディストラクションフリーの執筆モード画面表示 |
| 57 | Markdown | 補助機能 | Markdown執筆時の集中モードとして利用 |

## 画面種別

特殊表示モード（フルスクリーン集中モード）

## URL/ルーティング

Vimコマンド/キーバインドによるアクセス：
- `:Goyo` - 集中モードをトグル
- `:Goyo 120` - 幅120文字で集中モードを開始
- `:Goyo 120x30` - 幅120文字、高さ30行で集中モードを開始
- `:Goyo!` - 集中モードを強制終了

## 入出力項目

| 項目名 | 入出力 | データ型 | 説明 |
|--------|--------|----------|------|
| 幅設定 | 入力（オプション） | 数値 | コンテンツ領域の幅（デフォルト: 80） |
| 高さ設定 | 入力（オプション） | 数値 | コンテンツ領域の高さ（デフォルト: 画面全体） |
| 表示状態 | 出力 | Boolean | Goyoモードが有効かどうか |

## 表示項目

### Goyoモード有効時

| 表示項目 | 状態 | 説明 |
|----------|------|------|
| テキストコンテンツ | 表示 | 画面中央に配置 |
| ステータスライン | 非表示 | 一時的に非表示 |
| タブライン | 非表示 | 一時的に非表示 |
| 行番号 | 非表示 | 一時的に非表示 |
| サインカラム | 非表示 | 一時的に非表示 |
| 左右マージン | 表示 | 空のウィンドウで実現 |

### Limelight連携時（オプション）

| 表示項目 | 状態 | 説明 |
|----------|------|------|
| カーソル行 | 通常表示 | フル輝度で表示 |
| その他の行 | 薄く表示 | 視覚的に目立たなくする |

## イベント仕様

### 1-Goyoモード開始

`:Goyo`コマンドまたは`SPC g y`押下時、集中執筆モードが開始される。

```
[ユーザー操作] SPC g y または :Goyo
        ↓
[goyo.vim] 現在のウィンドウ状態を保存
        ↓
[goyo.vim] UI要素を非表示に設定
        │  ├─ &laststatus = 0
        │  ├─ &showmode = 0
        │  ├─ &showcmd = 0
        │  ├─ &number = 0
        │  └─ &signcolumn = 'no'
        ↓
[goyo.vim] マージン用ウィンドウを作成
        ↓
[画面更新] テキストが画面中央に配置
```

### 2-Goyoモード終了

Goyoモード中に再度`:Goyo`を実行すると、通常モードに戻る。

```
[ユーザー操作] SPC g y または :Goyo
        ↓
[goyo.vim] マージン用ウィンドウを削除
        ↓
[goyo.vim] 保存していた設定を復元
        ↓
[画面更新] 通常のエディタ画面に戻る
```

### 3-Limelight連携（オプション）

Limelightプラグインと連携し、カーソル行以外を暗くする。

```
[トリガー] GoyoEnter autocmd
        ↓
[limelight.vim] Limelight有効化
        ↓
[画面更新] カーソル行以外が薄く表示

[トリガー] GoyoLeave autocmd
        ↓
[limelight.vim] Limelight無効化
        ↓
[画面更新] 全行が通常表示に戻る
```

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

本画面は表示専用であり、データの更新は行わない。

## メッセージ仕様

Goyo自体はメッセージを表示しない。モードの切り替えは画面表示の変化で認識される。

## 例外処理

| 例外状態 | 対処 | ユーザーへの通知 |
|---------|------|-----------------|
| 分割ウィンドウでの実行 | ウィンドウを統合して実行 | 特になし |
| 端末幅が狭い | 指定幅に収まるよう調整 | 特になし |

## 備考

- goyo.vimはjunegunn氏によって開発されたディストラクションフリー執筆プラグインである
- limelight.vimとの連携により、よりフォーカスした執筆環境を実現可能
- space-vimでは`:Goyo`コマンドで遅延読み込みが設定されている
- Markdownファイルの執筆時に特に有用
- `:Goyo`コマンドで幅・高さを指定可能（例: `:Goyo 100x30`）

---

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

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

### 推奨読解順序

#### Step 1: プラグイン登録を理解する

まず、goyo.vimとlimelight.vimがどのように登録されているかを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+fun/goyo/packages.vim` | goyo.vimとlimelight.vimの登録 |

**読解のコツ**: `{ 'on': 'Goyo' }`は、`:Goyo`コマンド実行時に初めてプラグインが読み込まれることを示す。

**主要処理フロー**:
1. **1行目**: `MP 'junegunn/goyo.vim', { 'on' : 'Goyo' }` - Goyoコマンド実行時に遅延読み込み
2. **2行目**: `MP 'junegunn/limelight.vim', { 'on' : 'Limelight' }` - Limelightコマンド実行時に遅延読み込み

#### Step 2: キーバインド設定を理解する

Goyoモードのトグルキーバインドを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+fun/goyo/config.vim` | SPC g yキーバインド設定 |

**主要処理フロー**:
1. **2行目**: `nnoremap <Leader>gy :Goyo<CR>` - SPC g yでGoyoをトグル

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

```
SPC g y 押下
    │
    └─ :Goyo コマンド実行
           │
           ├─ goyo.vim（初回時に遅延読み込み）
           │
           └─ Goyoモード処理
                  │
                  ├─ 【開始時】
                  │      ├─ 現在の設定を保存
                  │      ├─ UI要素を非表示
                  │      ├─ マージンウィンドウ作成
                  │      └─ GoyoEnter autocmd発火
                  │             └─ Limelight（オプション）
                  │
                  └─ 【終了時】
                         ├─ マージンウィンドウ削除
                         ├─ 設定を復元
                         └─ GoyoLeave autocmd発火
                                └─ Limelight無効化（オプション）
```

### データフロー図

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

SPC g y ─────────▶ goyo.vim ────────────▶ 集中執筆モード
                          │
                          ├─▶ UI要素非表示
                          │
                          └─▶ マージン作成

:Goyo 120 ───────▶ goyo.vim ────────────▶ 幅120文字モード
                          │
                          └─▶ 指定幅でマージン計算

GoyoEnter ───────▶ limelight.vim ───────▶ フォーカス表示
                          │
                          └─▶ カーソル行以外を暗く
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+fun/goyo/packages.vim` | ソース | goyo.vim, limelight.vimプラグイン登録 |
| config.vim | `layers/+fun/goyo/config.vim` | ソース | キーバインド設定（SPC g y） |
| 画面一覧.csv | `docs/code-to-docs/画面一覧/画面一覧.csv` | データ | 画面No.16の定義 |
| 画面遷移図.md | `docs/code-to-docs/画面一覧/画面遷移図.md` | ドキュメント | 画面遷移の定義（32,39行目） |
