# 通知設計書 5-spacevim#vim#plug#download

## 概要

本ドキュメントは、space-vimにおけるvim-plugダウンロード開始通知関数 `spacevim#vim#plug#download` の通知仕様を定義するものである。

### 本通知の処理概要

`spacevim#vim#plug#download` は、vim-plugプラグインマネージャのダウンロードを開始する際に、ユーザーに処理開始を通知する関数である。この関数は、vim-plugがインストールされていない環境で初回起動時に呼び出され、ダウンロード処理と共にユーザーへの通知を行う。

**業務上の目的・背景**：space-vimは多数のプラグインを管理するためにvim-plugを使用している。しかし、初回インストール時やクリーンな環境ではvim-plug自体が存在しないため、自動的にダウンロードする必要がある。このダウンロード処理は数秒かかる可能性があり、何も表示しないとユーザーがフリーズしたと誤解する恐れがある。そのため、ダウンロード開始を明示的に通知することで、ユーザーに処理中であることを伝え、安心して待機してもらうことが目的である。

**通知の送信タイミング**：vim-plugのダウンロード処理が開始される直前に通知が送信される。具体的には、space-vimの初回起動時やvim-plugファイルが存在しない状態で起動した際に発生する。

**通知の受信者**：Vimエディタを操作しているユーザー本人がメッセージの受信者となる。メッセージはVimのコマンドライン領域に表示される。

**通知内容の概要**：「==> Downloading vim-plug ......」という固定メッセージが表示され、vim-plugのダウンロードが開始されることをユーザーに通知する。

**期待されるアクション**：ユーザーはダウンロード処理が完了するまで待機する。ダウンロード完了後、自動的にvim-plugの初期化が行われる。ネットワークエラーが発生した場合は、エラーメッセージを確認して対処する。

## 通知種別

アプリ内通知（Vimコマンドライン表示）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 高 |
| リトライ | 無し（curlコマンドに依存） |

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

現在Vimエディタを操作しているユーザーのコマンドライン領域に直接表示される。特別な送信先決定ロジックは存在しない。

## 通知テンプレート

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

| 項目 | 内容 |
|-----|------|
| 表示位置 | Vimコマンドライン領域 |
| ハイライト | なし（通常テキスト色） |
| プレフィックス | ==> |
| 形式 | テキスト |

### 本文テンプレート

```
==> Downloading vim-plug ......
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| plug_path | vim-plugの保存先パス | 呼び出し元関数からの引数 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 関数呼び出し | spacevim#vim#plug#download(plug_path)の呼び出し | 常時（呼び出されたら実行） | vim-plugが存在しない場合に上位処理から呼び出される |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| なし | 関数が呼び出された場合は常に表示される |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[vim-plug不在検出] --> B[spacevim#vim#plug#download呼び出し]
    B --> C[echo 'Downloading vim-plug ......']
    C --> D[curlコマンド実行]
    D --> E{ダウンロード結果}
    E -->|成功| F[vim-plug読み込み]
    E -->|失敗| G[エラーメッセージ表示]
    F --> H[終了]
    G --> H
```

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

### 参照テーブル一覧

該当なし（データベースを使用しない）

### 更新テーブル一覧

該当なし（データベースを使用しない）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| ネットワークエラー | インターネット接続なし | curlコマンドがエラーを返す、ユーザーが手動で対処 |
| パーミッションエラー | 保存先ディレクトリに書き込み権限なし | curlコマンドがエラーを返す |
| curlコマンド不在 | curlがインストールされていない | シェルエラーが発生 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（curlコマンドの-fオプションで失敗時は即座に終了） |
| リトライ間隔 | なし |
| リトライ対象エラー | なし |

## 配信設定

### レート制限

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

### 配信時間帯

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

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

- GitHubから直接vim-plugをダウンロードするため、ネットワーク通信が発生する
- HTTPS通信を使用してセキュアにダウンロードを行う
- ダウンロード元URLは `https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim` で固定

## 備考

- curlコマンドの`-f`オプションにより、HTTPエラー時は出力なしで失敗する
- curlコマンドの`-L`オプションにより、リダイレクトに対応する
- curlコマンドの`-o`オプションにより、指定されたパスにファイルを保存する
- `--create-dirs`オプションにより、保存先ディレクトリが存在しない場合は自動作成される

---

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

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

### 推奨読解順序

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

本関数は単純な文字列パス（vim-plugの保存先）を受け取る。複雑なデータ構造は使用していない。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | plug.vim | `core/autoload/spacevim/vim/plug.vim` | 関数シグネチャで受け取る引数 `plug_path` が文字列であることを確認 |

**読解のコツ**: Vim scriptでは `a:` プレフィックスは関数引数を示す。

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

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

**主要処理フロー**:
1. **1行目**: `function! spacevim#vim#plug#download(plug_path) abort` - 関数定義
2. **2行目**: `echo '==> Downloading vim-plug ......'` - ダウンロード開始通知
3. **3-4行目**: `execute '!curl -fLo' a:plug_path '--create-dirs' ...` - curlコマンドでvim-plugをダウンロード
4. **5行目**: `endfunction` - 関数終了

#### Step 3: ダウンロード処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | plug.vim | `core/autoload/spacevim/vim/plug.vim` | curlコマンドのオプションと実行（3-4行目） |

**主要処理フロー**:
- **3行目**: `execute '!curl -fLo' a:plug_path '--create-dirs'` - curlコマンド構築
  - `-f`: HTTPエラー時に失敗
  - `-L`: リダイレクトに対応
  - `-o`: 出力ファイル指定
  - `--create-dirs`: ディレクトリ自動作成
- **4行目**: `'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'` - ダウンロード元URL

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

```
spacevim#vim#plug#download(plug_path)
    │
    ├─ echo '==> Downloading vim-plug ......'
    │      └─ Vimのコマンドラインにメッセージ表示
    │
    └─ execute '!curl ...'
           └─ シェルでcurlコマンドを実行
                  └─ GitHubからvim-plugをダウンロード
```

### データフロー図

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

plug_path ───▶ spacevim#vim#plug#download ───▶ 通知メッセージ表示
(保存先パス)           │                              │
                       │                              ▼
                       ▼                         コマンドライン領域
                 curlコマンド実行 ───────────▶ plug.vimファイル
                       │
                       ▼
                 GitHubからダウンロード
```

### 関連ファイル一覧

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