# 画面設計書 30-Window Select

## 概要

本ドキュメントは、Doom EmacsのWindow Select機能の画面設計について記述します。Window Selectは、マウスや空間的なナビゲーション（hjkl）を使わずに、視覚的なヒントを使ってウィンドウを素早く選択する機能を提供します。

### 本画面の処理概要

Window Selectは、複数のウィンドウが開いている状況で、各ウィンドウに番号またはヒント文字を表示し、その文字を入力することで目的のウィンドウに素早く移動できる機能を提供します。ace-window（デフォルト）、switch-window、winumの3つのバックエンドから選択できます。

**業務上の目的・背景**：複数のウィンドウを使用した作業（コード編集、ドキュメント参照、ターミナル操作等）において、目的のウィンドウへの移動は頻繁に発生します。従来のC-w h/j/k/lによる空間的ナビゲーションは、ウィンドウ数が多い場合に非効率です。Window Selectは、1〜2回のキー入力で任意のウィンドウに移動できるため、作業効率を大幅に向上させます。

**画面へのアクセス方法**：以下の方法でWindow Select機能を使用します：
- `C-x o`（other-windowの置き換え）
- `C-w C-w`（Evil使用時）
- `+numbers` フラグ有効時：`C-w <番号>`で直接移動

**主要な操作・処理内容**：
1. ウィンドウ選択コマンドを実行
2. 各ウィンドウにヒント文字/番号を表示
3. ユーザーがヒント文字/番号を入力
4. 対応するウィンドウにフォーカスを移動

**画面遷移**：
- 入力元：任意のウィンドウ
- 出力先：選択したウィンドウ

**権限による表示制御**：権限による制御はありません。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 40 | ウィンドウ選択ナビゲーション | 主機能 | 番号・ヒント文字によるウィンドウ選択 |

## 画面種別

オーバーレイ表示（ウィンドウヒント）

## URL/ルーティング

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

## 入出力項目

### ace-window（デフォルト）

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|----------|------|
| aw-keys | 入力 | list | ヒント文字のリスト |
| aw-scope | 入力 | symbol | 選択範囲（'frame/'global） |
| aw-background | 入力 | boolean | 背景を暗くするか |

### switch-window（+switch-windowフラグ）

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|----------|------|
| switch-window-shortcut-style | 入力 | symbol | ショートカットスタイル |

### winum（+numbersフラグ）

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|----------|------|
| winum-auto-setup-mode-line | 入力 | boolean | モードラインに番号を表示するか |

## 表示項目

### ace-window表示

| 項目 | 説明 |
|------|------|
| ヒント文字 | 各ウィンドウの左上にa/s/d/f/g/h/j/k/l等の文字を表示 |
| 背景暗化 | 選択中、他のウィンドウの背景を暗くする |

### switch-window表示

| 項目 | 説明 |
|------|------|
| 大きな文字 | ウィンドウ全体を大きなヒント文字で置き換え |

### winum表示

| 項目 | 説明 |
|------|------|
| ウィンドウ番号 | 各ウィンドウに1〜9の番号を割り当て |

## イベント仕様

### 1-ace-windowでのウィンドウ選択

デフォルトのウィンドウ選択方式です。

**処理フロー**：
1. `C-x o` または `ace-window` を実行
2. 各ウィンドウの左上隅にヒント文字（a, s, d, f, g, h, j, k, l）を表示
3. ヒント文字を入力
4. 対応するウィンドウにフォーカスを移動

### 2-switch-windowでのウィンドウ選択

+switch-windowフラグ有効時の選択方式です。

**処理フロー**：
1. `C-x o` または `switch-window` を実行
2. 各ウィンドウの内容を大きなヒント文字で置き換え
3. ヒント文字を入力
4. 対応するウィンドウにフォーカスを移動

### 3-winumでの番号選択

+numbersフラグ有効時に追加される選択方式です。

**処理フロー**：
1. `C-w <番号>` を実行（0〜9）
2. 対応する番号のウィンドウにフォーカスを移動

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

N/A（データベースを使用しない）

## メッセージ仕様

