# 機能設計書 65-レインボー括弧

## 概要

本ドキュメントは、space-vimにおけるレインボー括弧機能の設計について記載する。rainbowおよびrainbow_parentheses.vimプラグインによる括弧の色分け表示機能を提供する。

### 本機能の処理概要

レインボー括弧機能は、ネストした括弧（丸括弧、角括弧、波括弧）を異なる色で表示する機能を提供する。括弧のネストレベルに応じて色が変化し、対応する括弧のペアを視覚的に識別できるようにする。

**業務上の目的・背景**：複雑な数式やネストした関数呼び出し、多重配列アクセスなど、括弧が深くネストするコードは可読性が低下しやすい。特にLisp系言語では括弧の対応関係の把握が困難になる。レインボー括弧機能により、各括弧ペアが異なる色で表示されるため、対応関係が一目で分かり、バグの発見や編集効率が向上する。

**機能の利用シーン**：
- 複雑な数式や条件式を読み解く場合
- Lisp/Clojure/Schemeなどの括弧ベース言語を編集する場合
- ネストした関数呼び出しの構造を確認する場合
- 括弧の不一致エラーを発見する場合

**主要な処理内容**：
1. 括弧のネストレベルを解析
2. ネストレベルに応じた色を割り当て
3. 対応する開き括弧と閉じ括弧を同じ色で表示
4. ファイルタイプに応じた設定の自動適用

**関連システム・外部連携**：
- luochen1990/rainbow プラグイン（メイン）
- junegunn/rainbow_parentheses.vim プラグイン（Lisp系言語向け）
- space-vimの+programming/programmingレイヤーの一部として提供

**権限による制御**：特になし。すべてのユーザーが利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | テキストエディタ全般 | 主画面 | 編集中のソースコードに括弧の色分けを表示 |

## 機能種別

表示制御

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:rainbow_active | Number | No | 1で有効、0で無効 | 0または1 |
| g:rainbow_conf | Dictionary | No | 色設定、括弧パターン設定 | 有効なVim辞書 |

### 入力データソース

編集中のバッファ（ソースコード）の括弧構造

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 色分けされた括弧 | 視覚表示 | ネストレベルに応じた色で表示される括弧 |

### 出力先

エディタ画面（シンタックスハイライトとして表示）

## 処理フロー

### 処理シーケンス

```
1. バッファ表示時に括弧解析
   └─ ファイルタイプに応じた括弧パターンを適用

2. ネストレベルの計算
   └─ 各括弧のネスト深度を算出

3. 色の割り当て
   └─ g:rainbow_confで定義された色リストから割り当て

4. シンタックスハイライト適用
   └─ 対応する括弧ペアを同じ色で表示
```

### フローチャート

```mermaid
flowchart TD
    A[バッファ表示] --> B{rainbow有効?}
    B -->|Yes| C[ファイルタイプ判定]
    B -->|No| D[通常表示]
    C --> E[括弧パターン取得]
    E --> F[ネストレベル解析]
    F --> G[色割り当て]
    G --> H[シンタックスハイライト適用]
    H --> I[画面表示]
    D --> I
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 自動有効化 | g:rainbow_active = 1 で自動的に有効化 | Vim起動時 |
| BR-02 | 言語別設定 | ファイルタイプに応じた括弧パターンと色設定 | 各ファイルタイプ |
| BR-03 | Lisp特別対応 | Lisp/Clojure/SchemeではRainbowParenthesesを使用 | Lisp系ファイルタイプ |

### 計算ロジック

特になし（シンタックスハイライトルールによる表示制御）

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

該当なし（表示機能のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 表示不具合 | 不正な括弧構造（閉じ括弧のない括弧等） | 最後に有効だったネストレベルの色を使用 |

### リトライ仕様

該当なし

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

該当なし（表示機能のみ、ファイルへの変更なし）

## パフォーマンス要件

即時表示（バッファ読み込み時に処理）

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

特になし

## 備考

- rainbowプラグインは遅延ロードで設定されている
- ファイルタイプによっては明示的に有効化が必要（`g:rainbow_conf.separately`）
- HTMLでは開始・終了タグもレインボー表示対象

---

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

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

### 推奨読解順序

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

レインボー括弧関連プラグインの登録を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+programming/programming/packages.vim` | rainbowとrainbow_parentheses.vimの登録を確認 |

