# 機能設計書 42-syntastic連携

## 概要

本ドキュメントは、space-vimにおけるsyntastic連携機能の設計仕様を定義する。syntasticはVim7以前の環境で使用される同期型の構文チェックプラグインであり、ALEが使用できない環境でのフォールバックとして機能する。

### 本機能の処理概要

本機能は、Vim8未満またはNeoVim以外の環境において、同期的にソースコードの構文チェックを行い、エラーおよび警告を表示する機能を提供する。

**業務上の目的・背景**：Vim8以前のレガシー環境でも構文チェック機能を利用可能にすることで、開発環境のバージョンに関わらず一貫したコード品質管理を実現する。ALEが非同期処理を前提としているため、非同期機能を持たないVim環境ではsyntasticが代替手段として必要となる。

**機能の利用シーン**：
- Vim7以前の環境でのソースコード構文チェック
- ファイル保存時の構文エラー検出
- Location Listへのエラー一覧表示
- SyntasticCheckコマンドによる手動チェック実行

**主要な処理内容**：
1. Vim環境（非Vim8/非NeoVim）の検出
2. syntasticプラグインのオンデマンド読み込み
3. 言語別リンター設定（pyflakes, jsl, jshint, tidy等）の適用
4. 同期的な構文チェック実行とエラー表示
5. SyntasticToggleModeによるチェックモード切り替え

**関連システム・外部連携**：
- vim-syntastic/syntastic プラグイン（コア機能）
- 各言語のリンター（pyflakes, jsl, jshint, tidy等）

**権限による制御**：特になし（全ユーザー共通機能）

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 10 | ALE/Syntastic（構文エラー表示） | 主画面 | 同期リンターによる構文チェック結果の表示（ALEの代替） |
| 17 | Quickfix/Location List | 結果表示画面 | 構文エラー一覧の表示 |

## 機能種別

バリデーション / 同期チェック

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:syntastic_python_checkers | List | No | Python用リンター | 文字列のリスト |
| g:syntastic_javascript_checkers | List | No | JavaScript用リンター | 文字列のリスト |
| g:syntastic_html_checkers | List | No | HTML用リンター | 文字列のリスト |
| g:syntastic_error_symbol | String | No | エラー表示記号 | 1-2文字の文字列 |
| g:syntastic_warning_symbol | String | No | 警告表示記号 | 1-2文字の文字列 |
| g:syntastic_aggregate_errors | Number | No | エラー集約フラグ | 0または1 |

### 入力データソース

- 編集中のソースコードバッファ
- 言語別リンター設定

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| エラー表示 | Sign | サインカラムへのエラーマーク表示（記号） |
| 警告表示 | Sign | サインカラムへの警告マーク表示（記号） |
| Location List | List | エラー・警告の一覧（行番号、メッセージ） |

### 出力先

- Vimのサインカラム（左端）
- Location List ウィンドウ

## 処理フロー

### 処理シーケンス

```
1. space-vim起動時
   └─ g:spacevim.vim8 および g:spacevim.nvim の判定

2. 非Vim8/非NeoVim環境の場合
   └─ MP 'vim-syntastic/syntastic' でプラグイン登録（オンデマンド）

3. SyntasticCheckコマンド実行時
   └─ プラグイン読み込み

4. config.vim の設定適用
   └─ g:syntastic_* 変数群の設定

5. 構文チェック実行
   └─ 同期的にリンター実行（エディタブロック）

6. 結果表示
   └─ Location Listへの出力
```

### フローチャート

```mermaid
flowchart TD
    A[space-vim起動] --> B{Vim8/NeoVim?}
    B -->|Yes| C[ALE読み込み]
    B -->|No| D[syntastic登録]
    D --> E[:SyntasticCheck実行]
    E --> F[プラグイン読み込み]
    F --> G[設定適用]
    G --> H[リンター実行]
    H --> I[同期処理]
    I --> J[結果表示]
    J --> K[Location List更新]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-42-01 | 環境判定ルール | Vim8未満かつNeoVim以外の環境でのみsyntasticを使用 | プラグイン読み込み時 |
| BR-42-02 | オンデマンド読み込み | SyntasticCheckコマンド実行時にプラグインを読み込む | コマンド実行時 |
| BR-42-03 | エラー集約ルール | 複数リンターのエラーを集約して表示する | g:syntastic_aggregate_errors=1 |

### 計算ロジック

該当なし

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

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

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | リンター未インストール | 言語別リンターが未インストール | 対応するリンターのインストール案内 |
| - | タイムアウト | リンター実行が長時間 | プロセス強制終了 |

### リトライ仕様

リンターエラー時のリトライは行わない（手動での再実行が必要）。

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

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

## パフォーマンス要件

- 同期処理のため、リンター実行中はエディタがブロックされる
- 大規模ファイルの場合、応答性が低下する可能性がある

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

- 外部リンターの実行はローカル環境に限定
- リンター出力は信頼できるツールからのみ受け付ける

## 備考

- Vim8/NeoVim環境ではALEが優先的に使用される
- syntasticは同期処理のため、ALEに比べて応答性が劣る
- 現代的な開発環境ではVim8/NeoVimへの移行を推奨

---

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

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

### 推奨読解順序

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

syntastic連携で使用される主要な設定変数を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.vim | `layers/+checkers/syntax-checking/config.vim` | syntastic用のグローバル設定変数（g:syntastic_*）の定義 |

**読解のコツ**: elseブロック（25-35行目）がsyntastic用の設定となる。

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

プラグイン読み込みの起点を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+checkers/syntax-checking/packages.vim` | 環境判定とプラグイン登録 |

**主要処理フロー**:
1. **1行目**: `if g:spacevim.vim8 || g:spacevim.nvim` で環境判定
2. **4行目**: else節でVim8/NeoVim以外の場合の処理
3. **5行目**: `MP 'vim-syntastic/syntastic', { 'on': 'SyntasticCheck' }` でオンデマンド登録

#### Step 3: 設定適用処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+checkers/syntax-checking/config.vim` | syntastic設定の適用 |

**主要処理フロー**:
- **26-29行目**: 言語別リンターの設定
- **27行目**: Python用 `['pyflakes']`
- **28行目**: JavaScript用 `['jsl', 'jshint']`
- **29行目**: HTML用 `['tidy', 'jshint']`
- **30-31行目**: エラー・警告記号の設定
- **32行目**: エラー集約設定
- **34行目**: トグルキーマッピング

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

```
space-vim起動
    │
    ├─ layers/+checkers/syntax-checking/packages.vim
    │      └─ 環境判定（Vim8/NeoVim以外）
    │             └─ MP 'vim-syntastic/syntastic' (オンデマンド)
    │
    ├─ :SyntasticCheck 実行時
    │      └─ vim-plug によるプラグイン読み込み
    │
    └─ layers/+checkers/syntax-checking/config.vim
           └─ g:syntastic_* 設定適用（else節）
```

### データフロー図

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

ソースコード ───────▶ syntasticリンター実行 ────▶ サインカラム表示
     │                    (同期処理)                      │
     │                         │                          ▼
     └──────────────────────────┴───────────▶ Location List表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+checkers/syntax-checking/packages.vim` | 設定 | プラグイン登録と環境判定 |
| config.vim | `layers/+checkers/syntax-checking/config.vim` | 設定 | syntasticの詳細設定（else節） |
