Background
2350 字
12 分钟
Expressive Code Example
NOTE

Fuwari使用Expressive Code来呈现代码块,但是由于我自己总是忘记这些代码到底怎么写,干脆水一篇文章把它记下来方便查阅

TIP

以下是渲染后的结果,原始 Markdown 格式文本在文章末尾

(别问,问就是水字数的)

语法高亮#

Syntax Highlighting - Expressive Code

常规语法高亮#

console.log("这段代码带有语法高亮!");

渲染 ANSI 转义序列#

Terminal window
ANSI Colors:
- Regular: Red Green Yellow Blue Magenta Cyan
- Bold: Red Green Yellow Blue Magenta Cyan
- Dimmed: Red Green Yellow Blue Magenta Cyan
256 colors (showing colors 160-177):
160 161 162 163 164 165
166 167 168 169 170 171
172 173 174 175 176 177
Full RGB colors:
ForestGreen - RGB(34, 139, 34)
Text formatting: Bold Dimmed Italic Underline

编辑器与终端框架#

Editor & Terminal Frames - Expressive Code

代码编辑器框架#

my-test-file.js
console.log("标题属性示例");

src/content/index.html
<div>文件名注释示例</div>

终端框架#

Terminal window
echo "此终端框架没有标题"

PowerShell 终端示例
Write-Output "这个有标题!"

覆盖框架类型#

echo "看,没有框架!"

PowerShell Profile.ps1
# 如果不覆盖,这里会显示为终端框架
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail

文本与行标记#

Text & Line Markers - Expressive Code

标记完整行与行范围#

// 第 1 行 - 通过行号定位
// 第 2 行
// 第 3 行
// 第 4 行 - 通过行号定位
// 第 5 行
// 第 6 行
// 第 7 行 - 通过范围“7-8”定位
// 第 8 行 - 通过范围“7-8”定位

选择行标记类型(mark、ins、del)#

line-markers.js
function demo() {
console.log("这一行被标记为删除");
// 这一行和下一行被标记为插入
console.log("这是第二行插入的内容");
return "这一行使用默认的中性标记类型";
}

为行标记添加标签#

labeled-line-markers.jsx
<button
role="button"
{...props}
value={value}
className={buttonClassName}
disabled={disabled}
active={active}
>
{children &&
!active &&
(typeof children === "string" ? <span>{children}</span> : children)}
</button>

将长标签放在独立行上#

labeled-line-markers.jsx
<button
role="button"
{...props}
value={value}
className={buttonClassName}
disabled={disabled}
active={active}
>
{children &&
!active &&
(typeof children === "string" ? <span>{children}</span> : children)}
</button>

使用类似 diff 的语法#

这一行将被标记为插入
这一行将被标记为删除
这是一行普通内容

--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+这是一个实际的差异文件
-所有内容将保持不变
不会移除任何空白字符

将语法高亮与 diff 式语法结合#

function thisIsJavaScript() {
// 整个代码块都将作为 JavaScript 进行高亮,
// 并且我们仍然可以向其中添加差异标记!
console.log('要移除的旧代码')
console.log('崭新闪亮的代码!')
}

标记行内的单个文本#

function demo() {
// 标记行内任意给定的文本
return "支持给定文本的多次匹配";
}

正则表达式#

console.log("单词 yesyep 将被标记。");

转义正斜杠#

Terminal window
echo "Test" > /home/test.txt

选择内联标记类型(mark、ins、del)#

function demo() {
console.log("这些是插入和删除标记类型");
// return 语句使用默认标记类型
return true;
}

自动换行#

Word Wrap - Expressive Code

按代码块配置自动换行#

// 启用换行的示例
function getLongString() {
return "这是一个非常长的字符串,很可能在可用空间内无法完全显示,除非容器非常宽";
}

// 禁用换行的示例
function getLongString() {
return "这是一个非常长的字符串,很可能在可用空间内无法完全显示,除非容器非常宽";
}

配置换行行的缩进#

// 启用 preserveIndent 的示例(默认启用)
function getLongString() {
return "这是一个非常长的字符串,很可能在可用空间内无法完全显示,除非容器非常宽";
}

