# 機能設計書 36-NERDTree連携

## 概要

本ドキュメントは、space-vimにおけるNERDTree連携機能の設計仕様を定義する。NERDTreeはツリー形式のファイルエクスプローラーであり、プロジェクトのディレクトリ構造を視覚的に表示し、ファイル操作を効率的に行うことを可能にする。

### 本機能の処理概要

NERDTree連携機能は、Vimエディタにサイドバー形式のファイルマネージャーを提供する。ディレクトリ構造をツリー形式で表示し、ファイルの開閉、作成、削除、名前変更などの操作をキーボードで効率的に行える。nerdtree-git-pluginとの連携によりGit状態の視覚化も実現する。

**業務上の目的・背景**：プロジェクト開発では、ディレクトリ構造の把握とファイル間の移動が頻繁に必要となる。NERDTreeはIDEのプロジェクトツリーに相当する機能をVimに提供し、大規模プロジェクトでのファイルナビゲーションを効率化する。

**機能の利用シーン**：
- プロジェクトのディレクトリ構造を視覚的に確認したい場合
- ファイルツリーからファイルを開きたい場合
- 現在編集中のファイルの位置をツリーで確認したい場合
- ファイル・ディレクトリの作成、削除、名前変更を行いたい場合
- Gitの変更状態をファイル単位で確認したい場合

**主要な処理内容**：
1. ファイルツリー表示（:NERDTreeToggle）- サイドバーでディレクトリツリーを表示/非表示
2. 現在ファイルを表示（:NERDTreeFind）- 現在のファイル位置をツリーで表示
3. Git状態表示 - nerdtree-git-pluginによる変更ファイルのマーキング
4. ファイル操作 - 作成(m→a)、削除(m→d)、名前変更(m→m)等

**関連システム・外部連携**：
- nerdtree-git-plugin - Git状態の表示
- vim-devicons - ファイルタイプアイコンの表示
- nerdtree-dash - ダッシュによるサイドバー操作
- coc-explorer - coc.nvim使用時の代替ファイルエクスプローラー

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 3 | NERDTree（ファイルエクスプローラ） | 主画面 | ツリー形式のファイルマネージャ表示、ディレクトリ構造のサイドバー表示 |

## 機能種別

UI操作 / ファイル管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:NERDTreeMinimalUI | Number | No | 最小UIモード（1で有効） | 0 or 1 |
| g:NERDTreeDirArrows | Number | No | ディレクトリ矢印アイコン使用（1で有効） | 0 or 1 |
| g:NERDTreeShowHidden | Number | No | 隠しファイル表示（1で有効） | 0 or 1 |
| g:NERDTreeAutoDeleteBuffer | Number | No | ファイル削除時にバッファも削除（1で有効） | 0 or 1 |
| g:NERDTreeIgnore | List | No | 無視するファイルパターン | 正規表現リスト |
| g:spacevim_nerd_fonts | Number | No | Nerd Fonts使用（1で有効） | 0 or 1 |
| g:spacevim_disable_nerdtree_arrow_icons | Number | No | 矢印アイコン無効化（1で有効） | 0 or 1 |

### 入力データソース

- ファイルシステム（ディレクトリ構造）
- Git状態（nerdtree-git-plugin使用時）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ディレクトリツリー | UI | ツリー形式のファイル/ディレクトリ一覧 |
| Git状態アイコン | UI | 変更/追加/削除等のGit状態 |
| ファイルアイコン | UI | vim-devicons使用時のファイルタイプアイコン |

### 出力先

- NERDTreeサイドバーウィンドウ

## 処理フロー

### 処理シーケンス

```
1. NERDTreeコマンド実行
   └─ :NERDTreeToggle または :NERDTreeFind
2. サイドバーウィンドウ作成
   └─ 左側に固定幅のウィンドウを作成
3. ディレクトリツリー構築
   └─ カレントディレクトリまたはプロジェクトルートをルートとしてツリー構築
4. Git状態取得
   └─ nerdtree-git-pluginによるGit状態の取得
5. ツリー表示
   └─ アイコン付きでディレクトリ/ファイルを表示
6. ユーザー操作待ち
   └─ ノード展開、ファイル選択、ファイル操作等
```

### フローチャート

