# 機能設計書 10-SpaceInfo

## 概要

本ドキュメントは、space-vimのSpaceInfoコマンドの設計について記述する。SpaceInfoコマンドは、デバッグ情報の表示機能を提供し、spacevim#debugging#Info()を呼び出す。

### 本機能の処理概要

SpaceInfoコマンドは、現在のspace-vim環境に関するデバッグ情報を表示する。現在のファイルタイプ、space-vim関連のすべてのグローバル変数とその値を整形して出力する。問題のトラブルシューティングや設定の確認に使用される。

**業務上の目的・背景**：space-vimは多数の設定変数を使用しており、問題が発生した際にこれらの値を確認することが重要である。SpaceInfoコマンドは、ユーザーやサポート担当者が現在の設定状態を一目で把握できるようにし、効率的なデバッグを支援する。特にGitHubでのissue報告時に、この情報を添付することで問題の特定が容易になる。

**機能の利用シーン**：
- space-vimの動作に問題が発生した場合のデバッグ
- GitHub issueで問題を報告する際の情報収集
- 現在の設定状態を確認したい場面
- 特定のグローバル変数の値を確認したい場面

**主要な処理内容**：
1. 現在のファイルタイプの取得と表示
2. `g:`名前空間から`spacevim`で始まる変数を抽出
3. 各変数を名前でソート
4. 変数の型に応じた整形出力（Dictionary/その他）
5. クリップボードへのコピー機能（オプション）

**関連システム・外部連携**：
- Vimグローバル変数: `g:`名前空間からの変数取得
- クリップボード: 結果のコピー機能（spacevim#debugging#InfoToClipboard）

**権限による制御**：本機能に権限制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | コマンドライン出力 | 結果表示画面 | デバッグ情報のecho表示 |

## 機能種別

デバッグ情報表示 / システム診断

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| - | - | - | SpaceInfoコマンドは引数を取らない | - |

### 入力データソース

1. **グローバル変数**: `g:`名前空間のspace-vim関連変数
2. **バッファ情報**: 現在のファイルタイプ（&filetype）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| Current FileType | String | 現在のファイルタイプ |
| Global Variables | List | spacevimで始まるグローバル変数一覧 |

### 出力先

- Vimコマンドライン（echo）
- クリップボード（InfoToClipboard使用時）

## 処理フロー

### 処理シーケンス

```
1. :SpaceInfoコマンド実行
   └─ spacevim#debugging#Info()呼び出し

2. グローバル変数の収集
   └─ s:GetGlobalVariables()呼び出し
   └─ g:名前空間をループ
   └─ 'spacevim'で始まる変数を抽出
   └─ 変数名でソート

3. ファイルタイプの表示
   └─ "Current FileType: " + &filetype

4. グローバル変数の表示
   └─ "Global Variables:" ヘッダー
   └─ 各変数をループ
      └─ Dictionary型: 整形出力（s:PrettyPrintDict）
      └─ その他: 単一行出力
```

### フローチャート

```mermaid
flowchart TD
    A[:SpaceInfo] --> B[spacevim#debugging#Info]
    B --> C[s:GetGlobalVariables]
    C --> D[g:名前空間をループ]
    D --> E{spacevimで始まる?}
    E -->|Yes| F[リストに追加]
    E -->|No| G[スキップ]
    F --> H{次の変数?}
    G --> H
    H -->|Yes| D
    H -->|No| I[変数名でソート]
    I --> J[FileType表示]
    J --> K[Global Variables表示]
    K --> L{Dictionary型?}
    L -->|Yes| M[s:PrettyPrintDict]
    L -->|No| N[単一行出力]
    M --> O{次の変数?}
    N --> O
    O -->|Yes| L
    O -->|No| P[完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 変数フィルタ | 'spacevim'で始まる変数のみ表示 | 常時 |
| BR-02 | ソート | 変数名でアルファベット順ソート | 常時 |
| BR-03 | 型判定 | Dictionary型は整形出力、その他は単一行 | 変数出力時 |
| BR-04 | インデント | 変数値は適切にインデント | 出力時 |

### 計算ロジック

該当なし

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

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | 特別なエラーケースなし | - |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 即座に表示（変数数に比例するが、通常は数十程度で即座）

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

- 機密情報を含む変数が表示される可能性がある
- クリップボードコピー時は内容に注意

## 備考

- spacevim#debugging#InfoToClipboard()で結果をクリップボードにコピー可能
- GitHub issue報告時に有用な情報を提供

---

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

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

### 推奨読解順序

#### Step 1: コマンド定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | spacevim.vim | `core/autoload/spacevim.vim` | SpaceInfoコマンドの定義 |

**主要処理フロー**:
- **51行目**: `command! -nargs=0 -bar SpaceInfo call spacevim#debugging#Info()`

