# 機能設計書 4-UI設定

## 概要

本ドキュメントは、Doom EmacsのUI（ユーザーインターフェース）設定システム（doom-ui.el）の機能設計を記述する。このシステムは、テーマ、フォント、カーソル、ウィンドウ、ミニバッファ、行番号表示など、Emacsの視覚的な側面をすべて制御する。

### 本機能の処理概要

**業務上の目的・背景**：Doom Emacsは、モダンで視覚的に美しいエディタ体験を提供することを目指している。UI設定システムは、デフォルトで美しく使いやすい設定を提供しつつ、ユーザーがカスタマイズできる柔軟性も確保する。

**機能の利用シーン**：
- Emacsの起動時にテーマとフォントを自動適用
- ウィンドウ・バッファの切り替え時にフックを実行
- ユーザーによるテーマ・フォント設定のカスタマイズ
- 行番号、カーソル、スクロールなどの表示設定

**主要な処理内容**：
1. テーマ管理（doom-theme変数、doom-load-theme-hook）
2. フォント管理（doom-font、doom-variable-pitch-font等）
3. カスタムフック（doom-switch-buffer-hook、doom-switch-window-hook等）
4. スクロール・カーソル設定
5. ウィンドウ・フレーム設定
6. ミニバッファ設定
7. 行番号表示設定
8. ビルトインパッケージ設定（hl-line、paren、winner等）

**関連システム・外部連携**：doom.el（コアシステム）、各種テーマパッケージ、nerd-icons

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 23 | Ophints | 主機能 | 操作対象リージョンのハイライト表示 |

## 機能種別

UI設定 / 表示制御 / テーマ管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| doom-theme | symbol/list | No | 適用するテーマ | custom-theme-p |
| doom-font | font-spec | No | デフォルトフォント | フォント存在確認 |
| doom-variable-pitch-font | font-spec | No | 可変幅フォント | フォント存在確認 |
| doom-serif-font | font-spec | No | セリフフォント | フォント存在確認 |
| doom-symbol-font | font-spec | No | シンボルフォント | フォント存在確認 |
| doom-emoji-font | font-spec | No | 絵文字フォント | フォント存在確認 |

### 入力データソース

- ユーザー設定ファイル（$DOOMDIR/config.el）
- システムフォント一覧
- テーマファイル（$DOOMDIR/themes/）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| フレーム表示 | visual | テーマ・フォントが適用されたUI |
| doom-init-ui-hook | hook | UI初期化完了時に実行 |
| doom-load-theme-hook | hook | テーマ読み込み時に実行 |

### 出力先

Emacsフレーム（GUI/TTY）

## 処理フロー

### 処理シーケンス

```
1. doom-init-fonts-h（フォント初期化）
   └─ doom-font、doom-serif-font等を各faceに適用
   └─ シンボル・絵文字フォントのフォールバック設定
2. doom-init-theme-h（テーマ初期化）
   └─ doom-themeの読み込み・有効化
3. doom-init-ui-h（UI初期化）
   └─ doom-init-ui-hookの実行
   └─ スイッチフックの登録
   └─ fallbackバッファ保護の設定
```

### フローチャート

