# 機能設計書 8-LayerStatus

## 概要

本ドキュメントは、space-vimのLayerStatusコマンドの設計について記述する。LayerStatusコマンドは、有効化されているレイヤーの状態を新規ウィンドウに表示する機能を提供する。

### 本機能の処理概要

LayerStatusコマンドは、現在有効化されているspace-vimレイヤーの一覧を専用のバッファに表示する。このバッファは読み取り専用で、シンタックスハイライトが適用され、有効レイヤー数と総レイヤー数の比率を視覚的に確認できる。

**業務上の目的・背景**：space-vimでは多数のレイヤーを有効化・無効化できるが、現在どのレイヤーが有効になっているかを確認する手段が必要である。LayerStatusコマンドは、この情報を見やすい形式で提供し、ユーザーが現在の設定状況を把握できるようにする。これはデバッグや設定確認において非常に有用である。

**機能の利用シーン**：
- 現在有効なレイヤーを確認したい場面
- 期待したレイヤーが有効になっているか確認したい場面
- space-vimの設定をデバッグする場面
- 新しいレイヤーを追加した後に有効化を確認する場面

**主要な処理内容**：
1. 新規ウィンドウ（垂直分割）の作成
2. [Layers]バッファの作成と名前付け
3. 有効レイヤー数と総レイヤー数の表示
4. プログレスバー風の表示
5. 各有効レイヤー名の一覧表示
6. シンタックスハイライトの適用
7. 読み取り専用設定と「q」キーでの閉じる操作

**関連システム・外部連携**：
- Vimウィンドウシステム: 新規ウィンドウの作成
- Vimバッファシステム: 専用バッファの管理

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | LayerStatusバッファ | 結果表示画面 | 有効レイヤー一覧の表示 |

## 機能種別

情報表示 / ユーザーインターフェース

## 入力仕様

### 入力パラメータ

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

### 入力データソース

1. **グローバル変数**: `g:spacevim.loaded` - 有効レイヤーのリスト
2. **グローバル変数**: `g:spacevim` - 総レイヤー数の計算用

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 有効レイヤー数/総数 | String | "Enabled layers: (X/Y)" 形式 |
| プログレスバー | String | "[===]" 形式（=の数は有効レイヤー数） |
| レイヤー一覧 | List | "+ レイヤー名" 形式で各行に表示 |

### 出力先

- 新規Vimウィンドウ（垂直分割）
- [Layers]という名前の専用バッファ

## 処理フロー

### 処理シーケンス

```
1. :LayerStatusコマンド実行
   └─ spacevim#layer#status()呼び出し

2. 新規ウィンドウ作成
   └─ s:new_window()でvertical topleft newを実行

3. バッファ設定
   └─ b:spacevim_preview = -1
   └─ s:spacevim_tab, s:spacevim_buf を記録
   └─ s:assign_name()で[Layers]と命名

4. レイヤー情報表示
   └─ 1行目: "Enabled layers: (有効数/総数)"
   └─ 2行目: "[===...]" プログレスバー
   └─ 3行目以降: "+ レイヤー名" の一覧

5. バッファオプション設定
   └─ buftype=nofile, bufhidden=wipe, nobuflisted
   └─ nolist, noswapfile, nowrap, cursorline
   └─ nomodifiable, nospell
   └─ filetype=spacevim

6. シンタックスハイライト設定
   └─ s:syntax()でハイライトルール定義

7. キーマッピング設定
   └─ qキーでバッファを閉じる
```

### フローチャート

