☰
Markdown表格语法避坑:对齐、竖线转义与自检实践
2026/11/4 9:10:01 网站建设 项目流程

做文档、写技术笔记、维护知识库这些年,我处理过的排版问题里,Markdown 表格语法是"看着最简单、翻车最集中"的一块。它的语法只有三个符号:竖线、连字符、冒号,但真正落到几百行的文档里,你会遇到表格突然不渲染、某一列凭空消失、代码里的竖线把整张表劈成两半、中文列怎么都对齐不了这些破事。这篇东西就是把我这些年踩过的坑和总结出来的写法一次性讲清楚:从最小可用结构,到对齐控制的边界,到单元格里能放什么不能放什么,再到合并单元格的替代方案和一套能落地的自检流程。不管你是刚学会用 Markdown 写周报的新人,还是天天在静态站点里维护参数手册的老手,都能从里面找到能直接用上的写法。

1. 三行定生死:先把表格的骨架看明白

1.1 表头行、分隔行、数据行组成的最小单元

Markdown 表格的语法模型非常朴素:它由一组"行"构成,第一行是表头,第二行是分隔行,之后是任意多行数据。判定一张表是否成立,解析器只看前两行——第一行里要有竖线,第二行要由连字符和可选的冒号组成,两者列数还必须对得上。满足这三条,它才进入表格模式;不满足,就当普通段落处理。

一个能被所有主流解析器认下来的最小表格长这样:

| 模块 | 职责 | | --- | --- | | 采集 | 拉取原始数据 | | 清洗 | 去重与格式统一 |

注意这里有个常被忽略的事实:表头行是必需的,不能省略。很多人想写一张"无表头"的表,直接上来就写数据行,结果整段被渲染成普通文本加一堆竖线。如果确实不想要表头语义,通用做法是写一行占位表头(比如全写—或者写字段序号),而不是空着。

分隔行是整张表里唯一"看起来像语法"的一行,它不承载任何内容,只做两件事:声明"上面那行是表头",以及携带对齐信息。数据行则完全是内容,你在这行里写什么,就以什么形式呈现(除了少量需要转义的字符)。理解了"语法只存在于前两行"这一点,后面很多诡异现象就都能解释了。

1.2 首尾竖线可以省,但我不建议省

严格来说,行首和行尾的竖线是可选的。模块 | 职责这种写法同样能被识别成一行两列的表格行。语法的核心是"分隔",而不是"包裹"。

但我个人的习惯是一律补全首尾竖线,理由有三个。第一是边界清晰:源文件里一眼能看出这一行的起止位置,特别是行首有缩进或者前面紧跟列表符号的时候。第二是兼容性:不同渲染器对省略首尾竖线时的空格处理有细微差异,有的会把行首空格吃掉,有的会把它算进第一格内容,跨平台粘贴时容易出现莫名其妙的前导空格。第三是工具友好:绝大多数格式化工具和表格编辑器都是按"首尾带竖线"的模型来对齐和重排的,你不写,它也会给你补上,不如一开始就统一。

这一条看起来是纯风格问题,但在多人协作的文档仓库里,风格不统一带来的 diff 噪音非常可观。一次格式化就能让整张表全红,评审的人根本看不出你实际改了什么。

1.3 列数对不上时,解析器的兜底规则

这是表格语法里最需要提前知道的"隐形行为"。当数据行的列数与表头不一致时,主流实现遵循两条兜底规则:

  • 数据行少于表头列数:缺的部分补成空单元格,表格照常渲染。
  • 数据行多于表头列数:多出来的单元格被直接丢弃,不报错、不提示。

第二条是真正的坑。你在编辑器里编辑时多打了一个竖线,预览里那一列数据就凭空消失了,而语法高亮往往不会有任何异常提示。我曾经在一份接口参数表里多写了一个竖线,导致"默认值"这一列在页面上整列不见,排查了半小时才发现是源文件里多了一个字符。

还有一个更隐蔽的变体:表头行的列数和分隔行的列数不一致时,整张表根本不成立。比如表头写了三列,分隔行只写了两个---,解析器会判定"这不是表格",然后把整段当普通段落输出,页面上就是一堆带竖线的文字。这种情况几乎每个人都遇到过至少一次,原因往往只是复制粘贴时漏了一段。

| 参数 | 类型 | 说明 | | --- | --- | | timeout | int | 超时秒数 |

上面这段里分隔行只有两列,结果是整块不渲染。修的办法很简单,补齐第三个---就行。养成"先写完整分隔行,再填内容"的顺序,能规避掉大部分这类问题。

