# 機能設計書 79-startify

## 概要

本ドキュメントは、space-vimの+distributions/better-defaultsレイヤーが提供するvim-startifyによるスタートスクリーン表示機能について、その設計と実装を詳細に記述する。

### 本機能の処理概要

**業務上の目的・背景**：
Vimを起動した際、デフォルトでは空のバッファが表示されるのみである。vim-startifyは、最近開いたファイル、セッション、ブックマークなどをスタート画面として表示し、素早くプロジェクトや作業に復帰できるようにする。これにより、Vimの起動体験が向上し、作業効率が改善される。

**機能の利用シーン**：
- Vim起動時に、最近開いたファイルから選択して開きたい場合
- 以前のセッションを復元して作業を継続したい場合
- プロジェクトのブックマークから素早くアクセスしたい場合
- SPC b hでホーム画面（スタート画面）に戻りたい場合

**主要な処理内容**：
1. vim-startifyプラグインの遅延読み込み（Startifyコマンド実行時）
2. 引数なしでVim起動時に自動的にStartify画面を表示
3. space-vim独自のカスタムヘッダー表示
4. 最近開いたファイル、プロジェクト、セッション、ブックマークの一覧表示

**関連システム・外部連携**：
- 外部プラグイン: mhinz/vim-startify
- core/autoload/spacevim/autocmd/startify.vim（カスタマイズ設定）
- +distributions/better-defaultsレイヤー内での統合

**権限による制御**：
本機能に権限による制御は存在しない。g:spacevim_enable_startify変数で有効/無効を切り替え可能（デフォルト有効）。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Startify（スタート画面） | 主機能 | Vim起動時の最近ファイル・セッション・ブックマーク表示 |

## 機能種別

UI/UX機能 / スタートスクリーン

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:spacevim_enable_startify | Number | No | Startify有効化フラグ（0/1） | デフォルト1 |
| g:startify_list_order | List | No | 表示項目の順序 | カスタマイズ可能 |
| g:startify_custom_header | List | No | カスタムヘッダー | 文字列のリスト |

### 入力データソース

- ~/.vim/.viminfo（最近開いたファイル情報）
- ~/.vim/session/（保存されたセッション）
- ユーザー設定（g:startify_*変数）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| スタート画面 | Buffer | カスタムヘッダー、ファイル一覧、セッション一覧 |

### 出力先

- Vimのバッファ（起動時またはStartifyコマンド実行時）

## 処理フロー

### 処理シーケンス

```
1. Vim起動時（引数なし）
   └─ VimEnter autocmdがトリガー
2. s:LoadStartifyIfNoArgs()が呼び出される
   └─ 引数がなければStartifyをロード
3. vim-startifyプラグインがロードされる
   └─ plug#load('vim-startify')
4. spacevim#autocmd#startify#Init()が呼び出される
   └─ カスタムヘッダー、表示順序を設定
5. Startify画面が表示される
   └─ space-vimロゴ、最近ファイル、セッション等を表示
6. ユーザーがエントリを選択
   └─ 対応するファイルを開く/セッションを復元
```

### フローチャート

```mermaid
flowchart TD
    A[Vim起動] --> B{引数あり?}
    B -->|Yes| C[通常起動]
    B -->|No| D{startify有効?}
    D -->|No| C
    D -->|Yes| E[vim-startifyロード]
    E --> F[Init関数呼び出し]
    F --> G[カスタムヘッダー設定]
    G --> H[表示順序設定]
    H --> I[Startify画面表示]
    I --> J[ユーザー選択待ち]
    J --> K{選択種別}
    K -->|ファイル| L[ファイルを開く]
    K -->|セッション| M[セッション復元]
    K -->|q| N[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-79-1 | 遅延読み込み | Startifyコマンド実行時にプラグインをロード | 初回Startify呼び出し時 |
| BR-79-2 | 引数なし起動 | 引数なしでVim起動時のみStartifyを自動表示 | VimEnter時 |
| BR-79-3 | VCSルート変更 | ファイル選択時にVCSルートに自動cd | startify_change_to_vcs_root=1 |

### 計算ロジック

本機能に独自の計算ロジックは存在しない（vim-startifyプラグインに委譲）。

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

本機能にデータベース操作は存在しない。ただし、viminfoファイルから最近開いたファイル情報を読み取る。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ファイル未検出 | 選択したファイルが存在しない | エラーメッセージ表示、再選択 |
| - | セッション未検出 | 選択したセッションが破損/存在しない | エラーメッセージ表示 |

### リトライ仕様

本機能にリトライ処理は存在しない。

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

本機能にトランザクション処理は存在しない。

## パフォーマンス要件

- 遅延読み込みにより起動時間への影響を最小化（引数ありの場合はロードしない）
- 最近ファイル一覧の取得は即座に完了

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

- 最近開いたファイル一覧は他者に見られる可能性があるため、機密ファイルのパスに注意
- セッションファイルにはバッファ内容が含まれる場合がある

## 備考

- vim-startifyはmhinz氏が開発・メンテナンスしている外部プラグイン
- space-vimはカスタムヘッダー（space-vimロゴ）を設定
- SPC b hでスタート画面に戻ることが可能

---

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

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

### 推奨読解順序

#### Step 1: パッケージ定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+distributions/better-defaults/packages.vim` | プラグイン登録と自動起動設定 |