```mermaid
flowchart TD
    A[Emacs起動] --> B{daemon?}
    B -->|Yes| C[server-after-make-frame-hook登録]
    B -->|No| D[after-init-hook登録]
    C --> E[doom-init-fonts-h]
    D --> E
    E --> F{doom-font設定あり?}
    F -->|Yes| G[フォント適用]
    F -->|No| H[デフォルトフォント使用]
    G --> I[doom-init-theme-h]
    H --> I
    I --> J{doom-theme設定あり?}
    J -->|Yes| K[テーマ読み込み]
    J -->|No| L[テーマなし]
    K --> M[doom-load-theme-hook実行]
    L --> N[doom-init-ui-h]
    M --> N
    N --> O[スイッチフック登録]
    O --> P[UI初期化完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | テーマ優先順位 | $DOOMDIR/themesが最優先 | 常時 |
| BR-02 | フレームフォーカスデバウンス | 2秒以内の再フォーカスは無視 | doom-switch-frame-hook |
| BR-03 | スクラッチバッファ保護 | fallbackバッファは削除不可 | kill-buffer時 |
| BR-04 | 行番号表示対象 | prog-mode、text-mode、conf-mode | 常時 |
| BR-05 | customizeの無効化 | customize系コマンドを無効化 | 常時 |

### 計算ロジック

フレームフォーカスデバウンス:
```elisp
(when (> (float-time (time-subtract (current-time) last-update))
         doom-switch-frame-hook-debounce-delay)
  (run-hooks 'doom-switch-frame-hook))
```

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| doom-font-error | フォントエラー | 指定フォントが見つからない | フォント設定を確認 |

### リトライ仕様

フォントエラー発生時はエラーを通知し、デフォルトフォントで継続。

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

該当なし

## パフォーマンス要件

- blink-cursor-modeの無効化（CPU負荷軽減）
- scroll-conservatively=10（再中央配置の削減）
- gc-cons-thresholdの一時的な増加（フック実行時）

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

特になし

## 備考

- customizeコマンドは意図的に無効化されている
- ユーザーは$DOOMDIR/config.elで設定を行う

---

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

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

### 推奨読解順序

#### Step 1: 変数定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | doom-ui.el | `lisp/doom-ui.el` | 8-75行目のフォント・テーマ変数 |

**主要変数**:
- **8-15行目**: `doom-theme` - テーマ設定
- **17-26行目**: `doom-font` - デフォルトフォント
- **28-33行目**: `doom-variable-pitch-font` - 可変幅フォント
- **35-40行目**: `doom-serif-font` - セリフフォント
- **42-48行目**: `doom-symbol-font` - シンボルフォント
- **52-58行目**: `doom-emoji-font` - 絵文字フォント

#### Step 2: カスタムフックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | doom-ui.el | `lisp/doom-ui.el` | 80-154行目のフック定義 |

**主要フック**:
- **80-81行目**: `doom-init-ui-hook` - UI初期化完了時
- **83-88行目**: `doom-load-theme-hook` - テーマ読み込み時
- **90-91行目**: `doom-switch-buffer-hook` - バッファ切り替え時
- **93-94行目**: `doom-switch-window-hook` - ウィンドウ切り替え時
- **96-103行目**: `doom-switch-frame-hook` - フレーム切り替え時

#### Step 3: フォント初期化を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | doom-ui.el | `lisp/doom-ui.el` | 580-641行目のdoom-init-fonts-h |

**処理フロー**:
1. **582-617行目**: 各フェイスにフォントを適用
2. **620-641行目**: シンボル・絵文字フォントのフォールバック設定
3. **638-639行目**: Nerd Fontsのプライベート領域設定

#### Step 4: テーマ初期化を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | doom-ui.el | `lisp/doom-ui.el` | 643-700行目のテーマ関連関数 |

**主要関数**:
- **643-649行目**: `doom-init-theme-h` - テーマの読み込み・有効化
- **651-659行目**: `doom--detect-colorscheme-a` - カラースキーム検出
- **661-681行目**: `doom--theme-is-colorscheme-p` - カラースキーム判定
- **683-700行目**: `doom-enable-theme-h` - テーマ有効化とフック実行

#### Step 5: UI初期化を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | doom-ui.el | `lisp/doom-ui.el` | 727-744行目のdoom-init-ui-h |

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

```
after-init-hook / server-after-make-frame-hook
    │
    ├─ doom-init-fonts-h
    │       │
    │       ├─ set-face-attribute (各フェイス)
    │       │
    │       └─ set-fontset-font (シンボル・絵文字)
    │
    ├─ doom-init-theme-h
    │       │
    │       ├─ load-theme / enable-theme
    │       │
    │       └─ doom-enable-theme-h
    │               │
    │               └─ doom-load-theme-hook 実行
    │
    └─ doom-init-ui-h (window-setup-hook)
            │
            ├─ doom-init-ui-hook 実行
            │
            ├─ kill-buffer-query-functions 登録
            │
            └─ スイッチフック登録
                    ├─ doom-run-switch-frame-hooks-fn
                    ├─ doom-run-switch-window-hooks-h
                    └─ doom-run-switch-buffer-hooks-h
```

### データフロー図

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

doom-theme ───────────▶ doom-init-theme-h ──────────▶ テーマ適用
                          │
                          └─ load-theme ────────────▶ doom-load-theme-hook

doom-font ────────────▶ doom-init-fonts-h ──────────▶ フェイス設定
doom-serif-font           │
doom-variable-pitch-font  ├─ set-face-attribute
doom-symbol-font          │
doom-emoji-font           └─ set-fontset-font ──────▶ フォントセット

(none) ───────────────▶ doom-init-ui-h ─────────────▶ フック登録
                          │
                          ├─ doom-init-ui-hook ────▶ UI準備完了
                          │
                          └─ スイッチフック登録 ────▶ 動的更新対応
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| doom-ui.el | `lisp/doom-ui.el` | ソース | UI設定本体 |
| doom.el | `lisp/doom.el` | ソース | コアシステム |
| themes/ | `$DOOMDIR/themes/` | ディレクトリ | ユーザーテーマ |
| config.el | `$DOOMDIR/config.el` | 設定 | ユーザー設定 |
