# 画面設計書 13-Signify（差分インジケータ）

## 概要

本ドキュメントは、space-vimにおけるSignify（差分インジケータ）画面の設計を記述したものである。vim-signifyプラグインによって提供される、編集中ファイルのGit変更状態をサインカラム（行番号左側）にリアルタイム表示する機能について、その構成・機能・操作方法を詳細に解説する。

### 本画面の処理概要

Signify画面（正確には「サインカラムへの差分インジケータ表示」）は、現在編集中のファイルに対するGitの変更状態を視覚的にフィードバックする機能である。追加行、変更行、削除行を異なるシンボルで表示し、開発者がファイルの変更状況を即座に把握できるようにする。

**業務上の目的・背景**：コード編集中に、どの行を変更したか、どの行を追加・削除したかを視覚的に把握できることは、作業効率とコード品質の向上に直結する。特にコミット前のレビューや、デバッグ時の変更箇所特定において重要な役割を果たす。Signifyは、この情報をエディタ画面に常時オーバーレイ表示することで、コンテキストを維持したまま変更状況を確認可能にする。

**画面へのアクセス方法**：
- 自動表示：Gitリポジトリ内のファイルを開くと自動的にサインカラムに表示
- `SPC t g` - Signifyのトグル（表示/非表示切り替え）
- `SPC g g` - Git差分表示のトグル（別名）

**主要な操作・処理内容**：
1. **変更状態表示**：追加行（`+`）、変更行（`~`）、削除行（`-`）をサインカラムに表示
2. **リアルタイム更新**：ファイル編集に伴う即座の表示更新
3. **ハンク間ジャンプ**：変更箇所（ハンク）間のナビゲーション
4. **差分プレビュー**：カーソル位置の変更内容をプレビュー表示
5. **トグル操作**：表示のON/OFF切り替え

**画面遷移**：
- エディタ画面上に常時オーバーレイ表示（独立した画面ではない）
- Signify自体への「遷移」は存在せず、エディタ画面の一部として機能

**権限による表示制御**：本画面に権限による表示制御は存在しない。Gitリポジトリ外のファイルでは表示されない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 39 | vim-signify連携 | 主機能 | 行ごとのGit変更状態をサインカラムに表示 |
| 17 | Git操作(SPC g) | 補助機能 | Git差分情報の視覚的フィードバック |

## 画面種別

オーバーレイ表示（エディタ画面のサインカラム拡張）

## URL/ルーティング

Vimコマンド/キーバインドによるアクセス：
- 自動：Gitリポジトリ内ファイルで自動有効化
- `:SignifyToggle` - 表示のトグル
- `:SignifyDiff` - 差分の表示
- `:SignifyHunkDiff` - カーソル位置のハンク差分表示

## 入出力項目

| 項目名 | 入出力 | データ型 | 説明 |
|--------|--------|----------|------|
| ファイルパス | 入力（自動） | 文字列 | 編集中ファイルのパス |
| Git差分情報 | 入力（自動） | 差分データ | `git diff`の結果 |
| サインシンボル | 出力 | 文字 | +（追加）/~（変更）/-（削除） |
| ハイライト | 出力 | カラー | 各状態に対応した色付け |

## 表示項目

### サインカラム表示

| 表示項目 | シンボル | 説明 |
|----------|----------|------|
| 追加行 | `+`（未設定時はデフォルト） | 新規追加された行 |
| 変更行 | `~` | 内容が変更された行 |
| 削除行 | `-` | 削除された行の直下 |
| 削除行（先頭） | `^` | ファイル先頭で削除された場合 |

### ハイライトグループ

| グループ名 | 用途 | デフォルト色 |
|------------|------|-------------|
| SignifySignAdd | 追加行のサイン | 緑系 |
| SignifySignChange | 変更行のサイン | 黄系 |
| SignifySignDelete | 削除行のサイン | 赤系 |

## イベント仕様

### 1-自動差分検出

ファイルを開くまたは保存すると、自動的にGit差分が検出され、サインカラムが更新される。

```
[トリガー] BufEnter / BufWritePost
        ↓
[vim-signify] git diff --no-color --no-ext-diff -U0 実行
        ↓
[vim-signify] 差分解析・サイン配置
        ↓
[画面更新] サインカラムに変更マーカー表示
```

### 2-トグル操作

`SPC t g`または`:SignifyToggle`で表示のON/OFFを切り替える。

```
[ユーザー操作] SPC t g押下
        ↓
[toggle.vim] spacevim#plug#toggle#Git()呼び出し
        ↓
[vim-signify] SignifyToggle実行
        ↓
[画面更新] サインカラムの表示/非表示切り替え
```

### 3-ハンク間ジャンプ

`]c`で次のハンク、`[c`で前のハンクへジャンプする。

```
[ユーザー操作] ]c押下
        ↓
[vim-signify] 次の変更箇所を検索
        ↓
[カーソル移動] 該当行へジャンプ
```

