# 機能設計書 31-LanguageClient-neovim連携

## 概要

本ドキュメントは、space-vimにおけるLanguageClient-neovim連携機能の設計仕様を定義する。LanguageClient-neovimは、Neovim向けのLanguage Server Protocol（LSP）クライアント実装であり、多言語に対応したコード補完・診断・定義ジャンプ等の機能を提供する。

### 本機能の処理概要

LanguageClient-neovim連携機能は、Neovim環境においてLSP（Language Server Protocol）を活用した高度なコード編集支援を実現する。この機能により、各プログラミング言語のLanguage Serverと連携し、インテリジェントなコード補完、エラー診断、定義ジャンプ、リファレンス検索などの機能を統合的に提供する。

**業務上の目的・背景**：現代のソフトウェア開発では、IDEレベルのコード支援機能が必要不可欠である。LanguageClient-neovimは、VimエディタにおいてIDEと同等のLSP機能を提供し、開発効率の大幅な向上を実現する。複数言語対応により、多言語プロジェクトでも一貫した開発体験を提供できる。

**機能の利用シーン**：
- C/C++、Go、Python、Rust、TypeScript、JavaScript、Haskell等のソースコード編集時
- 関数やクラスの定義箇所へのジャンプが必要な場合
- コード補完候補の表示が必要な場合
- シンタックスエラーや型エラーの即座の検出が必要な場合

**主要な処理内容**：
1. Language Serverの起動・接続管理（言語ごとのサーバーコマンド設定）
2. 診断情報（エラー・警告）のリアルタイム表示
3. ホバー情報（関数シグネチャ、ドキュメント）の表示
4. 定義・型定義・実装へのジャンプ
5. リファレンス検索
6. コードアクション・リネーム機能

**関連システム・外部連携**：
- 各言語のLanguage Server（ccls、go-langserver、pyls、rls、bash-language-server等）
- vim-lsp、coc.nvimとの選択的使用（`g:spacevim_lsp_engine`で制御）

**権限による制御**：特になし。すべてのユーザーが使用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 9 | LSP診断画面 | 主画面 | LanguageClient-neovimによるLSP診断（NeoVim向け） |

## 機能種別

データ連携 / リアルタイム処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:spacevim_lsp_engine | String | No | LSPエンジン選択（'lcn', 'vim_lsp', 'coc'） | デフォルト: 'lcn' |
| g:LanguageClient_serverCommands | Dict | No | 言語ごとのサーバーコマンド設定 | 有効なコマンドパス |
| g:LanguageClient_rootMarkers | Dict | No | プロジェクトルート判定用ファイル | ファイル名パターン |
| g:LanguageClient_diagnosticsDisplay | Dict | No | 診断表示のカスタマイズ設定 | 有効なハイライトグループ |

### 入力データソース

- ユーザー設定ファイル（~/.spacevim）
- レイヤー設定（layers/+tools/lsp/config.vim）
- Language Serverからのレスポンス（JSON-RPC）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 診断情報 | List | エラー・警告・情報・ヒントの診断結果 |
| 補完候補 | List | コード補完の候補リスト |
| ホバー情報 | String | カーソル位置のシンボル情報 |
| 定義位置 | Location | シンボルの定義ファイル・行番号 |

### 出力先

- サインカラム（診断アイコン表示）
- ポップアップウィンドウ（ホバー情報）
- Quickfixリスト（リファレンス検索結果）
- バーチャルテキスト（インライン診断メッセージ）

## 処理フロー

### 処理シーケンス

```
1. LSPエンジン選択
   └─ g:spacevim_lsp_engineの値をチェック（lcn/vim_lsp/coc）
2. LanguageClient-neovimの初期化（lcn選択時）
   └─ プラグインのロードとサーバーコマンド設定
3. 言語サーバーの起動
   └─ ファイルタイプに応じたLanguage Serverを起動
4. 診断情報の受信・表示
   └─ サーバーからの診断結果をサインカラム・バーチャルテキストに表示
5. ユーザー操作に応じたLSP機能実行
   └─ 定義ジャンプ、ホバー、リファレンス検索等
```

### フローチャート

