# 通知設計書 6-spacevim#vim#plug#check

## 概要

本ドキュメントは、space-vimにおけるプラグイン不足確認・通知関数 `spacevim#vim#plug#check` の通知仕様を定義するものである。

### 本通知の処理概要

`spacevim#vim#plug#check` は、インストールが必要なプラグインがある場合にユーザーに確認を求め、インストールを促す通知関数である。この関数は、不足しているプラグインを検出し、ユーザーに対してポップアップダイアログまたはコマンドラインで確認を行う。

**業務上の目的・背景**：space-vimは多数のプラグインに依存しており、新しいレイヤーを有効化した場合や初回起動時に必要なプラグインがインストールされていないことがある。ユーザーが手動で `:PlugInstall` コマンドを実行しなくても、自動的に不足プラグインを検出し、インストールの可否をユーザーに確認することで、スムーズなセットアップ体験を提供する。これにより、プラグイン不足によるエラーを未然に防ぎ、space-vimの機能を完全に活用できる状態にする。

**通知の送信タイミング**：Vim起動時のプラグイン読み込みフェーズで、`g:plugs` に登録されたプラグインのうち、ディレクトリが存在しないものが検出された場合に通知が送信される。

**通知の受信者**：Vimエディタを操作しているユーザー本人がメッセージの受信者となる。メッセージはポップアップダイアログ（対応している場合）またはコマンドライン領域に表示される。

**通知内容の概要**：「[space-vim] Need to install the missing plugins: 」に続いて、不足しているプラグイン名のリストと確認プロンプト「(y/N):」が表示される。

**期待されるアクション**：ユーザーは「y」または「Y」を入力してプラグインのインストールを承認するか、「n」または「N」（またはその他のキー）を入力してスキップする。インストールを承認した場合、`:PlugInstall --sync` が自動的に実行される。

## 通知種別

アプリ内通知（Vimポップアップダイアログまたはコマンドライン表示）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（ユーザー入力待機） |
| 優先度 | 高 |
| リトライ | 無し |

### 送信先決定ロジック

現在Vimエディタを操作しているユーザーに対して表示される。Vimが `popup_dialog` 関数をサポートしている場合はポップアップダイアログ、そうでない場合はコマンドライン入力で確認を行う。

## 通知テンプレート

### アプリ内通知の場合

| 項目 | 内容 |
|-----|------|
| 表示位置 | ポップアップダイアログまたはコマンドライン領域 |
| ハイライト | WarningMsg（コマンドライン入力時） |
| プレフィックス | [space-vim] |
| 形式 | テキスト + 確認プロンプト |

### 本文テンプレート

