# 機能設計書 64-インデントガイド

## 概要

本ドキュメントは、space-vimにおけるインデントガイド機能の設計について記載する。indentLineおよびvim-indent-guidesプラグインによるインデントレベルの視覚的表示機能を提供する。

### 本機能の処理概要

インデントガイド機能は、ソースコードのインデントレベルを視覚的に表示する機能を提供する。縦線や背景色の変化によってインデントの深さを明確にし、コードの構造把握を支援する。

**業務上の目的・背景**：プログラミングにおいて、インデントはコードの構造を示す重要な要素である。特にPythonのようにインデントが構文的に意味を持つ言語や、深くネストしたコードを読む際に、インデントレベルの把握は不可欠である。視覚的なガイドラインにより、コードブロックの開始・終了位置が明確になり、可読性と編集効率が向上する。

**機能の利用シーン**：
- 深くネストしたコードの構造を確認する場合
- 関数やクラスの範囲を視覚的に把握する場合
- インデントの不整合を発見する場合
- コードレビュー時にブロック構造を確認する場合

**主要な処理内容**：
1. インデントレベルに応じた縦線（`¦`）を表示
2. 各インデントレベルで異なる色を使用
3. `:IndentGuidesToggle` または `:IndentLinesToggle` でトグル
4. `<Leader>ti` キーマッピングでトグル実行

**関連システム・外部連携**：
- Yggdroot/indentLine プラグイン
- nathanaelkane/vim-indent-guides プラグイン
- space-vimの+programming/programmingレイヤーの一部として提供

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

## 関連画面

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

## 機能種別

表示制御

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:indentLine_enabled | Number | No | 1で有効、0で無効 | 0または1 |
| g:indentLine_char | String | No | ガイドライン文字（デフォルト: `¦`） | 1文字 |
| g:indentLine_color_term | Number | No | ターミナルでの色 | 有効な色番号 |
| g:indentLine_color_gui | String | No | GUIでの色 | 有効な色コード |

### 入力データソース

編集中のバッファ（ソースコード）のインデント情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| インデントガイドライン | 視覚表示 | インデント位置に表示される縦線 |

### 出力先

エディタ画面（コンシールテキストとして表示）

## 処理フロー

### 処理シーケンス

```
1. バッファ表示時にインデント解析
   └─ 各行のインデントレベルを計算

2. インデント位置にガイドラインを配置
   └─ conceal機能を使用して仮想文字を表示

3. カラーリング適用
   └─ 設定された色でガイドラインを表示

4. ユーザー操作でトグル
   └─ :IndentGuidesToggle または <Leader>ti
```

### フローチャート

```mermaid
flowchart TD
    A[バッファ表示] --> B[インデント解析]
    B --> C{インデントガイド有効?}
    C -->|Yes| D[ガイドライン描画]
    C -->|No| E[通常表示]
    D --> F[カラーリング適用]
    F --> G[画面表示]
    E --> G
    H[トグルコマンド] --> I{現在有効?}
    I -->|Yes| J[無効化]
    I -->|No| K[有効化]
    J --> C
    K --> C
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 自動有効化 | vim-indent-guidesはVim起動時に自動的に有効化 | g:indent_guides_enable_on_vim_startup = 1 |
| BR-02 | ファイルタイプ除外 | help, startify, vimfiler等では表示しない | 特定のファイルタイプ |
| BR-03 | インデント幅連動 | shiftwidth設定に基づいてガイドを表示 | すべてのファイル |

### 計算ロジック

特になし（インデント位置に基づく単純な表示制御）

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 表示不具合 | conceal機能がサポートされていないターミナル | vim-indent-guidesを使用（背景色方式） |

### リトライ仕様

該当なし

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

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

## パフォーマンス要件

即時表示（大規模ファイルでも遅延なし）

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

特になし

## 備考

- indentLineはconceal機能を使用するため、`g:indentLine_concealcursor`設定が重要
- vim-indent-guidesは背景色方式のため、より多くの環境で動作
- 両プラグインとも遅延ロードで設定されている

---

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

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

### 推奨読解順序

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

インデントガイド関連プラグインの登録を確認する。

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

**読解のコツ**: 両プラグインとも遅延ロード設定（`{ 'on': '...' }`）で登録されている。

**主要処理フロー**:
1. **29行目**: `MP 'Yggdroot/indentLine', { 'on': 'IndentLinesToggle' }` - indentLineの遅延ロード登録
2. **30行目**: `MP 'nathanaelkane/vim-indent-guides', { 'on': 'IndentGuidesToggle' }` - vim-indent-guidesの遅延ロード登録
3. **31行目**: `autocmd! User indentLine,vim-indent-guides call spacevim#autocmd#indent#Init()` - 初期化処理の登録

