# 機能設計書 53-Clojure

## 概要

本ドキュメントは、space-vimにおけるClojure言語サポート機能の設計を定義する。vim-fireplace、paredit、vim-clojure-static等の複数プラグインを組み合わせた包括的なClojure開発環境を提供する。

### 本機能の処理概要

Clojure言語でのVim開発体験を向上させるため、構文ハイライト、REPL連携、S式編集支援、コードフォーマットなどの包括的な開発サポートを提供する機能である。

**業務上の目的・背景**：ClojureはJVM上で動作するLisp方言であり、S式（括弧ベースの構文）を特徴とする関数型プログラミング言語である。Web開発（ClojureScript）、データ処理、マイクロサービス開発で利用されている。S式の編集には専用のツール（paredit）が不可欠であり、REPL駆動開発のためのnREPL連携も重要な機能である。

**機能の利用シーン**：Clojureプロジェクト（Leiningen、deps.edn等）の開発時、`.clj`、`.cljs`、`.cljc`ファイルを編集する際に自動的に有効化される。REPL接続によるコード評価、S式の構造的編集、名前空間の整理などの機能により、効率的な開発が可能になる。

**主要な処理内容**：
1. Clojure構文のシンタックスハイライト（vim-clojure-static）
2. 動的ハイライト（vim-clojure-highlight）
3. pareditによるS式構造編集
4. vim-fireplaceによるnREPL連携
5. vim-slamhoundによる名前空間整理
6. vim-cljfmtによるコードフォーマット

**関連システム・外部連携**：nREPL（Clojure REPL）、Leiningen/deps.edn（ビルドツール）との連携。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | Vimエディタ画面 | 主画面 | Clojureファイル編集時の構文ハイライトとS式編集 |
| - | REPLウィンドウ | 補助画面 | vim-fireplaceによるnREPL連携 |

## 機能種別

構文解析 / 構文ハイライト / 言語サポート / REPL連携 / コードフォーマット

## 入力仕様

### 入力パラメータ

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

### 入力データソース

- Clojureソースファイル（.clj, .cljs, .cljc, .edn）のバッファ内容
- project.clj / deps.ednプロジェクト設定
- nREPL接続情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 構文ハイライト | 視覚表示 | Clojure固有キーワードのカラー表示 |
| REPL評価結果 | テキスト | コード評価の結果 |
| フォーマット済みコード | テキスト | cljfmtによる整形結果 |

### 出力先

- Vimエディタ画面（バッファ表示）
- REPLウィンドウ
- コマンドライン出力

## 処理フロー

### 処理シーケンス

```
1. レイヤー読み込み
   └─ +lang/clojureレイヤーが有効化される
2. プラグイン読み込み
   └─ vim-clojure-static、paredit、vim-fireplace等がvim-plugにより読み込まれる
3. ファイル検出
   └─ .clj/.cljs/.cljcファイルオープン時にfiletypeがclojureに設定される
4. 構文ハイライト適用
   └─ vim-clojure-static/vim-clojure-highlightの構文定義に基づきハイライトが適用される
5. paredit有効化
   └─ S式編集モードが有効になる
6. nREPL接続（任意）
   └─ vim-fireplaceがnREPLサーバーに接続
```

### フローチャート

