# 機能設計書 82-goyo

## 概要

本ドキュメントは、space-vimの集中執筆モード機能（goyo）の設計について記述する。この機能は、Vimでディストラクションフリーな執筆環境を提供する。

### 本機能の処理概要

**業務上の目的・背景**：文章執筆やコーディングに集中したい場合、ステータスライン、行番号、サイドバーなどの視覚的要素が気を散らす原因となることがある。goyo機能はこれらの要素を一時的に非表示にし、コンテンツ作成に集中できる環境を提供する。特にMarkdown文書やブログ記事の執筆時に有効で、執筆者の生産性向上を目的とする。

**機能の利用シーン**：技術ブログ記事の執筆時、ドキュメント作成時、長文のコード説明を書く時、プレゼンテーション資料作成時など、集中して文章を書きたい場面で利用される。また、コードレビュー時に特定のコードブロックに集中したい場合にも活用できる。

**主要な処理内容**：
1. `+fun/goyo`レイヤーの有効化によりgoyo.vimとlimelight.vimプラグインをロード
2. `<Leader>gy`キーバインドでGoyoモードをトグル
3. Goyoモード有効化時に画面周辺を非表示化（ステータスライン、タブライン等）
4. 編集エリアを画面中央に配置し、余白を追加
5. Limelightによる現在段落のハイライト（オプション）

**関連システム・外部連携**：junegunn/goyo.vimおよびjunegunn/limelight.vimプラグインとの連携。Airlineやlightlineとも連動し、Goyoモード中はステータスラインが自動的に非表示になる。

**権限による制御**：特になし。レイヤーが有効化されていればすべてのユーザーが利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 16 | Goyo（集中執筆モード） | 主画面 | ディストラクションフリーの執筆モード画面表示 |

## 機能種別

UI制御 / 表示モード切替

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| width | String/Number | No | 編集エリアの幅（例: "80", "80%"） | 正の整数または割合 |
| height | String/Number | No | 編集エリアの高さ | 正の整数または割合 |

### 入力データソース

- ユーザーのキーボード入力（`<Leader>gy`または`:Goyo`コマンド）
- Vimの現在のウィンドウ・バッファ状態

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 画面状態 | Visual | 中央配置された編集エリア、周辺UI非表示 |
| モード状態 | Boolean | Goyoモードのオン/オフ状態 |

### 出力先

- Vimの画面全体（ウィンドウレイアウト変更）
- ステータスライン、タブライン、サイドバーの表示状態

## 処理フロー

### 処理シーケンス

```
1. コマンド実行
   └─ ユーザーが<Leader>gyまたは:Goyoを実行
2. 状態判定
   └─ 現在Goyoモードかどうかを判定
3. モード切替（有効化の場合）
   └─ ステータスライン、タブライン、行番号等を非表示
   └─ 編集エリアを中央に配置
   └─ 余白用のダミーウィンドウを作成
4. モード切替（無効化の場合）
   └─ 元のウィンドウレイアウトに復帰
   └─ ステータスライン等を再表示
```

### フローチャート

```mermaid
flowchart TD
    A[ユーザー入力 Leader gy] --> B{現在Goyoモード?}
    B -->|No| C[Goyoモード有効化]
    B -->|Yes| D[Goyoモード無効化]
    C --> E[UI要素を非表示]
    E --> F[編集エリアを中央配置]
    F --> G[余白ウィンドウ作成]
    G --> H[集中モード開始]
    D --> I[元のレイアウトに復帰]
    I --> J[UI要素を再表示]
    J --> K[通常モード復帰]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-82-1 | オンデマンドロード | goyo.vimは`:Goyo`コマンド実行時のみロード | `{ 'on': 'Goyo' }`指定 |
| BR-82-2 | Limelightオプション | limelight.vimも同時に利用可能 | `{ 'on': 'Limelight' }`指定 |
| BR-82-3 | トグル動作 | 同じキーで有効化/無効化を切り替え | `<Leader>gy`押下時 |
| BR-82-4 | 終了キー | `<Leader>q`でもGoyoモードを終了可能 | READMEに記載 |

### 計算ロジック

- デフォルト幅：80カラム（設定可能）
- 中央配置計算：`(columns - width) / 2`で左右余白を算出

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

本機能はデータベース操作を行わない。

### 操作別データベース影響一覧

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | プラグイン未インストール | goyo.vimがインストールされていない | :PlugInstallを実行 |
| - | レイヤー無効 | goyoレイヤーが有効化されていない | ~/.spacevimでLayer 'goyo'を追加 |
| - | ターミナル幅不足 | 編集エリア幅より画面が小さい | ターミナルウィンドウを拡大 |

### リトライ仕様

リトライは不要。エラー発生時はユーザーが設定を修正して再度操作する。

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

該当なし（ファイルシステムやDBへの永続化を伴わない）

## パフォーマンス要件

- モード切替は即座（100ms以内）に完了すること
- 編集操作のパフォーマンスに影響を与えないこと

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

- 外部通信を行わないため、セキュリティリスクは最小限
- 編集中のファイル内容に影響を与えない（表示のみの変更）

## 備考

- goyo.vimはjunegunn氏が開発。vim-emojiと同じ作者
- Limelightは現在の段落のみをハイライトし、他を暗くする機能
- ターミナルVimでもGUIVimでも動作する

---

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

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

### 推奨読解順序

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

本機能は外部プラグイン（goyo.vim）が提供するUIモード管理を利用する。space-vim側では設定とキーバインディングのみを定義。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+fun/goyo/packages.vim` | ロードされるプラグインの確認 |

**読解のコツ**: `{ 'on': 'Goyo' }`はコマンド実行時の遅延ロードを指定。必要になるまでプラグインはロードされない。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+fun/goyo/config.vim` | キーバインディング定義がエントリーポイント |

**主要処理フロー**:
1. **2行目**: `nnoremap <Leader>gy :Goyo<CR>` - Goyoコマンドへのマッピング

#### Step 3: プラグイン設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | packages.vim | `layers/+fun/goyo/packages.vim` | プラグイン登録（2行） |

**主要処理フロー**:
- **1行目**: goyo.vim登録（Goyoコマンド時にロード）
- **2行目**: limelight.vim登録（Limelightコマンド時にロード）

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

```
vim起動
    │
    ├─ spacevim#bootstrap()
    │      └─ レイヤー読み込み
    │             └─ layers/+fun/goyo/packages.vim
    │             │      └─ vim-plugへプラグイン登録（遅延）
    │             └─ layers/+fun/goyo/config.vim
    │                    └─ キーバインディング設定
    │
    └─ <Leader>gy押下
           └─ :Goyoコマンド実行
                  └─ vim-plugがgoyo.vimをロード
                         └─ Goyo機能が有効化
```

### データフロー図

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

<Leader>gy         goyo#execute()                  画面状態変更
キー入力    ──▶  ウィンドウレイアウト変更  ──▶  集中モード画面
                    UI要素の非表示化
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+fun/goyo/packages.vim` | ソース | プラグイン登録 |
| config.vim | `layers/+fun/goyo/config.vim` | ソース | キーバインディング設定 |
| README.md | `layers/+fun/goyo/README.md` | ドキュメント | レイヤー説明・キーバインド一覧 |
