# 機能設計書 37-devicons連携

## 概要

本ドキュメントは、space-vimにおけるvim-devicons連携機能の設計仕様を定義する。vim-deviconsはNerd Fontsを使用してファイルタイプに応じたアイコンを表示するプラグインであり、NERDTree、airline、lightline等の各種プラグインと連携してVimの視覚的な情報表示を向上させる。

### 本機能の処理概要

devicons連携機能は、Vimエディタにおいてファイルタイプをアイコンで視覚的に表現する。Nerd Fonts（プログラミング用のアイコン付きフォント）をインストールした環境で、ファイルの拡張子やファイル名に応じた適切なアイコンを表示する。NERDTreeのファイルツリー、ステータスライン、バッファリストなど、様々な場所でアイコンが活用される。

**業務上の目的・背景**：プロジェクト開発では、多数のファイルを扱う際にファイルタイプを瞬時に識別できることが重要である。vim-deviconsは拡張子やファイル名に基づいてアイコンを表示し、視覚的な情報量を増やすことで、ファイル操作の効率化と誤操作の防止に寄与する。

**機能の利用シーン**：
- NERDTreeでディレクトリ構造を閲覧する際のファイルタイプ識別
- ステータスライン（airline/lightline）でのファイルタイプ表示
- FZFバッファリストでのファイルタイプ識別
- タブライン上でのバッファアイコン表示

**主要な処理内容**：
1. 拡張子に基づくアイコン決定 - .py, .js, .go 等の拡張子に対応するアイコンを返す
2. 完全一致によるアイコン決定 - Dockerfile, .gitignore 等の特定ファイル名に対応
3. パターンマッチによるアイコン決定 - jquery.*.js 等のパターンに対応
4. デフォルトアイコン - 未定義のファイルタイプに対する汎用アイコン

**関連システム・外部連携**：
- Nerd Fonts（必須）- アイコンフォントのインストールが必要
- NERDTree - ファイルツリーへのアイコン表示
- vim-airline / lightline - ステータスラインへのアイコン表示
- FZFバッファリスト - バッファ一覧へのアイコン表示

**権限による制御**：特になし。すべてのユーザーが使用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 3 | NERDTree（ファイルエクスプローラ） | 補助機能 | ファイルツリーへのアイコン表示 |
| 4 | FZF（ファジーファインダー） | 補助機能 | バッファリストへのアイコン表示 |
| 14 | Airline（ステータスライン） | 補助機能 | ステータスラインへのアイコン表示 |

## 機能種別

UI表示 / データ変換

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:spacevim_nerd_fonts | Number | No | Nerd Fonts使用フラグ（1で有効） | 0 or 1 |
| ファイル名 | String | Yes | アイコンを取得する対象のファイル名 | 空文字列も許可 |
| ファイルタイプ | String | Yes | Vimのファイルタイプ（&filetype） | 空文字列も許可 |

### 入力データソース

- ファイル名（バッファ名、ファイルパス）
- Vimのファイルタイプ情報（&filetype）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| アイコン文字 | String | Nerd Fontsのアイコン文字（Unicode Private Use Area） |

### 出力先

- NERDTreeノード（ファイル名の前）
- ステータスライン（ファイルタイプ表示部分）
- バッファリスト（ファイル名の前）
- タブライン（タブラベル）

## 処理フロー

### 処理シーケンス

```
1. ファイル情報取得
   └─ ファイル名・ファイルタイプを取得
2. 完全一致チェック
   └─ g:spacevim#icons#exact_matchesで完全一致を検索
3. 拡張子マッチング
   └─ g:spacevim#icons#extensionsで拡張子に対応するアイコンを検索
4. パターンマッチング
   └─ g:spacevim#icons#pattern_matchesで正規表現マッチング
5. デフォルトアイコン
   └─ マッチしない場合はg:spacevim#icons#defaultを返す
```

### フローチャート