```
[space-vim] Need to install the missing plugins: {プラグインリスト} (y/N):
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| プラグインリスト | 不足しているプラグイン名の配列 | g:plugs から抽出 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 関数呼び出し | spacevim#vim#plug#check()の呼び出し | 不足プラグインが存在する場合 | Vim起動時の初期化処理で呼び出される |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 不足プラグインなし | すべてのプラグインがインストール済みの場合は通知されない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[spacevim#vim#plug#check呼び出し] --> B[g:plugsから不足プラグイン検出]
    B --> C{不足プラグインあり?}
    C -->|なし| D[終了]
    C -->|あり| E[メッセージ構築]
    E --> F{popup_dialog対応?}
    F -->|対応| G[ポップアップダイアログ表示]
    F -->|非対応| H[コマンドライン確認]
    G --> I{ユーザー応答}
    H --> I
    I -->|Yes| J[PlugInstall --sync実行]
    I -->|No| K[スキップ]
    J --> L[終了]
    K --> L
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| g:plugs | 登録されたプラグイン情報 | vim-plugが管理する辞書変数 |

### テーブル別参照項目詳細

#### g:plugs

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| dir | プラグインのインストール先ディレクトリ | 全プラグインについて存在チェック |

### 更新テーブル一覧

該当なし（プラグインインストールはvim-plugが管理）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| PlugInstall失敗 | ネットワークエラー等 | vim-plugがエラーメッセージを表示 |
| ユーザーキャンセル | Nまたはその他の入力 | プラグインインストールをスキップ |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | なし |
| リトライ対象エラー | なし |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（Vimが起動している間は常に表示可能）

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

- プラグインのインストールはGitHubなどの外部ソースから行われる
- ユーザーの明示的な承認を得てからインストールを実行する
- プラグインリストは `g:plugs` に登録されたものに限定される

## 備考

- vim-plugのWikiから引用されたコードがベースになっている
- `popup_dialog` 関数が存在する場合はモダンなポップアップUIを使用
- メッセージは画面幅に収まるよう `s:truncate` 関数で切り詰められる
- `--sync` オプションにより同期的にインストールが実行される

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

本関数は `g:plugs` 辞書変数からプラグイン情報を取得する。各プラグインは `dir` キーでインストール先ディレクトリを保持している。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | plug.vim | `core/autoload/spacevim/vim/plug.vim` | g:plugs辞書の参照方法を確認 |

**読解のコツ**: `g:plugs` はvim-plugが管理するグローバル辞書で、各プラグイン名をキーとして設定情報を保持している。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | plug.vim | `core/autoload/spacevim/vim/plug.vim` | spacevim#vim#plug#check関数の定義（16-36行目） |

**主要処理フロー**:
1. **17行目**: `let l:msg = '[space-vim] Need to install the missing plugins: '` - メッセージ初期化
2. **18行目**: `let missing = filter(values(g:plugs), '!isdirectory(v:val.dir)')` - 不足プラグイン検出
3. **19行目**: `if len(missing)` - 不足プラグインがあるか判定
4. **20行目**: `let plugs = map(missing, 'split(v:val.dir, "/")[-1]')` - プラグイン名抽出
5. **21行目**: `let l:msg .= string(plugs).' (y/N): '` - メッセージ構築
6. **22行目**: `let l:msg = s:truncate(l:msg)` - メッセージ切り詰め
7. **23-27行目**: ポップアップダイアログまたはコマンドライン確認の分岐

#### Step 3: 補助関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | plug.vim | `core/autoload/spacevim/vim/plug.vim` | s:truncate関数（8-13行目） |
| 3-2 | plug.vim | `core/autoload/spacevim/vim/plug.vim` | s:ask関数（52-60行目） |
| 3-3 | plug.vim | `core/autoload/spacevim/vim/plug.vim` | s:popup_dialog関数（45-50行目） |

**主要処理フロー（s:truncate）**:
- **9行目**: `let l:maxlen = &columns * &cmdheight - 2` - 最大長計算
- **10行目**: `let l:maxlen = &showcmd ? l:maxlen - 11 : l:maxlen` - showcmd補正
- **11行目**: `let l:maxlen = &ruler ? l:maxlen - 18 : l:maxlen` - ruler補正
- **12行目**: 切り詰め処理

**主要処理フロー（s:ask）**:
- **53行目**: `call inputsave()` - 入力状態保存
- **54行目**: `echohl WarningMsg` - 警告色設定
- **55行目**: `let answer = input(a:message)` - ユーザー入力待機
- **59行目**: `return (answer =~? '^y') ? 1 : 0` - y/Y判定

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

```
spacevim#vim#plug#check(...)
    │
    ├─ filter(values(g:plugs), ...) - 不足プラグイン検出
    │
    ├─ s:truncate(msg) - メッセージ切り詰め
    │      └─ 画面幅に合わせて調整
    │
    ├─ [popup_dialog対応時]
    │      └─ s:popup_dialog(msg)
    │             └─ popup_dialog() - Vimポップアップ表示
    │                    └─ s:dialog_handler() - 応答処理
    │
    └─ [popup_dialog非対応時]
           └─ s:ask(msg)
                  └─ input() - コマンドライン入力

    └─ PlugInstall --sync | q - プラグインインストール実行
```

### データフロー図

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

g:plugs ───▶ filter() ───▶ 不足プラグインリスト ───▶ メッセージ構築
                                  │
                                  ▼
                           s:truncate()
                                  │
                                  ▼
                           確認ダイアログ/入力
                                  │
                    ┌─────────────┴─────────────┐
                    │                           │
                    ▼                           ▼
             [ユーザー: Yes]             [ユーザー: No]
                    │                           │
                    ▼                           ▼
            PlugInstall実行                 スキップ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| plug.vim | `core/autoload/spacevim/vim/plug.vim` | ソース | check/download関数の実装 |
