# 機能設計書 28-YouCompleteMe連携

## 概要

本ドキュメントは、space-vimにおけるYouCompleteMe連携機能の設計仕様を定義する。

### 本機能の処理概要

YouCompleteMe（YCM）は、強力なコード補完エンジンを備えたVimプラグインである。space-vimでは、+tools/ycmdレイヤーを通じてYCMを統合し、C/C++、Python、Go、Rust、JavaScript等の多言語に対応したセマンティック補完機能を提供する。

**業務上の目的・背景**：YCMはClangベースのセマンティック補完により、C/C++等の言語で高精度な補完を実現する。また、Go、Rust、Python等の言語でも専用のコンプリーターを通じて高品質な補完を提供する。プロジェクト構成（Makefile、CMake等）を理解した上での補完が可能であり、大規模プロジェクトでの開発効率を向上させる。

**機能の利用シーン**：
- C/C++開発でClangベースのセマンティック補完を使用
- Go、Rust、Python等での高精度補完
- プロジェクト構成に基づいた補完
- 定義ジャンプ、ドキュメント表示等のIDE機能

**主要な処理内容**：
1. +tools/ycmdレイヤー有効化時にプラグインを登録
2. 遅延読み込み（timer 1000ms）またはイベントトリガーでYCMをロード
3. 言語固有の補完設定（セマンティックトリガー等）
4. LocalLeaderキーマッピングでGoTo、GetDoc等を提供

**関連システム・外部連携**：
- ycm-core/YouCompleteMe プラグイン
- rdnetto/YCM-Generator（設定ファイル生成）
- Clang（C/C++補完）
- 各言語のコンプリーター（go、rust、python等）

**権限による制御**：特になし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 8 | 補完ポップアップ | 主機能 | YCMによる補完候補の表示 |

## 機能種別

コード補完 / セマンティック解析

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:ycm_global_ycm_extra_conf | String | No | グローバル設定ファイル | パス |
| g:ycm_error_symbol | String | No | エラーシンボル | デフォルト: ✖ |
| g:ycm_warning_symbol | String | No | 警告シンボル | デフォルト: ⚠ |
| g:ycm_min_num_of_chars_for_completion | Number | No | 最小文字数 | デフォルト: 2 |

### 入力データソース

- ユーザー入力（キー入力）
- プロジェクト構成ファイル（Makefile、CMake等）
- 言語サーバー

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 補完候補リスト | List | 補完候補の一覧 |
| 診断情報 | List | エラー/警告情報 |
| ドキュメント | String | シンボルのドキュメント |

### 出力先

- Vimポップアップメニュー
- サインカラム（診断情報）
- プレビューウィンドウ（ドキュメント）

## 処理フロー

### 処理シーケンス

```
1. +tools/ycmdレイヤー読み込み
   └─ packages.vimでプラグイン登録
2. YCMビルド（初回インストール時）
   └─ install.py --clang-completer 等を実行
3. 遅延読み込み
   └─ timer_start(1000ms)またはCursorHold等でロード
4. ユーザー設定適用
   └─ autocmd User YouCompleteMeで設定初期化
5. コード補完
   └─ 2文字以上入力でトリガー、セマンティック補完
```

### フローチャート

```mermaid
flowchart TD
    A[Vim起動] --> B[+tools/ycmdレイヤー読み込み]
    B --> C[packages.vimでプラグイン登録]
    C --> D{初回インストール?}
    D -->|Yes| E[install.py実行]
    D -->|No| F[遅延読み込み待機]
    E --> F
    F --> G{timer/イベント発火?}
    G -->|Yes| H[plug#load YouCompleteMe]
    H --> I[autocmd User YouCompleteMe]
    I --> J[spacevim#autocmd#youcompleteme#Init]
    J --> K[各種設定適用]
    K --> L[ユーザー入力待ち]
    L --> M{2文字以上入力?}
    M -->|Yes| N[セマンティック補完トリガー]
    N --> O[補完候補表示]
    M -->|No| L
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-28-01 | 最小文字数 | 2文字以上入力でセマンティック補完トリガー | 常時 |
| BR-28-02 | ブラックリスト | tagbar、nerdtree、markdown等では補完無効 | 常時 |
| BR-28-03 | 診断表示 | syntax-checkingレイヤー有効時はYCM診断UIを無効 | ALE併用時 |

### 計算ロジック

なし

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

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

データベース操作なし

### テーブル別操作詳細

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| E-28-01 | ビルド失敗 | install.py実行失敗 | エラーメッセージ表示 |
| E-28-02 | コンプリーター未検出 | 言語固有コンプリーターなし | 対応言語以外では補完制限 |

### リトライ仕様

なし

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

該当なし

## パフォーマンス要件

- 遅延読み込みにより起動時間を最適化（1000ms後にロード）
- セマンティック補完は初回解析後は高速

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

なし

## 備考

- Clangベースのセマンティック補完
- Go、Rust、Python等の言語もサポート
- ビルドにPython必要

---

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

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

### 推奨読解順序

#### Step 1: プラグイン登録を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+tools/ycmd/packages.vim` | プラグイン登録と遅延読み込み |

