# 画面設計書 32-Vi Tilde Fringe

## 概要

本ドキュメントは、Doom Emacsのvi-tilde-fringeモジュールによって提供されるVi風のバッファ末尾表示機能の画面設計について記載する。このモジュールはバッファの終端（EOF）以降の行に`~`（チルダ）を表示し、Vimと同様の視覚的フィードバックを提供する。

### 本画面の処理概要

Vi Tilde Fringeは、バッファの実際の内容が終了した後の空行に対してチルダ（~）を左フリンジに表示するUI機能モジュールである。これはVimエディタから馴染みのある視覚的表現であり、バッファの終端を明確に示すことで、ユーザーがドキュメントの終わりを直感的に把握できるようにする。

**業務上の目的・背景**：VimやViを使用してきたユーザーにとって、バッファ終端以降の空行にチルダが表示されることは馴染み深い表示方式である。Emacsではデフォルトでこの表示がないため、Vimからの移行ユーザーは違和感を覚えることがある。本モジュールはvi-tilde-fringeパッケージを使用して、バッファ終端以降の行に`~`を表示することで、Vim風の視覚的体験を提供し、エディタ移行時の障壁を軽減する。また、ドキュメントの終端を明示することで、意図しないスクロールや編集を防ぐ効果もある。

**画面へのアクセス方法**：本機能は特定の画面ではなく、prog-mode、text-mode、conf-modeを継承するすべてのバッファに自動的に適用されるUI機能である。Doom Emacsの設定ファイル（init.el）で`:ui vi-tilde-fringe`モジュールを有効にすることで、該当するモードのバッファを開いた際に自動的にvi-tilde-fringe-modeが有効化される。

**主要な操作・処理内容**：
1. バッファ表示：バッファの内容が終了した行以降（EOF以降）の左フリンジにチルダ（~）を自動表示
2. モード有効化：prog-mode、text-mode、conf-mode派生のバッファで自動有効化
3. 表示更新：バッファ内容の変更に応じてチルダ表示位置を自動更新

**画面遷移**：本機能は画面遷移を伴わない。該当するモードのバッファで自動的に動作するUI視覚支援機能であり、他画面からの遷移元・遷移先という概念は適用されない。prog-mode（プログラミング言語モード）、text-mode（テキストモード）、conf-mode（設定ファイルモード）を継承するバッファすべてで動作する。

**権限による表示制御**：本機能に権限による表示制御はない。モジュールが有効な場合、対象モードのすべてのバッファで一律にチルダ表示が行われる。ユーザーは設定ファイルでフックを追加・削除することで、有効化するモードをカスタマイズできる。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 4 | UI 設定 | 主機能 | バッファ末尾~表示（Vim風）、フリンジ表示制御 |

## 画面種別

UI機能（対象モードバッファ適用型）

## URL/ルーティング

該当なし（EmacsはWebアプリケーションではないため、URL/ルーティングの概念は適用されない）

## 入出力項目

### 入力項目

| 項目名 | 型 | 説明 | 必須 |
|--------|------|------|------|
| バッファ内容 | buffer | 表示対象のバッファテキスト | - |
| ウィンドウサイズ | window | バッファを表示するウィンドウの高さ | - |

### 出力項目

| 項目名 | 型 | 説明 |
|--------|------|------|
| フリンジビットマップ | fringe-bitmap | 左フリンジに表示されるチルダ（~）ビットマップ |

## 表示項目

| 項目 | 表示位置 | 説明 |
|------|---------|------|
| チルダ（~） | 左フリンジ | バッファ終端以降の各行に表示 |

## イベント仕様

### 1-モードフック起動

**トリガー**：ユーザーがprog-mode、text-mode、conf-modeを継承するバッファを開く

**処理フロー**：
1. Emacsがバッファのメジャーモードを決定
2. 対象モード（prog-mode、text-mode、conf-mode）のフックが実行される
3. autoload.elで定義されたフック関数により`vi-tilde-fringe-mode`が有効化される
4. バッファ終端以降の行にチルダビットマップが表示される

### 2-バッファ内容変更時の更新

**トリガー**：ユーザーがバッファ内容を編集（テキスト追加・削除）

**処理フロー**：
1. バッファ内容が変更される
2. vi-tilde-fringe-modeがバッファ終端位置を再計算
3. チルダ表示位置が自動的に更新される

### 3-ウィンドウサイズ変更時の更新

**トリガー**：ユーザーがウィンドウサイズを変更（分割、リサイズ等）

**処理フロー**：
1. ウィンドウサイズが変更される
2. 表示可能な行数が変化
3. vi-tilde-fringe-modeがチルダ表示行数を再計算
4. フリンジ表示が更新される

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

該当なし（本機能はデータベースを使用しない）

## メッセージ仕様

