# 機能設計書 23-airline連携

## 概要

本ドキュメントは、space-vimにおけるvim-airline連携機能の設計仕様を定義する。

### 本機能の処理概要

vim-airlineは、Vim/NeoVimのステータスラインを高度にカスタマイズするプラグインである。space-vimでは、+themes/airlineレイヤーを通じてvim-airlineを統合し、モード表示、ブランチ情報、ファイル情報、エラー/警告表示などを美しく表示する。

**業務上の目的・背景**：開発者にとってステータスラインは重要な情報源であり、現在のモード、編集中のファイル、Gitブランチ、エラー状態などを一目で把握できることが作業効率に直結する。vim-airlineは豊富な情報を整理された形式で表示し、Powerlineフォントによる視覚的に優れたUIを提供する。

**機能の利用シーン**：
- 編集中のファイル情報（ファイル名、ファイルタイプ、エンコーディング）を確認する
- 現在のVimモード（Normal/Insert/Visual等）を視覚的に確認する
- Gitブランチ名を確認する
- ALEによるエラー/警告数をステータスラインで確認する
- バッファタブラインでバッファを切り替える

**主要な処理内容**：
1. +themes/airlineレイヤー有効化時にプラグインを登録
2. 遅延読み込み（timer 250ms）でairlineを起動
3. violetテーマ、tabline、ブランチ表示などを設定
4. ALE連携でエラー/警告シンボルを表示

**関連システム・外部連携**：
- vim-fugitive（Gitブランチ情報取得）
- ALE（エラー/警告情報取得）
- Powerlineフォント（シンボル表示）
- vim-airline-themes（テーマ）

**権限による制御**：特になし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 14 | Airline（ステータスライン） | 主機能 | vim-airlineによるカスタマイズされたステータスライン表示 |

## 機能種別

UI表示 / ステータスライン

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:airline_theme | String | No | airlineテーマ名 | デフォルト: violet |
| g:airline_powerline_fonts | Boolean | No | Powerlineフォント使用 | 0/1 |
| g:spacevim.speed_up_via_timer | Boolean | No | 遅延読み込みフラグ | true/false |

### 入力データソース

- Vimグローバル変数
- vim-fugitive（Gitブランチ情報）
- ALE（エラー/警告情報）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ステータスライン | Vim statusline | モード、ファイル、ブランチ等の表示 |
| タブライン | Vim tabline | バッファ一覧表示 |

### 出力先

- Vimステータスライン領域
- Vimタブライン領域

## 処理フロー

### 処理シーケンス

```
1. +themes/airlineレイヤー読み込み
   └─ packages.vimでプラグイン登録
2. 遅延読み込み（250ms後）
   └─ spacevim#defer#airline()でプラグインロード
3. config.vim実行
   └─ airline設定（テーマ、tabline、シンボル等）
4. ユーザー設定適用
   └─ SpacevimAfterUserConfig autocmdで追加設定
```

### フローチャート

```mermaid
flowchart TD
    A[Vim起動] --> B[+themes/airlineレイヤー読み込み]
    B --> C{speed_up_via_timer?}
    C -->|Yes| D[timer_start 250ms]
    C -->|No| E[即座にプラグイン読み込み]
    D --> F[spacevim#defer#airline]
    F --> G[plug#load実行]
    E --> G
    G --> H[config.vim設定適用]
    H --> I[SpacevimAfterUserConfig]
    I --> J{Powerlineフォント?}
    J -->|Yes| K[Powerlineシンボル使用]
    J -->|No| L[代替シンボル使用]
    K --> M[ステータスライン表示完了]
    L --> M
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-23-01 | 遅延読み込み | 起動時間最適化のため250ms後に読み込み | speed_up_via_timer有効時 |
| BR-23-02 | fugitive待機 | fugitive/ale読み込み後にairlineを読み込む | 常時 |
| BR-23-03 | Powerlineフォールバック | Powerlineフォントがない場合は代替シンボルを使用 | 常時 |

### 計算ロジック

なし

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

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

データベース操作なし

### テーブル別操作詳細

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| E-23-01 | プラグイン未検出 | vim-airlineが存在しない | silent!で無視 |

### リトライ仕様

なし

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

該当なし

## パフォーマンス要件

- 遅延読み込みにより起動時間を最適化（250ms後にロード）
- ステータスライン更新は即座に反映

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

なし

## 備考

- lightlineレイヤーとairlineレイヤーは排他的
- Powerlineフォント推奨（Nerd Font等）

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+themes/airline/packages.vim` | プラグイン登録と遅延読み込み設定 |

**読解のコツ**: `g:spacevim.speed_up_via_timer`フラグで遅延読み込みが制御される。

**主要処理フロー**:
- **1-4行目**: speed_up_via_timer有効時は`{ 'on': [] }`で遅延読み込み
- **6行目**: `timer_start(250, 'spacevim#defer#airline')` で250ms後にロード
- **7-10行目**: 遅延読み込み無効時は即座にロード

#### Step 2: 遅延読み込み処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | defer.vim | `core/autoload/spacevim/defer.vim` | 遅延読み込み関数の実装 |

**主要処理フロー**:
- **14-17行目**: `spacevim#defer#airline()`関数でairline関連プラグインをロード
- **15行目**: `plug#load('vim-airline', 'vim-airline-themes')` でプラグイン読み込み
- **16行目**: `redraws!` で画面再描画

#### Step 3: 設定処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+themes/airline/config.vim` | airline設定 |

**主要処理フロー**:
- **4行目**: `g:airline_theme='violet'` - テーマ設定
- **6-7行目**: ブランチ表示、tabline有効化
- **8-14行目**: tabline設定（buffer_idx_mode、formatter等）
- **15-26行目**: セクション幅、レイアウト設定
- **29-30行目**: ALEエラー/警告シンボル設定
- **31-40行目**: Powerlineフォント未設定時のフォールバック処理

#### Step 4: シンボル定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | airline.vim | `core/autoload/spacevim/plug/airline.vim` | シンボル定義 |

**主要処理フロー**:
- **3-9行目**: `g:spacevim#plug#airline#symbols`でシンボル定義（linenr, branch, paste, whitespace）

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

```
spacevim#bootstrap()
    │
    ├─ layers/+themes/airline/packages.vim
    │      ├─ MP 'vim-airline/vim-airline-themes'
    │      ├─ MP 'vim-airline/vim-airline'
    │      └─ timer_start(250, 'spacevim#defer#airline')
    │
    ├─ core/autoload/spacevim/defer.vim
    │      └─ spacevim#defer#airline()
    │             └─ plug#load('vim-airline', 'vim-airline-themes')
    │
    ├─ layers/+themes/airline/config.vim
    │      └─ airline設定
    │
    └─ core/autoload/spacevim/plug/airline.vim
           └─ シンボル定義
```

### データフロー図

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

packages.vim ───▶ timer_start(250ms) ───▶ defer.vim
                                              │
                                              ▼
                                        plug#load()
                                              │
                                              ▼
vim-fugitive ───▶ ブランチ情報取得 ───▶ ステータスライン表示
ALE ───▶ エラー/警告情報 ───▶ ステータスライン表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+themes/airline/packages.vim` | ソース | プラグイン登録 |
| config.vim | `layers/+themes/airline/config.vim` | ソース | airline設定 |
| defer.vim | `core/autoload/spacevim/defer.vim` | ソース | 遅延読み込み処理 |
| airline.vim | `core/autoload/spacevim/plug/airline.vim` | ソース | シンボル定義 |