1.4 表格前面必须空一行,这条几乎没有例外

块级元素之间需要空行分隔,这是 Markdown 的通用规则,表格尤其严格。如果你把表格紧贴在上一段文字下面,很多解析器会把这一整块当成一个段落,表格语法完全不生效。

以下是参数说明: | 参数 | 说明 | | --- | --- |

上面这种写法,在不同渲染器里的结果并不一致:有的能识别,有的不能。不要赌。正确写法是中间留一个空行:

以下是参数说明: | 参数 | 说明 | | --- | --- |

同样的规则适用于表格的结束:表格后面紧跟正文段落时,也要留空行,否则部分解析器会把那段文字当成表格的续行,或者把表格的最后一行的内容吃掉一部分。我在实际维护中形成的肌肉记忆是——表格前后各留一个空行,绝不省略,这条纪律能省掉大量莫名其妙的排版问题。

2. 冒号的位置决定对齐:对齐控制的细节与边界

2.1 三种写法及其真实含义

对齐信息写在分隔行里,靠冒号的位置表达。规则只有四条,但第四条经常被误解:

分隔行写法含义常见渲染结果
---未指定多数实现按左对齐显示
:---左对齐左对齐
:---:居中对齐居中
---:右对齐右对齐

关键在于第一条:---的语义是"未指定对齐方式",而不是"左对齐"。规范层面它不携带对齐信息,具体怎么显示由渲染环境决定。绝大多数情况下你看到的就是左对齐,所以把它当左对齐用没问题,但如果你在写需要严格控制的文档(比如要导出成固定格式的排版稿),最好显式写上:---,别依赖默认行为。

还有一个格式细节:分隔行里连字符的数量没有硬性统一标准,三个是社区惯例,写得更多(比如:------:)纯粹是为了让源码看起来更整齐。有些实现只要求至少一个连字符就能识别,但这不是你该赌的地方——统一写三个以上,跨平台最稳。

2.2 对齐在哪儿生效,在哪儿失效

很多人以为对齐是靠插入空格实现的,这是个根本性的误解。对齐信息在渲染时被转换成样式或属性,作用在单元格上,源文件里没有任何填充字符。所以它有三个明确的边界:

第一,复制粘贴到纯文本环境就没了。你把渲染后的表格复制到聊天窗口、邮件正文或者纯文本编辑器里,所有对齐瞬间打回原形,只剩下一堆用制表符勉强拼起来的内容。如果你需要把表格内容发给别人看,发渲染后的截图或者导出成 PDF、HTML,别直接复制渲染结果。

第二,列宽不由对齐符号决定。---:只影响单元格内文字的水平位置,不会让这一列变窄或变宽。列宽是渲染引擎根据内容长度自动计算的,你控制不了。想控制列宽,只能靠控制内容长度,或者干脆上 HTML。

第三,表格总宽超出容器时对齐会失效。窄屏或者窄侧边栏里,一张列数很多的表格会横向溢出,这时候右对齐的列被挤到视口外面,视觉效果上完全看不出对齐。这是移动端阅读体验崩坏的典型场景,后面第 5 节会专门讲怎么处理。

2.3 数字列右对齐,收益比你想的大

如果只让我保留一条对齐实践,我会选"数字列一律右对齐"。原因很实在:右对齐之后,个位、十位、百位在垂直方向上是对齐的,读者扫一眼就能比较量级。左对齐的数字列,9和1200的首字符对齐,但数量级差了两个数量级,反而更难比。

| 服务 | 调用次数 | 平均耗时(ms) | | :--- | ---: | ---: | | 查询 | 128400 | 12.6 | | 写入 | 9320 | 48.1 | | 导出 | 86 | 1830.5 |

这张表里"服务"左对齐,两个数值列右对齐,读起来就比全部左对齐舒服得多。同理,金额、百分比、计数、耗时这类字段都建议右对齐;而文本、路径、枚举值、说明类字段保持左对齐。

居中对齐要慎用。它在视觉上很"整齐",但对长文本极不友好——每一行的起始位置都不一样,读者的眼睛需要不断重新定位。我的经验是:居中对齐只适合短枚举值和状态标记,比如"是/否""通过/失败"这种两三个字的列,超过六个字的列一律左对齐。

2.4 中英混排下的视觉偏差

这是中文文档作者绕不开的问题:源码对齐和渲染对齐是两套坐标系。

