# 機能設計書 89-設定管理

## 概要

本ドキュメントは、Nushellの設定管理機能の設計について記述する。この機能は、シェルの動作を制御する各種設定項目を管理し、config.nuおよびenv.nuファイルを通じてユーザーカスタマイズを可能にする。

### 本機能の処理概要

設定管理機能は、Config構造体を中心として、テーブル表示設定、補完設定、履歴設定、フック設定、プラグイン設定など、Nushellのあらゆる動作を制御する設定項目を一元管理する。設定はconfig.nuファイルで定義され、起動時に読み込まれてEngineStateに保持される。config/config flatten/config nu/config env/config resetなどのコマンドで設定の参照・編集・リセットが可能。

**業務上の目的・背景**：シェルの動作は多岐にわたり、ユーザーの好みや環境に応じたカスタマイズが重要である。設定管理機能は、テーブル表示形式、エディタ選択、色テーマ、キーバインディングなど、シェル体験のあらゆる側面をユーザーが制御できるようにする。

**機能の利用シーン**：起動時の設定読み込み、`config nu`でのconfig.nu編集、`config flatten`での設定確認、`config reset`でのデフォルト復元など。

**主要な処理内容**：
1. 設定ファイル（config.nu, env.nu）の読み込み
2. Config構造体へのパース・バリデーション
3. 設定の動的更新（$envへの設定変更時）
4. エディタでの設定ファイル編集
5. 設定のフラット化表示
6. デフォルト設定へのリセット

**関連システム・外部連携**：外部エディタ（vim, nano等）、ファイルシステム

**権限による制御**：なし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | メインREPL | 補助機能 | config.nu/env.nuによるシェル設定管理（$config変数） |

## 機能種別

設定管理 / ファイル操作

## 入力仕様

### 入力パラメータ

#### config コマンド（メタコマンド）

サブコマンドへのルーティングのみ

#### config nu コマンド

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| --default (-d) | Switch | No | 内部デフォルトconfig.nuを表示 | - |
| --doc (-s) | Switch | No | コメント付きドキュメント版を表示 | - |

#### config env コマンド

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| --default (-d) | Switch | No | 内部デフォルトenv.nuを表示 | - |
| --doc (-s) | Switch | No | コメント付きドキュメント版を表示 | - |

#### config reset コマンド

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| --nu (-n) | Switch | No | config.nuのみリセット | - |
| --env (-e) | Switch | No | env.nuのみリセット | - |
| --without-backup (-w) | Switch | No | バックアップを作成しない | - |

### 入力データソース

- ~/.config/nushell/config.nu（メイン設定ファイル）
- ~/.config/nushell/env.nu（環境設定ファイル）
- $env.config（実行時設定レコード）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| filesize | FilesizeConfig | ファイルサイズ表示設定 |
| table | TableConfig | テーブル表示設定 |
| ls | LsConfig | ls コマンド設定 |
| color_config | HashMap<String, Value> | 色テーマ設定 |
| footer_mode | FooterMode | フッター表示モード |
| completions | CompletionConfig | 補完設定 |
| edit_mode | EditBindings | エディトモード（Emacs/Vi） |
| history | HistoryConfig | 履歴設定 |
| keybindings | Vec<ParsedKeybinding> | キーバインディング |
| menus | Vec<ParsedMenu> | メニュー設定 |
| hooks | Hooks | フック設定 |
| shell_integration | ShellIntegrationConfig | シェル統合設定 |
| plugins | HashMap<String, Value> | プラグイン設定 |
| plugin_gc | PluginGcConfigs | プラグインGC設定 |

### 出力先

- EngineState（実行時）
- 標準出力（config flatten時）

## 処理フロー

### 処理シーケンス

```
1. 設定ファイル読み込み（起動時）
   └─ eval_config_contents()でconfig.nuを評価
2. Config構造体への変換
   └─ update_from_value()でレコードをパース
3. バリデーション
   └─ 各フィールドの型・値を検証
4. EngineStateへの保存
   └─ engine_state.set_config()
5. 実行時参照
   └─ stack.get_config()で取得
```

### フローチャート