本機能はメッセージを表示しない。

## 例外処理

| 例外 | 対応 |
|------|------|
| フリンジ非表示設定のバッファ | vi-tilde-fringe-modeは有効だが、フリンジが表示されないためチルダも非表示 |
| 対象外モード | prog-mode、text-mode、conf-mode以外のモードではフックが実行されず、機能は有効化されない |

## 備考

- Doom Emacs 2.0.6以降で利用可能
- prog-mode、text-mode、conf-modeを継承するバッファで自動有効化
- 特定のモードでの有効化/無効化は設定ファイルでフックを追加/削除することでカスタマイズ可能
- vi-tilde-fringeパッケージ（外部パッケージ）に依存

---

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

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

### 推奨読解順序

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

本モジュールは特別なデータ構造を定義していない。フリンジビットマップを使用してチルダを表示する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.el | `modules/ui/vi-tilde-fringe/packages.el` | 使用する外部パッケージ（vi-tilde-fringe）の定義を確認 |

**読解のコツ**: Doom Emacsのpackages.elは依存パッケージを定義するファイル。`package!`マクロでパッケージ名とピンバージョンを指定している。

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

本モジュールにはconfig.elがなく、autoload.elがエントリーポイントとなる。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | autoload.el | `modules/ui/vi-tilde-fringe/autoload.el` | モードフック設定を理解 |

**主要処理フロー**:
1. **3行目**: `;;;###autoload`マクロでオートロード関数を宣言
2. **4-5行目**: `add-hook!`マクロでprog-mode、text-mode、conf-modeにvi-tilde-fringe-modeを追加

#### Step 3: フック設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | autoload.el | `modules/ui/vi-tilde-fringe/autoload.el` | フック設定の詳細 |

**主要処理フロー**:
- **4行目**: `add-hook!`マクロで複数のモードフックに同時に関数を追加
- **4行目**: `'(prog-mode-hook text-mode-hook conf-mode-hook)` - 対象となる3つのモードフック
- **5行目**: `#'vi-tilde-fringe-mode` - 有効化する関数

**読解のコツ**: `add-hook!`はDoom Emacs独自のマクロで、複数のフックに同時に関数を追加できる。標準の`add-hook`より簡潔に記述可能。

#### Step 4: パッケージ依存を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | packages.el | `modules/ui/vi-tilde-fringe/packages.el` | パッケージ定義 |

**主要処理フロー**:
- **4行目**: `package!`マクロでvi-tilde-fringeパッケージを宣言
- **4行目**: `:pin`で特定のコミットハッシュに固定

#### Step 5: ドキュメントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | README.org | `modules/ui/vi-tilde-fringe/README.org` | モジュールの使用方法とカスタマイズ |

**主要ポイント**:
- **7行目**: 機能説明 - EOF以降の空行に`~`を表示
- **36-48行目**: カスタマイズ方法 - フックの追加/削除によるモード制御

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

```
[Doom Emacs起動]
    |
    +-- [モジュール読み込み]
           |
           +-- autoload.el
                  |
                  +-- add-hook! マクロ
                         |
                         +-- prog-mode-hook に vi-tilde-fringe-mode を追加
                         +-- text-mode-hook に vi-tilde-fringe-mode を追加
                         +-- conf-mode-hook に vi-tilde-fringe-mode を追加

[バッファを開く]
    |
    +-- [メジャーモード決定]
           |
           +-- prog-mode / text-mode / conf-mode 派生の場合
                  |
                  +-- モードフック実行
                         |
                         +-- vi-tilde-fringe-mode 有効化
                                |
                                +-- バッファ終端以降にチルダ表示
```

### データフロー図

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

バッファ内容 -----------> vi-tilde-fringe-mode --------> 左フリンジに
                                |                         チルダ（~）表示
                                v
                    +---------------------+
                    | バッファ終端位置    |
                    | 検出処理           |
                    +---------------------+
                                |
                                v
                    +---------------------+
                    | フリンジビットマップ |
                    | 生成・表示          |
                    +---------------------+

ウィンドウ高さ --------> 表示行数計算 -----------------> チルダ表示行数
                                                          決定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| autoload.el | `modules/ui/vi-tilde-fringe/autoload.el` | ソース | モードフック設定。prog-mode、text-mode、conf-modeでvi-tilde-fringe-modeを有効化 |
| packages.el | `modules/ui/vi-tilde-fringe/packages.el` | 設定 | 依存パッケージ（vi-tilde-fringe）の定義 |
| README.org | `modules/ui/vi-tilde-fringe/README.org` | ドキュメント | モジュールの説明、使用方法、カスタマイズ方法 |
| .doommodule | `modules/ui/vi-tilde-fringe/.doommodule` | 設定 | Doom Emacsモジュール識別ファイル |