你在源文件里用空格把竖线补齐,编辑器里看着是齐的,但那是因为编辑器用等宽字体渲染。而中文字符在全角字体下的显示宽度约等于两个英文字符,一旦编辑器(或者代码托管平台的网页预览)对中文的宽度计算和你的假设不一致,源码里精心对齐的竖线就会歪掉。

更麻烦的是自动化格式化:格式化工具通常是按"字符个数"来补空格的,一个汉字算一个字符,补出来的空格数在视觉上就少了。结果就是纯英文表格格式化后完美对齐,中英混排的表格格式化后反而更歪。

我的处理办法比较务实:不追求源码层面的像素级对齐。表格源码只要能看出列的分界就行,多一两个空格少一两个空格无所谓,反正渲染出来是渲染引擎的事。如果团队里有人非要源码对齐,那就约定"格式化工具跑一遍,以工具输出为准",别手工调——手工调出来的对齐,下一次别人格式化就全毁了,diff 会非常难看。

3. 单元格里能放什么、不能放什么

3.1 竖线是表格的头号敌人

竖线在表格里既是分隔符又是普通字符,冲突不可避免。想要在单元格内容里出现一个真正的竖线,有四条路可以走,各有适用场景:

方案写法适用场景代价
反斜杠转义|通用首选源码里多一个字符
HTML 实体|内容要经过二次处理时源码可读性差
移出表格改用列表或代码块内容本身复杂失去表格的结构感
全角替换|纯展示、不参与解析不是同一个字符

首选反斜杠转义,\|在所有主流实现里都能正确还原成一个竖线字符。它的缺点是:当你在源码里看到一堆\|时,可读性会明显下降,尤其是整列都是路径或者命令行参数的时候。

这里有个细节值得强调:反斜杠转义在行内代码里同样有效。这一点反直觉,因为很多人以为行内代码是"原样保留"的,不需要转义。但表格的切分发生在行内语法解析之前,所以代码片段里的裸竖线照样会把单元格劈开。第 3.2 节专门讲这个。

3.2 代码片段里的竖线要单独处理

这是我在实际项目里踩得最疼的一个坑。表格里放命令行示例太常见了:

| 命令 | 作用 | | --- | --- | | `grep -E "a|b" file` | 匹配 a 或 b |

上面这段,第二行里那个裸竖线会把单元格切成三格,多出来的部分被丢弃,最终渲染出来grep -E "a就没了。正确写法是给竖线加转义:

| 命令 | 作用 | | --- | --- | | `grep -E "a\|b" file` | 匹配 a 或 b |

渲染结果里,行内代码中的反斜杠会被吃掉,显示为一个干净的竖线。这个行为在所有遵循主流扩展方言的实现里是一致的。

如果你觉得在一堆转义符里读命令太痛苦,还有两个替代思路。一是把这类内容整个挪出表格,改成"小标题 + 代码块"的结构,可读性反而更好;二是用 HTML 实体|代替,源码里虽然更丑,但至少不会被误删——有些编辑器的"自动清理多余转义"功能会把\|干掉,而实体不会被识别成转义序列。

3.3 单元格内换行的唯一正确做法

Markdown 表格不支持在单元格里用回车换行。你在源码里把一个单元格的内容分成两行写,解析器看到的就是两行数据,第二行会被当成新的一行。

想在单元格内产生视觉换行,标准做法是插入<br>:

| 阶段 | 说明 | | --- | --- | | 准备 | 收集需求<br>确认范围<br>排期 |

这个写法在绝大多数渲染环境里都能正常工作,因为<br>属于行内 HTML,而表格单元格允许行内 HTML。少数环境(比如某些严格过滤 HTML 的预览器)可能不认,那就只能接受"内容挤在一行",或者把表格拆开。

需要提醒的是:<br>用多了,单元格会变成三行四行,整张表的行高被拉得很高,视觉上非常松散。如果你的表格里有多列都需要多行内容,那说明这个数据结构本来就不适合用表格承载,换成"每个条目一个小节"的写法会清晰得多。

另外,单元格里不能放块级元素。列表、代码块、引用块、标题,这些在单元格里都不生效,会被降级成纯文本或者直接破坏表格结构。需要放这类内容的场合,唯一的选择是改用 HTML 表格,或者干脆放弃表格。

3.4 空单元格、前后空格与行内语法

空单元格的写法是两根竖线之间什么都不写,或者只写一个空格:

| 参数 | 必填 | 默认值 | | :--- | :---: | :--- | | timeout | 是 | 30 | | retries | 否 | |

最后一行的"默认值"列留空,效果就是空白单元格。注意这里不要写成| |和| |混用——两种写法语义上没区别,但混着用会让源码看起来乱七八糟,也容易在格式化时产生无意义的 diff。

关于单元格内前后空格:主流实现会去掉单元格内容首尾的空白,所以你写| 30 |和| 30 |渲染结果一样。这意味着你没法靠空格在单元格里做缩进,想要缩进效果只能用全角空格或者<br>配合。

行内语法在单元格里是正常生效的:加粗、斜体、删除线、行内代码、链接、图片,都能用。这一点让表格的表达力强了不少,常见用法是把关键参数加粗、把状态用删除线标记废弃项。但要注意两个限制:一是图片放进表格会撑爆行高,除非你显式限制尺寸(那就得用 HTML 的img标签了);二是链接 URL 里如果含有竖线,同样需要转义,这个场景少见但不是没有。

4. 合并单元格:原生不做,怎么绕

4.1 为什么标准语法不提供 colspan 和 rowspan

这是新手问得最多的问题:表格怎么合并单元格?答案是——原生语法不支持,而且短期内也不会有。

原因不复杂。Markdown 的设计目标是"人能直接读懂的纯文本",它的所有语法都是基于"行"的线性模型。而合并单元格本质上是二维网格操作:你需要表达"这一格横跨三列"或者"这一格纵跨两行",这在纯文本里没有自然、无歧义的表达方式。硬要设计的话,无非两种思路:一是引入专门的标记符号(比如用<表示向左合并),二是用占位符表示"这一格是空的、被上面那格占了"。两种方案都会让源码变得极难维护——表格稍微复杂一点,源码就彻底没法读了,正好违背了 Markdown 的初衷。

规范选择不做,是一种克制。但对写文档的人来说,问题依然存在,得自己找替代方案。

4.2 HTML 表格兜底:什么时候值得用

最直接的替代方案是整张表改用 HTML 写。Markdown 允许在文档里嵌入 HTML 块,只要前后留空行、不缩进,多数渲染环境都会原样输出。

<table> <tr> <th>季度</th> <th>指标</th> <th>数值</th> </tr> <tr> <td rowspan="2">Q1</td> <td>新增</td> <td>1200</td> </tr> <tr> <td>流失</td> <td>340</td> </tr> </table>

这条路能解决合并问题,但代价要提前算清楚:

  • 源码可读性断崖式下跌。原本三行写完的表,HTML 版本要写十几行,评审 diff 时基本没法看。
  • 可移植性变差。部分平台会出于安全策略过滤 HTML 标签,或者只放行白名单里的标签,table有可能在白名单外,结果就是整块内容消失。发布前一定要在目标环境里实测。
  • 导出链路要单独验证。从 Markdown 转 PDF、转 Word、转其他格式时,HTML 表格的处理方式各不相同,有的会保留样式,有的会降级成纯文本,有的直接丢掉。
  • 样式不受控。原生表格的样式由文档主题统一管理,HTML 表格的样式取决于渲染环境是否放行style属性,很可能出现"本地好看、线上难看"的情况。

我的判断标准是:只有当合并带来的信息表达收益明显超过维护成本时才用。比如一张季度汇总表,横向合并可以让"上半年/下半年"这样的大类分组一目了然,这种场合值得。如果只是为了"看起来整齐",那还是别用。

4.3 语义降级:重复填写拆表

绝大多数情况下,所谓"需要合并单元格",本质上是我们把表格当成了电子表格来用。解决办法是换一种组织方式,用 Markdown 擅长的手段表达同样的信息。

第一种是重复填写。纵向合并的场景,最直接的做法就是把上一格的值重复写到下面几行:

| 季度 | 指标 | 数值 | | :--- | :--- | ---: | | Q1 | 新增 | 1200 | | Q1 | 流失 | 340 | | Q2 | 新增 | 1450 | | Q2 | 流失 | 290 |

看起来"重复"了,但对读者来说信息一点没少,而且每一行都是独立完整的记录,排序、筛选、复制都更方便。真正需要"看出分组"的时候,靠视觉效果(适当加空行、加粗分组边界行)就能解决。

第二种是拆表。横向合并的场景,通常意味着表格里混了两个维度的数据。拆成两张表反而更清楚:

