blog.dopana

Back

无序列表的项目符号#

在Markdown中,创建无序列表需要在每项前面加上连字符(-)、星号(*)或加号(+)。缩进一个或多个项目即可创建嵌套列表:

- 项目A
- 项目B
  - 嵌套项目B.1
markdown
* 项目A
* 项目B
  * 嵌套项目B.1
markdown

三者渲染结果完全相同。用哪种符号只是风格问题——而这正是 lint 工具检查的内容。

MD004(ul-style)#

Markdown lint 规则 MD004(ul-style)用于配置并强制文档中无序列表所使用的项目符号类型。

  • 标签(Tags):bulletul
  • 别名(Aliases):ul-style
  • 可自动修复(Fixable):部分违规行为可通过工具自动修复。
  • 参数(style):
    • consistent(默认值):允许使用任何符号(*-+),但整篇文档中的所有列表必须与第一个列表的风格保持一致。
    • asterisk:强制使用星号(*)。
    • dash:强制使用连字符(-)。
    • plus:强制使用加号(+)。
    • sublist:允许每个嵌套列表层级(sublist)使用与父层级不同的独立符号。

默认配置通常为 “consistent”:

{
  "ul-style": {
    "style": "consistent"
  }
}
json

例如,当启用 sublist 风格时,以下文档是合法的,因为最外层使用星号,中间层使用加号,最内层使用连字符:

* 项目 1
  + 项目 2
    - 项目 3
  + 项目 4
* 项目 5
  + 项目 6
markdown

为什么我偏好连字符#

默认可能是星号,但我觉得连字符(-)才是常见风格,也最容易阅读。还有一个实际原因:AI agent 几乎都用连字符,而星号(**)主要用来表示粗体。因此强制列表用星号会带来噪声——行首的 * 一眼看去难以区分是列表符号还是粗体格式。

不要强行改写现有文档#

有时文档通篇使用星号(*),且完全一致。我不想为了满足某条规则而改动那份文档。lint 工具不应成为重写干净、一致内容的理由。

方案一:配置连字符风格#

可以更新 JSON 配置(.markdownlint.json),让规则接受连字符:

{
  "ul-style": {
    "style": "dash"
  }
}
json

现在连字符可以通过。但只用星号的文档仍然报错,改写问题依旧存在。

方案二:禁用规则#

这条规则价值不大——选择哪种符号纯属外观问题。我更喜欢直接禁用它:

{
  "ul-style": false
}
json

这样两种风格都能自由共存。每份文档保留自己的约定,无需强制改写,lint 工具也保持安静。

结论#

风格规则是观点,不是 bug。MD004 只关心你选哪种符号,而每份文档本来就会一致地选用一种。配置 "dash" 仍然惩罚现有星号文档,所以我选择 "ul-style": false,让每个文件保留自己的风格。

参考资料#