VS Code 配合 Prettier 编辑文本真好用,但是 .md 的项目列表不统一

最近开始用 VS Code,因为有 Prettier,用它来编辑文本,尤其是 Markdown 的自动格式化非常好用。但是有个问题,Prettier 自动化格式的时候,使用 *的项目列表有时候会变成 -,有时候不会,像抽盲盒令人困惑,可以让它统一都用 -吗?

我编造了一段文本,分别尝试用 VSCode 中的 Prettier 和 Prettier playground 格式化,得到的结果都是一致的:

格式化.png

其中第一段因为是用单空格缩进,不被认为是合法的多级列表,所以格式化后就变成了单级列表。

1.x 这一段是混用了多种无序列表的符号,优先统一为 - 符号,其次是 * 符号。

可以直接访问这个链接查看:Playground

我不太确定是不是跟你视频中没录到的上下文有关,建议把完整文本发上来看看。

网页版好像正常一些,更不容易出现 * 。但是在你的测试例子中,仍然出现了*

image.png

我希望的效果是,要么全部转换为-,要么全部转换为*

我新建了一个md文件,全文如下:

- 好的
  - 聪明
    - 喜欢
  * 还行
    - 不行
  * 希望不要用星号
    - 还是有星号

结果:
image.png

问题:
在第二层级的缩进,第一个是-,后面两个却是*

已经解释过了

嗯,我注意到了原文是多种混用。我的意思是多种项目列表符号混用,应该全部转换为一种。
现在这种一行-,一行*,在我看来是不正常的。

混用列表符号的情况下,每一条列表项都被认为是单独列表中的唯一列表项:

* 1
+ 2
- 3

↑ 实际上会被认为是:↓

- 1

- 2

- 3

用 AST 来表示会更加直观一点:

{
  "type": "root",
  "children": [
    {
      "type": "list",
      "ordered": false,
      "start": null,
      "spread": false,
      "children": [
        {
          "type": "listItem",
          "spread": false,
          "checked": null,
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "1"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "type": "list",
      "ordered": false,
      "start": null,
      "spread": false,
      "children": [
        {
          "type": "listItem",
          "spread": false,
          "checked": null,
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "2"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "type": "list",
      "ordered": false,
      "start": null,
      "spread": false,
      "children": [
        {
          "type": "listItem",
          "spread": false,
          "checked": null,
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "3"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

相对应的,如果是:

* 1
* 2
* 3

它的 AST 是:

{
  "type": "root",
  "children": [
    {
      "type": "list",
      "ordered": false,
      "start": null,
      "spread": false,
      "children": [
        {
          "type": "listItem",
          "spread": false,
          "checked": null,
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "1"
                }
              ]
            }
          ]
        },
        {
          "type": "listItem",
          "spread": false,
          "checked": null,
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "2"
                }
              ]
            }
          ]
        },
        {
          "type": "listItem",
          "spread": false,
          "checked": null,
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "3"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

综上,混用列表符号本就是充满歧义的,应该避免混用。

可以试试 Markdown Linter 我记得它可以提示那些不规范的地方,然后也提供了格式化。

感谢你的详细解答,现在我对项目符号混排有更深了解。

我其实并不会主动使用多种项目符号混排。补充说下我提问的原因,是因为我习惯用 * 做项目符号。就像我第一个帖子录屏里那样,我只打了 *,结果 Prettier 保存时给我转成 - 了。但 Prettier 它转换不彻底,总会剩下一两个 * 在里面。使得看起来我在使用两种符号,但其实并非如此,这恰恰是让我困扰的地方。

我还蛮喜欢 Prettier 的风格,但我会试试你推荐的 Markdown Linter。