```mermaid
flowchart TD
    A[:LayerStatus] --> B[spacevim#layer#status]
    B --> C[s:new_window]
    C --> D[vertical topleft new]
    D --> E[バッファ変数設定]
    E --> F[s:assign_name]
    F --> G[レイヤー情報取得]
    G --> H[1行目: 有効数/総数]
    H --> I[2行目: プログレスバー]
    I --> J[3行目以降: レイヤー一覧]
    J --> K[バッファオプション設定]
    K --> L{syntax on?}
    L -->|Yes| M[s:syntax]
    L -->|No| N[キーマッピング設定]
    M --> N
    N --> O[完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 垂直分割 | デフォルトで左側に垂直分割でウィンドウ作成 | 常時 |
| BR-02 | 一意な名前 | [Layers]バッファ名は一意（重複時は連番追加） | 常時 |
| BR-03 | 読み取り専用 | バッファは編集不可 | 常時 |
| BR-04 | qで閉じる | qキーでバッファを閉じる | 常時 |
| BR-05 | +プレフィックス | 各レイヤー名の前に"+ "を付与 | 常時 |

### 計算ロジック

総レイヤー数の計算:
```
g:layers_sum = len(g:spacevim)
```

プログレスバーの生成:
```
'[' . repeat('=', len(g:spacevim.loaded)) . ']'
```

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

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

## エラー処理

### エラーケース一覧

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

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

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

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

- 特になし

## 備考

- g:spacevim_windowでウィンドウの開き方をカスタマイズ可能

---

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

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

### 推奨読解順序

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

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

**主要処理フロー**:
- **53行目**: `command! -nargs=0 -bar LayerStatus call spacevim#layer#status()`

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

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

**主要処理フロー**:
- **26-51行目**: spacevim#layer#status()関数
  - **27行目**: s:new_window()で新規ウィンドウ作成
  - **29-32行目**: バッファ変数の初期化とバッファ名設定
  - **34-36行目**: レイヤー数の取得とg:layers_sum設定
  - **38-39行目**: 1行目と2行目（ヘッダー）の設定
  - **40-44行目**: 各レイヤー名をループで追加
  - **45行目**: バッファオプション設定
  - **46行目**: ファイルタイプをspacevimに設定
  - **47-49行目**: シンタックスハイライトの適用
  - **50行目**: qキーマッピングの設定

#### Step 3: ウィンドウ作成を理解する

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

**主要処理フロー**:
- **4-6行目**: s:new_window()関数
  - g:spacevim_windowの設定を使用（デフォルト: 'vertical topleft new'）

#### Step 4: バッファ名の一意性確保を理解する

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

**主要処理フロー**:
- **13-23行目**: s:assign_name()関数
  - **15-16行目**: プレフィックス[Layers]を設定
  - **18-21行目**: 同名バッファが存在する場合は連番を追加
  - **22行目**: fコマンドでバッファ名を設定

#### Step 5: シンタックスハイライトを理解する

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

**主要処理フロー**:
- **53-92行目**: s:syntax()関数
  - **54行目**: 既存のシンタックスをクリア
  - **55-71行目**: シンタックスマッチ・リージョンの定義
  - **72-91行目**: ハイライトグループのリンク設定

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

```
:LayerStatus  [コマンド]
    │
    └─ spacevim#layer#status()  [core/autoload/spacevim/layer.vim:26]
           │
           ├─ s:new_window()  [core/autoload/spacevim/layer.vim:4]
           │      └─ execute 'vertical topleft new'
           │
           ├─ s:assign_name()  [core/autoload/spacevim/layer.vim:13]
           │      └─ バッファ名を[Layers]に設定
           │
           ├─ append()/setline()  [バッファ内容の設定]
           │      ├─ 1行目: 有効数/総数
           │      ├─ 2行目: プログレスバー
           │      └─ 3行目以降: レイヤー一覧
           │
           ├─ setlocal オプション設定
           │
           └─ s:syntax()  [core/autoload/spacevim/layer.vim:53]
                  └─ シンタックスハイライト定義
```

### データフロー図

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

g:spacevim.loaded ────────────▶ spacevim#layer#status() ─────▶ [Layers]バッファ
(有効レイヤーリスト)                  │                         │
                                     │                         ├─ 1行目: "Enabled layers: (X/Y)"
g:spacevim ───────────────────▶      │                         ├─ 2行目: "[===...]"
(総レイヤー数計算)                   │                         └─ 3行目以降: "+ レイヤー名"
                                     │
                                     ▼
                              シンタックスハイライト適用 ──────▶ 色付きの見やすい表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| layer.vim | `core/autoload/spacevim/layer.vim` | ソース | LayerStatus機能の実装 |
| spacevim.vim | `core/autoload/spacevim.vim` | ソース | LayerStatusコマンドの定義 |
| spacevim.vim | `core/ftdetect/spacevim.vim` | ソース | spacevimファイルタイプの検出 |
