# 機能設計書 36-タブバー表示

## 概要

本ドキュメントは、Doom Emacsにおけるタブバー表示機能の設計を記載する。この機能は、centaur-tabsパッケージを使用してバッファをタブ形式で表示し、ブラウザライクなバッファナビゲーションを提供する。

### 本機能の処理概要

**業務上の目的・背景**：多数のバッファを開いて作業する際、バッファの切り替えに時間がかかることがある。タブバー機能は、開いているバッファをタブとして視覚的に表示し、ワンクリックまたはキー操作でバッファ間を素早く移動できるようにする。これにより、複数ファイルを同時に扱う開発作業の効率が向上する。

**機能の利用シーン**：
- 複数のソースファイルを同時に編集する場合
- 関連ファイル間を頻繁に切り替える場合
- 開いているバッファを視覚的に確認したい場合
- persp-mode（ワークスペース）と連携してバッファを管理する場合

**主要な処理内容**：
1. centaur-tabsパッケージの初期化と設定
2. タブバーの表示とスタイリング
3. バッファフィルタリング（一時バッファの除外）
4. persp-mode連携によるワークスペース別バッファ表示
5. Evil統合によるタブナビゲーション
6. ダッシュボード・ポップアップでのタブ非表示

**関連システム・外部連携**：
- centaur-tabsパッケージ
- persp-mode（ワークスペース管理）
- nerd-icons（アイコン表示）

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 11 | Tabs | 主機能 | centaur-tabsによるタブ形式バッファ表示 |

## 機能種別

UI表示 / バッファナビゲーション

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| centaur-tabs-set-icons | boolean | No | アイコン表示 | t |
| centaur-tabs-gray-out-icons | symbol | No | 非アクティブタブのアイコングレーアウト | 'buffer |
| centaur-tabs-set-bar | symbol | No | バー位置 | 'left |
| centaur-tabs-set-modified-marker | boolean | No | 変更マーカー表示 | t |
| centaur-tabs-close-button | string | No | 閉じるボタン文字 | "x" |
| centaur-tabs-modified-marker | string | No | 変更マーカー文字 | "●" |

### 入力データソース

- バッファリスト
- persp-mode からのワークスペース情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| タブバー | 表示 | ウィンドウ上部のタブ表示 |

### 出力先

ウィンドウのヘッダーライン領域

## 処理フロー

### 処理シーケンス

```
1. centaur-tabs-mode の有効化
   └─ doom-first-file-hook または server-after-make-frame-hook
2. バッファリストの取得
   └─ +tabs-buffer-list 関数
3. 一時バッファのフィルタリング
   └─ doom-temp-buffer-p でチェック
4. persp-mode 連携（有効時）
   └─ persp-buffer-list でワークスペース内バッファ取得
5. タブの描画
   └─ centaur-tabs によるヘッダーライン描画
```

### フローチャート

```mermaid
flowchart TD
    A[Emacs起動] --> B{daemonモード?}
    B -->|Yes| C[server-after-make-frame-hookで有効化]
    B -->|No| D[doom-first-file-hookで有効化]
    C --> E[centaur-tabs-mode有効化]
    D --> E
    E --> F[バッファリスト取得]
    F --> G{persp-mode有効?}
    G -->|Yes| H[persp-buffer-list使用]
    G -->|No| I[buffer-list使用]
    H --> J[一時バッファフィルタ]
    I --> J
    J --> K[タブ描画]
    K --> L{特殊バッファ?}
    L -->|Dashboard/Popup| M[centaur-tabs-local-mode]
    L -->|通常| N[タブ表示維持]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-36-1 | アイコン表示 | タブにファイルタイプアイコンを表示 | centaur-tabs-set-icons = t |
| BR-36-2 | バー位置 | アクティブタブの左側にバーを表示 | centaur-tabs-set-bar = 'left |
| BR-36-3 | 変更マーカー | 変更されたバッファに●を表示 | centaur-tabs-set-modified-marker = t |
| BR-36-4 | 閉じるボタン | タブに閉じるボタン(x)を表示 | centaur-tabs-close-button = "x" |
| BR-36-5 | スコープ | マウスホイールでのタブ切り替えはタブリスト内に限定 | centaur-tabs-cycle-scope = 'tabs |
| BR-36-6 | アイコンタイプ | nerd-iconsを使用 | centaur-tabs-icon-type = 'nerd-icons |
| BR-36-7 | 特殊バッファ除外 | ダッシュボード・ポップアップではタブを非表示 | +tabs-disable-centaur-tabs-mode-maybe-h |

### 計算ロジック

特になし

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | アイコンパッケージ未ロード | nerd-iconsが利用できない | アイコン表示を無効化 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 多数のバッファがあってもタブ描画がスムーズであること
- タブ切り替えが即座に反映されること

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

特になし

## 備考

- centaur-tabsパッケージのピン留めバージョン: 5ec350da6cacc34ac0efaac17d6ac5031ef82bd4
- Emacs 27以降のtab-bar-mode、tab-line-modeとの統合は今後の課題

---

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

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

### 推奨読解順序

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

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

**読解のコツ**: `:pin`でコミットハッシュが固定されている。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/ui/tabs/config.el` | centaur-tabsの設定 |

**主要処理フロー**:
- **6-7行目**: `use-package!`によるcentaur-tabs設定
- **9-19行目**: 初期設定値
  - **9行目**: アイコン表示有効
  - **10行目**: 非アクティブアイコンのグレーアウト
  - **11行目**: バー位置（左）
  - **12行目**: 変更マーカー表示
  - **13行目**: 閉じるボタン文字
  - **14行目**: 変更マーカー文字
  - **15行目**: アイコンタイプ（nerd-icons）
  - **19行目**: サイクルスコープ（タブ内）
- **21-23行目**: 起動フック設定（daemonモード対応）
- **26-33行目**: `+tabs-buffer-list`関数定義
  - **27-30行目**: 一時バッファフィルタリング
  - **31-32行目**: persp-mode連携
- **34行目**: バッファリスト関数の設定
- **36-40行目**: 特殊バッファでのタブ無効化フック

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | autoload.el | `modules/ui/tabs/autoload.el` | Evilコマンド定義 |

**主要処理フロー**:
- **5-10行目**: `+tabs:next-or-goto`コマンド
  - インデックス指定時は該当タブへ、なければ次のタブへ
- **13-18行目**: `+tabs:previous-or-goto`コマンド
  - インデックス指定時は該当タブへ、なければ前のタブへ

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

```
Emacs起動
    │
    ├─ (daemonモード)
    │      └─ server-after-make-frame-hook
    │             └─ centaur-tabs-mode
    │
    └─ (通常モード)
           └─ doom-first-file-hook
                  └─ centaur-tabs-mode
                         │
                         └─ centaur-tabs-buffer-list-function
                                │
                                └─ +tabs-buffer-list
                                       │
                                       ├─ buffer-live-p
                                       ├─ doom-temp-buffer-p
                                       └─ persp-buffer-list (persp-mode時)
```

### データフロー図

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

バッファリスト ───▶ フィルタリング ───▶ タブ表示用リスト
    │                    │
persp-mode ────────▶ ワークスペースフィルタ ─▶ スコープ限定
    │                    │
バッファ状態 ───────▶ アイコン/マーカー決定 ─▶ タブ描画
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/ui/tabs/config.el` | ソース | centaur-tabs設定 |
| autoload.el | `modules/ui/tabs/autoload.el` | ソース | Evilコマンド定義 |
| packages.el | `modules/ui/tabs/packages.el` | 設定 | 依存パッケージ定義 |
