# 画面設計書 26-Unicode

## 概要

本ドキュメントは、Doom EmacsのUnicode機能の画面設計について記述します。Unicodeは、非英語のUnicode文字を適切に表示するためのフォント設定とグリフカバレッジを拡張する機能を提供します。

### 本画面の処理概要

Unicodeは、unicode-fontsパッケージを使用して、Emacsのデフォルトフォントセットを拡張し、可能な限り多くのUnicodeグリフをカバーするように設定します。利用可能なすべてのフォントをスキャンし、各Unicode範囲に最適なフォントを自動的に選択します。

**業務上の目的・背景**：非英語圏のユーザーや、多言語のテキストを扱うユーザーにとって、Emacsの標準設定では一部のUnicode文字が正しく表示されない問題があります。このモジュールは、システムにインストールされているすべてのフォントを分析し、各Unicodeブロック（アラビア文字、中国語、絵文字等）に対して最適なフォントを自動的に割り当てることで、この問題を解決します。

**画面へのアクセス方法**：Unicodeは自動的に動作するため、明示的な画面アクセスは不要です。フォント設定後に自動的に有効化され、すべてのバッファでUnicode文字が適切に表示されるようになります。

**主要な操作・処理内容**：
1. フォント設定変更時に `after-setting-font-hook` が発火
2. `+unicode-init-fonts-h` が呼び出される
3. GUIフレームの場合、`+unicode-setup-fonts-h` を実行
4. `unicode-fonts` パッケージを読み込み
5. `doom-symbol-font` が設定されている場合、優先フォントとして登録
6. `unicode-fonts-setup` を実行してフォントセットを構築
7. キャッシュが生成され、次回起動時は高速に読み込み

**画面遷移**：Unicodeは独立した画面ではなく、フォント表示設定を制御する機能です。他の画面への遷移機能はありません。

**権限による表示制御**：権限による制御はありません。すべてのユーザーに同一のフォント設定が適用されます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 38 | Unicode文字サポート | 主機能 | Unicode文字の表示サポート |

## 画面種別

フォント設定（システム設定）

## URL/ルーティング

N/A（Emacsバッファ上で動作するため、URLの概念なし）

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|----------|------|
| doom-symbol-font | 入力 | font-spec | シンボル表示用優先フォント |
| unicode-fonts-block-font-mapping | 入力/出力 | alist | Unicodeブロックとフォントの対応 |
| font-utils-use-memory-cache | 入力 | boolean | フォントユーティリティのキャッシュ設定 |

## 表示項目

| 項目 | 説明 |
|------|------|
| Unicode文字 | システムフォントを使用して適切に表示 |
| シンボル文字 | doom-symbol-fontを優先使用 |

## イベント仕様

### 1-フォント設定変更時の初期化

フォント設定が変更されると自動的にUnicodeフォント設定が更新されます。

**処理フロー**：
1. `after-setting-font-hook` が発火
2. `+unicode-init-fonts-h` が呼び出される
3. `bidi-display-reordering` を有効化（双方向テキストサポート）
4. 現在のフレームで `+unicode-setup-fonts-h` を実行

### 2-フォントセットアップ

GUIフレームでunicode-fontsを初期化します。

**処理フロー**：
1. `display-multi-font-p` でGUIフレームか確認
2. `unicode-fonts` パッケージを読み込み
3. `doom-symbol-font` が設定されている場合
   - フォントファミリーを取得
   - すべてのUnicodeブロックの優先フォントリストに追加
4. `unicode-fonts-setup` を実行
5. フォントセットが構築され、キャッシュに保存

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

N/A（データベースを使用しない、ただしキャッシュファイルを生成）

## メッセージ仕様

N/A（通常のメッセージ表示なし）

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| TTYモード | フォント設定をスキップ |
| デーモンモード | フレーム作成時に遅延実行 |
| キャッシュエラー | キャッシュを削除して再生成を推奨 |

## 備考

- 初回起動時はUnicodeキャッシュ生成に時間がかかる
- フォント設定変更やパッケージ更新時にキャッシュが再生成される
- キャッシュは `$EMACSDIR/.local/cache/pcache/unicode-fonts` に保存
- `doom-symbol-font` を設定すると、そのフォントが優先的に使用される
- `:ui ligatures` モジュールと併用時は、ligaturesが `doom-symbol-font` を上書きする可能性あり

---

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

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

### 推奨読解順序

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

unicode-fontsパッケージの設定変数が中心です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | autoload.el | `modules/ui/unicode/autoload.el` | `font-utils-use-memory-cache` 変数の宣言（行13） |

**読解のコツ**: unicode-fontsパッケージは外部パッケージであり、`unicode-fonts-block-font-mapping` がUnicodeブロックとフォントの対応を管理します。

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

after-setting-font-hookがエントリーポイントです。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | autoload.el | `modules/ui/unicode/autoload.el` | `+unicode-init-fonts-h` 関数（行4-9） |

**主要処理フロー**:
1. **行4-5**: `after-setting-font-hook` に `:depth -90` で早期登録
2. **行7**: `bidi-display-reordering` を有効化
3. **行8**: `+unicode-setup-fonts-h` を現在のフレームで呼び出し

#### Step 3: フォントセットアップ関数を理解する

実際のフォント設定処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | autoload.el | `modules/ui/unicode/autoload.el` | `+unicode-setup-fonts-h` 関数（行16-35） |

**主要処理フロー**:
- **行20**: GUIフレームチェック（`display-multi-font-p`）
- **行22**: `unicode-fonts` パッケージの読み込み
- **行23-26**: `doom-symbol-font` が設定されている場合、優先フォントとして各ブロックに追加
- **行27-34**: `unicode-fonts-setup` を実行

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

```
フォント設定変更
    │
    └─ after-setting-font-hook ─────▶ +unicode-init-fonts-h
                                              │
                                              ├─ bidi-display-reordering 有効化
                                              │
                                              └─ +unicode-setup-fonts-h
                                                         │
                                    ┌──────────────────┤
                                    │                  │
                                    ▼                  ▼
                            GUIフレームか?        TTYフレーム
                                    │              (処理なし)
                                    │
                                    ▼
                           require 'unicode-fonts
                                    │
                                    ├─ doom-symbol-font 設定あり?
                                    │         │
                                    │         ▼
                                    │   unicode-fonts-block-font-mapping
                                    │   に優先フォント追加
                                    │
                                    ▼
                           unicode-fonts-setup
                                    │
                                    ▼
                           フォントセット構築完了
                                    │
                                    ▼
                              キャッシュ保存
```

### データフロー図

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

doom-symbol-font ───▶ font-face-attributes ───▶ フォントファミリー名
                              │
                              ▼
unicode-fonts-block-font-mapping ───▶ 優先フォント追加 ───▶ 更新されたマッピング
       │
       └─ (("Arabic" ("Courier New" ...))
           ("Greek" ("DejaVu Sans" ...))
           ...)

font-family-list ───▶ unicode-fonts-setup ───▶ fontset-default 設定
                              │
                              ▼
                      キャッシュファイル生成
                      ($EMACSDIR/.local/cache/pcache/unicode-fonts)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| autoload.el | `modules/ui/unicode/autoload.el` | ソース | フォント初期化処理 |
| packages.el | `modules/ui/unicode/packages.el` | 設定 | unicode-fontsパッケージの依存定義 |
| README.org | `modules/ui/unicode/README.org` | ドキュメント | モジュール説明書、設定例、トラブルシューティング |
| .doommodule | `modules/ui/unicode/.doommodule` | 設定 | Doomモジュールメタデータ |
