# 機能設計書 25-deoplete連携

## 概要

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

### 本機能の処理概要

deopleteは、NeoVim/Vim8向けの非同期補完プラグインである。space-vimでは、+completion/deopleteレイヤーを通じてdeopleteを統合し、高速な自動補完機能を提供する。非同期処理により、補完候補の取得中も編集操作をブロックしない快適な開発体験を実現する。

**業務上の目的・背景**：コード補完は開発効率を大幅に向上させる重要な機能である。従来の同期補完は、補完候補の取得中にエディタがフリーズすることがあった。deopleteは非同期で補完候補を取得するため、大規模なプロジェクトでもスムーズな編集が可能となる。

**機能の利用シーン**：
- コード入力中に自動で補完候補を表示
- Tab/Shift-Tabで補完候補を選択
- Enter(CR)で補完を確定
- Ctrl-gで補完を取り消し
- 言語固有の補完（HTML, CSS, XML等）

**主要な処理内容**：
1. +completion/deopleteレイヤー有効化時にプラグインを登録
2. 起動時にdeopleteを有効化（deoplete#enable_at_startup = 1）
3. Tab/Shift-Tab/CRキーマッピングを設定
4. 言語固有のomni補完を登録
5. multiple-cursors競合回避処理

**関連システム・外部連携**：
- Shougo/deoplete.nvim プラグイン
- nvim-yarp/vim-hug-neovim-rpc（Vim8用）
- 言語固有補完ソース（neco-ghc, neco-vim, deoplete-rust, deoplete-go等）

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 8 | 補完ポップアップ | 主機能 | deopleteによる非同期補完候補の表示（NeoVim向け） |

## 機能種別

コード補完 / 非同期処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:deoplete#enable_at_startup | Number | No | 起動時有効化 | 0/1, デフォルト: 1 |
| g:min_pattern_length | Number | No | 最小パターン長 | デフォルト: 2 |
| g:spacevim.nvim | Boolean | - | NeoVim判定 | true/false |
| g:spacevim.vim8 | Boolean | - | Vim8判定 | true/false |

### 入力データソース

- ユーザー入力（キー入力）
- 言語固有補完ソース
- バッファ内容

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 補完候補リスト | List | 補完候補の一覧 |
| ポップアップメニュー | UI | 補完候補表示UI |

### 出力先

- Vimポップアップメニュー

## 処理フロー

### 処理シーケンス

```
1. +completion/deopleteレイヤー読み込み
   └─ packages.vimでプラグイン登録
2. config.vim実行
   └─ deoplete設定、キーマッピング
3. ユーザー入力
   └─ 2文字以上入力で補完トリガー
4. 補完候補取得（非同期）
   └─ 各補完ソースから候補を収集
5. ポップアップ表示
   └─ 補完候補をポップアップで表示
```

### フローチャート

```mermaid
flowchart TD
    A[Vim起動] --> B[+completion/deopleteレイヤー読み込み]
    B --> C{NeoVim?}
    C -->|Yes| D[deoplete.nvim登録]
    C -->|No| E[deoplete.nvim + nvim-yarp登録]
    D --> F[config.vim実行]
    E --> F
    F --> G[deoplete有効化]
    G --> H[キーマッピング設定]
    H --> I[ユーザー入力待ち]
    I --> J{2文字以上?}
    J -->|Yes| K[非同期で補完候補取得]
    J -->|No| I
    K --> L[ポップアップ表示]
    L --> M{Tab押下?}
    M -->|Yes| N[次の候補選択]
    M -->|No| O{CR押下?}
    O -->|Yes| P[補完確定]
    O -->|No| I
    N --> I
    P --> I
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-25-01 | 最小文字数 | 2文字以上入力で補完トリガー | 常時 |
| BR-25-02 | プレビュー無効 | docstring等のプレビューを非表示 | 常時 |
| BR-25-03 | multiple-cursors競合回避 | multiple-cursors使用時はdeoplete一時無効 | 常時 |

### 計算ロジック

なし

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

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

データベース操作なし

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| E-25-01 | プラグイン未検出 | deopleteが存在しない | silent!で無視 |

### リトライ仕様

なし

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

該当なし

## パフォーマンス要件

- 非同期処理により編集をブロックしない
- 補完遅延0ms（auto_complete_delay = 0）
- 自動リフレッシュ遅延0ms

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

なし

## 備考

- NeoVim向けに最適化
- Vim8使用時はnvim-yarp/vim-hug-neovim-rpcが必要

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+completion/deoplete/packages.vim` | プラグイン登録と環境分岐 |

**読解のコツ**: NeoVimとVim8で登録するプラグインが異なる。

**主要処理フロー**:
- **1-2行目**: NeoVim判定、UpdateRemotePlugins実行
- **3-7行目**: Vim8用にnvim-yarp、vim-hug-neovim-rpcを追加登録
- **10-13行目**: 言語固有補完ソース（neco-ghc, neco-vim, deoplete-rust, deoplete-go）を登録

#### Step 2: 設定処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+completion/deoplete/config.vim` | deoplete設定 |

**主要処理フロー**:
- **3-7行目**: NeoVim/Vim8判定内でキーマッピング設定
- **5-7行目**: Tab/S-Tab/CRキーマッピング
- **9行目**: `completeopt-=preview` でプレビュー非表示
- **11行目**: `g:deoplete#enable_at_startup = 1` で起動時有効化
- **13行目**: `g:min_pattern_length = 2` で最小2文字
- **19行目**: `auto_complete_delay = 0` で遅延なし
- **25-26行目**: Ctrl-g/Ctrl-lキーマッピング
- **29行目**: Ctrl-h/BSでポップアップ閉じてバックスペース
- **32-48行目**: HTML/CSS/XML等のomni補完登録
- **51-57行目**: multiple-cursors競合回避処理

#### Step 3: 補完キーマッピングを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | complete.vim | `core/autoload/spacevim/vim/complete.vim` | Tab/S-Tab/CR処理 |

**主要処理フロー**:
- **8-28行目**: Tab関数 - pumvisible時はC-n、coc有効時はcoc#refresh()
- **30-35行目**: S-Tab関数 - pumvisible時はC-p
- **37-41行目**: CR関数 - pumvisible時はC-y、そうでなければCR

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

```
spacevim#bootstrap()
    │
    ├─ layers/+completion/deoplete/packages.vim
    │      ├─ MP 'Shougo/deoplete.nvim'
    │      ├─ MP 'roxma/nvim-yarp' (Vim8)
    │      ├─ MP 'roxma/vim-hug-neovim-rpc' (Vim8)
    │      └─ 言語固有補完ソース
    │
    ├─ layers/+completion/deoplete/config.vim
    │      ├─ deoplete設定
    │      └─ omni補完登録
    │
    └─ core/autoload/spacevim/vim/complete.vim
           └─ Tab/S-Tab/CR関数
```

### データフロー図

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

キー入力 ───▶ deoplete ───▶ 補完ソース ───▶ 補完候補
                  │                              │
                  ▼                              ▼
         非同期で候補取得 ───────────────▶ ポップアップ表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+completion/deoplete/packages.vim` | ソース | プラグイン登録 |
| config.vim | `layers/+completion/deoplete/config.vim` | ソース | deoplete設定 |
| complete.vim | `core/autoload/spacevim/vim/complete.vim` | ソース | キーマッピング関数 |