#### Step 2: 初期化処理を理解する

プラグイン読み込み時の初期化処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | indent.vim | `core/autoload/spacevim/autocmd/indent.vim` | 各プラグインの設定を確認 |

**主要処理フロー**:
- **2-9行目**: indentLine設定セクション
  - **3行目**: `let g:indentLine_char='¦'` - ガイドライン文字
  - **4行目**: `let g:indentLine_enabled=1` - 有効化
  - **5行目**: `let g:indentLine_color_term=239` - ターミナル色
  - **6行目**: `let g:indentLine_color_gui = '#4A9586'` - GUI色
  - **7行目**: `let g:indentLine_concealcursor='vc'` - カーソル行のconceal設定
  - **8行目**: `let g:indentLine_fileTypeExclude = ['help', 'startify', 'vimfiler']` - 除外ファイルタイプ
- **11-16行目**: vim-indent-guides設定セクション
  - **12行目**: `let g:indent_guides_start_level = 2` - 開始レベル
  - **13行目**: `let g:indent_guides_guide_size = 1` - ガイドサイズ
  - **14行目**: `let g:indent_guides_enable_on_vim_startup = 1` - 起動時有効化
  - **15行目**: `let g:indent_guides_auto_colors = 0` - 自動色設定無効

#### Step 3: キーバインディングを確認する

トグル用のキーマッピングを確認する。

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

**主要処理フロー**:
- **80-82行目**: vim-indent-guides設定セクション
- **81行目**: `nnoremap <Leader>ti :IndentGuidesToggle<CR>` - トグルキーマッピング

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

```
space-vim起動
    │
    └─ spacevim#bootstrap()
           │
           └─ +programming/programming レイヤー読み込み
                  │
                  ├─ packages.vim
                  │      ├─ MP 'Yggdroot/indentLine' (遅延ロード)
                  │      ├─ MP 'nathanaelkane/vim-indent-guides' (遅延ロード)
                  │      └─ autocmd User登録
                  │
                  └─ config.vim
                         └─ <Leader>ti キーマッピング

プラグインロード時
    │
    └─ spacevim#autocmd#indent#Init()
           │
           ├─ indentLine設定
           │      ├─ g:indentLine_char = '¦'
           │      ├─ g:indentLine_enabled = 1
           │      ├─ g:indentLine_color_term = 239
           │      ├─ g:indentLine_color_gui = '#4A9586'
           │      ├─ g:indentLine_concealcursor = 'vc'
           │      └─ g:indentLine_fileTypeExclude = [...]
           │
           └─ vim-indent-guides設定
                  ├─ g:indent_guides_start_level = 2
                  ├─ g:indent_guides_guide_size = 1
                  ├─ g:indent_guides_enable_on_vim_startup = 1
                  └─ g:indent_guides_auto_colors = 0
```

### データフロー図

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

バッファ内容             インデント解析                  インデントガイド
（ソースコード）   ───▶  プラグイン処理    ───▶         表示
    +                          │
shiftwidth設定                 ▼
                         conceal/背景色
                           描画処理
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+programming/programming/packages.vim` | 設定 | プラグイン登録 |
| config.vim | `layers/+programming/programming/config.vim` | 設定 | キーマッピング設定 |
| indent.vim | `core/autoload/spacevim/autocmd/indent.vim` | 設定 | プラグイン初期化設定 |
| LAYERS.md | `layers/LAYERS.md` | ドキュメント | レイヤー一覧 |
| indentLine | 外部プラグイン（Yggdroot/indentLine） | プラグイン | conceal方式ガイド |
| vim-indent-guides | 外部プラグイン（nathanaelkane/vim-indent-guides） | プラグイン | 背景色方式ガイド |