**読解のコツ**: `g:spacevim_enable_startify`変数で機能の有効/無効を制御。autocmdでプラグインロード後にInit関数を呼び出す。`s:LoadStartifyIfNoArgs()`で引数なし起動時のみロードする。

**主要処理フロー**:
- **18-20行目**: 条件付きプラグイン登録（g:spacevim_enable_startify確認）
- **19行目**: `MP 'mhinz/vim-startify', { 'on': 'Startify' }` - 遅延読み込み設定
- **20行目**: `autocmd! User vim-startify call spacevim#autocmd#startify#Init()` - 初期化関数
- **22-27行目**: `s:LoadStartifyIfNoArgs()`関数 - 引数なし起動時の自動ロード
- **29-32行目**: VimEnter autocmd - 起動時に自動ロード関数を呼び出し

#### Step 2: キーバインディングを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | keybindings.vim | `layers/+distributions/better-defaults/keybindings.vim` | Startify呼び出しマッピング |

**読解のコツ**: `<Leader>bh`でStartify（ホーム画面）を呼び出せる。

**主要処理フロー**:
- **44行目**: `nnoremap <silent><Leader>bh :Startify<CR>` - SPC b hでStartify表示

#### Step 3: 初期化関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | startify.vim | `core/autoload/spacevim/autocmd/startify.vim` | カスタマイズ設定 |

**読解のコツ**: `s:custom_header`でspace-vimのASCIIアートロゴを定義。`s:list_order`で表示項目の順序を定義。

**主要処理フロー**:
- **3-8行目**: `s:get_nvim_version()`関数 - NeoVimバージョン取得
- **10-19行目**: `s:custom_header` - space-vimロゴのASCIIアート定義
- **21-32行目**: `s:list_order` - 表示項目順序（Recent Files、Project、Sessions、Bookmarks、Commands）
- **33-37行目**: `spacevim#autocmd#startify#Init()` - 設定値の初期化

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

```
VimEnter（引数なし起動）
    │
    └─ s:LoadStartifyIfNoArgs()
           │
           └─ plug#load('vim-startify')
                  │
                  └─ autocmd User vim-startify
                         │
                         └─ spacevim#autocmd#startify#Init()
                                ├─ g:startify_list_order 設定
                                ├─ g:startify_custom_header 設定
                                └─ g:startify_change_to_vcs_root 設定

SPC b h 押下
    │
    └─ :Startify
           │
           └─ Startify画面表示
```

### データフロー図

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

Vim起動（引数なし）  ───▶  s:LoadStartifyIfNoArgs  ───▶  Startify画面
                                ↓
                         vim-startifyロード
                               ↓
                         Init関数呼び出し
                               ↓
~/.vim/.viminfo     ───▶  最近ファイル取得      ───▶  ファイル一覧表示
~/.vim/session/     ───▶  セッション取得        ───▶  セッション一覧表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+distributions/better-defaults/packages.vim` | ソース | プラグイン登録と自動起動設定 |
| keybindings.vim | `layers/+distributions/better-defaults/keybindings.vim` | ソース | SPC b hマッピング |
| startify.vim | `core/autoload/spacevim/autocmd/startify.vim` | ソース | カスタムヘッダーと表示順序設定 |
| config.vim | `layers/+distributions/better-defaults/config.vim` | ソース | レイヤー設定 |