```mermaid
flowchart TD
    A[ファイル名取得] --> B{exact_matchesに存在?}
    B -->|Yes| C[完全一致アイコンを返す]
    B -->|No| D[拡張子を抽出]
    D --> E{extensionsに存在?}
    E -->|Yes| F[拡張子アイコンを返す]
    E -->|No| G{pattern_matchesにマッチ?}
    G -->|Yes| H[パターンアイコンを返す]
    G -->|No| I[デフォルトアイコンを返す]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | Nerd Fonts必須 | vim-deviconsはNerd Fontsがインストールされた環境でのみ正常表示 | 常時 |
| BR-02 | g:spacevim_nerd_fonts制御 | g:spacevim_nerd_fonts=1の場合のみvim-deviconsをロード | 設定有効時 |
| BR-03 | 優先順位 | 完全一致 > 拡張子 > パターン > デフォルト の順でアイコンを決定 | 常時 |
| BR-04 | space-vim独自アイコン | space-vimはg:spacevim#iconsで独自のアイコンマッピングを定義 | fzf_base.vim使用時 |

### 計算ロジック

該当なし

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| DEV-001 | フォント未インストール | Nerd Fontsがインストールされていない | 豆腐文字（□）が表示される。Nerd Fontsのインストールを案内 |
| DEV-002 | ターミナル非対応 | ターミナルがUnicodeを正しく表示できない | 適切なターミナルエミュレータの使用を推奨 |

### リトライ仕様

特になし。

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

該当なし

## パフォーマンス要件

- アイコン取得: 1ms以内
- 辞書検索のため高速な処理が可能

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

特になし。

## 備考

- Nerd Fontsは https://www.nerdfonts.com/ からダウンロード可能
- space-vimはcore/autoload/spacevim/icons.vimで独自のアイコンマッピングを定義
- iTerm2、Alacritty、Kitty等のモダンターミナルでの使用を推奨

---

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

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

### 推奨読解順序

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

アイコンマッピングの辞書構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | icons.vim | `core/autoload/spacevim/icons.vim` | g:spacevim#icons#*の定義 |

**読解のコツ**:
- `g:spacevim#icons#extensions`: 拡張子とアイコンのマッピング（.py→、.js→ 等）
- `g:spacevim#icons#exact_matches`: ファイル名完全一致のマッピング（Dockerfile→ 等）
- `g:spacevim#icons#pattern_matches`: 正規表現パターンのマッピング
- `g:spacevim#icons#default`: デフォルトアイコン（）

#### Step 2: プラグインロードを理解する

vim-deviconsのロード条件を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+tools/file-manager/packages.vim` | vim-deviconsロード条件 |

**主要処理フロー**:
- **14-16行目**: g:spacevim_nerd_fonts有効時にvim-deviconsをロード
  - `if get(g:, 'spacevim_nerd_fonts', 0)`
  - `MP 'ryanoasis/vim-devicons'`

#### Step 3: FZFでのアイコン使用を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | fzf_base.vim | `core/autoload/spacevim/plug/fzf_base.vim` | s:GetFileTypeWithIcon関数 |

**主要処理フロー**:
- **217-224行目**: `s:GetFileTypeWithIcon()`関数
  - `get(g:, 'spacevim_nerd_fonts', 0)` で有効化確認
  - `g:spacevim#icons#extensions` からアイコンを取得
  - デフォルトは `g:spacevim#icons#default` を使用

#### Step 4: NERDTreeでのアイコン設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | nerdtree.vim | `core/autoload/spacevim/autocmd/nerdtree.vim` | アイコン関連設定 |

**主要処理フロー**:
- **69-83行目**: 矢印アイコンの設定（devicons用）
  - `g:spacevim_disable_nerdtree_arrow_icons` でアイコン無効化
  - Nerd Fonts有効時は専用アイコンを使用

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

```
vim-devicons (外部プラグイン)
    │
    ├─ NERDTree連携
    │      └─ ファイルノードにアイコン表示
    │
    ├─ airline/lightline連携
    │      └─ ステータスラインにアイコン表示
    │
    └─ space-vim独自実装
           │
           └─ spacevim#icons.vim
                  │
                  ├─ g:spacevim#icons#extensions
                  │
                  ├─ g:spacevim#icons#exact_matches
                  │
                  └─ g:spacevim#icons#pattern_matches
```

### データフロー図

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

ファイル名 ──────▶ icons.vim ─────────▶ アイコン文字
                       │
                       ├─ exact_matches検索
                       │
                       ├─ extensions検索
                       │
                       ├─ pattern_matches検索
                       │
                       └─ default
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| icons.vim | `core/autoload/spacevim/icons.vim` | ソース | アイコンマッピング定義 |
| packages.vim | `layers/+tools/file-manager/packages.vim` | 設定 | vim-deviconsロード |
| fzf_base.vim | `core/autoload/spacevim/plug/fzf_base.vim` | ソース | FZFでのアイコン使用 |
| nerdtree.vim | `core/autoload/spacevim/autocmd/nerdtree.vim` | ソース | NERDTreeアイコン設定 |
