# 画面設計書 1-Startify（スタート画面）

## 概要

本ドキュメントは、space-vimにおけるStartify（スタート画面）の画面設計について記載する。Startifyはvim-startifyプラグインにより提供されるVim起動時のスタート画面であり、最近開いたファイル、セッション、ブックマークなどを一覧表示し、素早くファイルへアクセスするためのランチャー機能を提供する。

### 本画面の処理概要

**業務上の目的・背景**：開発者がVimを起動した際に、前回の作業コンテキストに素早く復帰できるようにすることが目的である。最近使用したファイルやセッションへのクイックアクセスを提供することで、プロジェクト間の切り替えや継続作業の開始を効率化する。また、space-vimのブランドイメージを表すカスタムヘッダー（ASCIIアート）を表示することで、フレームワークの認識性を高めている。

**画面へのアクセス方法**：以下の方法でStartify画面にアクセスできる。
- Vimを引数なしで起動した場合に自動表示（`vim`コマンド）
- `:Startify`コマンドを実行

**主要な操作・処理内容**：
1. 最近開いたファイル（Recent Files）一覧から選択してファイルを開く
2. プロジェクトディレクトリ（Project）一覧から選択してディレクトリを開く
3. 保存されたセッション（Sessions）を選択して復元する
4. ブックマーク（Bookmarks）から登録済みファイルを開く
5. コマンド（Commands）から定義済みコマンドを実行する
6. `j`/`k`キーでカーソル移動、`Enter`で選択実行

**画面遷移**：
- Vim起動 -> Startify画面（自動）
- Startify画面 -> ファイル選択 -> エディタ画面（メインバッファ）
- Startify画面 -> セッション選択 -> エディタ画面（セッション復元）

**権限による表示制御**：特になし。すべてのユーザーが同一の機能を利用可能。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 79 | startify | 主機能 | Vim起動時に最近開いたファイル、セッション、ブックマークを表示する主処理 |
| 2 | ブートストラップ | 補助機能 | spacevim#defer#defaultsによる遅延読み込み時の初期化処理 |
| 80 | カーソルライン | 補助機能 | スタート画面でのカーソル位置表示 |

## 画面種別

一覧 / ランチャー

## URL/ルーティング

- 起動コマンド: `:Startify`
- 自動起動: Vim起動時（引数なしの場合）

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|---------|------|
| g:startify_list_order | 入力（設定） | List | 表示セクションの順序定義 |
| g:startify_custom_header | 入力（設定） | List | カスタムヘッダー（ASCIIアート） |
| g:startify_change_to_vcs_root | 入力（設定） | Number | VCSルートへの自動cd有効化 |
| 選択アイテム | 出力 | String | 選択されたファイルパス/セッション名/コマンド |

## 表示項目

| セクション | 表示内容 | 説明 |
|-----------|---------|------|
| ヘッダー | space-vim ASCIIアート | フレームワーク名とバージョン情報 |
| Recent Files | 最近開いたファイル一覧 | ファイルパスとアクセス番号 |
| Project | プロジェクトディレクトリ一覧 | ディレクトリパスとアクセス番号 |
| Sessions | 保存されたセッション一覧 | セッション名とアクセス番号 |
| Bookmarks | ブックマーク一覧 | 登録済みファイルパス |
| Commands | コマンド一覧 | 実行可能なコマンド |

## イベント仕様

### 1-ファイル選択

ユーザーが一覧からファイルを選択（番号キーまたはEnter）すると、選択されたファイルがバッファに読み込まれ、エディタ画面に遷移する。Startifyバッファは閉じられる。

### 2-セッション復元

セッション一覧から選択すると、`:SLoad`コマンドが実行され、保存されたセッション状態（開いていたファイル、ウィンドウレイアウト等）が復元される。

### 3-VCSルート変更

`g:startify_change_to_vcs_root`が1（デフォルト）の場合、ファイルを開く際にそのファイルが属するVCS（Git等）のルートディレクトリに自動的にカレントディレクトリを変更する。

## データベース更新仕様

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

該当なし（ファイルシステムおよびVimセッションファイルのみ使用）

## メッセージ仕様

| 種別 | メッセージ | 表示条件 |
|------|----------|---------|
| 情報 | ヘッダーASCIIアート | 画面表示時 |
| 情報 | セクションタイトル（Recent Files:等） | 各セクション表示時 |

## 例外処理

| 状態 | 処理 |
|------|------|
| ファイルが存在しない | 該当ファイルは一覧から除外される |
| セッションファイルが破損 | セッション復元失敗のエラーメッセージ表示 |
| vim-startifyプラグイン未ロード | 画面は表示されず、通常の空バッファを表示 |

## 備考

- vim-startifyプラグインは`mhinz/vim-startify`により提供される
- 遅延読み込み（on-demand loading）が有効であり、`:Startify`コマンド実行時にプラグインがロードされる
- `g:spacevim_enable_startify`変数でStartify機能の有効/無効を切り替え可能（デフォルト: 有効）

---

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

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

### 推奨読解順序

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

Startifyの設定データ構造とカスタムヘッダー定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | startify.vim | `core/autoload/spacevim/autocmd/startify.vim` | カスタムヘッダーとリスト順序の定義を確認 |

**読解のコツ**: `s:custom_header`変数がASCIIアートを定義し、`s:list_order`が表示セクションの順序を定義している。Vim scriptのリスト構造に注目する。

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

プラグインのロードと初期化の流れを理解する。

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

**主要処理フロー**:
1. **18-19行目**: `g:spacevim_enable_startify`の確認とvim-startifyプラグインの登録
2. **20行目**: `autocmd! User vim-startify`でプラグインロード時の初期化関数を登録
3. **22-27行目**: `s:LoadStartifyIfNoArgs()`関数で引数なし起動時の自動表示ロジック
4. **29-32行目**: `VimEnter`イベントでStartify自動起動

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

Startifyの初期化処理で設定がどのように適用されるかを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | startify.vim | `core/autoload/spacevim/autocmd/startify.vim` | `spacevim#autocmd#startify#Init()`関数の処理内容 |

**主要処理フロー**:
- **33-37行目**: グローバル変数へのデフォルト値設定（`get()`関数によるフォールバック）

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

```
VimEnter (autocmd)
    │
    └─ s:LoadStartifyIfNoArgs()
           │
           ├─ argc() チェック（引数なし確認）
           │
           ├─ plug#load('vim-startify')
           │
           └─ :Startify コマンド実行
                  │
                  └─ User vim-startify (autocmd)
                         │
                         └─ spacevim#autocmd#startify#Init()
                                │
                                ├─ g:startify_list_order 設定
                                ├─ g:startify_custom_header 設定
                                └─ g:startify_change_to_vcs_root 設定
```

### データフロー図

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

設定ファイル ────────▶ packages.vim ──────────────▶ プラグイン登録
(~/.spacevim)            (プラグイン定義)

VimEnter ────────────▶ s:LoadStartifyIfNoArgs() ──▶ Startify起動判定
イベント                 (起動条件チェック)

User vim-startify ───▶ startify#Init() ───────────▶ 設定適用
イベント                 (初期化処理)                 (画面表示)

ユーザー入力 ────────▶ vim-startify ────────────▶ ファイル/セッション
(番号/Enter)            (選択処理)                   オープン
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+distributions/better-defaults/packages.vim` | ソース | プラグイン登録・自動起動設定 |
| startify.vim | `core/autoload/spacevim/autocmd/startify.vim` | ソース | 初期化処理・設定適用 |
| vim-startify | 外部プラグイン（mhinz/vim-startify） | プラグイン | Startify本体機能 |
