# 機能設計書 47-C/C++

## 概要

本ドキュメントは、space-vimにおけるC/C++言語サポート機能の設計仕様を定義する。本機能はvim-clang-formatおよびvim-cpp-enhanced-highlightプラグインを統合し、C/C++ファイル編集時のコードフォーマット、強化された構文ハイライト機能を提供する。

### 本機能の処理概要

本機能は、C/C++ファイル（.c/.cpp/.h/.hpp）の編集時に、clang-formatによる自動フォーマットと、C++構文の強化ハイライト機能を提供する。

**業務上の目的・背景**：C/C++はシステムプログラミング、組み込みシステム、ゲーム開発等で広く使用されているプログラミング言語である。Vim上でのC/C++開発を効率化し、clang-formatによる一貫したコードスタイルの適用、強化された構文ハイライトによるコード可読性の向上を実現する。

**機能の利用シーン**：
- C/C++ソースファイル・ヘッダーファイルの作成・編集
- clang-formatによるコードフォーマット
- クラス・テンプレート・名前空間等の構文ハイライト
- C++11以降の新機能の視覚的表示

**主要な処理内容**：
1. C/C++ファイルタイプ検出時のプラグイン読み込み
2. vim-clang-formatによるフォーマット機能提供
3. vim-cpp-enhanced-highlightによる強化ハイライト
4. クラススコープ・波括弧エラー表示の設定

**関連システム・外部連携**：
- rhysd/vim-clang-format プラグイン
- octol/vim-cpp-enhanced-highlight プラグイン
- clang-format（フォーマッター）

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 8 | 補完ポップアップ | 参照画面 | C/C++コードの補完候補表示（YCM/coc連携時） |
| 10 | ALE/Syntastic（構文エラー表示） | 参照画面 | C/C++コンパイルエラーの表示 |

## 機能種別

言語サポート / 構文ハイライト / フォーマット

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:cpp_class_scope_highlight | Number | No | クラススコープのハイライト | 0または1 |
| g:c_no_curly_error | Number | No | 波括弧エラー表示の無効化 | 0または1 |

### 入力データソース

- C/C++ソースファイル（.c/.cpp）
- C/C++ヘッダーファイル（.h/.hpp）
- .clang-format（フォーマット設定）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 構文ハイライト | Highlight | C/C++構文の強化された色分け表示 |
| フォーマット済みコード | String | clang-format整形後のコード |

### 出力先

- エディタバッファ（構文ハイライト、フォーマット）

## 処理フロー

### 処理シーケンス

```
1. C/C++ファイルオープン
   └─ ファイルタイプ検出（c または cpp）

2. プラグイン読み込み
   └─ vim-clang-format, vim-cpp-enhanced-highlight

3. 設定適用
   └─ g:cpp_class_scope_highlight = 1
   └─ g:c_no_curly_error = 1

4. 構文ハイライト強化
   └─ クラススコープ、テンプレート等の色分け

5. フォーマット機能利用可能
   └─ :ClangFormat コマンド
```

### フローチャート

```mermaid
flowchart TD
    A[C/C++ファイルオープン] --> B{ファイルタイプ?}
    B -->|c| C[Cプラグイン読み込み]
    B -->|cpp| D[C++プラグイン読み込み]
    C --> E[設定適用]
    D --> E
    E --> F[構文ハイライト強化]
    F --> G[フォーマット機能有効]
    G --> H[編集開始]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-47-01 | ファイルタイプ読み込み | c/cppファイルタイプでプラグインを読み込み | ファイルオープン時 |
| BR-47-02 | クラスハイライトルール | クラススコープを視覚的に強調表示する | g:cpp_class_scope_highlight=1 |
| BR-47-03 | 波括弧エラー無効化 | C++では波括弧のネストエラーを表示しない | g:c_no_curly_error=1 |

### 計算ロジック

該当なし

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | clang-format未インストール | clang-formatが見つからない | clang-formatインストール案内 |
| - | .clang-format未設定 | プロジェクトにフォーマット設定がない | 設定ファイル作成案内 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- ファイルタイプ検出時のみプラグインを読み込み（遅延読み込み）

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

- 外部ツール（clang-format）はローカル環境のものを使用

## 備考

- .clang-format ファイルでプロジェクト固有のフォーマットスタイルを定義可能
- vim-cpp-enhanced-highlight はC++11以降の構文もサポート

---

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

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

### 推奨読解順序

#### Step 1: プラグイン登録を理解する

C/C++関連プラグインの登録方法を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+lang/c-c++/packages.vim` | プラグイン登録 |

**読解のコツ**: 両プラグインともc/cppファイルタイプで読み込まれる。

**主要処理フロー**:
1. **1行目**: vim-clang-format 登録（c, cpp ファイルタイプ）
2. **2行目**: vim-cpp-enhanced-highlight 登録（c, cpp ファイルタイプ）

#### Step 2: 設定を理解する

プラグイン設定を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.vim | `layers/+lang/c-c++/config.vim` | ハイライト設定 |

**主要処理フロー**:
- **2行目**: `let g:cpp_class_scope_highlight = 1` - クラススコープハイライト有効化
- **3行目**: `let g:c_no_curly_error = 1` - 波括弧エラー無効化

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

```
C/C++ファイルオープン
    │
    ├─ layers/+lang/c-c++/packages.vim
    │      ├─ vim-clang-format 登録 { 'for': ['c', 'cpp'] }
    │      └─ vim-cpp-enhanced-highlight 登録 { 'for': ['c', 'cpp'] }
    │
    └─ layers/+lang/c-c++/config.vim
           ├─ g:cpp_class_scope_highlight = 1
           └─ g:c_no_curly_error = 1
```

### データフロー図

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

C/C++ソースコード ───▶ プラグイン読み込み ─────▶ ハイライト表示
     │                      │
     └─────────────────▶ :ClangFormat ─────────▶ フォーマット済みコード
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+lang/c-c++/packages.vim` | 設定 | プラグイン登録 |
| config.vim | `layers/+lang/c-c++/config.vim` | 設定 | ハイライト設定 |
