# 画面設計書 11-Tabs

## 概要

本ドキュメントは、Doom EmacsにおけるTabs画面（タブバー表示機能）の設計仕様を定義するものである。centaur-tabsパッケージを利用したタブ形式のバッファ管理UIについて、その表示仕様、操作方法、およびイベント仕様を記載する。

### 本画面の処理概要

Tabs画面は、開いているバッファをタブ形式で表示し、視覚的なバッファ切り替えを可能にする機能である。

**業務上の目的・背景**：従来のEmacsでは、多数のバッファを開いた際にバッファ間の切り替えが煩雑になる課題があった。本機能はモダンなエディタやブラウザで一般的なタブインターフェースを提供することで、ユーザーが直感的にバッファを管理・切り替えできるようにする。特に複数のファイルを同時に編集する際の生産性向上に寄与する。

**画面へのアクセス方法**：Doom Emacsの起動時に自動的に有効化される（`doom-first-file-hook`または`server-after-make-frame-hook`により初期化）。手動で有効化する場合は`centaur-tabs-mode`コマンドを実行する。

**主要な操作・処理内容**：
1. タブのクリックによるバッファ切り替え
2. タブの左右移動によるバッファナビゲーション（`gt`/`gT`キー）
3. タブのグループ化によるバッファの論理的分類
4. 修正マーカーによる未保存バッファの視覚的識別
5. アイコン表示によるファイルタイプの識別

**画面遷移**：各タブをクリックまたはキー操作で選択すると、対応するバッファの編集画面に遷移する。ダッシュボードやポップアップウィンドウではタブバーが自動的に非表示になる。

**権限による表示制御**：本機能に権限による表示制御はない。全ユーザーが同一の機能を利用可能である。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 36 | タブバー表示 | 主機能 | centaur-tabsによるタブ形式バッファ表示 |
| 41 | ワークスペース管理（タブ風） | 補助機能 | ワークスペース内バッファのタブ表示、persp-mode連携 |

## 画面種別

一覧（バッファタブ一覧表示）

## URL/ルーティング

Emacsモード: `centaur-tabs-mode`
バッファ名: なし（ヘッダーライン/タブラインとして表示）

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|---------|------|
| バッファリスト | 入力 | リスト | 表示対象となるバッファのリスト |
| 現在のバッファ | 入力 | バッファ | アクティブなタブとして強調表示されるバッファ |
| ワークスペース | 入力 | persp | persp-mode有効時のワークスペースコンテキスト |
| タブアイコン | 出力 | 画像 | nerd-iconsによるファイルタイプアイコン |
| 修正マーカー | 出力 | 文字列 | 未保存バッファを示す「•」マーカー |
| 閉じるボタン | 出力 | 文字列 | タブを閉じる「✕」ボタン |

## 表示項目

| 項目名 | 表示位置 | 説明 |
|--------|---------|------|
| ファイルアイコン | タブ左端 | nerd-iconsによるファイルタイプアイコン |
| バッファ名 | タブ中央 | バッファの名前（ファイル名） |
| 修正インジケータ | バッファ名横 | 未保存時に「•」を表示 |
| 閉じるボタン | タブ右端 | タブを閉じる「✕」ボタン |
| アクティブバー | タブ左端 | アクティブタブを示す縦バー |

## イベント仕様

### 1-タブクリック

ユーザーがタブをクリックすると、対応するバッファに切り替わる。centaur-tabsがバッファ選択イベントを処理し、`switch-to-buffer`相当の処理を実行する。

### 2-タブ移動（次のタブ）

`gt`キーまたは`centaur-tabs-forward`コマンドで次のタブに移動する。カウント引数を指定すると、指定番号のタブに直接ジャンプする（`+tabs:next-or-goto`関数）。

### 3-タブ移動（前のタブ）

`gT`キーまたは`centaur-tabs-backward`コマンドで前のタブに移動する。カウント引数を指定すると、指定番号のタブに直接ジャンプする（`+tabs:previous-or-goto`関数）。

### 4-タブを閉じる

閉じるボタン「✕」をクリックすると、対応するバッファが閉じられる。未保存の変更がある場合は確認ダイアログが表示される。

### 5-タブのスクロール

マウスホイールでタブリストをスクロールできる。`centaur-tabs-cycle-scope`が`tabs`に設定されているため、スクロールはタブリスト内に限定され、他のワークスペースには遷移しない。

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

本機能はデータベースを使用しない。バッファのリストはEmacsのバッファ管理機能から動的に取得される。

## メッセージ仕様

