# 機能設計書 5-ワンラインインストーラー

## 概要

本ドキュメントは、space-vimのワンラインインストーラー機能の設計について記述する。この機能は、bashスクリプトによるspace-vimの自動インストールを実現し、curlでinstall.shをダウンロードして実行することで、簡単にspace-vimをセットアップできる。

### 本機能の処理概要

ワンラインインストーラーは、`curl -sLf https://.../.../install.sh | bash`の形式で実行可能なインストールスクリプトを提供する。このスクリプトは、space-vimリポジトリのクローン、vim-plugのダウンロード、設定ファイルのシンボリックリンク作成、プラグインのインストールを自動的に行う。

**業務上の目的・背景**：Vimの設定は複雑であり、特にspace-vimのようなフレームワークのインストールには複数のステップが必要となる。ワンラインインストーラーは、この複雑なプロセスを1行のコマンドで完了できるようにし、新規ユーザーがすぐにspace-vimを使い始められるようにする。これにより、セットアップのハードルを大幅に下げ、space-vimの採用を促進する。

**機能の利用シーン**：
- 新規ユーザーがspace-vimを初めてインストールする場面
- 新しいマシンにspace-vim環境を構築する場面
- CI/CD環境でspace-vim環境を自動構築する場面
- space-vimを最新版にアップデートする場面（--updateオプション）

**主要な処理内容**：
1. gitコマンドの存在確認
2. space-vimリポジトリを~/.space-vimにクローン（またはpull更新）
3. VimまたはNeoVimの検出と選択
4. 既存のvimrc設定のバックアップ
5. vim-plugのダウンロード
6. init.vimへのシンボリックリンク作成
7. ~/.spacevimファイルの生成（テンプレートからコピー）
8. プラグインのインストール（PlugInstall）

**関連システム・外部連携**：
- git: リポジトリのクローン・更新に使用
- curl: vim-plugのダウンロードに使用
- GitHub: space-vimリポジトリおよびvim-plugのホスティング

**権限による制御**：本機能に権限制御はない。ただし、~/.vimディレクトリへの書き込み権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | ターミナル | 実行環境 | bashスクリプトの実行 |

## 機能種別

インストーラー / セットアップ自動化

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| --help | フラグ | No | ヘルプメッセージを表示 | - |
| --all | フラグ | No | VimとNeoVim両方にインストール | - |
| --vim | フラグ | No | Vimのみにインストール | - |
| --neovim | フラグ | No | NeoVimのみにインストール | - |
| --update | フラグ | No | space-vimを更新 | - |

### 入力データソース

1. **GitHubリポジトリ**: https://github.com/liuchengxu/space-vim.git
2. **vim-plug**: https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ~/.space-vim/ | ディレクトリ | space-vimリポジトリのクローン |
| ~/.vimrc | シンボリックリンク | init.vimへのリンク（Vim用） |
| ~/.config/nvim/init.vim | シンボリックリンク | init.vimへのリンク（NeoVim用） |
| ~/.spacevim | ファイル | ユーザー設定ファイル |
| ~/.vim/autoload/plug.vim | ファイル | vim-plug（Vim用） |
| ~/.local/share/nvim/site/autoload/plug.vim | ファイル | vim-plug（NeoVim用） |
| ~/.vim/plugged/ | ディレクトリ | インストールされたプラグイン |

### 出力先

- ファイルシステム（ユーザーホームディレクトリ）

## 処理フロー

### 処理シーケンス

```
1. オプション解析
   └─ --help, --all, --vim, --neovim, --update

2. 前提条件確認
   └─ gitコマンドの存在確認

3. リポジトリ同期
   └─ ~/.space-vim存在確認
   └─ 存在しない: git clone実行
   └─ 存在する: git pull実行
   └─ --update指定時はここで終了

4. インストール対象判定
   └─ --all: VimとNeoVim両方
   └─ --vim: Vimのみ
   └─ --neovim: NeoVimのみ
   └─ オプションなし: 自動検出（infer関数）

5. VimまたはNeoVimへのインストール
   └─ 既存設定のバックアップ
   └─ vim-plugのダウンロード
   └─ init.vimへのシンボリックリンク作成
   └─ ~/.spacevim生成（未存在の場合）
   └─ PlugInstall実行
```

