# 機能設計書 86-リドゥ

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータにおけるリドゥ（Redo）機能の設計仕様を記載する。

### 本機能の処理概要

リドゥ機能は、アンドゥ機能で取り消した操作をやり直す機能である。アンドゥで復元したウィンドウ、タブ、スプリットを再度閉じることができる。

**業務上の目的・背景**：
アンドゥ機能でうっかり復元してしまった操作を元に戻すことができる。アンドゥとリドゥの組み合わせにより、ユーザーは柔軟にターミナルの状態を管理できる。

**機能の利用シーン**：
- アンドゥで誤って復元してしまった要素を再度閉じたい場合
- キーボードショートカット（Cmd+Shift+Z等）で素早く操作

**主要な処理内容**：
1. キーバインドアクション`redo`を受け取る
2. リドゥスタックから最新の操作を取得
3. 操作の種類（ウィンドウ/タブ/スプリット）に応じて再度閉じる処理を実行
4. アンドゥスタックに操作を戻す

**関連システム・外部連携**：
- macOS AppKit（macOSのみ実装）
- アンドゥ機能（No.85）と対をなす

**権限による制御**：
特に権限による制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | メインターミナルウィンドウ | 主画面 | ウィンドウ/タブ/スプリットの再閉じ |

## 機能種別

ユーザー操作 / 状態管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| (なし) | - | - | パラメータなしのアクション | - |

### 入力データソース

- キーバインドアクション
- メニュー操作

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 再度閉じられたウィンドウ/タブ/スプリット | UI要素 | やり直し操作の結果 |

### 出力先

アプリケーションUI

## 処理フロー

### 処理シーケンス

```
1. アクション受信
   └─ redoアクション
2. リドゥスタック確認
   └─ やり直し可能な操作があるか確認
3. やり直し処理実行
   ├─ ウィンドウ再閉じ
   ├─ タブ再閉じ
   └─ スプリット再閉じ
4. 状態更新
   └─ リドゥスタックから操作を除去、アンドゥスタックに追加
```

### フローチャート

```mermaid
flowchart TD
    A[redo アクション] --> B{macOS環境?}
    B -->|No| C[何もしない]
    B -->|Yes| D{リドゥスタックに操作あり?}
    D -->|No| C
    D -->|Yes| E{操作種別}
    E -->|ウィンドウ| F[ウィンドウ再閉じ]
    E -->|タブ| G[タブ再閉じ]
    E -->|スプリット| H[スプリット再閉じ]
    F --> I[アンドゥスタックに追加]
    G --> I
    H --> I
    I --> J[終了]
    C --> J
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-86-01 | macOS限定 | 本機能はmacOSでのみ実装 | 常時 |
| BR-86-02 | アンドゥ連携 | リドゥはアンドゥ後にのみ有効 | 常時 |
| BR-86-03 | スタック管理 | リドゥ後はアンドゥスタックに操作が戻る | 常時 |

### 計算ロジック

特になし。

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

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 無視 | 非macOS環境での実行 | 何もしない |
| - | 無視 | リドゥスタックが空 | 何もしない |

### リトライ仕様

リトライは行わない。

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

該当なし。

## パフォーマンス要件

特になし。

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

アンドゥ機能と同様の考慮事項が適用される。

## 備考

- GTK（Linux）環境では本機能は未実装
- アンドゥ機能（No.85）と対をなす機能

---

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

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

### 推奨読解順序

#### Step 1: アクション定義を理解する

まず、アクションの定義を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Binding.zig | `src/input/Binding.zig` | redo アクション定義（850-853行目） |
| 1-2 | action.zig | `src/apprt/action.zig` | redo アクション定義（299-300行目） |

**読解のコツ**: `redo`アクションはアンドゥの逆操作で、macOSのみ実装されている。

**主要処理フロー**:
- **Binding.zig 850-853行目**: アクションのドキュメント（undoを参照）

#### Step 2: App.zigでのアクション処理を理解する

アクションがAppでどのように処理されるか。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | App.zig | `src/App.zig` | redoアクションのperformAction呼び出し（455行目） |

**主要処理フロー**:
- **455行目**: `rt_app.performAction(.app, .redo, {})`

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

```
キーバインドアクション
    │
    └─ redo
           │
           ▼
    App.zig
           │
           └─ rt_app.performAction(.app, .redo)
                  │
                  ▼
           [macOS環境のみ]
                  │
                  ▼
           macOS AppKit Redo Manager
                  │
                  ├─ ウィンドウ再閉じ
                  ├─ タブ再閉じ
                  └─ スプリット再閉じ
```

### データフロー図

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

キーバインド ───▶ アクション判定 ───▶ プラットフォーム判定
                                              │
                                              ▼
                                    [macOS環境のみ]
                                              │
                                              ▼
                                    リドゥスタック確認
                                              │
                                              ▼
                                    やり直し処理
                                              │
                                              ▼
                                    UI更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Binding.zig | `src/input/Binding.zig` | ソース | アクション定義（redo） |
| action.zig | `src/apprt/action.zig` | ソース | apprレベルのアクション定義 |
| App.zig | `src/App.zig` | ソース | アクション処理のディスパッチ |
| command_palette.zig | `src/apprt/gtk/class/command_palette.zig` | ソース | GTKでのフィルタリング |
