# 機能設計書 51-設定表示

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータの設定表示機能(`+show-config`コマンド)の設計仕様を記載する。

### 本機能の処理概要

設定表示機能は、現在のGhostty設定を標準出力に表示するCLIコマンドである。ユーザーが設定内容を確認したり、設定ファイルのテンプレートを生成したりする際に使用される。

**業務上の目的・背景**：ターミナルエミュレータの設定は多岐にわたり、ユーザーが現在有効な設定を把握することは重要である。本機能により、ユーザーは現在の設定状態を確認でき、デバッグや設定の最適化に役立てることができる。また、デフォルト設定と現在の設定の差分を把握することで、カスタマイズ内容を明確化できる。

**機能の利用シーン**：
- 現在の設定内容を確認したい場合
- 設定ファイルのテンプレートを生成したい場合
- デフォルト設定からの変更点を把握したい場合
- 設定オプションのドキュメントを参照したい場合

**主要な処理内容**：
1. コマンドライン引数の解析（`--default`、`--changes-only`、`--docs`フラグの処理）
2. 設定のロード（ユーザー設定またはデフォルト設定）
3. FileFormatterによる設定のフォーマット処理
4. 標準出力への設定内容の出力

**関連システム・外部連携**：設定ファイルシステム(`~/.config/ghostty/config`等)との連携

**権限による制御**：特になし。全ユーザーが実行可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | CLI | 主機能 | コマンドライン実行による設定出力 |

## 機能種別

CLI操作 / 情報表示

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| --default | bool | No | trueの場合、ユーザー設定をロードせずデフォルト設定のみ表示 | - |
| --changes-only | bool | No | デフォルトから変更されたオプションのみ表示（デフォルト: true）。--defaultが指定された場合は無効 | - |
| --docs | bool | No | 各オプションの上にコメントとしてドキュメントを表示 | - |

### 入力データソース

- コマンドライン引数
- 設定ファイル（`~/.config/ghostty/config`等）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 設定内容 | テキスト | Ghostty設定ファイル形式の設定内容 |

### 出力先

標準出力（stdout）

## 処理フロー

### 処理シーケンス

```
1. コマンドライン引数の解析
   └─ Options構造体にフラグ値を設定
2. 設定のロード
   └─ --defaultフラグに応じてConfig.default()またはConfig.load()を呼び出し
3. FileFormatterの構築
   └─ アロケータ、設定、changed、docsフラグを設定
4. 設定のフォーマットと出力
   └─ stdout_writerを通じて設定を出力
5. 正常終了（リターンコード0）
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[引数解析]
    B --> C{--default?}
    C -->|Yes| D[Config.default]
    C -->|No| E[Config.load]
    D --> F[FileFormatter構築]
    E --> F
    F --> G{--docs?}
    G -->|Yes| H[ドキュメント付きでフォーマット]
    G -->|No| I[設定値のみフォーマット]
    H --> J[stdout出力]
    I --> J
    J --> K[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-51-1 | 変更フィルタリング | changes-only=trueの場合、デフォルトと異なる設定のみ出力 | --defaultが指定されていない場合 |
| BR-51-2 | ドキュメント出力 | docs=trueの場合、各設定項目の上にヘルプ文字列をコメントとして出力 | --docsフラグ指定時 |
| BR-51-3 | 出力順序 | 出力順序は一定だが、入力設定ファイルの順序とは一致しない場合がある | 常時 |

### 計算ロジック

特になし

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

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

データベース操作なし（読み取り専用のCLIコマンド）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 設定ロードエラー | 設定ファイルの読み込みに失敗した場合 | エラーメッセージを出力し終了 |
| - | 引数解析エラー | 無効なコマンドライン引数が指定された場合 | ヘルプを表示 |

### リトライ仕様

リトライなし

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

該当なし

## パフォーマンス要件

即座にレスポンスが返ること（通常1秒未満）

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

設定ファイルには機密情報が含まれる可能性があるため、出力内容の取り扱いに注意が必要

## 備考

- 新規ユーザー向けに全オプションとドキュメントを確認する場合: `ghostty +show-config --default --docs`
- 出力は入力設定ファイルと完全に一致しないが、動作は同一となる

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | show_config.zig | `src/cli/show_config.zig` | Options構造体（8-29行目）でCLIオプションを定義 |
| 1-2 | formatter.zig | `src/config/formatter.zig` | FileFormatter構造体（131-186行目）で設定フォーマットを定義 |

**読解のコツ**: Zigの構造体はdefault値を持てるため、Options構造体のフィールド定義でデフォルト動作を把握できる。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | show_config.zig | `src/cli/show_config.zig` | run関数（58-86行目）がエントリーポイント |

**主要処理フロー**:
1. **59-66行目**: コマンドライン引数の解析
2. **68行目**: 設定のロード（--defaultフラグに応じて分岐）
3. **71-76行目**: FileFormatterの構築
4. **80-84行目**: 標準出力への書き込み

#### Step 3: 設定フォーマット処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | formatter.zig | `src/config/formatter.zig` | format関数（142-185行目）で設定をフォーマット |
| 3-2 | formatter.zig | `src/config/formatter.zig` | formatEntry関数（36-126行目）で各型をフォーマット |

**主要処理フロー**:
- **150-154行目**: changedフラグが有効な場合、デフォルト設定をロードして比較
- **156-184行目**: 各設定フィールドをインラインforでイテレート
- **166-173行目**: docsフラグが有効な場合、help_stringsからドキュメントを取得してコメント出力

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

```
ghostty +show-config
    │
    └─ show_config.run()
           │
           ├─ args.parse() ─ オプション解析
           │
           ├─ Config.default() または Config.load()
           │      └─ 設定ファイル読み込み
           │
           └─ FileFormatter.format()
                  │
                  ├─ Config.default() ─ 比較用デフォルト設定
                  │
                  └─ formatEntry() ─ 各設定項目をフォーマット
```

### データフロー図

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

コマンドライン ───▶ args.parse() ───────▶ Options
引数

設定ファイル ───▶ Config.load() ─────▶ Config
                         │
                         ▼
                  FileFormatter.format()
                         │
                         ▼
                  stdout.writer() ────▶ 標準出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| show_config.zig | `src/cli/show_config.zig` | ソース | メインエントリーポイント |
| formatter.zig | `src/config/formatter.zig` | ソース | 設定フォーマット処理 |
| Config.zig | `src/config/Config.zig` | ソース | 設定データ構造 |
| args.zig | `src/cli/args.zig` | ソース | コマンドライン引数解析 |
| help_strings | `help_strings` | 生成ファイル | 設定オプションのドキュメント |
