# 画面設計書 3-NERDTree（ファイルエクスプローラ）

## 概要

本ドキュメントは、space-vimにおけるNERDTree（ファイルエクスプローラ）の画面設計について記載する。NERDTreeはscrooloose/nerdtreeプラグインにより提供されるツリー形式のファイルマネージャ画面であり、ディレクトリ構造をサイドバーで表示し、ファイルやディレクトリのナビゲーション・操作を行う。

### 本画面の処理概要

**業務上の目的・背景**：開発者がプロジェクトのディレクトリ構造を視覚的に把握し、ファイル間の移動を効率的に行えるようにすることが目的である。コマンドラインでのファイル操作に慣れていないユーザーでも、GUIファイルマネージャのような操作感でファイルを選択・開くことができる。また、Gitステータスの表示やdeviconsによるアイコン表示により、ファイルの状態を一目で把握できる。

**画面へのアクセス方法**：以下の方法でNERDTree画面にアクセスできる。
- `SPC f t`キーバインド：NERDTreeトグル
- `F4`キー：NERDTreeトグル
- `SPC f d`キーバインド：現在のファイル位置でNERDTreeを開く（NERDTreeFind）
- `:NERDTreeToggle`コマンド
- `:NERDTreeFind`コマンド

**主要な操作・処理内容**：
1. ディレクトリのツリー表示・展開・折りたたみ（`o`キー、`Enter`キー）
2. ファイルを選択してバッファに開く（`Enter`キー）
3. ファイルを分割ウィンドウで開く（`s`：垂直分割、`i`：水平分割）
4. ファイルの作成・削除・リネーム（`m`キーでメニュー表示）
5. 隠しファイルの表示切替（`I`キー）
6. ブックマーク操作（`B`キーでブックマーク表示）
7. ルートディレクトリの変更（`C`キー）

**画面遷移**：
- エディタ画面 -> `SPC f t` -> NERDTree画面（サイドバー）
- NERDTree画面 -> ファイル選択 -> エディタ画面（選択ファイル）
- NERDTree画面 -> `q` -> エディタ画面（NERDTree閉じる）

**権限による表示制御**：特になし。ファイルシステムのパーミッションに依存する。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 36 | NERDTree連携 | 主機能 | ツリー形式のファイルマネージャ表示、ディレクトリ構造のサイドバー表示 |
| 15 | ファイル操作(SPC f) | 補助機能 | SPC f tでNERDTreeトグル、SPC f dでカレントファイル位置表示 |
| 37 | devicons連携 | 補助機能 | ファイルツリーへのアイコン表示 |

## 画面種別

サイドバー / ツリービュー

## URL/ルーティング

- トグルコマンド: `:NERDTreeToggle`
- 検索コマンド: `:NERDTreeFind`
- キーバインド: `SPC f t`（トグル）、`SPC f d`（カレントファイル位置）、`F4`（トグル）

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|---------|------|
| g:NERDTreeMinimalUI | 入力（設定） | Number | 最小UIモード有効化（1） |
| g:NERDTreeDirArrows | 入力（設定） | Number | ディレクトリ矢印アイコン有効化（1） |
| g:NERDTreeShowHidden | 入力（設定） | Number | 隠しファイル表示（1） |
| g:NERDTreeAutoDeleteBuffer | 入力（設定） | Number | ファイル削除時にバッファも削除（1） |
| g:NERDTreeIgnore | 入力（設定） | List | 無視するファイルパターン |
| g:NERDTreeDirArrowExpandable | 入力（設定） | String | 展開可能ディレクトリの矢印 |
| g:NERDTreeDirArrowCollapsible | 入力（設定） | String | 折りたたみ可能ディレクトリの矢印 |
| 選択ファイルパス | 出力 | String | 選択されたファイルの絶対パス |

## 表示項目

| 項目 | 表示内容 | 説明 |
|-----|---------|------|
| ディレクトリ矢印 | 展開/折りたたみアイコン | Nerd Fonts有効時は専用アイコン |
| ディレクトリ名 | ディレクトリ名 | 階層的にインデント表示 |
| ファイル名 | ファイル名 | devicons有効時はファイルタイプアイコン付き |
| Gitステータス | Git変更状態 | 変更/ステージ/未追跡等のインジケータ |

## イベント仕様

### 1-NERDTreeToggle

`SPC f t`または`F4`押下時、NERDTreeサイドバーの表示/非表示を切り替える。

### 2-NERDTreeFind

`SPC f d`押下時、現在編集中のファイルの位置でNERDTreeを開き、該当ファイルにカーソルを移動する。

### 3-ファイル選択

NERDTree内でファイルを選択（`Enter`）すると、選択されたファイルがバッファに読み込まれ、エディタ画面に表示される。

### 4-分割ウィンドウでファイルを開く

`s`キーで垂直分割、`i`キーで水平分割でファイルを開く。

### 5-ファイル操作メニュー

`m`キーでファイル操作メニューを表示。作成、削除、リネーム、コピー等の操作が可能。

## データベース更新仕様

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

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

### テーブル別更新項目詳細

該当なし

## メッセージ仕様

