# 機能設計書 32-カスタムモードライン

## 概要

本ドキュメントは、Doom Emacsにおけるカスタムモードライン機能の設計を記載する。この機能は、doom-modelineパッケージまたは軽量版(+light)を使用して、美しく機能的なステータスバーを提供する。

### 本機能の処理概要

**業務上の目的・背景**：Emacsの標準モードラインは情報過多で視認性が低い。Doom Emacsのカスタムモードラインは、必要な情報を洗練されたデザインで表示し、開発者の作業効率を向上させる。バッファ名、カーソル位置、Gitブランチ、構文エラー数など、開発に必要な情報を一目で把握できるようにする。

**機能の利用シーン**：
- ファイル編集時に現在のバッファ状態を確認
- Gitブランチや変更状態の確認
- 構文チェック結果の確認
- 検索マッチ数の表示
- マクロ記録状態の確認

**主要な処理内容**：
1. doom-modelineパッケージの初期化と設定
2. モードライン要素（バー、バッファ名、位置情報、モード表示等）の構成
3. フォントサイズ変更に応じたモードライン高さの動的調整
4. テーマ変更時のバー色更新
5. 検索・置換時のマッチ数表示（anzu統合）
6. Flycheck結果のアイコン表示

**関連システム・外部連携**：
- doom-modelineパッケージ
- anzuパッケージ（検索マッチ数表示）
- evil-anzuパッケージ（Evil統合）
- Flycheckとの連携

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 12 | Modeline | 主機能 | doom-modelineによるステータスバー表示 |

## 機能種別

UI表示 / 状態表示

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| doom-modeline-height | integer | No | モードラインの高さ | 正の整数 |
| doom-modeline-bar-width | integer | No | 左端バーの幅 | 0以上の整数 |

### 入力データソース

- バッファの状態（名前、変更フラグ、読み取り専用等）
- カーソル位置（行、列）
- VCシステムからのブランチ情報
- Flycheckからのエラー/警告カウント
- 検索状態（anzu経由）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| mode-line-format | list | フォーマットされたモードライン表示 |
| +modeline-bar | string | 左端の色付きバー |

### 出力先

フレーム下部のモードライン領域

## 処理フロー

### 処理シーケンス

```
1. Doom初期化後にdoom-modeline-modeを有効化
   └─ doom-after-initフックで起動
2. size-indication-modeとcolumn-number-modeを有効化
   └─ ファイルサイズと列番号表示の有効化
3. テーマ読み込み時にバーを更新
   └─ doom-load-theme-hookでdoom-modeline-refresh-bars呼び出し
4. フォント変更時にモードライン高さを調整
   └─ after-setting-font-hookで+modeline-resize-for-font-h呼び出し
5. Magitバッファでの特別なモードライン処理
   └─ magit-status-modeでは専用モードライン、他は非表示
```

### フローチャート

```mermaid
flowchart TD
    A[Doom起動] --> B[doom-after-init-hook]
    B --> C[doom-modeline-mode有効化]
    C --> D[size-indication-mode有効化]
    C --> E[column-number-mode有効化]
    D --> F[モードライン表示]
    E --> F
    F --> G{テーマ変更?}
    G -->|Yes| H[doom-modeline-refresh-bars]
    G -->|No| I{フォント変更?}
    H --> F
    I -->|Yes| J[+modeline-resize-for-font-h]
    I -->|No| K[表示維持]
    J --> F
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-32-1 | バー幅デフォルト | 左端バーの幅は3ピクセル | 初期設定時 |
| BR-32-2 | エンコーディング表示 | UTF-8以外またはOS標準以外の改行コードの場合のみ表示 | doom-modeline-buffer-encoding = 'nondefault |
| BR-32-3 | EOLデフォルト | WindowsはCRLF(1)、その他はLF(0)をデフォルトとする | doom-modeline-default-eol-type設定 |
| BR-32-4 | Magit特別処理 | magit-status-modeでは専用モードライン、他のmagitバッファでは非表示 | Magitバッファ表示時 |
| BR-32-5 | プロジェクト情報 | projectileのモードライン表示を無効化（独自表示のため） | 常時 |

### 計算ロジック

フォント変更時の高さ計算:
```
new_height = default_height + (scale * doom-font-increment)
```

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

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

該当なし（データベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 変数未定義 | TTY Emacsでmouse-wheel-*-event未定義 | config.elで明示的に定義 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- モードライン更新がバッファ操作を妨げないこと
- バッファID生成のキャッシュによる性能最適化

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

特になし

## 備考

- +lightフラグで軽量版モードラインを使用可能
- doom-modelineパッケージのピン留めバージョン: 0c91e47a0cfe8a56cc09d1da485ea0d19947777c
- anzuパッケージのピン留めバージョン: 21cb5ab2295614372cb9f1a21429381e49a6255f

---

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

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

### 推奨読解順序

#### Step 1: パッケージ定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.el | `modules/ui/modeline/packages.el` | 依存パッケージの定義 |

**読解のコツ**: `modulep!`マクロでフラグの有無を確認。`+light`フラグがない場合にdoom-modelineを使用。

#### Step 2: メイン設定ファイルを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/ui/modeline/config.el` | 標準モードラインの設定 |