```mermaid
flowchart TD
    A[Vim起動] --> B{clojureレイヤー有効?}
    B -->|Yes| C[プラグイン群読み込み]
    B -->|No| Z[終了]
    C --> D{.cljファイルを開く?}
    D -->|Yes| E[filetype=clojure設定]
    D -->|No| F[待機]
    F --> D
    E --> G[構文ハイライト適用]
    G --> H[paredit有効化]
    H --> I{nREPL起動中?}
    I -->|Yes| J[vim-fireplace接続]
    I -->|No| K[オフラインモード]
    J --> L[REPL駆動開発可能]
    K --> M[編集のみ可能]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-53-01 | レイヤー依存 | +lang/clojureレイヤーの有効化が必要 | .spacevimファイルでレイヤー指定時 |
| BR-53-02 | ファイルタイプ検出 | .clj, .cljs, .cljc, .ednファイルで自動有効化 | ファイルオープン時 |
| BR-53-03 | nREPL自動接続 | .nrepl-portファイル存在時に自動接続 | ファイルオープン時 |
| BR-53-04 | paredit遅延読み込み | clojureファイルタイプでのみparedit有効化 | filetype検出時 |

### 計算ロジック

特になし

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | プラグイン未インストール | vim-plugによるインストール未完了 | :PlugInstall実行 |
| - | nREPL接続エラー | nREPLサーバーが起動していない | lein repl または clj -M:repl実行 |
| - | cljfmtエラー | コードフォーマットに失敗 | 構文エラーの修正 |

### リトライ仕様

- nREPL接続は手動リトライが必要（:Connect コマンド）

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

該当なし

## パフォーマンス要件

- 大規模Clojureプロジェクトでも構文ハイライトが遅延なく適用されること
- REPL評価のレスポンス：nREPLサーバーの応答速度に依存

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

- vim-fireplaceはnREPLサーバーと通信し、任意のClojureコードを評価できる
- 信頼できるプロジェクトでのみnREPL接続を行うこと

## 備考

- ClojureScriptプロジェクトではfigwheelやshadow-cljsとの連携が可能
- coc.nvimとclojure-lspを併用することでより高度なLSP機能が利用可能

---

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

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

### 推奨読解順序

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

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

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

**読解のコツ**: `{ 'for': 'clojure' }`オプションは遅延読み込みを示し、clojureファイルタイプでのみプラグインがロードされる。

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

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

**主要処理フロー**:
1. **1行目**: `MP 'kovisoft/paredit', { 'for': 'clojure' }` - S式編集支援（遅延読み込み）
2. **2行目**: `MP 'tpope/vim-fireplace', { 'for': 'clojure' }` - nREPL連携（遅延読み込み）
3. **3行目**: `MP 'guns/vim-clojure-static'` - 構文定義・静的ハイライト
4. **4行目**: `MP 'guns/vim-clojure-highlight'` - 動的ハイライト
5. **5行目**: `MP 'guns/vim-slamhound'` - 名前空間整理
6. **6行目**: `MP 'venantius/vim-cljfmt'` - コードフォーマット

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

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

**主要処理フロー**:
- paredit: S式の構造的編集（括弧のバランス維持、スラープ/バーフ操作）
- vim-fireplace: nREPL接続、コード評価、ドキュメント参照
- vim-clojure-static: Clojure構文定義、インデント
- vim-clojure-highlight: 動的なシンボルハイライト
- vim-slamhound: require/import文の自動生成
- vim-cljfmt: cljfmtによるコードフォーマット

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

```
.spacevim (ユーザー設定)
    │
    └─ Layer '+lang/clojure' 有効化
           │
           └─ packages.vim
                  ├─ MP 'kovisoft/paredit' (S式編集)
                  │
                  ├─ MP 'tpope/vim-fireplace' (REPL連携)
                  │      │
                  │      └─ nREPL サーバー接続
                  │
                  ├─ MP 'guns/vim-clojure-static' (構文定義)
                  │
                  ├─ MP 'guns/vim-clojure-highlight' (動的ハイライト)
                  │
                  ├─ MP 'guns/vim-slamhound' (名前空間)
                  │
                  └─ MP 'venantius/vim-cljfmt' (フォーマット)
```

### データフロー図

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

.spacevim ───▶ レイヤーシステム ───▶ プラグイン登録
                     │
                     ▼
.cljファイル ───▶ vim-clojure-static ───▶ 構文ハイライト
                     │
                     ▼
S式編集 ───▶ paredit ───▶ バランス維持されたコード
                     │
                     ▼
コード評価 ───▶ vim-fireplace ───▶ nREPL ───▶ 評価結果
                     │
                     ▼
フォーマット ───▶ vim-cljfmt ───▶ 整形済みコード
```

### 関連ファイル一覧

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