**読解のコツ**: rainbowプラグインは遅延ロード、rainbow_parentheses.vimはLisp系言語用に設定されている。

**主要処理フロー**:
1. **1-6行目**: speed_up_via_timer設定に応じたロード方式
2. **2行目** または **8行目**: `MP 'luochen1990/rainbow'` - rainbowプラグイン登録
3. **21行目**: `MP 'junegunn/rainbow_parentheses.vim', { 'for': ['lisp', 'clojure', 'scheme'] }` - Lisp系言語用

#### Step 2: 設定内容を理解する

レインボー括弧の詳細設定を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+programming/programming/config.vim` | 色設定と括弧パターンを確認 |

**主要処理フロー**:
- **40-58行目**: rainbow設定セクション
- **41行目**: `let g:rainbow_active = 1` - 自動有効化
- **42-50行目**: `let g:rainbow_conf = {...}` - 設定辞書
  - **43行目**: `'guifgs': [...]` - GUI用の色リスト（6色）
  - **44行目**: `'ctermfgs': [...]` - ターミナル用の色リスト
  - **45行目**: `'operators': '_,_'` - 演算子のパターン
  - **46行目**: `'parentheses': [...]` - 括弧のパターン定義
  - **47-49行目**: `'separately': {'*': 0}` - ファイルタイプ別設定
- **51-53行目**: ファイルタイプ別の特殊設定（tex, lisp, vim, html）
- **55-57行目**: 有効化するファイルタイプの一覧

#### Step 3: Lisp向け設定を確認する

rainbow_parentheses.vimの設定を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+programming/programming/config.vim` | RainbowParenthesesコマンドの設定を確認 |

**主要処理フロー**:
- **60-65行目**: rainbow_parentheses.vim設定セクション
- **61-64行目**: augroup定義
- **63行目**: `autocmd FileType lisp,clojure,scheme RainbowParentheses` - Lisp系でRainbowParentheses自動実行

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

```
space-vim起動
    │
    └─ spacevim#bootstrap()
           │
           └─ +programming/programming レイヤー読み込み
                  │
                  ├─ packages.vim
                  │      ├─ MP 'luochen1990/rainbow' (遅延ロード or 通常)
                  │      └─ MP 'junegunn/rainbow_parentheses.vim' (Lisp系用)
                  │
                  └─ config.vim
                         │
                         ├─ g:rainbow_active = 1
                         │
                         ├─ g:rainbow_conf 設定
                         │      ├─ guifgs (GUI色)
                         │      ├─ ctermfgs (ターミナル色)
                         │      ├─ operators (演算子)
                         │      ├─ parentheses (括弧パターン)
                         │      └─ separately (ファイルタイプ別)
                         │
                         └─ augroup rainbowLisp
                                └─ FileType lisp,clojure,scheme
                                       └─ RainbowParentheses
```

### データフロー図

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

バッファ内容             rainbow / rainbow_parentheses   色分けされた
（ソースコード）   ───▶  プラグイン処理    ───▶         括弧表示
    +                          │
ファイルタイプ                 ▼
                         ネストレベル解析
                              │
                              ▼
                         g:rainbow_conf
                         色リストから割り当て
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+programming/programming/packages.vim` | 設定 | プラグイン登録 |
| config.vim | `layers/+programming/programming/config.vim` | 設定 | 色設定、括弧パターン設定 |
| LAYERS.md | `layers/LAYERS.md` | ドキュメント | レイヤー一覧 |
| rainbow | 外部プラグイン（luochen1990/rainbow） | プラグイン | レインボー括弧本体 |
| rainbow_parentheses.vim | 外部プラグイン（junegunn/rainbow_parentheses.vim） | プラグイン | Lisp系向けレインボー括弧 |
