2350 字
12 分钟
Expressive Code Example
NOTE
Fuwari使用Expressive Code来呈现代码块,但是由于我自己总是忘记这些代码到底怎么写,干脆水一篇文章把它记下来方便查阅
TIP以下是渲染后的结果,原始 Markdown 格式文本在文章末尾
(别问,问就是水字数的)
语法高亮
Syntax Highlighting - Expressive Code
常规语法高亮
console.log("这段代码带有语法高亮!");渲染 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 165166 167 168 169 170 171172 173 174 175 176 177
Full RGB colors:ForestGreen - RGB(34, 139, 34)
Text formatting: Bold Dimmed Italic Underline编辑器与终端框架
Editor & Terminal Frames - Expressive Code
代码编辑器框架
console.log("标题属性示例");<div>文件名注释示例</div>终端框架
echo "此终端框架没有标题"Write-Output "这个有标题!"覆盖框架类型
echo "看,没有框架!"# 如果不覆盖,这里会显示为终端框架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)
function demo() { console.log("这一行被标记为删除"); // 这一行和下一行被标记为插入 console.log("这是第二行插入的内容");
return "这一行使用默认的中性标记类型";}为行标记添加标签
<button role="button" {...props} value={value} className={buttonClassName} disabled={disabled} active={active}> {children && !active && (typeof children === "string" ? <span>{children}</span> : children)}</button>将长标签放在独立行上
<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("单词 yes 和 yep 将被标记。");转义正斜杠
echo "Test" > /home/test.txt选择内联标记类型(mark、ins、del)
function demo() { console.log("这些是插入和删除标记类型"); // return 语句使用默认标记类型 return true;}自动换行
按代码块配置自动换行
// 启用换行的示例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 格式文本
## 语法高亮
[Syntax Highlighting - Expressive Code](https://expressive-code.com/key-features/syntax-highlighting/)
### 常规语法高亮
```jsconsole.log("这段代码带有语法高亮!");```
### 渲染 ANSI 转义序列
```ansiANSI Colors:- Regular: [31mRed[0m [32mGreen[0m [33mYellow[0m [34mBlue[0m [35mMagenta[0m [36mCyan[0m- Bold: [1;31mRed[0m [1;32mGreen[0m [1;33mYellow[0m [1;34mBlue[0m [1;35mMagenta[0m [1;36mCyan[0m- Dimmed: [2;31mRed[0m [2;32mGreen[0m [2;33mYellow[0m [2;34mBlue[0m [2;35mMagenta[0m [2;36mCyan[0m
256 colors (showing colors 160-177):[38;5;160m160 [38;5;161m161 [38;5;162m162 [38;5;163m163 [38;5;164m164 [38;5;165m165[0m[38;5;166m166 [38;5;167m167 [38;5;168m168 [38;5;169m169 [38;5;170m170 [38;5;171m171[0m[38;5;172m172 [38;5;173m173 [38;5;174m174 [38;5;175m175 [38;5;176m176 [38;5;177m177[0m
Full RGB colors:[38;2;34;139;34mForestGreen - RGB(34, 139, 34)[0m
Text formatting: [1mBold[0m [2mDimmed[0m [3mItalic[0m [4mUnderline[0m```
## 编辑器与终端框架
[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>```
### 终端框架
```bashecho "此终端框架没有标题"```
---
```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=5console.log("来自第 5 行的问候!");console.log("我在第 6 行");``` Expressive Code Example
https://auspiceshirley.dev/posts/expressive-code-example/