# 画面設計書 9-LSP診断画面

## 概要

本ドキュメントは、space-vimにおけるLSP診断画面の画面設計について記載する。LSP診断画面はLanguage Server Protocol（LSP）によるエラー・警告の表示機能であり、coc.nvim、vim-lsp、LanguageClient-neovim等のLSPクライアントにより提供される。

### 本画面の処理概要

**業務上の目的・背景**：開発者がコーディング中にリアルタイムでエラーや警告を把握し、早期に問題を修正できるようにすることが目的である。LSPサーバーがソースコードを解析し、構文エラー、型エラー、未使用変数、非推奨APIの使用などを検出してエディタにフィードバックする。これにより、コンパイル・実行前に多くの問題を発見・修正できる。

**画面へのアクセス方法**：以下の方法でLSP診断情報が表示される。
- 自動表示：ファイル保存時・編集時に自動的にサインカラムに表示
- `gd`キーバインド：定義ジャンプ
- `K`キー：ドキュメント表示（coc.nvim使用時）
- `SPC l`キーバインドプレフィックス：LSP操作メニュー

**主要な操作・処理内容**：
1. LSPサーバーによるリアルタイム診断
2. サインカラムへのエラー・警告マーク表示
3. カーソル位置の診断メッセージ表示
4. 診断箇所間のジャンプ
5. 定義ジャンプ（`gd`）
6. ドキュメント表示（`K`）
7. コードアクション・クイックフィックス

**画面遷移**：
- エディタ画面（編集中） -> 自動 -> サインカラムに診断表示
- エディタ画面 -> `gd` -> 定義位置（新バッファ/同バッファ）
- エディタ画面 -> `K` -> ドキュメントプレビュー

**権限による表示制御**：特になし。LSPサーバーの対応言語に依存する。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 29 | coc.nvim連携 | 主機能 | coc.nvimによるLSPエラー・警告の表示 |
| 30 | vim-lsp連携 | 主機能 | vim-lspによるLSP診断情報の表示 |
| 31 | LanguageClient-neovim連携 | 主機能 | LanguageClient-neovimによるLSP診断（NeoVim向け） |
| 18 | LSP操作(SPC l) | 補助機能 | SPC lによるLSP関連の操作（定義ジャンプ、リファレンス検索等） |

## 画面種別

オーバーレイ / サインカラム / バーチャルテキスト

## URL/ルーティング

- 定義ジャンプ: `gd`
- ドキュメント表示: `K`
- LSP操作プレフィックス: `SPC l`

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|---------|------|
| g:spacevim_lsp_engine | 入力（設定） | String | 使用するLSPエンジン（'coc'/'vim_lsp'/'lcn'） |
| set hidden | 入力（設定） | Boolean | 複数バッファ操作用設定 |
| set cmdheight | 入力（設定） | Number | メッセージ表示領域の高さ |
| set updatetime | 入力（設定） | Number | CursorHoldイベントの待機時間 |
| set signcolumn | 入力（設定） | String | サインカラムの表示設定 |
| 診断情報 | 出力 | List | LSPサーバーからの診断データ |
| サインマーク | 出力 | String | エラー・警告のアイコン |

## 表示項目

| 項目 | 表示内容 | 説明 |
|-----|---------|------|
| サインマーク | エラー(✖)/警告(⚠)/情報(ℹ)/ヒント(➤) | 行ごとの診断マーク |
| バーチャルテキスト | 診断メッセージ | 行末にインライン表示（対応時） |
| エコーメッセージ | 診断詳細 | コマンドラインに表示 |
| ドキュメント | 関数・変数のドキュメント | プレビューウィンドウ |

## イベント仕様

### 1-リアルタイム診断

ファイル編集・保存時、LSPサーバーが自動的にコードを解析し、診断情報をエディタに送信する。診断情報はサインカラムとバーチャルテキストに表示される。

### 2-定義ジャンプ

`gd`キー押下時、`spacevim#lang#util#Definition()`が呼ばれ、カーソル位置のシンボルの定義位置にジャンプする。

### 3-ドキュメント表示（coc.nvim）

`K`キー押下時、`spacevim#plug#coc#show_documentation()`が呼ばれ、カーソル位置のシンボルのドキュメントがプレビュー表示される。

### 4-カーソルホールドハイライト

`CursorHold`イベント時、カーソル位置のシンボルがハイライトされる（`CocActionAsync('highlight')`）。

### 5-シグネチャヘルプ

関数呼び出し時、`CocActionAsync('showSignatureHelp')`により関数シグネチャが表示される。

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

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

該当なし（コード解析・表示のみ）

## メッセージ仕様

