YAML 是面向配置的数据序列化语言,用缩进表达层级。Obsidian frontmatter、Hugo 配置、GitHub Actions workflow 全是 YAML——比 ini文件 表达力强,比 JSON 可读且支持注释。

三种基础结构

映射(键值对):

name: Obsidian
version: 1.0

序列(列表):

tags:
  - Markdown
  - 标记语言

标量:字符串、数字、布尔、null(~ 或留空)。

三种结构自由嵌套:映射的值可以是序列或子映射,列表项也可以是映射——这是它碾压 ini 的地方。

缩进规则

  • 空格缩进,禁止 Tab;同级元素严格对齐
  • 缩进深度表达层级,冒号后的空格不可省
  • 惯例 2 空格一级

常用语法

# 注释——JSON 做不到
literal: |
  保留换行的整段文本
folded: >
  换行折叠成空格
quoted: "强制字符串"
single: '单引号串,反斜杠不转义'

多文档与锚点

一个文件装多个文档,用 --- 分隔——Obsidian frontmatter 的边界正是这个语法:frontmatter 就是嵌在 Markdown 头部的独立 YAML 文档(见 Markdown与HTML的关系)。

锚点与引用,复用重复片段:

base: &defaults
  adapter: postgres
  host: localhost
 
development:
  <<: *defaults    # 合并锚点
  database: dev

类型推断陷阱

YAML 自动推断类型,纯文本值必须加引号:

写法被解析为安全写法
no / Yes / on布尔值"no"(挪威问题 Norway Problem)
1.10数字 1.1,尾部 0 丢失"1.10"(版本号必加)
0755八进制(YAML 1.1)"0755"

版本号、国家代码、性别这类字段不加引号,就是事故现场。