| メッセージ種別 | メッセージ内容 | 表示条件 |
|--------------|--------------|---------|
| なし | - | タブ操作ではメッセージは表示されない |

## 例外処理

| 例外状態 | 処理内容 |
|---------|---------|
| バッファが存在しない | タブは自動的に削除される |
| 一時バッファ | `doom-temp-buffer-p`により一時バッファはタブ表示から除外される |
| ダッシュボードモード | `+doom-dashboard-mode-hook`でタブバーが自動的に無効化される |
| ポップアップバッファ | `+popup-buffer-mode-hook`でタブバーが自動的に無効化される |

## 備考

- centaur-tabs 4.0以降を使用
- アイコン表示には`nerd-icons`パッケージが必要
- persp-modeが有効な場合、ワークスペースごとにバッファがグループ化される
- daemonモードでの起動時は`server-after-make-frame-hook`で初期化される

---

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

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

### 推奨読解順序

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

タブ表示に使用されるデータ構造として、バッファリストとタブグループの概念を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/ui/tabs/config.el` | `+tabs-buffer-list`関数でバッファリストのフィルタリング方法を理解する |

**読解のコツ**: `centaur-tabs-buffer-list-function`に設定される関数がタブに表示されるバッファを決定する。`doom-temp-buffer-p`と`persp-buffer-list`の関係を把握することが重要。

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

タブモードの初期化処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/ui/tabs/config.el` | 6-24行目: `use-package!`マクロによるcentaur-tabsの設定と初期化フックを確認 |

**主要処理フロー**:
1. **9-19行目**: 初期設定（アイコン、バー位置、修正マーカー等）
2. **21-23行目**: daemonモードと通常モードでの初期化フック設定
3. **26-34行目**: カスタムバッファリスト関数の定義

#### Step 3: バッファフィルタリング処理を理解する

タブに表示されるバッファの選別ロジックを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/ui/tabs/config.el` | 26-34行目: `+tabs-buffer-list`関数のフィルタリングロジック |

**主要処理フロー**:
- **27-30行目**: `seq-filter`でバッファをフィルタリング
- **31-33行目**: persp-modeが有効な場合は`persp-buffer-list`、無効な場合は`buffer-list`を使用

#### Step 4: タブ無効化処理を理解する

特定のモードでタブを自動無効化する処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config.el | `modules/ui/tabs/config.el` | 36-40行目: ダッシュボードとポップアップでのタブ無効化 |

#### Step 5: Evil連携を理解する

Evil mode（Vimエミュレーション）との連携を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | autoload.el | `modules/ui/tabs/autoload.el` | 5-18行目: `+tabs:next-or-goto`と`+tabs:previous-or-goto`コマンド |

**主要処理フロー**:
- **5-10行目**: カウント引数付きで特定タブにジャンプ、引数なしで次のタブへ
- **12-18行目**: カウント引数付きで特定タブにジャンプ、引数なしで前のタブへ

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

```
doom-first-file-hook / server-after-make-frame-hook
    │
    └─ centaur-tabs-mode
           │
           ├─ centaur-tabs-buffer-list-function
           │      └─ +tabs-buffer-list
           │             ├─ persp-buffer-list (persp-mode有効時)
           │             └─ buffer-list (persp-mode無効時)
           │
           ├─ +tabs-disable-centaur-tabs-mode-maybe-h
           │      └─ centaur-tabs-local-mode (ダッシュボード/ポップアップ時)
           │
           └─ Evil キーバインド
                  ├─ +tabs:next-or-goto (gt)
                  │      └─ centaur-tabs-forward / centaur-tabs-select-visible-nth-tab
                  └─ +tabs:previous-or-goto (gT)
                         └─ centaur-tabs-backward / centaur-tabs-select-visible-nth-tab
```

### データフロー図

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

buffer-list    ───▶ +tabs-buffer-list    ───▶ タブ表示用バッファリスト
                         │
persp-mode     ───▶      │
コンテキスト               │
                         ▼
                    centaur-tabs
                    描画エンジン     ───▶ タブバーUI
                         │
nerd-icons     ───▶      │
                         │
doom-temp-buffer-p ───▶  │ (フィルタリング)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/ui/tabs/config.el` | ソース | メイン設定ファイル、centaur-tabsの設定とカスタム関数定義 |
| autoload.el | `modules/ui/tabs/autoload.el` | ソース | 遅延ロード関数、Evil連携コマンド |
| packages.el | `modules/ui/tabs/packages.el` | 設定 | パッケージ依存関係定義 |