```mermaid
flowchart TD
    A[ファイルを開く] --> B{g:spacevim_lsp_engine}
    B -->|lcn| C[LanguageClient-neovim初期化]
    B -->|vim_lsp| D[vim-lsp初期化]
    B -->|coc| E[coc.nvim初期化]
    C --> F{対応言語？}
    F -->|Yes| G[Language Server起動]
    F -->|No| H[機能無効]
    G --> I[診断情報表示]
    I --> J[ユーザー操作待ち]
    J --> K{操作種別}
    K -->|定義ジャンプ| L[textDocument/definition]
    K -->|ホバー| M[textDocument/hover]
    K -->|補完| N[textDocument/completion]
    L --> J
    M --> J
    N --> J
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | LSPエンジン排他制御 | 同時に使用できるLSPエンジンは1つのみ | 常時 |
| BR-02 | サーバー自動起動 | 対応ファイルタイプを開いた際に自動でLanguage Server起動 | 対応言語のファイル編集時 |
| BR-03 | 診断レベル表示 | Error/Warning/Information/Hintの4段階で視覚的に区別 | 診断情報受信時 |

### 計算ロジック

該当なし

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

該当なし（ファイルシステムベースの操作のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| LSP-001 | サーバー接続エラー | Language Serverが起動できない | サーバーのインストール状態を確認 |
| LSP-002 | 通信タイムアウト | サーバーからの応答がない | サーバーの再起動 |
| LSP-003 | 未サポート言語 | 対応するLanguage Serverが設定されていない | serverCommandsへの設定追加 |

### リトライ仕様

Language Server起動失敗時はログファイルにエラー出力し、手動での再起動を要求。

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

該当なし

## パフォーマンス要件

- Language Server起動: 3秒以内
- 診断情報更新: 500ms以内（updatetime設定に依存）
- 定義ジャンプ: 1秒以内

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

- Language Serverはローカルプロセスとして実行
- ログファイル（/tmp/LanguageClient.log等）に機密情報が含まれる可能性あり
- 信頼できないプロジェクトでのLSP使用に注意

## 備考

- NeoVim専用機能（Vimでは動作しない）
- coc.nvimやvim-lspとの併用は推奨されない
- 各Language Serverは別途インストールが必要

---

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

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

### 推奨読解順序

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

LanguageClient-neovimの設定構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.vim | `layers/+tools/lsp/config.vim` | g:LanguageClient_serverCommandsの構造 |

**読解のコツ**: VimScriptの辞書型（Dict）とリスト型の記法に注目。各言語に対してLanguage Serverのコマンドが配列で指定されている。

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

LSPレイヤーの初期化処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+tools/lsp/packages.vim` | プラグインのロード設定 |

**主要処理フロー**:
1. **20-25行目**: `s:lcn()`関数でLanguageClient-neovimプラグインを登録
2. **27行目**: `g:spacevim_lsp_engine`のデフォルト値設定（'lcn'）
3. **29行目**: 選択されたLSPエンジンの初期化関数を動的呼び出し

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+tools/lsp/config.vim` | `s:lcn()`関数の設定処理 |

**主要処理フロー**:
- **59-77行目**: `s:lcn()`関数で各言語のサーバーコマンドを設定
- **83-113行目**: 診断表示のカスタマイズ設定（signText、texthl等）
- **231行目**: 選択されたLSPエンジンの設定関数を実行

#### Step 4: LSPユーティリティを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | lsp.vim | `core/autoload/spacevim/lang/lsp.vim` | Language Server登録関数 |

**主要処理フロー**:
- **1-7行目**: RLS（Rust Language Server）の登録
- **10-15行目**: go-langserverの登録
- **18-24行目**: pyls（Python Language Server）の登録

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

```
spacevim#bootstrap()
    │
    └─ layers/+tools/lsp/packages.vim
           │
           ├─ s:lcn()
           │      └─ MP 'autozimu/LanguageClient-neovim'
           │
           └─ layers/+tools/lsp/config.vim
                  │
                  ├─ s:lcn()
                  │      ├─ g:LanguageClient_serverCommands設定
                  │      └─ g:LanguageClient_diagnosticsDisplay設定
                  │
                  └─ spacevim#lang#lsp#register_*()
                         └─ lsp#register_server()
```

### データフロー図

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

ソースコード ───▶ Language Server ───▶ 診断情報
                       │
                       ├──────────────▶ 補完候補
                       │
                       ├──────────────▶ ホバー情報
                       │
                       └──────────────▶ 定義位置
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+tools/lsp/packages.vim` | 設定 | LSPプラグインのロード定義 |
| config.vim | `layers/+tools/lsp/config.vim` | 設定 | LSP設定・キーバインド |
| lsp.vim | `core/autoload/spacevim/lang/lsp.vim` | ソース | Language Server登録ユーティリティ |
| lsp_ui.vim | `core/autoload/spacevim/lang/lsp_ui.vim` | ソース | LSP UI関連ユーティリティ |
| util.vim | `core/autoload/spacevim/lang/util.vim` | ソース | LSP操作のラッパー関数 |
