# 画面設計書 10-ALE/Syntastic（構文エラー表示）

## 概要

本ドキュメントは、space-vimにおけるALE/Syntastic（構文エラー表示）の画面設計について記載する。ALEはw0rp/aleプラグインにより提供される非同期リンター、Syntasticはvim-syntastic/syntasticプラグインにより提供される同期リンターである。リアルタイムまたは保存時に構文チェックを行い、結果をサインカラムとロケーションリストに表示する。

### 本画面の処理概要

**業務上の目的・背景**：開発者がコーディング中に構文エラーやスタイル違反を早期に発見・修正できるようにすることが目的である。LSPとは異なり、ALEやSyntasticは外部リンター（ESLint、Pylint、RuboCop等）を呼び出して構文チェックを行う。これにより、LSPサーバーがない言語でも構文チェックが可能であり、プロジェクト固有のリンター設定を反映できる。

**画面へのアクセス方法**：以下の方法で構文エラー情報が表示される。
- 自動表示：テキスト変更時（ALE）または保存時（Syntastic）
- `SPC t s`キーバインド：ALE/Syntasticトグル
- `Leader en`：次のエラーへジャンプ
- `Leader ep`：前のエラーへジャンプ

**主要な操作・処理内容**：
1. 非同期（ALE）または同期（Syntastic）で構文チェック実行
2. サインカラムへのエラー・警告マーク表示
3. エコーエリアへの詳細メッセージ表示
4. エラー間のナビゲーション
5. ロケーションリストへの結果一覧表示
6. 自動修正（ALE fix on save）

**画面遷移**：
- エディタ画面（編集中） -> 自動 -> サインカラムに構文エラー表示
- エディタ画面 -> `Leader en` -> 次のエラー位置へジャンプ
- エディタ画面 -> `Leader ep` -> 前のエラー位置へジャンプ

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 41 | ALE連携 | 主機能 | 非同期リンターによるリアルタイム構文チェック結果の表示 |
| 42 | syntastic連携 | 主機能 | 同期リンターによる構文チェック結果の表示（ALEの代替） |
| 20 | トグル操作(SPC t) | 補助機能 | SPC t sでALE/Syntasticのトグル |

## 画面種別

オーバーレイ / サインカラム / ロケーションリスト

## URL/ルーティング

- トグル: `SPC t s`
- 次エラー: `Leader en`
- 前エラー: `Leader ep`
- ALEトグル: `:ALEToggle`
- Syntasticトグル: `:SyntasticToggleMode`

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|---------|------|
| g:ale_set_highlights | 入力（設定） | Number | ハイライト無効化（0） |
| g:ale_fix_on_save | 入力（設定） | Number | 保存時自動修正（1） |
| g:ale_echo_msg_format | 入力（設定） | String | メッセージフォーマット |
| g:ale_statusline_format | 入力（設定） | List | ステータスライン表示形式 |
| g:ale_sign_error | 入力（設定） | String | エラーサイン（'•'） |
| g:ale_sign_warning | 入力（設定） | String | 警告サイン（'•'） |
| g:ale_lint_delay | 入力（設定） | Number | リント遅延時間（500ms） |
| g:ale_lint_on_text_changed | 入力（設定） | String | テキスト変更時リント（'normal'） |
| g:syntastic_python_checkers | 入力（設定） | List | Python用チェッカー |
| 構文エラー一覧 | 出力 | List | リンターからのエラー・警告一覧 |

## 表示項目