上半年: | 指标 | 数值 | | :--- | ---: | | 新增 | 2650 | | 流失 | 630 | 下半年: | 指标 | 数值 | | :--- | ---: | | 新增 | 2980 | | 流失 | 510 |

第三种是转成小标题 + 列表。当表格的一级分组只有寥寥几行数据时,用二级或三级标题做分组,每个分组下面用一个两列的键值表或者干脆用列表,结构比一张大表清楚得多。这种情况在配置说明、参数手册里特别常见。

4.4 判断该不该用表格的三条标准

顺手把选择标准也摆出来,省得每次纠结:

情况建议理由
两列、每行是"名称-说明"用列表列表没有列宽问题,长说明不会被挤
三到五列、结构统一用表格表格的优势区间
超过六列拆表或转置窄屏必然溢出,横向滚动体验极差
单元格里要放多段文字改小节结构表格撑不下块级内容
需要合并单元格优先降级组织方式HTML 表格维护成本高

这张判断表我自己用了一年多,基本能覆盖日常文档里 95% 的选择困难。

5. 源码可读性:让表格在编辑器里也不难维护

5.1 对齐填充到底要不要做

源码层面的空格填充,一直有争议。支持的理由是"看起来整齐、改起来定位快";反对的理由是"手调的填充下次格式化就没了,纯属浪费"。

我的立场是:要么全做,要么全不做,别半做。如果团队用格式化工具统一处理,那就别手工补空格,靠工具;如果不用工具,那就约定一个简单的填充规则——每列宽度按该列最长内容(按字符数)加两个空格,一次写好,后续修改时不必强求完美对齐。最怕的是有人对齐有人不对齐,最后源文件里横竖不齐,谁都不敢动。

还有个实操细节:填充用的空格数量,宁少勿多。填太满会让每一行都很长,编辑器里容易触发横向滚动,反而更难读。

5.2 宽表格的三条出路

一张超过六列的表格,在任何窄容器里都是灾难。这不是 Markdown 的问题,是信息密度的问题。三条出路,按推荐顺序排列:

拆表。把一张宽表按语义拆成多张窄表,每张聚焦一个维度。比如一张"服务清单"表,把"服务名/负责人/用途"放一张,"服务名/调用量/耗时/错误率"放另一张。读者按需查阅,比在一张大表里横着找列舒服得多。

转置。当"列"其实是"样本"的时候,转置成纵向表往往更合适。比如对比三套方案在十个指标上的表现,横着放是十列,转过来就是十行:

| 指标 | 方案甲 | 方案乙 | 方案丙 | | :--- | ---: | ---: | ---: |

这种"指标作行、样本作列"的布局,列数只跟样本数有关,扩展性更好。

裁列。把长文本列(比如说明、备注)从表格里拿出去,用脚注或者单独小节承载,表格里只留短字段。这招在参数手册里特别管用,大部分"说明"列都是整段文字,放进去会把表格撑得又宽又高。

5.3 表格前后的留白与上下文衔接

表格是块级元素,但它的"阅读节奏"和段落不一样。我的习惯是表格前面留一个空行,后面留一个空行,表格前后不要紧贴列表或者标题。

如果表格前面需要一句引导语,写成独立段落,句尾用冒号,然后空行,再上表格。这个格式在渲染后读起来最顺:读者先看到"下表是各阶段的耗时统计:",视线下移就是表格,中间没有多余的干扰。

表格后面如果紧跟正文,也要留空行。这里有个容易忽略的坑:表格最后一行的下面如果紧跟着一段文字,某些实现会把它吞进表格里,尤其是那一行恰好以竖线开头的时候。别赌解析器的宽容度。

5.4 单元格内容的长度控制

单元格里的文字,控制在一行能扫完的长度最理想。经验值是中文不超过 20 个字,英文不超过 40 个字符。超过这个长度,单元格会折行,整张表的行高被撑开,阅读节奏就断了。

真的需要写长说明怎么办?三个办法:一是在说明列里写关键词,把详细解释放到表格下面的段落里;二是用脚注标记,正文里写简洁版本;三是接受折行,但保证每张表里只有一列是长文本,其他列保持短小,形成视觉上的主次。最糟的情况是每列都是长文本,那就不是表格了,是一堆挤在格子里的文章。

6. 排查与工程化:把表格问题挡在提交之前

6.1 常见问题速查表

下面这些是我这些年遇到过频次最高的表格问题,按发生频率排序。遇到"表格显示不对"的时候,从上往下查,基本能在两分钟内定位。