N/A（標準的なEmacsメッセージを使用）

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| ウィンドウが1つのみ | ヒント表示をスキップ |
| 無効なヒント文字入力 | 操作をキャンセル |

## 備考

- ace-windowはavyパッケージに基づく
- switch-windowはバッファ内容を一時的に置き換えるため、視認性が高い
- winumはモードラインへの番号表示を無効化（モードラインプラグインに委任）
- ace-windowのフェイスをカスタマイズして視認性を向上可能

---

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

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

### 推奨読解順序

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

各バックエンドの設定変数を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/ui/window-select/config.el` | 各パッケージの設定変数 |

**読解のコツ**: `modulep!` でフラグを判定し、`use-package!` の `:when` / `:unless` で条件付きロードを行っています。

#### Step 2: switch-windowバックエンドを理解する

+switch-windowフラグ有効時のバックエンドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/ui/window-select/config.el` | `use-package! switch-window` ブロック（行3-9） |

**主要処理フロー**:
1. **行4**: `+switch-window` フラグ有効時のみロード
2. **行7**: `other-window` を `switch-window` にリマップ
3. **行9**: `switch-window-shortcut-style` を `'qwerty` に設定

#### Step 3: ace-windowバックエンドを理解する

デフォルトバックエンドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/ui/window-select/config.el` | `use-package! ace-window` ブロック（行12-21） |

**主要処理フロー**:
1. **行13**: `+switch-window` フラグ無効時のみロード
2. **行16**: `other-window` を `ace-window` にリマップ
3. **行18-19**: `+numbers` フラグ無効時、`aw-keys` を設定
4. **行20-21**: `aw-scope` を `'frame`、`aw-background` を `t` に設定

#### Step 4: winumバックエンドを理解する

+numbersフラグ有効時の追加機能を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config.el | `modules/ui/window-select/config.el` | `use-package! winum` ブロック（行24-42） |

**主要処理フロー**:
1. **行25**: `+numbers` フラグ有効時のみロード
2. **行26**: `doom-switch-window-hook` で遅延ロード
3. **行30**: `winum-auto-setup-mode-line` を `nil` に設定
4. **行31**: `winum-mode` を有効化
5. **行32-42**: Evil キーマップにウィンドウ番号選択を登録

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

```
C-x o / C-w C-w 実行
    │
    ├─ +switch-window フラグ有効 ─▶ switch-window
    │                                    │
    │                                    ▼
    │                         ウィンドウ内容を大文字で置換
    │                                    │
    │                                    ▼
    │                              文字入力待ち
    │
    └─ +switch-window フラグ無効 ─▶ ace-window
                                         │
                                         ▼
                               各ウィンドウにヒント文字表示
                                         │
                                         ▼
                                   文字入力待ち

C-w <番号> 実行（+numbers フラグ有効時）
    │
    └─ winum-select-window-N
              │
              ▼
        対応ウィンドウに移動
```

### データフロー図

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

キー入力 ───▶ コマンドディスパッチ ───▶ バックエンド選択
   │                                           │
   └─ C-x o                         ┌──────────┴──────────┐
                                    │                     │
                                    ▼                     ▼
                            ace-window            switch-window
                                    │                     │
                                    ▼                     ▼
                           ヒント文字表示         大文字置換表示

ヒント入力 ───▶ ウィンドウ特定 ───▶ フォーカス移動
   │
   └─ "a" / "s" / "d" / ...

aw-keys ───▶ ヒント文字設定
   │
   └─ (?a ?s ?d ?f ?g ?h ?j ?k ?l)

aw-scope ───▶ 選択範囲制御
   │
   └─ 'frame（現在のフレームのみ）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/ui/window-select/config.el` | ソース | パッケージ設定、キーバインド |
| packages.el | `modules/ui/window-select/packages.el` | 設定 | ace-window、switch-window、winumパッケージの依存定義 |
| README.org | `modules/ui/window-select/README.org` | ドキュメント | モジュール説明書、フラグ説明、カスタマイズ例 |
| .doommodule | `modules/ui/window-select/.doommodule` | 設定 | Doomモジュールメタデータ |