| 種別 | メッセージ | 表示条件 |
|------|----------|---------|
| エラー | ✖ + エラーメッセージ | 構文エラー・型エラー検出時 |
| 警告 | ⚠ + 警告メッセージ | 警告検出時 |
| 情報 | ℹ + 情報メッセージ | 情報レベルの診断時 |
| ヒント | ➤ + ヒントメッセージ | ヒントレベルの診断時 |

## 例外処理

| 状態 | 処理 |
|------|------|
| LSPサーバーが未起動 | 診断機能が動作しない（エラー表示なし） |
| 対応していない言語 | 診断機能が動作しない |
| 定義が見つからない | エラーメッセージを表示 |

## 備考

- LSPエンジンは`g:spacevim_lsp_engine`で設定（デフォルト: 'lcn'）
- coc.nvim: 最も高機能、Node.js依存
- vim-lsp: 純粋なVim script実装
- LanguageClient-neovim: Rust実装、高速
- `set hidden`が必須（複数バッファ操作用）
- `cmdheight=2`でメッセージ表示領域を確保
- `updatetime=300`でCursorHoldの反応を高速化
- `signcolumn=yes`でサインカラムを常時表示

---

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

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

### 推奨読解順序

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

LSP設定とエンジン選択を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.vim | `layers/+tools/lsp/config.vim` | LSP設定とキーマッピングを確認 |
| 1-2 | packages.vim | `layers/+tools/lsp/packages.vim` | LSPエンジンの選択ロジックを確認 |

**読解のコツ**: `g:spacevim_lsp_engine`変数がLSPエンジンの選択を制御している。各エンジン用の設定関数（`s:coc()`, `s:vim_lsp()`, `s:lcn()`）を確認する。

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

キーマッピングとLSP操作を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+tools/lsp/config.vim` | gdキーマッピングと設定を確認 |

**主要処理フロー**:
1. **2行目**: `gd`で定義ジャンプ（`spacevim#lang#util#Definition()`）
2. **6行目**: `set hidden`の設定
3. **16-57行目**: coc.nvim用設定関数
4. **59-115行目**: LanguageClient-neovim用設定関数
5. **118-228行目**: vim-lsp用設定関数

#### Step 3: LSPエンジン設定を理解する

各LSPエンジンの設定詳細を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | packages.vim | `layers/+tools/lsp/packages.vim` | 各エンジンのプラグイン登録 |

**主要処理フロー**:
- **1-9行目**: coc.nvimのセットアップ
- **11-18行目**: vim-lspのセットアップ
- **20-25行目**: LanguageClient-neovimのセットアップ
- **27-29行目**: デフォルトエンジン設定とエンジン関数呼び出し

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

```
ファイル編集・保存
    │
    └─ LSPサーバーへ診断要求
           │
           ├─ [coc.nvim使用時]
           │      │
           │      ├─ CocActionAsync('highlight')
           │      └─ CocActionAsync('showSignatureHelp')
           │
           ├─ [vim-lsp使用時]
           │      │
           │      └─ lsp#get_text_document_symbol()
           │
           └─ [LanguageClient-neovim使用時]
                  │
                  └─ LanguageClient#textDocument_*()

gd キー押下
    │
    └─ spacevim#lang#util#Definition()
           │
           └─ LSPエンジンの定義ジャンプ呼び出し

K キー押下（coc.nvim）
    │
    └─ spacevim#plug#coc#show_documentation()
           │
           └─ CocAction('doHover')
```

### データフロー図

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

ソースコード ─────────▶ LSPサーバー ──────────────▶ 診断情報
ファイル変更              (解析処理)

診断情報 ─────────────▶ LSPクライアント ──────────▶ サインカラム表示
                        (coc/vim-lsp/lcn)            バーチャルテキスト

gd キー押下 ──────────▶ Definition() ─────────────▶ 定義位置ジャンプ
                        (定義ジャンプ)

K キー押下 ───────────▶ show_documentation() ──────▶ ドキュメント表示
                        (ホバー処理)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.vim | `layers/+tools/lsp/config.vim` | ソース | LSP設定・キーマッピング |
| packages.vim | `layers/+tools/lsp/packages.vim` | ソース | LSPエンジン登録 |
| coc.vim | `core/autoload/spacevim/plug/coc.vim` | ソース | coc.nvim連携 |
| coc.nvim | 外部プラグイン（neoclide/coc.nvim） | プラグイン | coc.nvim LSPクライアント |
| vim-lsp | 外部プラグイン（prabirshrestha/vim-lsp） | プラグイン | vim-lsp LSPクライアント |
| LanguageClient-neovim | 外部プラグイン（autozimu/LanguageClient-neovim） | プラグイン | LCN LSPクライアント |