### フローチャート

```mermaid
flowchart TD
    A[install.sh実行] --> B{オプション解析}
    B --> C{--help?}
    C -->|Yes| D[ヘルプ表示・終了]
    C -->|No| E[check_git]
    E --> F{git存在?}
    F -->|No| G[エラー終了]
    F -->|Yes| H[sync_repo]
    H --> I{リポジトリ存在?}
    I -->|No| J[git clone]
    I -->|Yes| K[git pull]
    J --> L{--update?}
    K --> L
    L -->|Yes| M[終了]
    L -->|No| N[install関数]
    N --> O{--all?}
    O -->|Yes| P[install_for_vim]
    P --> Q[install_for_neovim]
    O -->|No| R{--vim?}
    R -->|Yes| P
    R -->|No| S{--neovim?}
    S -->|Yes| Q
    S -->|No| T[infer関数]
    T --> U{vim & nvim存在?}
    U -->|Both| V[選択肢表示]
    U -->|vim only| P
    U -->|nvim only| Q
    V --> W[ユーザー選択]
    Q --> X[完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | git必須 | gitコマンドが存在しない場合はエラー終了 | 常時 |
| BR-02 | 自動検出 | オプション未指定時はvim/nvimを自動検出 | インストール時 |
| BR-03 | バックアップ | 既存の.vimrcは日付付きでバックアップ | インストール時 |
| BR-04 | テンプレート使用 | ~/.spacevimが存在しない場合のみinit.spacevimからコピー | インストール時 |
| BR-05 | 両方インストール | vimとnvim両方存在時はユーザーに選択肢を提示 | 自動検出時 |

### 計算ロジック

該当なし

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 前提条件エラー | gitコマンドが存在しない | エラーメッセージ表示・終了 |
| 1 | 前提条件エラー | vimもnvimも存在しない | エラーメッセージ表示・終了 |
| 1 | オプションエラー | 不明なオプション指定 | ヘルプ表示・終了 |
| - | ネットワークエラー | git cloneまたはcurlが失敗 | 処理中断 |

### リトライ仕様

該当なし（手動で再実行）

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

該当なし

## パフォーマンス要件

- インストール時間: ネットワーク速度に依存
- プラグインインストール: プラグイン数に依存

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

- GitHubからHTTPS経由でダウンロード
- スクリプトをcurlでパイプ実行するため、URLの正当性を確認すること
- インストール前にスクリプト内容を確認することを推奨

## 備考

- macOS、Linux環境で動作
- Windows環境では別途セットアップが必要

---

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

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

### 推奨読解順序

#### Step 1: スクリプト全体構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | install.sh | `install.sh` | スクリプト全体の構造と処理フロー |

**読解のコツ**: bashスクリプトは以下の構造で構成されている:
- **1-21行目**: ヘッダーと変数定義
- **23-50行目**: オプション解析
- **52-73行目**: ユーティリティ関数（msg, success, error, exists）
- **75-91行目**: sync_repo関数（リポジトリ同期）
- **93-108行目**: その他のヘルパー関数
- **110-148行目**: install_for_vim, install_for_neovim関数
- **150-193行目**: infer関数（自動検出）
- **196-208行目**: install関数（メイン処理）
- **214-220行目**: メイン実行部

#### Step 2: 変数定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | install.sh | `install.sh` | グローバル変数の定義 |

**主要処理フロー**:
- **13行目**: app_name="space-vim"
- **14行目**: repo_uri="https://github.com/liuchengxu/space-vim.git"
- **15行目**: repo_name="space-vim"
- **16行目**: repo_path="$HOME/.space-vim"
- **17行目**: repo_branch="master"
- **18-21行目**: オプションフラグ変数

#### Step 3: オプション解析を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | install.sh | `install.sh` | オプション解析処理 |

**主要処理フロー**:
- **35-51行目**: forループでオプションを解析
- **37-40行目**: --helpでhelp関数呼び出し・終了
- **41行目**: --allで_all=1
- **42行目**: --vimで_vim=1
- **43行目**: --neovimで_neovim=1
- **44行目**: --updateで_update=1
- **45-49行目**: 不明オプションでエラー

#### Step 4: リポジトリ同期処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | install.sh | `install.sh` | sync_repo関数 |

**主要処理フロー**:
- **75-91行目**: sync_repo関数
- **76行目**: ~/.space-vim存在確認
- **77-81行目**: 存在しない場合はgit clone
- **82-86行目**: 存在する場合はgit pull
- **88-90行目**: --updateの場合はここで終了

#### Step 5: インストール処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | install.sh | `install.sh` | install_for_vim, install_for_neovim関数 |

**主要処理フロー**:
- **122-134行目**: install_for_vim()
  - **123行目**: 既存設定のバックアップ
  - **124-127行目**: vim-plugのダウンロード
  - **130行目**: ~/.vimrcへのシンボリックリンク作成
  - **131行目**: ~/.spacevim生成
  - **133行目**: PlugInstall実行
- **136-149行目**: install_for_neovim()
  - **137行目**: 既存設定のバックアップ
  - **138-142行目**: vim-plugのダウンロード
  - **144-145行目**: ディレクトリ作成とシンボリックリンク
  - **148行目**: PlugInstall実行

#### Step 6: 自動検出処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 6-1 | install.sh | `install.sh` | infer関数 |

**主要処理フロー**:
- **157-194行目**: infer関数
- **158行目**: vimとnvim両方存在するかチェック
- **161-181行目**: 両方存在する場合はユーザーに選択を求める
- **182-185行目**: vimのみの場合
- **186-191行目**: nvimのみの場合
- **192-193行目**: どちらも存在しない場合はエラー

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

```
install.sh
    │
    ├─ help()
    │
    ├─ check_git()
    │
    ├─ sync_repo()
    │      ├─ git clone（新規）
    │      └─ git pull（既存）
    │
    └─ install()
           │
           ├─ [--all] install_for_vim() + install_for_neovim()
           │
           ├─ [--vim] install_for_vim()
           │      ├─ backup()
           │      ├─ curl vim-plug
           │      ├─ ln -sf init.vim
           │      ├─ generate_dot_spacevim()
           │      └─ install_plugins("vim")
           │
           ├─ [--neovim] install_for_neovim()
           │      ├─ backup()
           │      ├─ curl vim-plug
           │      ├─ mkdir -p ~/.config/nvim
           │      ├─ ln -sf init.vim
           │      ├─ generate_dot_spacevim()
           │      └─ install_plugins("nvim")
           │
           └─ [オプションなし] infer()
                  └─ vim/nvim検出・選択
```

### データフロー図

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

コマンドラインオプション ────▶ オプション解析 ────────────────▶ _all, _vim, _neovim, _update

GitHub
  │
  ├─ space-vim.git ───────▶ git clone/pull ─────────────────▶ ~/.space-vim/
  │
  └─ plug.vim ────────────▶ curl --create-dirs ─────────────▶ ~/.vim/autoload/plug.vim
                                                              ~/.local/share/nvim/site/autoload/plug.vim

~/.space-vim/init.vim ────▶ ln -sf ──────────────────────────▶ ~/.vimrc
                                                              ~/.config/nvim/init.vim

~/.space-vim/init.spacevim ▶ cp ─────────────────────────────▶ ~/.spacevim

vim/nvim PlugInstall ─────▶ プラグインインストール ──────────▶ ~/.vim/plugged/
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| install.sh | `install.sh` | スクリプト | ワンラインインストーラー本体 |
| uninstall.sh | `uninstall.sh` | スクリプト | アンインストールスクリプト |
| init.vim | `init.vim` | ソース | Vim設定エントリーポイント |
| init.spacevim | `init.spacevim` | テンプレート | ~/.spacevimのテンプレート |
