> ## Documentation Index
> Fetch the complete documentation index at: https://bun.ll1025.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# REPL

> 一个交互式 JavaScript 和 TypeScript REPL，支持语法高亮、历史记录和 Tab 补全

`bun repl` 启动一个交互式的读取-求值-打印循环（REPL），用于求值 JavaScript 和 TypeScript 表达式。用于测试代码片段、探索 API 和调试。

```sh terminal icon="terminal" theme={null}
bun repl
```

```txt theme={null}
欢迎使用 Bun v1.3.3
输入 .copy [code] 复制到剪贴板。输入 .help 获取更多信息。

> 1 + 1
2
> const greeting = "Hello, Bun!"
undefined
> greeting
'Hello, Bun!'
```

***

## 特性

* **TypeScript 和 JSX** — 直接编写 TypeScript 和 JSX。Bun 实时转译所有内容。
* **顶层 `await`** — 直接在提示符处 await  Promise，无需包装在 async 函数中。
* **语法高亮** — 输入时进行语法高亮。
* **持久化历史记录** — 历史记录保存到 `~/.bun_repl_history`，跨会话持久化。
* **Tab 补全** — 按 `Tab` 键补全属性名和 REPL 命令。
* **多行输入** — 未闭合的中括号、花括号和圆括号会自动延续到下一行。
* **Node.js 全局变量** — `require`、`module`、`__dirname` 和 `__filename` 可用，相对于当前工作目录解析。

***

## 特殊变量

REPL 暴露了两个每次求值后都会更新的特殊变量。

| 变量       | 描述         |
| -------- | ---------- |
| `_`      | 最后一个表达式的结果 |
| `_error` | 最后一个抛出的错误  |

```txt theme={null}
> 2 + 2
4
> _ * 10
40
> JSON.parse("oops")
SyntaxError: JSON Parse error: Unexpected identifier "oops"
> _error
SyntaxError: JSON Parse error: Unexpected identifier "oops"
```

***

## 顶层 `await`

你可以直接在提示符处 `await` 任何表达式。

```txt theme={null}
> await fetch("https://api.github.com/repos/oven-sh/bun").then(r => r.json()).then(r => r.stargazers_count)
81234
> const response = await fetch("https://example.com")
undefined
> response.status
200
```

***

## 导入模块

与 Bun 的运行时一样，REPL 同时接受 `require` 和 `import`：在提示符处自由混用 ES 模块和 CommonJS。模块解析使用与 `bun run` 相同的规则，因此你可以从 `node_modules`、相对路径或 `node:` 内置模块导入。

```txt theme={null}
> import { z } from "zod"
undefined
> const path = require("path")
undefined
> z.string().parse(path.join("/tmp", "file.txt"))
'/tmp/file.txt'
```

声明在会话的剩余时间内持久存在，且 `const`/`let` 可以在不同求值之间重新声明（与常规脚本不同），因此你可以在迭代时重新运行 `import` 和 `require` 语句。

***

## 多行输入

当按下 `Enter` 但行中有未闭合的中括号、花括号或圆括号时，REPL 会自动延续到下一行。提示符会变为 `...` 表示续行。

```txt theme={null}
> function add(a, b) {
...   return a + b;
... }
undefined
> add(2, 3)
5
```

对于较长的多行输入，使用 `.editor` 进入编辑器模式，该模式会缓冲所有输入，直到按下 `Ctrl+D`。

***

## REPL 命令

在提示符处输入 `.help` 查看所有可用的 REPL 命令。

| 命令         | 描述                                       |
| ---------- | ---------------------------------------- |
| `.help`    | 打印帮助信息，列出命令和快捷键                          |
| `.exit`    | 退出 REPL                                  |
| `.clear`   | 清屏                                       |
| `.copy`    | 将最后一个结果复制到剪贴板。传入表达式进行求值并复制：`.copy 1 + 1` |
| `.load`    | 加载文件到 REPL 会话：`.load ./script.ts`        |
| `.save`    | 将当前 REPL 历史记录保存到文件：`.save ./session.txt` |
| `.editor`  | 进入多行编辑器模式（按 `Ctrl+D` 求值，按 `Ctrl+C` 取消）   |
| `.break`   | 取消当前多行输入                                 |
| `.history` | 打印命令历史记录                                 |

***

## 快捷键

REPL 支持 Emacs 风格的行编辑。

| 快捷键                 | 动作               |
| ------------------- | ---------------- |
| `Ctrl+A`            | 移动到行首            |
| `Ctrl+E`            | 移动到行尾            |
| `Ctrl+B` / `Ctrl+F` | 向后/向前移动一个字符      |
| `Alt+B` / `Alt+F`   | 向后/向前移动一个单词      |
| `Ctrl+U`            | 删除到行首            |
| `Ctrl+K`            | 删除到行尾            |
| `Ctrl+W`            | 向后删除一个单词         |
| `Ctrl+D`            | 删除字符（如果行为空则退出）   |
| `Ctrl+L`            | 清屏               |
| `Ctrl+T`            | 交换光标前的两个字符       |
| `上` / `下`           | 浏览历史记录           |
| `Tab`               | 自动补全             |
| `Ctrl+C`            | 取消当前输入（在空行按两次退出） |

***

## 历史记录

REPL 历史记录自动保存到 `~/.bun_repl_history`（最多 1000 条），并在每次会话开始时加载。使用 `上`/`下` 键浏览。

要导出历史记录到另一个文件，使用 `.save`：

```txt theme={null}
> .save ./my-session.txt
```

***

## 非交互模式

使用 `-e` / `--eval` 以 REPL 语义求值脚本并退出。使用 `-p` / `--print` 可额外打印结果。

```sh terminal icon="terminal" theme={null}
bun repl -e "const x: number = 42; console.log(x)"
# 42

bun repl -p "await fetch('https://example.com').then(r => r.status)"
# 200

bun repl -p "{ a: 1, b: 2 }"
# { a: 1, b: 2 }
```

两个标志都使用与交互式 REPL 相同的转换，因此裸对象字面量如 `{ a: 1 }` 会被视为对象表达式而非块语句。进程在事件循环排空后退出（待处理的定时器和 I/O 先完成）。出错时，进程以状态码 `1` 退出。