// 禁用 preserveIndent 的示例
function getLongString() {
return "这是一个非常长的字符串,很可能在可用空间内无法完全显示,除非容器非常宽";
}

可折叠部分#

Collapsible Sections - Expressive Code

5 collapsed lines
// 以下所有样板设置代码将被折叠
import { someBoilerplateEngine } from "@example/some-boilerplate";
import { evenMoreBoilerplate } from "@example/even-more-boilerplate";
const engine = someBoilerplateEngine(evenMoreBoilerplate());
// 这部分代码默认可见
engine.doSomething(1, 2, 3, calcFn);
function calcFn() {
// 你可以有多个可折叠部分
3 collapsed lines
const a = 1;
const b = 2;
const c = a + b;
// 这部分保持可见
console.log(`计算结果:${a} + ${b} = ${c}`);
return c;
}
4 collapsed lines
// 从此处到代码块末尾的所有代码将再次折叠
engine.closeConnection();
engine.freeMemory();
engine.shutdown({ reason: "样板代码示例结束" });

行号#

Line Numbers - Expressive Code

按代码块显示行号#

// 此代码块将显示行号
console.log("来自第 2 行的问候!");
console.log("我在第 3 行");

// 此代码块已禁用行号
console.log("你好?");
console.log("抱歉,你知道我在哪一行吗?");

更改起始行号#

console.log("来自第 5 行的问候!");
console.log("我在第 6 行");

原始 Markdown 格式文本#