| 項目 | 表示内容 | 説明 |
|-----|---------|------|
| サインマーク | エラー(•)/警告(•) | 行ごとのエラーマーク |
| エコーメッセージ | [#リンター名#] メッセージ [種別] | カーソル位置のエラー詳細 |
| ステータスライン | E•数 W•数 OK | エラー・警告カウント |

## イベント仕様

### 1-リアルタイムリント（ALE）

テキスト変更後、`g:ale_lint_delay`（500ms）経過後に非同期でリンターが実行され、結果がサインカラムに表示される。

### 2-保存時リント

ファイル保存時、リンターが実行される。ALEでは`g:ale_fix_on_save`が1の場合、自動修正も実行される。

### 3-次/前エラージャンプ

`Leader en`（次エラー）、`Leader ep`（前エラー）でエラー位置間をジャンプする。ALEでは`<Plug>(ale_next)`、`<Plug>(ale_previous)`にマッピングされている。

### 4-ALE/Syntasticトグル

`SPC t s`で構文チェック機能のオン/オフを切り替える。ALEでは`:ALEToggle`、Syntasticでは`:SyntasticToggleMode`が実行される。

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

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

該当なし（構文チェック・表示のみ）

## メッセージ仕様

| 種別 | メッセージ | 表示条件 |
|------|----------|---------|
| エラー | [#リンター#] メッセージ [✹ Error] | エラー検出時 |
| 警告 | [#リンター#] メッセージ [⚠ Warning] | 警告検出時 |
| 情報 | E•数 W•数 | ステータスライン |
| 情報 | OK | エラーなし時のステータスライン |

## 例外処理

| 状態 | 処理 |
|------|------|
| リンターが未インストール | そのリンターはスキップ |
| 対応していないファイルタイプ | 構文チェックなし |
| リンター実行エラー | エラーメッセージを表示 |

## 備考

- Vim8/NeoVimではALE、それ以外ではSyntasticが使用される
- ALEは非同期実行のため、編集中もブロックされない
- Syntasticは同期実行のため、保存時に一時的にブロックされる
- `g:ale_lint_on_text_changed = 'normal'`でノーマルモード時のみリント
- `g:ale_lint_on_insert_leave = 1`でインサートモード離脱時にリント
- 遅延読み込み（`timer_start(200, ...)`）が有効

---

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

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

### 推奨読解順序

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

ALE/Syntasticの設定データ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.vim | `layers/+checkers/syntax-checking/config.vim` | ALE/Syntastic設定を確認 |

**読解のコツ**: `g:ale_*`で始まる変数がALE設定、`g:syntastic_*`がSyntastic設定。Vim8/NeoVimかどうかで分岐している。

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

プラグインのロードと条件分岐を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+checkers/syntax-checking/packages.vim` | プラグイン登録と条件分岐を確認 |
| 2-2 | config.vim | `layers/+checkers/syntax-checking/config.vim` | 設定とキーマッピングを確認 |

**主要処理フロー**:
1. **packages.vim 1行目**: Vim8/NeoVim判定
2. **packages.vim 2行目**: ALE遅延読み込み登録
3. **packages.vim 5行目**: Syntastic遅延読み込み登録
4. **config.vim 3-24行目**: ALE設定
5. **config.vim 26-35行目**: Syntastic設定

#### Step 3: ALE設定を理解する

ALE固有の設定詳細を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+checkers/syntax-checking/config.vim` | ALE設定セクション（3-24行目） |

**主要処理フロー**:
- **5行目**: `g:ale_set_highlights = 0`
- **6行目**: `g:ale_fix_on_save = 1`
- **7行目**: `g:ale_echo_msg_format`
- **10-11行目**: サインアイコン設定
- **15-19行目**: リント遅延・タイミング設定
- **21-23行目**: キーマッピング

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

```
テキスト変更 / ファイル保存
    │
    ├─ [ALE使用時（Vim8/NeoVim）]
    │      │
    │      ├─ ale_lint_delay 待機（500ms）
    │      │
    │      └─ 非同期リンター実行
    │             │
    │             ├─ 外部リンター呼び出し（ESLint等）
    │             │
    │             └─ 結果をサインカラムに反映
    │
    └─ [Syntastic使用時（旧Vim）]
           │
           └─ 同期リンター実行
                  │
                  ├─ 外部リンター呼び出し
                  │
                  └─ 結果をロケーションリストに反映

Leader en / Leader ep
    │
    └─ <Plug>(ale_next/previous)
           │
           └─ 次/前エラー位置へジャンプ
```

### データフロー図

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

テキスト変更 ─────────▶ ALE/Syntastic ────────────▶ リンター呼び出し
ファイル保存              (リント処理)

外部リンター ─────────▶ ALE/Syntastic ────────────▶ エラー解析
(ESLint/Pylint等)         (結果解析)

エラー情報 ───────────▶ ALE/Syntastic ────────────▶ サインカラム表示
                        (表示処理)                   エコーメッセージ

Leader en/ep ─────────▶ ALE ──────────────────────▶ エラー間ジャンプ
                        (ナビゲーション)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+checkers/syntax-checking/packages.vim` | ソース | プラグイン登録・条件分岐 |
| config.vim | `layers/+checkers/syntax-checking/config.vim` | ソース | 設定・キーマッピング |
| ale | 外部プラグイン（w0rp/ale） | プラグイン | ALE非同期リンター |
| syntastic | 外部プラグイン（vim-syntastic/syntastic） | プラグイン | Syntastic同期リンター |