### 4-差分プレビュー

カーソル位置のハンクの差分内容をプレビュー表示する。

```
[ユーザー操作] :SignifyHunkDiff
        ↓
[vim-signify] カーソル位置のハンク情報取得
        ↓
[プレビュー] ポップアップ/分割ウィンドウで差分表示
```

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

本画面は参照専用であり、Gitリポジトリへの更新は行わない。

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

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| 差分検出 | .git/objects | SELECT | HEADとワーキングツリーの差分取得 |
| サイン表示更新 | なし | N/A | 表示のみ、リポジトリ変更なし |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| SIG001 | 情報 | Signify enabled | トグルON時 |
| SIG002 | 情報 | Signify disabled | トグルOFF時 |
| SIG003 | 警告 | Not in a VCS repository | バージョン管理外で実行時 |

## 例外処理

| 例外状態 | 対処 | ユーザーへの通知 |
|---------|------|-----------------|
| Gitリポジトリ外のファイル | サイン表示をスキップ | 特になし（静かに無効化） |
| 大きなファイル | パフォーマンス低下を防ぐため制限 | 設定による |
| Git未インストール | 機能無効化 | 起動時に警告 |

## 備考

- vim-signifyはmhinz氏によって開発されたVim用差分表示プラグインである
- space-vimでは遅延読み込みが設定されており、300ms後に自動読み込みされる
- GitGutter（vim-gitgutter）の代替として使用可能で、toggle関数で自動判定される
- サインシンボルはconfig.vimで`-`、`^`、`~`にカスタマイズされている

---

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

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

### 推奨読解順序

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

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

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

**読解のコツ**: `speed_up_via_timer`設定により、timer_startで300ms後に読み込まれる。

**主要処理フロー**:
1. **5行目（packages.vim）**: `MP 'mhinz/vim-signify'      , { 'on': [] }` - 遅延読み込み設定
2. **6行目（packages.vim）**: `call timer_start(300, 'spacevim#defer#git')` - 300ms後に読み込み
3. **20-22行目（defer.vim）**: `spacevim#defer#git()`関数 - vim-signifyをロード

#### Step 2: サインシンボル設定を理解する

サインカラムに表示されるシンボルのカスタマイズ設定を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+version-control/git/config.vim` | サインシンボルのカスタマイズ設定 |

**主要処理フロー**:
1. **29行目**: `let g:signify_sign_delete            = '-'` - 削除行のシンボル
2. **30行目**: `let g:signify_sign_delete_first_line = '^'` - 先頭削除のシンボル
3. **31行目**: `let g:signify_sign_change            = '~'` - 変更行のシンボル

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

SignifyToggleのトグル機能を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+version-control/git/config.vim` | トグルキーバインド設定 |
| 3-2 | toggle.vim | `core/autoload/spacevim/plug/toggle.vim` | Git表示トグル関数 |

**主要処理フロー**:
1. **34行目（config.vim）**: `nnoremap <silent> <Leader>tg :call spacevim#plug#toggle#Git()<CR>` - SPC t gマッピング
2. **1-9行目（toggle.vim）**: SignifyToggleまたはGitGutterToggleを実行

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

```
Vim起動 / ファイルオープン
    │
    ├─ timer_start(300, ...)
    │      │
    │      └─ spacevim#defer#git()
    │             └─ plug#load('vim-signify')
    │
    └─ vim-signify（プラグイン本体）
           │
           ├─ BufEnter autocmd
           │      └─ git diff実行 → サイン配置
           │
           ├─ BufWritePost autocmd
           │      └─ git diff実行 → サイン更新
           │
           └─ SignifyToggle
                  └─ サイン表示ON/OFF

SPC t g 押下
    │
    └─ spacevim#plug#toggle#Git()
           │
           ├─ SignifyToggle（vim-signifyがある場合）
           │
           └─ GitGutterToggle（vim-gitgutterがある場合）
```

### データフロー図

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

ファイルオープン ─▶ vim-signify ──────────▶ サインカラム表示
                          │
                          ├─▶ git diff実行
                          │
                          └─▶ 差分解析・サイン配置

ファイル編集 ────▶ vim-signify ──────────▶ サイン更新
                          │
                          └─▶ 差分再計算

SPC t g ─────────▶ toggle#Git() ─────────▶ 表示切り替え
                          │
                          └─▶ SignifyToggle
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+version-control/git/packages.vim` | ソース | vim-signifyプラグイン登録・遅延読み込み |
| config.vim | `layers/+version-control/git/config.vim` | ソース | サインシンボル設定・トグルキーバインド |
| defer.vim | `core/autoload/spacevim/defer.vim` | ソース | 遅延読み込み実行関数 |
| toggle.vim | `core/autoload/spacevim/plug/toggle.vim` | ソース | Git表示トグル機能 |
| 画面一覧.csv | `docs/code-to-docs/画面一覧/画面一覧.csv` | データ | 画面No.13の定義 |