| 種別 | メッセージ | 表示条件 |
|------|----------|---------|
| 情報 | ファイル操作メニュー | `m`キー押下時 |
| エラー | ファイル削除確認 | ファイル削除操作時 |
| 情報 | ブックマーク一覧 | `B`キー押下時 |

## 例外処理

| 状態 | 処理 |
|------|------|
| ディレクトリ読み取り権限なし | エラーメッセージ表示 |
| ファイル操作権限なし | 操作失敗のエラーメッセージ表示 |
| coc-explorer有効時 | NERDTreeの代わりにcoc-explorerを使用 |

## 備考

- NERDTreeプラグインは`scrooloose/nerdtree`により提供される
- coc-explorerがインストールされている場合は、NERDTreeの代わりにcoc-explorerが使用される
- `g:spacevim_nerd_fonts`が有効な場合、vim-deviconsによるファイルタイプアイコンが表示される
- nerdtree-git-pluginによりGitステータスインジケータが表示される
- 遅延読み込み（on-demand loading）が有効

---

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

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

### 推奨読解順序

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

NERDTreeの設定データ構造と初期化設定を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | nerdtree.vim | `core/autoload/spacevim/autocmd/nerdtree.vim` | NERDTreeの設定変数と初期化処理を確認 |

**読解のコツ**: `s:ignore`リストが無視パターン、`s:IndicatorMapCustom`がGitステータスインジケータ、`s:colors`がシンタックスハイライト用カラー定義である。

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

プラグインのロードとキーマッピングの設定を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+tools/file-manager/packages.vim` | プラグイン登録と条件分岐を確認 |
| 2-2 | config.vim | `layers/+tools/file-manager/config.vim` | キーマッピング設定とcoc-explorer分岐を確認 |

**主要処理フロー**:
1. **packages.vim 3-8行目**: coc-explorerの有無によるプラグイン選択分岐
2. **packages.vim 7行目**: NERDTreeプラグインの遅延読み込み登録
3. **packages.vim 8行目**: `User nerdtree`イベントで初期化関数を登録
4. **config.vim 3-28行目**: coc-explorerとNERDTreeのキーマッピング分岐

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

NERDTreeの初期化処理で設定がどのように適用されるかを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | nerdtree.vim | `core/autoload/spacevim/autocmd/nerdtree.vim` | `spacevim#autocmd#nerdtree#Init()`関数の処理内容 |

**主要処理フロー**:
- **62-65行目**: 基本設定（MinimalUI、DirArrows、ShowHidden、AutoDeleteBuffer）
- **69-83行目**: ディレクトリ矢印アイコンの設定（Nerd Fonts対応）
- **85行目**: 無視パターンの設定
- **89行目**: Gitステータスインジケータの設定
- **98-99行目**: シンタックスハイライトカラーの設定

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

```
<Leader>ft (nnoremap) または F4
    │
    ├─ [coc-explorer有効時]
    │      │
    │      └─ s:CocExplorerToggle()
    │             │
    │             └─ CocCommand explorer --toggle
    │
    └─ [NERDTree使用時]
           │
           └─ :NERDTreeToggle コマンド
                  │
                  ├─ NERDTreeプラグインロード（初回のみ）
                  │       │
                  │       └─ User nerdtree (autocmd)
                  │              │
                  │              └─ spacevim#autocmd#nerdtree#Init()
                  │                     │
                  │                     ├─ g:NERDTreeMinimalUI = 1
                  │                     ├─ g:NERDTreeDirArrows = 1
                  │                     ├─ g:NERDTreeShowHidden = 1
                  │                     ├─ g:NERDTreeIgnore 設定
                  │                     └─ g:NERDTreeIndicatorMapCustom 設定
                  │
                  └─ NERDTreeサイドバー表示
```

### データフロー図

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

SPC f t / F4 ─────────▶ config.vim ───────────────▶ トグルコマンド
キー押下                  (キーマッピング)

coc-explorer確認 ─────▶ packages.vim ─────────────▶ プラグイン選択
                        (条件分岐)

User nerdtree ────────▶ nerdtree#Init() ──────────▶ 設定適用
イベント                  (初期化処理)

ファイルシステム ─────▶ NERDTree ─────────────────▶ ツリー表示
                        (ディレクトリ解析)

ファイル選択 ─────────▶ NERDTree ─────────────────▶ バッファオープン
                        (選択処理)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+tools/file-manager/packages.vim` | ソース | プラグイン登録・条件分岐 |
| config.vim | `layers/+tools/file-manager/config.vim` | ソース | キーマッピング設定 |
| nerdtree.vim | `core/autoload/spacevim/autocmd/nerdtree.vim` | ソース | 初期化処理・設定適用 |
| nerdtree | 外部プラグイン（scrooloose/nerdtree） | プラグイン | NERDTree本体機能 |
| nerdtree-git-plugin | 外部プラグイン（Xuyuanp/nerdtree-git-plugin） | プラグイン | Gitステータス表示 |
| vim-devicons | 外部プラグイン（ryanoasis/vim-devicons） | プラグイン | ファイルアイコン表示 |
