像写Python的文档注释一样写Markdown的块引用

陪她去流浪 桃子 阅读次数:22

我很早就在文章《我也希望 Markdown 能够支持“内容引用/嵌入”》中表明过对目前的Markdown语法对于块引用较复杂的内容时的写法过于复杂的担忧。今天在写前一篇文章《排查Linux一处网络设备命名问题》时我又遇到了这个困境。所以在坐地铁闲得没事儿做的时候,我给Codex下达了一个命令计划,并尝试帮我实现我提到的想法。

目前Markdown写块引用最大的问题在于需要给每一行内容加上“> ”前缀。如果是完全手写,那没有一点问题;但是如果是粘贴引用一段外部的内容,那就是灾难(而我经常引用ChatGPT生成的内容)。每到这种时候,我都是切换到支持VIM绑定的编辑器,按“VG”进入块选中状态,然后按“I”进入块编辑状态,这样可以一次性给所有选中的行插入“> ”前缀。然后再粘贴回文章编辑器。我只能说,任务确实是完成了,但就体验来说那是真的非常割裂。

先对比一下两种写法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
> This is a paragraph.
>
> ```go
> func main() { }
> ```
>
> 这是一个列表:
>
> * item1
> * item2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
"""
This is a paragraph.

```go
func main() { }
```

这是一个列表:

* item1
* item2
"""

Codex一次性就成功地实现了我的需求,非常精炼,加上测试才200+行代码,我一行代码都没有写:markdown: extension: fenced blockquote。使用“"""”而不是“>>>”的原因是后者其实是现有的标准Markdown语法,可能会有冲突。而使用“"""”这种看起来像Python文档注释的写法确实是一种全新的语法。这可能是我几十个Markdown扩展中第一次出现新的不兼容语法。