# 復原與重做

本頁說明 `editorHistory` 如何記錄編輯狀態，以及 `undo()`／`redo()` 還原內容與游標的方式。

## 紀錄內容

每筆紀錄是一個快照，而不是差異：

| 欄位 | 內容 |
|---|---|
| `index` | 游標所在列（從 0 起算） |
| `offset` | 游標在該列的位置 |
| `content` | 編輯器所有 `<div>` 列的 `innerText` 以 `\n` 串接 |

復原與重做各是一個陣列，沒有長度上限；長文件連續編輯時記憶體用量會隨步數線性成長。

## 何時寫入

| 動作 | 寫入時機 |
|---|---|
| `init()`（建構時與 `clear()`） | 立即寫入初始狀態 |
| 一般輸入（`input` 事件） | 延遲 300 ms；期間再次輸入會取消前一個計時器，連續輸入合併為一筆 |
| 剪下、貼上、Enter、Backspace、Tab、`Cmd/Ctrl+]` | 以 0 ms 計時器寫入 |
| 格式化方法（`bold()`、`heading()` 等） | 以 0 ms 計時器寫入 |

所有寫入都會清空重做堆疊，所以復原後再做任何編輯就無法重做。

## undo()

1. 取復原堆疊倒數第二筆作為目標；堆疊少於兩筆時不做任何事
2. 把最後一筆移到重做堆疊
3. 以目標的 `content` 呼叫 `init(content, false, false)` 重建列，不再寫入紀錄
4. 把游標放回目標的 `index`／`offset`
5. `autosave` 為真時更新預覽

## redo()

從重做堆疊取出最後一筆，推回復原堆疊，之後的重建、游標與預覽更新與 `undo()` 相同。

## 快捷鍵

| 組合鍵 | 方法 |
|---|---|
| `Cmd/Ctrl+Z` | `undo()` |
| `Cmd/Ctrl+Shift+Z` | `redo()` |

這兩組不受 `hotKey: false` 影響。`goBack()`、`goForward()` 是舊名稱，見 [已棄用 API](/deprecations)。
