Files
BlogPosts/Collection/YAML用法.md

252 lines
12 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
tags:
- yaml
aliases:
- yaml用法
笔记类型:
日期: 2026/4/17
---
**YAML (YAML Ain't Markup Language) 是一种以数据为中心、对人类友好的数据序列化语言。它因其简洁和高可读性而备受青睐,尤其是在配置文件和知识管理领域。**
### 1. YAML的应用场景
#### 作为Markdown知识笔记的元数据
##### 什么是YAML Front Matter
- **定义:** 它是添加到文件第一行的一系列纯文本属性用于在Markdown等文件中添加元数据。
- **别称:** 也常被称为 front matter、页眉、前页、扉页、前言。
- **作用:** 它是一种人类可读、文件级的元数据,为笔记本身添加了结构化的信息,使得软件可以基于这些信息进行强大的自动化处理,例如分类、查询和筛选。
在Obsidian、Joplin等众多工具中YAML Front Matter是核心功能。它为一篇笔记提供了超越其正文内容的“身份信息”。
**示例:** 在一篇Obsidian笔记的开头你可以这样定义元数据。
```yaml
---
title: "我的Obsidian使用技巧"
date: 2025-08-21
tags: [Obsidian, 知识管理, YAML]
aliases: [Obsidian技巧, 如何使用Obsidian]
---
```
#### 作为AI提示词的格式
当构建复杂的AI提示词Prompt需要一种能够清晰组织指令、变量和上下文的格式。YAML在这方面表现出色。
| 格式 | 优点 | 缺点 | 适用场景 |
| ------------ | ------------------------------------------------------------ | -------------------------------------- | -------------------------------------- |
| **YAML** | 结构清晰,可读性高,易于手写和维护,适合表达复杂的层级关系。 | 语法依赖严格的缩进,对新手不友好。 | 复杂的、多参数的、需要模板化的AI任务。 |
| **Markdown** | 自由流畅,接近自然语言,适合编写故事或对话型提示词。 | 结构性差,难以定义精确的配置参数。 | 文学创作、角色扮演、简单的问答。 |
| **JSON** | 机器解析极为友好语法严格不易产生歧义是API交互的标准。 | 手写繁琐,括号和引号过多,可读性较差。 | 程序化的API调用自动化工作流。 |
#### 作为配置文件
YAML是许多现代软件和工具首选的配置文件格式因为它能清晰地表达复杂的配置结构。
- **智能家居自动化:** 在流行的开源智能家居平台 Home Assistant 中用户主要通过编辑YAML文件 configuration.yaml来设置自动化场景。例如“当太阳下山时自动打开客厅的灯”或者“当传感器检测到湿度低于40%时开启加湿器”这样的规则都是通过YAML来定义的。
- **PC游戏的插件与Mod:** 许多PC游戏尤其是沙盒类游戏如《我的世界》Minecraft的服务器插件或Mod都使用YAML文件作为配置文件。服务器的管理员或玩家可以通过修改这些 .yml 文件来调整游戏规则、设置商店物品价格、或者自定义玩家加入时的欢迎信息而无需编写任何代码。
### 2. YAML的基础语法
#### <mark style="background: #FFF3A3A6;">核心规则</mark>
1. **格式**:采用“关键词: 值”的键值对形式(关键词 英文冒号 空格 值)。
样例:
```yaml
views:
- type: table
name: 表格
order:
- file.name
- file.fullname
- file.tags
- file.folder
```
2. **空格与缩进**YAML 的语法对缩进和空格**极其敏感**,这是其结构的核心。理解并遵守这些规则是正确编写 YAML 的关键。
- **使用空格进行缩进**:通过空格缩进来表示数据的层级关系和嵌套。
- **严禁使用 Tab 键**:只能使用空格进行缩进,绝不能使用 Tab 键。混合使用或单独使用 Tab 键都会导致解析错误。
- **缩进需保持一致**:同一层级的元素必须左侧对齐(即保持相同的缩进量)。通常推荐使用 2 个或 4 个空格作为一级缩进。
- **冒号和短横线后的空格**
- 键值对的冒号 (:) 后面必须跟一个空格。
- 列表项的短横线 (-) 后面必须跟一个空格。
#### 基本数据结构
YAML 主要由三种基本数据结构组成纯量Scalars、序列Sequences/Lists和映射Mappings/Dictionaries
##### 1. 纯量 (Scalars)
纯量是单个的、不可分割的值,是 YAML 中最基本的数据单元。
- **字符串 (String)**
- 默认无需引号my_string: Hello YAML
- 单引号 ('):不会转义特殊字符,所有内容视为字面量。
- 双引号 ("):会转义特殊字符,例如 \n 会被解析为换行符。
- **数字 (Number)**:包括整数和浮点数。
- **布尔值 (Boolean)**true  false。
- **空值 (Null)**使用 null  ~ 表示。
**示例代码:**
```yaml
# 字符串
string_value: Hello YAML
quoted_string: "This is a string with a \n newline."
# 数字
integer_value: 1024
float_value: 3.14159
# 布尔值
is_active: true
is_enabled: false
# 空值
empty_value: null
another_empty: ~
```
##### 2. 序列 (Sequences / Lists)
序列是一组有序的值,类似于编程语言中的数组或列表。每个列表项由一个短横线 (-) 和一个空格开头。
**示例代码:**
```yaml
# 一个简单的水果列表
fruits:
- Apple
- Orange
- Strawberry
# 也可以使用行内inline格式
fruits_inline: [Apple, Orange, Strawberry]
```
##### 3. 映射 (Mappings / Dictionaries)
映射是键值对key-value的集合类似于编程语言中的字典或哈希表。
**示例代码:**
```yaml
# 描述一个用户的基本信息
user:
name: John Doe
age: 30
email: john.doe@example.com
# 也可以使用行内inline格式
user_inline: {name: Jane Doe, age: 28}
```
#### 复合结构:数据嵌套
以上三种基本结构可以自由组合,形成复杂的数据结构。这是 YAML 强大功能的核心体现。
**示例代码:**
```yaml
# 一个用户列表,每个用户都是一个包含详细信息的映射
users:
# 第一个用户
- name: Alice
age: 28
is_admin: true
roles: # "roles" 的值是一个序列
- editor
- publisher
# 第二个用户
- name: Bob
age: 35
is_admin: false
roles:
- viewer
```
#### 多行文本
**字面量块 `|`**:保留每一个换行。适合要“按原样呈现”的文本。
```yaml
about: |
第一行
第二行
第三行
```
解析后:`"第一行\n第二行\n第三行\n"`(注意末尾有 1 个换行因为默认是clip-保留一个结尾换行(\n但丢掉多余的尾随空行
**折叠块** `>`:把换行折叠为空格(空行保留为换行)
```yaml
about: >
这一段
被写成了多行
但会折叠成一行显示
空行用来分段
分段之间会出现真正的换行
```
解析后:`"这一段 被写成了多行 但会折叠成一行显示\n\n空行用来分段 分段之间会出现真正的换行\n"`
(你看到:单个换行被折成空格;空行保留为 `\n`末尾仍有一个换行因为clip-保留一个结尾换行(\n但丢掉多余的尾随空行
#### 注释
使用井号 (#) 进行单行注释。从 # 开始到该行末尾的所有内容都会被忽略。
```yaml
# 这是一个注释,它将被解析器忽略。
key: value # 这也是一个行内注释。
```
### 3. YAML在Obsidian中的实践
在Obsidian中YAML元数据是实现知识库从简单笔记集合升级为强大个人数据库的关键。它为每篇笔记赋予了结构化的“属性”使得自动化管理和知识发现成为可能。
#### 从YAML Front Matter到“属性”视图
最初YAML元数据需要手动在笔记顶端的`---`分隔符之间编写。为了降低使用门槛并提升体验Obsidian推出了核心的“**属性**”Properties功能。
* **可视化界面**你不再需要手动输入YAML代码可以通过一个直观的界面在笔记顶部添加、编辑或删除属性。这个界面提供了文本、数字、日期、复选框和列表等多种属性类型并会自动补全已存在的属性名和值极大地保证了数据的一致性。
* **源码对应**你在属性界面上的所有操作都会实时、准确地转换成笔记源文件顶部的标准YAML Front Matter。你随时可以切换到“源码模式”查看和编辑底层的YAML代码。
#### Obsidian原生支持的特殊属性
Obsidian会对一些特定的YAML属性赋予特殊功能让它们与软件的核心功能深度集成。
| 属性 (Property) | 功能描述 (Description) | 格式要求 (Format Requirement) |
| :--- | :--- | :--- |
| `tags` | 定义笔记的标签会自动被Obsidian的“标签面板”识别和索引。 | 必须是列表Array格式。 |
| `aliases` | 为笔记设置一个或多个“别名”,方便通过别名进行链接和搜索。 | 必须是列表Array格式。 |
| `cssclasses` | 为当前笔记应用一个或多个自定义的CSS样式片段实现特定的视觉效果。 | 必须是列表Array格式。 |
> **重要更新**从Obsidian 1.4版本开始,官方统一并强制要求这些原生属性必须使用复数形式(`tags`, `aliases`, `cssclasses`),并且它们的值必须是列表格式。
#### 设计你的个人化元数据系统
YAML的真正威力在于自定义。通过建立一套规范的元数据体系你可以为自己的知识库量身打造强大的分类和检索系统。
| 实践建议 (Practice) | 目的与描述 (Purpose & Description) | 示例 (Example) |
| :--- | :--- | :--- |
| **规范命名** | 为了便于Dataview等插件查询建议属性名全部使用小写并用下划线代替空格。 | `creation_date` |
| **笔记分类** | 使用`type``category`属性来定义笔记的类型,这是进行分类查询的基础。 | `type: book` |
| **状态追踪** | 使用`status`属性来管理笔记的生命周期或项目的进度。 | `status: seedling` (想法) |
| **建立关联** | 除了使用`[[链接]]`,你还可以用属性来定义更明确的关系。 | `author: [[作者A]]` |
#### 通过Obsidian插件让你的元数据“活”起来
你精心维护的YAML属性通过插件可以实现知识的自动化组织与呈现。
| 插件 (Plugin) | 核心功能 (Core Function) | 应用实例 (Application Example) |
| :--- | :--- | :--- |
| **Dataview** | 使用简单的查询语言DQL从整个知识库中筛选、排序和展示笔记自动生成动态的笔记列表和表格。 | 创建一个“动态首页”,自动汇总所有 `status: in-progress` 的任务。 |
| **Bases** | (官方插件) 提供一个可视化的、类似Notion数据库的界面表格、看板等来浏览和批量编辑笔记的元数据。 | 以看板视图来管理所有 `type: project` 的笔记,并拖动卡片来改变它们的 `status` 属性。 |
| **Metadata Menu** | 极大地增强了属性的编辑体验,可以为属性预设可选值或创建依赖关系,实现更高效、规范的元数据录入。 | 为`status`属性设置固定的下拉菜单选项:"待办"、"进行中"、"完成"。 |
### 4. YAML的编辑器或格式化工具
| 工具 | 类型 | 主要功能 |
| ----------------------- | -------------- | ------------------------------------------------------------------ |
| **VS Code + YAML 插件** | 桌面编辑器 | 语法高亮、自动补全、实时错误校验、代码折叠、格式化。 |
| **Online YAML Parsers** | 在线工具,例如[YAML Checker - The YAML Syntax Validator](https://yamlchecker.com/) | 快速验证YAML语法是否正确进行格式化和美化适合临时检查。 |
| **Prettier** | 代码格式化工具,例如[Prettier · Opinionated Code Formatter · Prettier](https://prettier.io/) | 通过插件支持YAML可以在项目中统一代码风格实现保存时自动格式化。 |