# バッチ設計書 1-install.sh

## 概要

本ドキュメントは、space-vimのUnix/Linux/macOS向けインストールスクリプト `install.sh` の設計仕様を記載する。

### 本バッチの処理概要

このバッチは、space-vim（Spacemacsにインスパイアされたモダンなvim/neovimディストリビューション）をUnix系システムにインストールするためのシェルスクリプトである。ユーザーの環境を自動検出し、Vim/NeoVimの両方またはいずれか一方に対してspace-vimを導入する。

**業務上の目的・背景**：space-vimは、豊富なプラグインとキーバインドを備えたvim設定フレームワークであり、開発者の生産性向上を目的としている。このインストールスクリプトは、ユーザーがコマンド一つでspace-vim環境を構築できるようにし、手動でのセットアップの煩雑さを解消する。GitHubリポジトリからのクローン、プラグインマネージャー（vim-plug）の導入、設定ファイルのシンボリックリンク作成を自動化することで、初心者でも簡単にspace-vimを利用開始できる。

**バッチの実行タイミング**：初回インストール時に手動実行、または `--update` オプションを指定して既存環境の更新時に実行する。

**主要な処理内容**：
1. gitコマンドの存在確認
2. space-vimリポジトリのクローンまたは更新
3. vim-plugプラグインマネージャーのダウンロード
4. 既存のvim設定ファイルのバックアップ
5. 設定ファイルのシンボリックリンク作成
6. .spacevimユーザー設定ファイルの生成
7. プラグインの自動インストール

**前後の処理との関連**：このスクリプトは単独で実行される初期セットアップ処理であり、前提バッチはない。後続処理として、ユーザーが `.spacevim` ファイルをカスタマイズし、vim/nvimを起動して使用を開始する。

**影響範囲**：ユーザーのホームディレクトリ配下のvim設定ファイル（`.vimrc`、`~/.config/nvim/init.vim`、`.spacevim`、`.space-vim/`）に影響を与える。

## バッチ種別

インストール処理 / 環境構築

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（初回インストール時または更新時） |
| 実行時刻 | 任意 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| gitコマンド | システムにgitがインストールされていること |
| vim/nvim | vimまたはnvimの少なくとも一方がインストールされていること |
| curlコマンド | vim-plugのダウンロードにcurlが必要 |
| インターネット接続 | GitHubへのアクセスが必要 |

### 実行可否判定

スクリプト開始時にgitコマンドの存在を確認し、存在しない場合はエラー終了する。vim/nvimの存在確認は後続の処理で行い、どちらも存在しない場合はエラー終了する。

## 入力仕様

### 入力パラメータ

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

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| GitHub リポジトリ | Git | https://github.com/liuchengxu/space-vim.git |
| vim-plug | Vim script | https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| ~/.space-vim/ | ディレクトリ | space-vimリポジトリのクローン |
| ~/.vimrc | シンボリックリンク | Vim用設定ファイル |
| ~/.config/nvim/init.vim | シンボリックリンク | NeoVim用設定ファイル |
| ~/.spacevim | ファイル | ユーザー設定ファイル（init.spacevimのコピー） |
| ~/.vim/autoload/plug.vim | ファイル | vim-plug（Vim用） |
| ~/.local/share/nvim/site/autoload/plug.vim | ファイル | vim-plug（NeoVim用） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 上記各ファイル |
| 出力先 | ユーザーホームディレクトリ配下 |
| 文字コード | UTF-8 |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. オプション引数の解析
   └─ --help, --all, --vim, --neovim, --update を判定
2. gitコマンドの存在確認
   └─ 存在しない場合はエラー終了
3. リポジトリの同期（sync_repo）
   └─ ~/.space-vim が存在しない場合: git clone
   └─ 存在する場合: git pull
   └─ --update オプションの場合、ここで終了
4. インストール対象の決定（install）
   └─ --all: vim + neovim
   └─ --vim: vimのみ
   └─ --neovim: neovimのみ
   └─ オプションなし: 環境を自動判定（infer）
5. インストール実行
   └─ install_for_vim または install_for_neovim を呼び出し
6. 完了メッセージの表示
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{gitが存在するか}
    B -->|No| C[エラー終了]
    B -->|Yes| D[リポジトリ同期]
    D --> E{--updateオプション?}
    E -->|Yes| F[更新完了・終了]
    E -->|No| G{インストール対象判定}
    G -->|--all| H[Vim + NeoVimインストール]
    G -->|--vim| I[Vimインストール]
    G -->|--neovim| J[NeoVimインストール]
    G -->|なし| K{環境自動判定}
    K -->|vim + nvim| L[ユーザー選択]
    K -->|vimのみ| I
    K -->|nvimのみ| J
    K -->|なし| C
    L --> H
    L --> I
    L --> J
    H --> M[完了メッセージ]
    I --> M
    J --> M
    M --> N[バッチ終了]
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| N/A | N/A | N/A | 本バッチはデータベースを使用しない |

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

N/A - データベース操作なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 依存関係エラー | gitがインストールされていない | gitをインストールする |
| 1 | 依存関係エラー | vim/nvimがインストールされていない | vim/nvimをインストールする |
| 1 | ネットワークエラー | GitHubへの接続失敗 | ネットワーク接続を確認する |
| 1 | オプションエラー | 不明なオプションが指定された | --helpで使用方法を確認する |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（自動リトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

- git clone/pull 失敗時: ネットワーク接続を確認し、再実行する
- curl失敗時: vim-plugのURLが変更されていないか確認する
- 既存設定のバックアップは自動で `ファイル名.YYYYMMDD_UNIXタイムスタンプ` 形式で作成される

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（シェルスクリプトのためトランザクション管理なし） |
| コミットタイミング | N/A |
| ロールバック条件 | N/A（set -eo pipefail により、エラー時は処理中断） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回/インストール |
| 目標処理時間 | ネットワーク速度依存（通常1-5分） |
| メモリ使用量上限 | 最小限（シェルスクリプトのため） |

## 排他制御

同時実行の想定なし。同一ユーザーが複数回同時実行した場合、git操作での競合が発生する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | リポジトリ同期開始時 | "Trying to clone/update space-vim" |
| 進捗ログ | vim-plugダウンロード時 | "Trying to download vim-plug" |
| 成功ログ | 各処理完了時 | "[✔] Successfully ..." |
| エラーログ | エラー発生時 | "[✘] ..." |
| 完了ログ | 処理完了時 | "Thanks for installing space-vim. Enjoy!" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| N/A | N/A | N/A（手動実行スクリプトのため監視対象外） |

## 備考

- スクリプトは `set -eo pipefail` により、コマンド失敗時に即座に終了する
- 既存の `.vimrc` がある場合は日付付きでバックアップを作成する
- Vim/NeoVim両方が存在する場合、インタラクティブにインストール対象を選択できる
- vim-plugはGitHubから直接ダウンロードされる