**読解のコツ**: on_eventオプションでイベントトリガー、timerで遅延読み込みの2パターン。

**主要処理フロー**:
- **2行目**: `MP 'rdnetto/YCM-Generator'` - 設定ファイル生成ツール
- **4-5行目**: `MP 'ycm-core/YouCompleteMe'` - YCM本体登録（do:でビルド、on_event:でトリガー）
- **6行目**: `autocmd! User YouCompleteMe` - ロード後にInit呼び出し
- **8-10行目**: timer_start(1000ms)で遅延読み込み

#### Step 2: ビルド処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | youcompleteme.vim | `core/autoload/spacevim/plug/youcompleteme.vim` | ビルド処理 |

**主要処理フロー**:
- **1-23行目**: `spacevim#plug#youcompleteme#build()` - install.py実行
- **3行目**: `['install.py', '--clang-completer']` - 基本引数
- **5-7行目**: Goがあれば`--go-completer`追加
- **9-12行目**: Rustがあれば`--rust-completer`追加
- **18-22行目**: Python3/Python判定してinstall.py実行

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | youcompleteme.vim | `core/autoload/spacevim/autocmd/youcompleteme.vim` | YCM初期化設定 |

**主要処理フロー**:
- **2-3行目**: エラー/警告シンボル設定
- **4-14行目**: 各種オプション設定（cache、complete_in_strings/comments等）
- **15行目**: syntax-checkingレイヤー有効時は診断UI無効
- **20-23行目**: セマンティックトリガー設定（2文字以上）
- **24-31行目**: ブラックリストファイルタイプ設定
- **33-35行目**: Tab/S-Tab/CRキーマッピング
- **37-61行目**: 言語固有omnifunc、キーバインディング設定

#### Step 4: 設定ファイルを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config.vim | `layers/+tools/ycmd/config.vim` | グローバル設定 |

**主要処理フロー**:
- **1行目**: `g:ycm_global_ycm_extra_conf` - グローバル設定ファイルパス

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

```
spacevim#bootstrap()
    │
    ├─ layers/+tools/ycmd/packages.vim
    │      ├─ MP 'rdnetto/YCM-Generator'
    │      ├─ MP 'ycm-core/YouCompleteMe'
    │      │      └─ do: spacevim#plug#youcompleteme#build
    │      └─ timer_start(1000, 'spacevim#plug#youcompleteme#invoke')
    │
    ├─ core/autoload/spacevim/plug/youcompleteme.vim
    │      ├─ spacevim#plug#youcompleteme#build()
    │      └─ spacevim#plug#youcompleteme#invoke()
    │
    └─ core/autoload/spacevim/autocmd/youcompleteme.vim
           └─ spacevim#autocmd#youcompleteme#Init()
```

### データフロー図

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

キー入力 ───▶ YCM ───▶ Clang/コンプリーター ───▶ 補完候補
                │                                  │
                ▼                                  ▼
       セマンティック解析 ──────────────────▶ ポップアップ表示
                │                                  │
                ▼                                  ▼
          診断情報 ─────────────────────────▶ サインカラム表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+tools/ycmd/packages.vim` | ソース | プラグイン登録 |
| config.vim | `layers/+tools/ycmd/config.vim` | ソース | グローバル設定 |
| youcompleteme.vim | `core/autoload/spacevim/plug/youcompleteme.vim` | ソース | ビルド・ロード処理 |
| youcompleteme.vim | `core/autoload/spacevim/autocmd/youcompleteme.vim` | ソース | 初期化設定 |
| complete.vim | `core/autoload/spacevim/vim/complete.vim` | ソース | キーマッピング関数 |