```mermaid
flowchart TD
    A[NERDTreeコマンド実行] --> B{coc-explorer有効?}
    B -->|Yes| C[coc-explorer使用]
    B -->|No| D[NERDTree使用]
    D --> E{コマンド種別}
    E -->|Toggle| F[サイドバー表示/非表示切り替え]
    E -->|Find| G[現在ファイルをツリーで表示]
    F --> H[ディレクトリツリー構築]
    G --> H
    H --> I{nerdtree-git-plugin?}
    I -->|Yes| J[Git状態取得]
    I -->|No| K[状態なし]
    J --> L[ツリー表示]
    K --> L
    L --> M[ユーザー操作待ち]
    M --> N{操作種別}
    N -->|Enter| O[ファイルを開く]
    N -->|o| P[ノード展開/折りたたみ]
    N -->|m| Q[ファイル操作メニュー]
    N -->|q| R[NERDTree終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | coc-explorer優先 | coc_global_extensionsにcoc-explorerが含まれる場合、coc-explorerを使用 | coc-explorer有効時 |
| BR-02 | 遅延読み込み | NERDTreeToggle/NERDTreeFindコマンド実行時にロード | 常時 |
| BR-03 | Nerd Fonts連携 | g:spacevim_nerd_fonts=1の場合、vim-deviconsを読み込み | 設定有効時 |
| BR-04 | Git状態表示 | nerdtree-git-pluginによりModified/Staged/Untracked等を表示 | プラグイン有効時 |
| BR-05 | 矢印アイコン切り替え | g:spacevim_nerd_fontsまたはg:spacevim_disable_nerdtree_arrow_iconsで制御 | 設定に応じて |

### 計算ロジック

該当なし

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

該当なし（ファイルシステムベースの操作のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| NT-001 | ディレクトリ読み取りエラー | 権限不足でディレクトリが読めない | エラーメッセージ表示 |
| NT-002 | ファイル操作エラー | 削除/名前変更等が失敗 | エラーメッセージ表示 |

### リトライ仕様

特になし。エラー時はメッセージを表示し、処理を中断。

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

該当なし

## パフォーマンス要件

- ツリー表示: 500ms以内
- ノード展開: 100ms以内
- Git状態取得: 1秒以内

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

- ファイル操作の権限確認
- 隠しファイル表示設定の適切な管理

## 備考

- coc.nvimとcoc-explorerを使用する場合、NERDTreeは読み込まれない
- vim-deviconsはNerd Fontsのインストールが必要
- 大規模プロジェクトではパフォーマンスに注意

---

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

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

### 推奨読解順序

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

NERDTreeの設定変数とGit状態インジケータを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | nerdtree.vim | `core/autoload/spacevim/autocmd/nerdtree.vim` | 設定変数とGit状態アイコン定義 |

**読解のコツ**: `s:IndicatorMapCustom`でGit状態アイコンを定義。Modified(✹)、Staged(✚)、Untracked(✭)等のUnicode文字を使用。

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

NERDTreeのプラグインロードとcoc-explorer分岐を理解する。

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

**主要処理フロー**:
1. **3-5行目**: coc-explorer有効判定
2. **7行目**: NERDTreeの遅延読み込み（on: ['NERDTreeToggle', 'NERDTreeFind']）
3. **8行目**: autocmd User nerdtree で初期化関数呼び出し
4. **14-16行目**: g:spacevim_nerd_fonts有効時にvim-deviconsをロード
5. **18-19行目**: nerdtree-dash、nerdtree-git-pluginのロード

#### Step 3: キーバインド設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+tools/file-manager/config.vim` | キーマッピングの定義 |

**主要処理フロー**:
- **3-5行目**: coc-explorer有効時のCocExplorerToggle/CocExplorerFind関数定義
- **22-23行目**: coc-explorer有効時のLeader ft/fdマッピング
- **25-28行目**: NERDTree使用時のF4、Leader ft/fdマッピング

#### Step 4: 初期化処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | nerdtree.vim | `core/autoload/spacevim/autocmd/nerdtree.vim` | spacevim#autocmd#nerdtree#Init() |

**主要処理フロー**:
- **61-65行目**: 基本設定（MinimalUI、DirArrows、ShowHidden、AutoDeleteBuffer）
- **69-83行目**: 矢印アイコンの設定（Nerd Fonts有無で切り替え）
- **85行目**: g:NERDTreeIgnoreの設定
- **89行目**: nerdtree-git-pluginのインジケータ設定

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

```
<Leader>ft (キーバインド)
    │
    ├─ [coc-explorer有効時]
    │      └─ CocCommand explorer --toggle
    │
    └─ [NERDTree使用時]
           └─ :NERDTreeToggle
                  │
                  └─ spacevim#autocmd#nerdtree#Init()
                         │
                         ├─ g:NERDTree* 設定
                         │
                         └─ g:NERDTreeIndicatorMapCustom設定
```

### データフロー図

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

キー入力 ──────▶ config.vim ─────────▶ NERDTree/coc-explorer分岐
                       │                    │
                       │                    ▼
                       │              NERDTreeToggle
                       │                    │
                       │                    ▼
                       │              Init関数呼び出し
                       │                    │
                       │                    ▼
                       │              ディレクトリツリー表示
                       │                    │
                       └────────────────────┘
                                │
                                ▼
                         NERDTreeサイドバー
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+tools/file-manager/packages.vim` | 設定 | NERDTree関連プラグインのロード |
| config.vim | `layers/+tools/file-manager/config.vim` | 設定 | キーバインド・coc-explorer分岐 |
| nerdtree.vim | `core/autoload/spacevim/autocmd/nerdtree.vim` | ソース | NERDTree初期化処理 |
| nerdtree.vim | `core/ftplugin/nerdtree.vim` | 設定 | NERDTreeバッファのファイルタイプ設定 |