**主要処理フロー**:
- **3-4行目**: `+light`フラグ時に軽量版を読み込み
- **7-9行目**: doom-modeline-modeをdoom-after-initフックで有効化
- **10-11行目**: size-indication-modeとcolumn-number-modeを連動起動
- **14-27行目**: doom-modelineの初期設定値
- **34-35行目**: フォント・テーマ変更フックの設定
- **37行目**: ダッシュボードモードでの特別処理
- **38-43行目**: Magitバッファでのモードライン制御

#### Step 3: autoload関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | autoload.el | `modules/ui/modeline/autoload.el` | 自動読み込み関数 |

**主要処理フロー**:
- **5-17行目**: `+modeline-resize-for-font-h`でフォントサイズ変更時の高さ調整
- **20-26行目**: `+modeline-update-env-in-all-windows-h`で全ウィンドウの環境情報更新
- **29-36行目**: `+modeline-clear-env-in-all-windows-h`で環境情報クリア

#### Step 4: 軽量版モードラインを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | +light.el | `modules/ui/modeline/+light.el` | 軽量版モードラインの実装 |

**主要処理フロー**:
- **21-41行目**: カスタム変数定義（高さ、バー幅）
- **53-65行目**: モードラインフェイス定義
- **72-77行目**: アクティブウィンドウ追跡
- **85-110行目**: XPMビットマップ生成（左端バー用）
- **128-139行目**: `set-modeline!`関数でモードラインフォーマット設定
- **151-159行目**: `def-modeline!`マクロでモードライン定義
- **339-347行目**: `+modeline-matches`セグメント（検索マッチ表示）
- **389-396行目**: `+modeline-buffer-identification`セグメント
- **524-538行目**: デフォルトモードライン定義

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

```
doom-after-init-hook
    │
    ├─ doom-modeline-mode
    │      ├─ size-indication-mode
    │      └─ column-number-mode
    │
    ├─ after-setting-font-hook
    │      └─ +modeline-resize-for-font-h
    │
    └─ doom-load-theme-hook
           └─ doom-modeline-refresh-bars

+modeline-global-mode (軽量版)
    │
    ├─ +modeline-mode
    │      └─ mode-line-format設定
    │
    ├─ +modeline-refresh-bars-h
    │      └─ +modeline--make-xpm
    │
    └─ anzu (検索マッチ表示)
           └─ evil-anzu (Evil統合)
```

### データフロー図

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

バッファ状態 ───▶ mode-line-format生成 ───▶ モードライン表示
    │                    │
Git状態 ────────▶ vc-mode処理 ─────────▶ ブランチ表示
    │                    │
Flycheck ───────▶ エラーカウント ─────▶ アイコン+数字
    │                    │
検索状態 ───────▶ anzu処理 ───────────▶ マッチ数表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/ui/modeline/config.el` | ソース | メイン設定 |
| autoload.el | `modules/ui/modeline/autoload.el` | ソース | 自動読み込み関数 |
| +light.el | `modules/ui/modeline/+light.el` | ソース | 軽量版モードライン実装 |
| packages.el | `modules/ui/modeline/packages.el` | 設定 | 依存パッケージ定義 |
