# 機能設計書 52-Elixir

## 概要

本ドキュメントは、space-vimにおけるElixir言語サポート機能の設計を定義する。vim-elixirによる構文ハイライトとalchemist.vimによる開発支援機能を提供する。

### 本機能の処理概要

Elixir言語でのVim開発体験を向上させるため、構文ハイライト、自動補完、ドキュメント参照、テスト実行支援などの包括的な開発サポートを提供する機能である。

**業務上の目的・背景**：ElixirはErlang VM上で動作する関数型プログラミング言語であり、Phoenixフレームワークを用いたWebアプリケーション開発で広く利用されている。マクロ、パイプライン演算子、パターンマッチングなどの独自構文を持つため、専用のプラグインによる開発支援が効率向上に不可欠である。

**機能の利用シーン**：Elixirプロジェクト（Phoenix、Nerves等）の開発時、`.ex`や`.exs`ファイルを編集する際に自動的に有効化される。IEx（Elixir対話環境）との連携、ドキュメント参照、定義ジャンプなどの機能により、効率的な開発が可能になる。

**主要な処理内容**：
1. Elixir構文のシンタックスハイライト
2. インデント処理の最適化
3. ファイルタイプ自動検出
4. alchemist.vimによるElixir開発支援
5. IExとの連携によるコード評価
6. ドキュメント参照機能
7. 定義ジャンプ機能

**関連システム・外部連携**：vim-elixir（構文ハイライト）、alchemist.vim（開発支援）、Elixir/IEx（ランタイム）との連携。LSP（ElixirLS）との併用も可能。

**権限による制御**：特になし。レイヤー有効化によりすべての機能が利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | Vimエディタ画面 | 主画面 | Elixirファイル編集時の構文ハイライトと補完 |

## 機能種別

構文解析 / 構文ハイライト / 言語サポート / 開発支援

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| - | - | - | 設定変数なし（デフォルト動作） | - |

### 入力データソース

- Elixirソースファイル（.ex, .exs, .eex, .heex）のバッファ内容
- mix.exsプロジェクト設定
- deps/ディレクトリ内の依存関係

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 構文ハイライト | 視覚表示 | Elixir固有キーワードのカラー表示 |
| 補完候補 | リスト | モジュール・関数の補完候補 |
| ドキュメント | テキスト | 関数・モジュールのヘルプ情報 |

### 出力先

- Vimエディタ画面（バッファ表示）
- 補完ポップアップ
- プレビューウィンドウ

## 処理フロー

### 処理シーケンス

```
1. レイヤー読み込み
   └─ +lang/elixirレイヤーが有効化される
2. プラグイン読み込み
   └─ vim-elixirとalchemist.vimがvim-plugにより読み込まれる
3. ファイル検出
   └─ .ex/.exsファイルオープン時にfiletypeがelixirに設定される
4. 構文ハイライト適用
   └─ vim-elixirの構文定義に基づきハイライトが適用される
5. alchemist初期化
   └─ プロジェクト情報の解析とIEx接続準備
```

### フローチャート

```mermaid
flowchart TD
    A[Vim起動] --> B{elixirレイヤー有効?}
    B -->|Yes| C[vim-elixirプラグイン読み込み]
    B -->|No| Z[終了]
    C --> D[alchemist.vim読み込み]
    D --> E{.ex/.exsファイルを開く?}
    E -->|Yes| F[filetype=elixir設定]
    E -->|No| G[待機]
    G --> E
    F --> H[構文ハイライト適用]
    H --> I[alchemist機能有効化]
    I --> J[編集・開発可能状態]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-52-01 | レイヤー依存 | +lang/elixirレイヤーの有効化が必要 | .spacevimファイルでレイヤー指定時 |
| BR-52-02 | ファイルタイプ検出 | .ex, .exs, .eex, .heexファイルで自動有効化 | ファイルオープン時 |
| BR-52-03 | mixプロジェクト検出 | mix.exs存在時にプロジェクトルートを認識 | ファイルオープン時 |

### 計算ロジック

特になし（構文ハイライトと開発支援のみの機能）

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

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

該当なし（データベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | プラグイン未インストール | vim-plugによるインストール未完了 | :PlugInstall実行 |
| - | Elixir未インストール | システムにElixirがインストールされていない | Elixirのインストール |
| - | IEx接続エラー | IExプロセスに接続できない | mix環境の確認 |

### リトライ仕様

- IEx接続はタイムアウト後に自動リトライ

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

該当なし

## パフォーマンス要件

- 大規模Elixirプロジェクトでも構文ハイライトが遅延なく適用されること
- 補完候補の表示：500ms以下

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

- alchemist.vimはIExプロセスと通信するため、プロジェクトコードが評価される可能性がある
- 信頼できるプロジェクトでのみ使用すること

## 備考

- Phoenix LiveViewプロジェクトでは.heexファイルのサポートも含まれる
- coc.nvimとElixirLSを併用することでより高度なLSP機能が利用可能

---

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

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

### 推奨読解順序

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

Elixirレイヤーは設定ファイルを持たず、プラグイン登録のみで構成される。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+lang/elixir/packages.vim` | 使用するプラグインの確認 |

**読解のコツ**: MPマクロはspace-vim独自のプラグイン登録マクロで、vim-plugのPlug関数をラップしている。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+lang/elixir/packages.vim` | MPマクロによるプラグイン登録 |

**主要処理フロー**:
1. **1行目**: `MP 'elixir-lang/vim-elixir'` - vim-elixirプラグイン登録（構文ハイライト）
2. **3行目**: `MP 'slashmili/alchemist.vim'` - alchemist.vimプラグイン登録（開発支援）

#### Step 3: プラグインの役割を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | LAYERS.md | `layers/LAYERS.md` | +lang/elixirセクションでプラグイン一覧を確認 |

**主要処理フロー**:
- vim-elixir: Elixir構文ハイライト、インデント、ファイルタイプ検出を提供
- alchemist.vim: IEx連携、補完、ドキュメント参照、定義ジャンプを提供

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

```
.spacevim (ユーザー設定)
    │
    └─ Layer '+lang/elixir' 有効化
           │
           └─ packages.vim
                  ├─ MP 'elixir-lang/vim-elixir' (構文ハイライト)
                  │
                  └─ MP 'slashmili/alchemist.vim' (開発支援)
                         │
                         └─ IEx プロセス連携
```

### データフロー図

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

.spacevim ───▶ レイヤーシステム ───▶ プラグイン登録
                     │
                     ▼
.ex/.exsファイル ───▶ vim-elixir ───▶ 構文ハイライト表示
                     │
                     ▼
コード編集 ───▶ alchemist.vim ───▶ 補完・ドキュメント
                     │
                     ▼
               IEx プロセス ───▶ コード評価結果
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+lang/elixir/packages.vim` | 設定 | vim-elixirとalchemist.vimの登録 |
| LAYERS.md | `layers/LAYERS.md` | ドキュメント | レイヤー一覧とプラグイン情報 |
