# 機能設計書 39-vim-signify連携

## 概要

本ドキュメントは、space-vimにおけるvim-signify連携機能の設計仕様を定義する。vim-signifyはバージョン管理システム（Git、SVN、Mercurial等）の差分情報をサインカラム（行番号の左側）にリアルタイムで表示するプラグインである。

### 本機能の処理概要

vim-signify連携機能は、編集中のファイルの変更状態を行単位で視覚的にフィードバックする。追加・変更・削除された行を、サインカラムの記号（+、~、-等）で即座に確認できる。これにより、コミット前の変更内容の把握が容易になり、意図しない変更の検出にも役立つ。

**業務上の目的・背景**：コード編集中に「どの行を変更したか」を常に把握できることは、品質の高いコミットを作成する上で重要である。vim-signifyはリアルタイムで差分を表示することで、変更の追跡と確認を効率化する。

**機能の利用シーン**：
- コード編集中に変更箇所を視覚的に確認したい場合
- コミット前に変更範囲を確認したい場合
- 誤って削除した行を検出したい場合
- 変更行数の概算を把握したい場合

**主要な処理内容**：
1. 差分検出 - バッファ保存時またはリアルタイムでVCS差分を検出
2. サイン表示 - 追加(+)、変更(~)、削除(-)の記号をサインカラムに表示
3. 差分ナビゲーション - 変更箇所間をジャンプ
4. 差分ハンク操作 - 変更ハンクのステージング・アンドゥ

**関連システム・外部連携**：
- Git、SVN、Mercurial等のVCS
- vim-fugitive - Git操作との連携
- airline/lightline - ステータスラインへの変更情報表示

**権限による制御**：特になし。VCS操作はユーザーの権限に依存。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 13 | Signify（差分インジケータ） | 主画面 | 行ごとのGit変更状態をサインカラムに表示 |

## 機能種別

UI表示 / バージョン管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:signify_sign_delete | String | No | 削除行の記号 | 1-2文字 |
| g:signify_sign_delete_first_line | String | No | 先頭行削除の記号 | 1-2文字 |
| g:signify_sign_change | String | No | 変更行の記号 | 1-2文字 |
| g:signify_sign_add | String | No | 追加行の記号（デフォルト: +） | 1-2文字 |

### 入力データソース

- VCSの差分情報（git diff等）
- カレントバッファの内容

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| サイン | UI | サインカラムに表示される変更記号 |
| ハイライト | UI | 変更種別に応じた色付け |

### 出力先

- サインカラム（行番号の左側）
- ステータスライン（変更行数サマリー）

## 処理フロー

### 処理シーケンス

```
1. バッファ読み込み/保存
   └─ BufRead/BufWrite autocmdでトリガー
2. VCS検出
   └─ .git、.svn等のディレクトリを検索
3. 差分取得
   └─ git diff等のコマンドを実行
4. 差分解析
   └─ 追加/変更/削除行を特定
5. サイン設置
   └─ sign place で各行にサインを設置
```

### フローチャート

```mermaid
flowchart TD
    A[バッファ読み込み] --> B{VCSリポジトリ?}
    B -->|Yes| C[差分コマンド実行]
    B -->|No| D[処理なし]
    C --> E[差分解析]
    E --> F{変更あり?}
    F -->|Yes| G[サイン設置]
    F -->|No| H[サインクリア]
    G --> I[サインカラム表示]
    H --> J[表示更新なし]
    I --> K[バッファ変更監視]
    K --> L{保存/変更?}
    L -->|Yes| C
    L -->|No| K
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 遅延読み込み | speed_up_via_timer有効時、300ms後にsignifyをロード | 設定有効時 |
| BR-02 | VCS自動検出 | Git、SVN、Mercurial等を自動検出 | VCSリポジトリ内 |
| BR-03 | カスタム記号 | g:signify_sign_*でサイン記号をカスタマイズ可能 | 設定時 |
| BR-04 | トグル機能 | Leader tgでGit差分表示のオン/オフ切り替え | 常時 |

### 計算ロジック

該当なし

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

該当なし（VCSへの操作）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| SIG-001 | VCS未検出 | VCSリポジトリ外 | サイン非表示（正常動作） |
| SIG-002 | 差分コマンドエラー | VCSコマンド実行失敗 | エラーログ出力 |

### リトライ仕様

特になし。次回のバッファ保存時に再度差分を取得。

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

該当なし

## パフォーマンス要件

- 差分取得: 500ms以内
- サイン更新: 100ms以内
- 大規模ファイル（1万行以上）でも遅延なく動作

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

- VCSコマンドの実行権限に注意
- リポジトリ外のファイルでは機能しない

## 備考

- vim-gitgutterと同様の機能を提供するが、複数VCSに対応
- airlineと連携して変更行数をステータスラインに表示可能
- vim-fugitiveと併用することでGit操作も可能

---

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

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

### 推奨読解順序

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

サイン記号の設定を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.vim | `layers/+version-control/git/config.vim` | g:signify_sign_*の定義 |

**読解のコツ**: vim-signifyの設定は`g:signify_`プレフィックスで始まる。delete、delete_first_line、changeの3種類の記号をカスタマイズ。

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

vim-signifyのプラグインロードを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+version-control/git/packages.vim` | プラグインロード |

**主要処理フロー**:
1. **3-6行目**: speed_up_via_timer有効時の処理
2. **5行目**: `MP 'mhinz/vim-signify', { 'on': [] }` - 遅延読み込み設定
3. **6行目**: `timer_start(300, 'spacevim#defer#git')` - 300ms後にロード

#### Step 3: サイン記号設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+version-control/git/config.vim` | サイン記号の設定 |

**主要処理フロー**:
- **29行目**: `g:signify_sign_delete = '-'` - 削除行の記号
- **30行目**: `g:signify_sign_delete_first_line = '^'` - 先頭行削除の記号
- **31行目**: `g:signify_sign_change = '~'` - 変更行の記号

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config.vim | `layers/+version-control/git/config.vim` | トグルキーバインド |

**主要処理フロー**:
- **34行目**: `<Leader>tg :call spacevim#plug#toggle#Git()<CR>` - Git差分表示トグル

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

```
バッファ読み込み/保存
    │
    └─ vim-signify autocmd
           │
           ├─ VCS検出
           │      └─ .git, .svn, .hg 等
           │
           ├─ 差分コマンド実行
           │      └─ git diff, svn diff 等
           │
           └─ サイン設置
                  └─ sign place
```

### データフロー図

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

バッファ保存 ──────▶ vim-signify ───────▶ VCS差分取得
                       │                    │
                       │                    ▼
                       │              差分解析
                       │                    │
                       │                    ▼
                       │              サイン設置
                       │                    │
                       └────────────────────┘
                                │
                                ▼
                         サインカラム表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+version-control/git/packages.vim` | 設定 | vim-signifyプラグインのロード |
| config.vim | `layers/+version-control/git/config.vim` | 設定 | サイン記号・キーバインド設定 |