Fuwari Expressive Code
## 语法高亮
[Syntax Highlighting - Expressive Code](https://expressive-code.com/key-features/syntax-highlighting/)
### 常规语法高亮
```js
console.log("这段代码带有语法高亮!");
```
### 渲染 ANSI 转义序列
```ansi
ANSI Colors:
- Regular: Red Green Yellow Blue Magenta Cyan
- Bold: Red Green Yellow Blue Magenta Cyan
- Dimmed: Red Green Yellow Blue Magenta Cyan
256 colors (showing colors 160-177):
160 161 162 163 164 165
166 167 168 169 170 171
172 173 174 175 176 177
Full RGB colors:
ForestGreen - RGB(34, 139, 34)
Text formatting: Bold Dimmed Italic Underline
```
## 编辑器与终端框架
[Editor & Terminal Frames - Expressive Code](https://expressive-code.com/key-features/frames/)
### 代码编辑器框架
```js title="my-test-file.js"
console.log("标题属性示例");
```
---
```html
<!-- src/content/index.html -->
<div>文件名注释示例</div>
```
### 终端框架
```bash
echo "此终端框架没有标题"
```
---
```powershell title="PowerShell 终端示例"
Write-Output "这个有标题!"
```
### 覆盖框架类型
```sh frame="none"
echo "看,没有框架!"
```
---
```ps frame="code" title="PowerShell Profile.ps1"
# 如果不覆盖,这里会显示为终端框架
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
```
## 文本与行标记
[Text & Line Markers - Expressive Code](https://expressive-code.com/key-features/text-markers/)
### 标记完整行与行范围
```js {1, 4, 7-8}
// 第 1 行 - 通过行号定位
// 第 2 行
// 第 3 行
// 第 4 行 - 通过行号定位
// 第 5 行
// 第 6 行
// 第 7 行 - 通过范围“7-8”定位
// 第 8 行 - 通过范围“7-8”定位
```
### 选择行标记类型(mark、ins、del)
```js title="line-markers.js" del={2} ins={3-4} {6}
function demo() {
console.log("这一行被标记为删除");
// 这一行和下一行被标记为插入
console.log("这是第二行插入的内容");
return "这一行使用默认的中性标记类型";
}
```
### 为行标记添加标签
```jsx {"1":5} del={"2":7-8} ins={"3":10-12}
// labeled-line-markers.jsx
<button
role="button"
{...props}
value={value}
className={buttonClassName}
disabled={disabled}
active={active}
>
{children &&
!active &&
(typeof children === "string" ? <span>{children}</span> : children)}
</button>
```
### 将长标签放在独立行上
```jsx {"1. 在此处提供 value 属性:":5-6} del={"2. 移除 disabled 和 active 状态:":8-10} ins={"3. 添加此代码以在按钮内渲染 children:":12-15}
// labeled-line-markers.jsx
<button
role="button"
{...props}
value={value}
className={buttonClassName}
disabled={disabled}
active={active}
>
{children &&
!active &&
(typeof children === "string" ? <span>{children}</span> : children)}
</button>
```
### 使用类似 diff 的语法
```diff
+这一行将被标记为插入
-这一行将被标记为删除
这是一行普通内容
```
---
```diff
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+这是一个实际的差异文件
-所有内容将保持不变
不会移除任何空白字符
```
### 将语法高亮与 diff 式语法结合
```diff lang="js"
function thisIsJavaScript() {
// 整个代码块都将作为 JavaScript 进行高亮,
// 并且我们仍然可以向其中添加差异标记!
- console.log('要移除的旧代码')
+ console.log('崭新闪亮的代码!')
}
```
### 标记行内的单个文本
```js "给定文本"
function demo() {
// 标记行内任意给定的文本
return "支持给定文本的多次匹配";
}
```
### 正则表达式
```ts /ye[sp]/
console.log("单词 yes 和 yep 将被标记。");
```
### 转义正斜杠
```sh //ho.*//
echo "Test" > /home/test.txt
```
### 选择内联标记类型(mark、ins、del)
```js "return true;" ins="已插入" del="已删除"
function demo() {
console.log("这些是插入和删除标记类型");
// return 语句使用默认标记类型
return true;
}
```
## 自动换行
[Word Wrap - Expressive Code](https://expressive-code.com/key-features/word-wrap/)
### 按代码块配置自动换行
```js wrap
// 启用换行的示例
function getLongString() {
return "这是一个非常长的字符串,很可能在可用空间内无法完全显示,除非容器非常宽";
}
```
---
```js wrap=false
// 禁用换行的示例
function getLongString() {
return "这是一个非常长的字符串,很可能在可用空间内无法完全显示,除非容器非常宽";
}
```
### 配置换行行的缩进
```js wrap preserveIndent
// 启用 preserveIndent 的示例(默认启用)
function getLongString() {
return "这是一个非常长的字符串,很可能在可用空间内无法完全显示,除非容器非常宽";
}
```
---
```js wrap preserveIndent=false
// 禁用 preserveIndent 的示例
function getLongString() {
return "这是一个非常长的字符串,很可能在可用空间内无法完全显示,除非容器非常宽";
}
```
## 可折叠部分
[Collapsible Sections - Expressive Code](https://expressive-code.com/plugins/collapsible-sections/)
```js collapse={1-5, 12-14, 21-24}
// 以下所有样板设置代码将被折叠
import { someBoilerplateEngine } from "@example/some-boilerplate";
import { evenMoreBoilerplate } from "@example/even-more-boilerplate";
const engine = someBoilerplateEngine(evenMoreBoilerplate());
// 这部分代码默认可见
engine.doSomething(1, 2, 3, calcFn);
function calcFn() {
// 你可以有多个可折叠部分
const a = 1;
const b = 2;
const c = a + b;
// 这部分保持可见
console.log(`计算结果:${a} + ${b} = ${c}`);
return c;
}
// 从此处到代码块末尾的所有代码将再次折叠
engine.closeConnection();
engine.freeMemory();
engine.shutdown({ reason: "样板代码示例结束" });
```
## 行号
[Line Numbers - Expressive Code](https://expressive-code.com/plugins/line-numbers/)
### 按代码块显示行号
```js showLineNumbers
// 此代码块将显示行号
console.log("来自第 2 行的问候!");
console.log("我在第 3 行");
```
---
```js showLineNumbers=false
// 此代码块已禁用行号
console.log("你好?");
console.log("抱歉,你知道我在哪一行吗?");
```
### 更改起始行号
```js showLineNumbers startLineNumber=5
console.log("来自第 5 行的问候!");
console.log("我在第 6 行");
```
Expressive Code Example
https://auspiceshirley.dev/posts/expressive-code-example/
作者
Shirley Auspice
发布于
2026-04-25
许可协议
CC BY-NC-SA 4.0