```mermaid
flowchart TD
    A[起動] --> B[env.nu読み込み]
    B --> C[config.nu読み込み]
    C --> D[eval_source実行]
    D --> E{$env.config設定?}
    E -->|Yes| F[update_from_value]
    F --> G{バリデーション}
    G -->|OK| H[Config更新]
    G -->|Error| I[エラー収集]
    I --> H
    H --> J[EngineStateに保存]
    E -->|No| J
    J --> K[REPL開始]

    L[config nuコマンド] --> M{フラグ}
    M -->|--default| N[デフォルト表示]
    M -->|--doc| O[ドキュメント表示]
    M -->|なし| P[エディタ起動]
    P --> Q[start_editor]
    Q --> R[外部エディタでconfig.nu編集]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-89-01 | 設定ファイルパス | ~/.config/nushell/config.nu | デフォルト |
| BR-89-02 | エラー処理 | 設定エラーは警告として表示し、残りの設定は継続処理 | 常時 |
| BR-89-03 | デフォルト値 | 未設定項目はConfig::default()の値を使用 | 常時 |
| BR-89-04 | バックアップ | config reset時は日時付きでバックアップ作成 | --without-backup未指定時 |
| BR-89-05 | エディタ選択 | $env.EDITOR, $env.VISUAL, config.buffer_editorの順で決定 | config nu/env時 |

### 計算ロジック

**バックアップファイル名**: `oldconfig-{yyyy-MM-dd-HH-mm-ss}.nu`

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConfigDirNotFound | 設定エラー | 設定ディレクトリが見つからない | エラー表示 |
| TypeMismatch | 設定エラー | 設定値の型が不正 | 該当フィールドをスキップ、警告表示 |
| InvalidValue | 設定エラー | 設定値が範囲外 | 該当フィールドをスキップ、警告表示 |
| UnknownOption | 設定エラー | 未知の設定項目 | 警告表示 |
| ExternalCommand | 実行エラー | エディタが見つからない | エラー表示 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 設定ファイル読み込みは起動時のみ
- 設定参照は即座に完了

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

- 設定ファイルは適切なパーミッションで保護
- 外部エディタ実行時の環境変数を制御

## 備考

- --defaultと--docは排他的オプション
- config flattenはデバッグカテゴリ

---

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

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

### 推奨読解順序

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

設定で使用する主要な構造体を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | mod.rs | `crates/nu-protocol/src/config/mod.rs` | Config構造体 |

**読解のコツ**:
- **47-87行目**: Config構造体の全フィールド定義
- **89-144行目**: Default実装（各フィールドのデフォルト値）
- **146-241行目**: UpdateFromValue実装（設定レコードからの更新）

#### Step 2: 設定コマンドを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config_.rs | `crates/nu-command/src/env/config/config_.rs` | メインコマンド |
| 2-2 | config_nu.rs | `crates/nu-command/src/env/config/config_nu.rs` | config nu |
| 2-3 | config_env.rs | `crates/nu-command/src/env/config/config_env.rs` | config env |

**主要処理フロー**:
1. **config_.rs 61-142行目**: start_editor関数（エディタ起動処理）
2. **config_.rs 144-172行目**: handle_call関数（--default/--docフラグ処理）
3. **config_nu.rs 52-60行目**: config nu run実装

#### Step 3: 設定リセットを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config_reset.rs | `crates/nu-command/src/env/config/config_reset.rs` | リセット処理 |

**主要処理フロー**:
- **36-109行目**: run関数全体
- **50-79行目**: config.nuリセット処理
- **81-108行目**: env.nuリセット処理

#### Step 4: 設定ファイル読み込みを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config_files.rs | `crates/nu-cli/src/config_files.rs` | 設定ファイル処理 |

**主要処理フロー**:
- **202-238行目**: eval_config_contents関数

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

```
起動処理
    │
    ├─ eval_config_contents(env.nu)
    │      │
    │      └─ eval_source()
    │
    └─ eval_config_contents(config.nu)
           │
           └─ eval_source()
                  │
                  └─ Config::update_from_value()
                         │
                         └─ UpdateFromValue::update()

config コマンド群
    │
    ├─ config nu
    │      │
    │      └─ handle_call()
    │             │
    │             ├─ start_editor() [フラグなし]
    │             │      │
    │             │      └─ ForegroundChild::spawn()
    │             │
    │             └─ kind.default()/kind.doc() [フラグあり]
    │
    ├─ config env
    │      └─ [同上]
    │
    ├─ config flatten
    │      │
    │      └─ serde_json::to_value()
    │             │
    │             └─ JsonFlattener::flatten()
    │
    └─ config reset
           │
           └─ std::fs::rename() + std::fs::File::create()
```

### データフロー図

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

config.nu ───▶ eval_source ───▶ $env.config ───▶ Config構造体
  ファイル        評価           レコード          EngineState

config nu ───▶ handle_call ───▶ start_editor ───▶ エディタ起動
  コマンド        処理             外部実行         vim/nano

config flatten ───▶ serialize ───▶ flatten ───▶ テーブル出力
  コマンド           JSON化          平坦化      key.sub.field
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| mod.rs | `crates/nu-protocol/src/config/mod.rs` | ソース | Config構造体定義 |
| config_.rs | `crates/nu-command/src/env/config/config_.rs` | ソース | configメインコマンド |
| config_nu.rs | `crates/nu-command/src/env/config/config_nu.rs` | ソース | config nuコマンド |
| config_env.rs | `crates/nu-command/src/env/config/config_env.rs` | ソース | config envコマンド |
| config_reset.rs | `crates/nu-command/src/env/config/config_reset.rs` | ソース | config resetコマンド |
| config_flatten.rs | `crates/nu-command/src/env/config/config_flatten.rs` | ソース | config flattenコマンド |
| config_files.rs | `crates/nu-cli/src/config_files.rs` | ソース | 設定ファイル読み込み |
| history.rs | `crates/nu-protocol/src/config/history.rs` | ソース | HistoryConfig定義 |
| completions.rs | `crates/nu-protocol/src/config/completions.rs` | ソース | CompletionConfig定義 |
| table.rs | `crates/nu-protocol/src/config/table.rs` | ソース | TableConfig定義 |
| hooks.rs | `crates/nu-protocol/src/config/hooks.rs` | ソース | Hooks定義 |