现象最可能的原因处理办法
整段变成带竖线的文字表头与分隔行列数不一致数一遍两边竖线,补齐---
整段变成带竖线的文字表格前没留空行在表格上方插入空行
某一列内容消失数据行多了一个竖线检查并转义多余的|
单元格内容被截断内容里有裸竖线,含行内代码给竖线加反斜杠转义
对齐完全没生效冒号写在了表头行冒号只能写在分隔行
右对齐看起来还是左对齐表格溢出容器,列被挤出视口拆表或裁列
换行不生效用了回车而非<br>改为<br>
中文列源码对不齐全角字符宽度导致放弃源码对齐,交给格式化工具
复制到别处格式全乱对齐靠渲染实现,纯文本不保留改用截图或导出文件

6.2 一个能跑的自检脚本

人工数竖线很容易出错,尤其是长文档。写个几十行的脚本,在提交前跑一遍,能挡掉绝大部分低级错误。思路很简单:逐行扫描,识别连续的表格行,统计每行未转义的竖线数量,跟表头比对。

import re import sys PIPE = re.compile(r"(?<!\\)\|") def check_tables(path): problems = [] block = [] def flush(): if len(block) < 2: block.clear() return counts = [(no, len(PIPE.findall(line))) for no, line in block] base_no, base = counts[0] for no, cnt in counts[1:]: if cnt != base: problems.append( f"{path}:{no} 列数 {cnt} 与表头 {base} 不一致" ) block.clear() with open(path, encoding="utf-8") as f: for no, line in enumerate(f, 1): s = line.rstrip("\n") if s.strip().startswith("|"): block.append((no, s.strip())) else: flush() flush() return problems if __name__ == "__main__": total = 0 for p in sys.argv[1:]: for msg in check_tables(p): print(msg) total += 1 if total: sys.exit(1)

这段脚本是简化版,做了几个务实取舍。它只统计未转义的竖线,所以\|不会被误算;它把连续以竖线开头的行当成一个表格块,遇到空行就结束;它要求每行列数与表头完全一致——这条规则比规范更严格,因为规范允许数据行少列(补空),但在实际写作里,少列几乎都是笔误,让它报错反而更好。

用法很直接:

python check_tables.py docs/*.md

有问题的行会打印出来,退出码非零。挂到提交钩子或者流水线里,就能保证进仓库的表格都是规整的。跑一段时间你会发现,报出来的问题里绝大多数是"多打了一个竖线"和"分隔行漏写一列",正好是最容易漏的两类。

脚本还可以扩展几个检查项:分隔行是否全是合法字符(-和:)、表头行是否为空、单行长度是否超阈值。加这些不费什么力气,收益却很实在。

6.3 团队协作里的几条约定

工具只能挡住语法错误,挡不住风格混乱。如果文档是多人维护的,下面这几条约定值得写进贡献指南:

第一,表格一律首尾带竖线,中间不留多余空格。这条纯粹是为了让格式化工具的 diff 稳定。

第二,分隔行统一写成| :--- | :---: | ---: |这种形式,左对齐显式写冒号,未指定的情况不用。显式写的好处是任何人看源码都能立刻知道这一列的对齐意图,不用去猜渲染结果。

第三,表格只承载结构化短内容,长说明一律挪出去。这条能有效控制表格宽度和行高,是保住表格可读性的根本。

第四,超过六列必须走评审,说明为什么不能用拆表代替。人为设置一点摩擦,能有效阻止"什么都往表格里塞"的倾向。

第五,格式化工具作为提交前的最后一步,任何人提交前跑一遍,不做手工对齐。这条执行下来,diff 会干净很多,评审效率也高。

我在实际维护中形成的几条习惯

写到最后,分享几个纯粹来自实践、文档里不会写的小习惯。

一是先写分隔行再写内容。这个顺序看着反直觉,但它能保证列数从一开始就是对的。很多人习惯先写一行数据再补分隔行,结果补的时候数错,整张表不渲染,又得回头排查。

二是表格里的代码片段尽量短。\|转义在长命令里非常影响阅读,我的做法是表格里只写命令名和一句作用,完整命令放到下面的代码块里,用序号或者名称关联起来。这样表格清爽,代码块也能带注释。

三是随时准备放弃表格。写得越久越觉得,表格是一种有明确适用边界的表达工具,它擅长"短、齐、多行同类"的数据,其他场合都是勉强。判断不了的时候,用列表写一版,再用表格写一版,哪个读起来顺用哪个——这个笨办法我用了几十次,从来没失手过。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询