# 画面設計書 11-Fugitive（Git操作画面）

## 概要

本ドキュメントは、space-vimにおけるFugitive（Git操作画面）の画面設計を記述したものである。vim-fugitiveプラグインによって提供されるGitステータス、差分、ログなどの操作画面について、その構成・機能・操作方法を詳細に解説する。

### 本画面の処理概要

Fugitive画面は、Vim内でGitリポジトリの状態確認、ステージング、コミット、差分表示などのGit操作を統合的に行うための画面である。従来のターミナルでのGit操作をVimエディタ内で完結させることで、編集作業とバージョン管理のコンテキストスイッチを最小化する。

**業務上の目的・背景**：開発作業において、コード編集とバージョン管理は密接に関連している。エディタ外でGit操作を行う場合、作業の中断や画面の切り替えが発生し、生産性が低下する。Fugitive画面は、Vim内でGitの全機能を利用可能にすることで、シームレスな開発ワークフローを実現し、開発者の集中力維持と作業効率向上を目的としている。

**画面へのアクセス方法**：
- `SPC g s` または `:Git` - Gitステータス画面を開く
- `SPC g d` または `:Gdiffsplit` - 差分表示画面を開く
- `SPC g c` または `:Git commit` - コミット画面を開く
- `SPC g b` または `:Git blame` - Blame表示画面を開く
- `SPC g l` または `:Gclog` - コミットログ画面を開く

**主要な操作・処理内容**：
1. **ステータス確認**：変更ファイルの一覧表示、ステージング状態の確認
2. **ステージング操作**：`s`キーでステージング、`u`キーでアンステージング
3. **差分表示**：ファイル単位・ハンク単位での変更内容確認
4. **コミット作成**：コミットメッセージの編集とコミット実行
5. **履歴参照**：コミットログの閲覧、特定コミットへのチェックアウト
6. **Blame表示**：行ごとの変更者・コミット情報の表示
7. **リモート操作**：push、pull、fetchなどのリモート同期

**画面遷移**：
- エディタ画面 → Fugitive画面（`:Git`コマンドまたは`SPC g s`）
- Fugitive画面 → 差分表示画面（ファイル選択後）
- Fugitive画面 → コミットメッセージ編集画面（`cc`キー押下）
- Fugitive画面 → エディタ画面（`:q`または`gq`）

**権限による表示制御**：本画面に権限による表示制御は存在しない。ただし、Gitリポジトリ外のディレクトリでは機能が制限される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 38 | vim-fugitive連携 | 主機能 | Gitステータス、差分、ログなどの表示・操作 |
| 17 | Git操作(SPC g) | 補助機能 | SPC gによるGit操作（blame、commit、diff、push等） |

## 画面種別

操作画面（Git操作用特殊バッファ）

## URL/ルーティング

Vimコマンド/キーバインドによるアクセス：
- `:Git` / `:Gstatus` - ステータス画面
- `:Gdiffsplit` - 差分分割表示
- `:Git commit` - コミット画面
- `:Git blame` - Blame画面
- `:Gclog` - コミットログ画面

## 入出力項目

| 項目名 | 入出力 | データ型 | 説明 |
|--------|--------|----------|------|
| ファイルパス | 入力 | 文字列 | 操作対象のファイルパス |
| コミットメッセージ | 入力 | 文字列 | コミット時のメッセージ |
| コミットハッシュ | 出力 | 文字列 | コミットの識別子 |
| ファイルステータス | 出力 | 文字列 | staged/unstaged/untracked等 |
| 差分内容 | 出力 | テキスト | ファイルの変更内容 |

## 表示項目

### Gitステータス画面

| 表示項目 | データ型 | 説明 |
|----------|----------|------|
| Headセクション | 文字列 | 現在のブランチ名、HEADの状態 |
| Stagedセクション | リスト | ステージング済みファイル一覧 |
| Unstagedセクション | リスト | 未ステージングの変更ファイル一覧 |
| Untrackedセクション | リスト | 未追跡ファイル一覧 |
| ファイル状態マーカー | 文字 | A(追加)/M(変更)/D(削除)/?（未追跡） |

### Blame画面

| 表示項目 | データ型 | 説明 |
|----------|----------|------|
| コミットハッシュ | 文字列 | 各行の最終変更コミット |
| 作者名 | 文字列 | 変更を行ったユーザー名 |
| 日時 | 日時 | 変更日時 |
| コード行 | 文字列 | ソースコード本体 |

## イベント仕様

### 1-ステージング操作

ステータス画面でファイルを選択し、`s`キーを押下するとファイルがステージングされる。`u`キーでアンステージングが実行される。

```
[ユーザー操作] sキー押下
        ↓
[Fugitive] git add <ファイル>を実行
        ↓
[画面更新] ファイルがUnstaged→Stagedセクションへ移動
```

### 2-コミット実行

ステータス画面で`cc`キーを押下するとコミットメッセージ編集画面が開く。メッセージ入力後`:wq`でコミットが実行される。

```
[ユーザー操作] ccキー押下
        ↓
[Fugitive] コミットメッセージ編集バッファを開く
        ↓
[ユーザー操作] メッセージ入力 → :wq
        ↓
[Fugitive] git commitを実行
        ↓
[画面更新] ステータス画面が更新される
```

### 3-差分表示

ステータス画面またはエディタ画面から`:Gdiffsplit`を実行すると、現在のファイルとHEADの差分が分割ウィンドウで表示される。