#### Step 2: メイン処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | debugging.vim | `core/autoload/spacevim/debugging.vim` | spacevim#debugging#Info()関数 |

**主要処理フロー**:
- **23-39行目**: spacevim#debugging#Info()関数
  - **24行目**: s:GetGlobalVariables()で変数一覧取得
  - **26-27行目**: ファイルタイプの表示
  - **28行目**: "Global Variables:"ヘッダー表示
  - **29-38行目**: 各変数のループ処理
    - **31行目**: 変数の値を取得
    - **32-34行目**: Dictionary型の場合は整形出力
    - **35-37行目**: その他の型は単一行出力

#### Step 3: 変数収集処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | debugging.vim | `core/autoload/spacevim/debugging.vim` | s:GetGlobalVariables()関数 |

**主要処理フロー**:
- **9-21行目**: s:GetGlobalVariables()関数
  - **10行目**: 空のリストを初期化
  - **12-16行目**: g:のキーをループ
    - **13行目**: 'spacevim'で始まるかチェック（正規表現）
    - **14行目**: マッチした変数名をリストに追加
  - **18行目**: 変数名でソート
  - **20行目**: ソート済みリストを返す

#### Step 4: Dictionary整形出力を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | debugging.vim | `core/autoload/spacevim/debugging.vim` | s:PrettyPrintDict()関数 |

**主要処理フロー**:
- **1-7行目**: s:PrettyPrintDict()関数
  - **2行目**: キーをソート
  - **3-6行目**: 各キー・値ペアを整形出力
    - インデント付きで"key = value,"形式

#### Step 5: クリップボードコピー機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | debugging.vim | `core/autoload/spacevim/debugging.vim` | spacevim#debugging#InfoToClipboard()関数 |

**主要処理フロー**:
- **41-50行目**: spacevim#debugging#InfoToClipboard()関数
  - **42行目**: redir開始
  - **43行目**: Info()の出力をキャプチャ
  - **44行目**: redir終了
  - **46行目**: 出力を+レジスタ（クリップボード）にコピー
  - **47-49行目**: 成功メッセージ表示

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

```
:SpaceInfo  [コマンド]
    │
    └─ spacevim#debugging#Info()  [core/autoload/spacevim/debugging.vim:23]
           │
           ├─ s:GetGlobalVariables()  [core/autoload/spacevim/debugging.vim:9]
           │      └─ g:名前空間をフィルタ・ソート
           │
           ├─ echo "Current FileType: " + &filetype
           │
           └─ 各変数をループ
                  │
                  ├─ [Dictionary型]
                  │      └─ s:PrettyPrintDict()  [core/autoload/spacevim/debugging.vim:1]
                  │
                  └─ [その他]
                         └─ echo 単一行出力
```

### データフロー図

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

g:名前空間 ───────────────────▶ s:GetGlobalVariables() ────────▶ 変数名リスト
                                     │                         (ソート済み)
                                     ▼
&filetype ────────────────────▶ spacevim#debugging#Info() ────▶ コマンドライン出力
                                     │                         ├─ Current FileType: xxx
                                     │                         ├─ Global Variables:
                                     │                         ├─ let g:spacevim = {...}
                                     │                         └─ ...
                                     │
                                     ▼
                              [InfoToClipboard使用時]
                                     │
                                     └─ redir → @+ レジスタ ───▶ クリップボード
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| debugging.vim | `core/autoload/spacevim/debugging.vim` | ソース | SpaceInfo機能の実装 |
| spacevim.vim | `core/autoload/spacevim.vim` | ソース | SpaceInfoコマンドの定義 |