### 4-Push/Pull操作

`SPC g p`でpush、`SPC g P`でpullが実行される。リモートとの同期処理が非同期で実行される。

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

本画面はGitリポジトリ（.gitディレクトリ）を操作対象とする。データベース（RDBMS）への更新は行わない。

### 操作別Gitリポジトリ影響一覧

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| ステージング | .git/index | UPDATE | インデックスファイルの更新 |
| コミット | .git/objects | INSERT | コミットオブジェクトの作成 |
| Push | remote repository | SYNC | リモートリポジトリへの送信 |
| Pull | .git/objects | SYNC | リモートからの取得・マージ |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| FUG001 | 成功 | Committed: {hash} | コミット成功時 |
| FUG002 | 成功 | Pushed to {remote}/{branch} | Push成功時 |
| FUG003 | エラー | Not in a git repository | Gitリポジトリ外で実行時 |
| FUG004 | エラー | Nothing to commit | コミット対象がない場合 |
| FUG005 | 警告 | Merge conflict detected | マージコンフリクト発生時 |

## 例外処理

| 例外状態 | 対処 | ユーザーへの通知 |
|---------|------|-----------------|
| Gitリポジトリ外での実行 | コマンドを中断 | エラーメッセージを表示 |
| リモート接続エラー | 操作を中断 | 接続エラーメッセージを表示 |
| マージコンフリクト | コンフリクトマーカーを表示 | 手動解決を促すメッセージ |
| 権限エラー | 操作を中断 | 権限エラーメッセージを表示 |

## 備考

- vim-fugitiveはTim Pope氏によって開発されたVim用Gitプラグインである
- space-vimでは遅延読み込みが設定されており、初回Git操作時に自動読み込みされる（800ms後）
- GVプラグインと連携してグラフィカルなコミット履歴表示も可能
- vim-signifyとの連携により、編集中のファイルの変更状態もリアルタイム表示される

---

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

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

### 推奨読解順序

#### Step 1: プラグイン登録と遅延読み込みを理解する

まず、vim-fugitiveがどのように登録され、いつ読み込まれるかを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+version-control/git/packages.vim` | vim-fugitiveの登録と遅延読み込み設定 |
| 1-2 | defer.vim | `core/autoload/spacevim/defer.vim` | fugitiveの遅延読み込み関数（800ms後に実行） |

**読解のコツ**: `MP`コマンドはspace-vim独自のプラグイン登録コマンドで、vim-plugの`Plug`コマンドをラップしている。`{ 'on': [] }`は遅延読み込み設定を示す。

#### Step 2: キーバインド設定を理解する

Git操作のキーバインドがどのように設定されているかを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+version-control/git/config.vim` | Leaderキー（SPC g）によるGit操作のマッピング |

**主要処理フロー**:
1. **4行目**: `nnoremap <silent> <Leader>gs :Git<CR>` - ステータス画面を開くマッピング
2. **5行目**: `nnoremap <silent> <Leader>gd :Gdiffsplit<CR>` - 差分表示マッピング
3. **6行目**: `nnoremap <silent> <Leader>gc :Git commit<CR>` - コミット画面マッピング
4. **7行目**: `nnoremap <silent> <Leader>gb :Git blame<CR>` - Blame表示マッピング
5. **8行目**: `nnoremap <silent> <Leader>gl :Gclog<CR>` - ログ表示マッピング

#### Step 3: トグル機能を理解する

Git差分インジケータのトグル機能を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | toggle.vim | `core/autoload/spacevim/plug/toggle.vim` | SignifyToggleとの連携処理 |

**主要処理フロー**:
- **1-9行目**: `spacevim#plug#toggle#Git()`関数 - SignifyまたはGitGutterのトグル

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

```
ユーザー操作（SPC g s）
    │
    ├─ config.vim（キーバインド定義）
    │      └─ nnoremap <Leader>gs :Git<CR>
    │
    └─ vim-fugitive（プラグイン本体）
           ├─ :Git コマンド実行
           │      └─ Gitステータスバッファ作成・表示
           │
           └─ 各種Gitサブコマンド
                  ├─ :Gdiffsplit（差分表示）
                  ├─ :Git commit（コミット）
                  ├─ :Git blame（Blame表示）
                  └─ :Gclog（ログ表示）
```

### データフロー図

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

SPC g s ──────────▶ vim-fugitive ──────────▶ Gitステータス画面
                          │
                          ├─▶ git status実行
                          │
                          └─▶ バッファ生成・表示

ファイル選択 + s ─▶ vim-fugitive ──────────▶ ステージング完了
                          │
                          └─▶ git add実行

cc キー押下 ─────▶ vim-fugitive ──────────▶ コミット完了
                          │
                          ├─▶ コミットメッセージバッファ
                          │
                          └─▶ git commit実行
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+version-control/git/packages.vim` | ソース | プラグイン登録・遅延読み込み設定 |
| config.vim | `layers/+version-control/git/config.vim` | ソース | キーバインド設定・Signify設定 |
| defer.vim | `core/autoload/spacevim/defer.vim` | ソース | 遅延読み込み実行関数 |
| toggle.vim | `core/autoload/spacevim/plug/toggle.vim` | ソース | Git差分表示トグル機能 |
| spacevim.vim | `core/autoload/spacevim.vim` | ソース | レイヤー読み込み・プラグイン管理 |
