# 用 Obsidian 有效应对日常工作

两三年前，因为信息安全方面的考虑，弃坑了 Notion 和 Craft，改为使用 Obsidian 进行日常工作的记录，随着工作内容的日渐散乱，原本围绕少量项目和单一知识体系构造的笔记方法，从记录效率、到检索能力都逐渐被破坏了。因此经过一段时间打磨之后，围绕着记录、浏览和检索三个功能特性，面向我的日常工作内容，借助一系列的插件，逐步调整了我的笔记方法。目前看来，这种用事件为核心的记录方法，在日常工作中表现出的效率，的确远远超过之前以天为单位的粗放方法。

## 场景

日常工作中，需要打开 Obsidian 进行记录的情况，主要有几个场景：

* **文件往来**：这里说的文件，除了 Markdown 和 Office 三件套之外，还可能包括各种绘图、建模的存档，以及一些在线文档、代码仓、工单系统等。虽说在线文档是现在的主流，但是在面对的并行项目和工具都达到两位数，并且相互之间存在交叉的情况下，在线文档的各种网址本身也可能成为一种认知负担；更不要提“我早就发给过你”、“你从来就没发给过我”的常规战争了。
    
* **会议/沟通纪要**：日常经常有些小会、小的讨论，其结论处在“有用、有意向，但是没有公示价值”的尴尬区间，可能需要进一步的深入讨论以及决策，这些鸡肋内容如果失去记录，可能就造成信息流的中断，对于其所属的更大的项目或者产品的决策过程，也会造成一定的损失。
    
* **即兴文档**：一方面在工作范围之外，还是会有一些稍嫌杂乱的思索和摘抄；另一方面，在线交流过程中，会产生一些现场绘图、板书等也是需要记录的。
    

除了上述三种记录场景之外，更重要的是查询和展示，传统来说 Obsidian 通过文件夹、标签、搜索、（反向）链接和关系图谱对记录内容进行展示，这些方法**的确可以**显示出特定关注点的**所有**相关内容，但是通常会显得比较杂乱；除了这些之外，我们还希望有更丰富的查询和更规整的展示方式。

## 方法

综合上述场景化需求，我决定使用 Zettelkasten 的卡片记录法，结合 `Dataview` 查询来满足日常需求。

## 使用卡片快速记录

要使用卡片记录，首先要在`配置->核心插件`中，启用`时间戳笔记生成器`（`Unique note creator`）。功能启用之后，创建一个保存卡片的目录，例如 `/Cards`，然后打开这个选项，把这个目录设置为保存位置。如果有兴趣可以把时间戳格式设置成自己喜欢的样式。后续我们会针对模板进行更多工作，所以这里不会进行设置。

## 建立模板

在 Obsidian 中，模板用于设置常见的格式化内容。设置模版之后，只要用 `插入模板` 命令，就可以选择模版插入当前位置。

> 这里假设使用 `/Templates` 作为模板目录，可以在 `配置->核心插件->模板` 中设置目录。

在模板中，除了可以设置特定常用的文字、结构和内容之外，还可以使用 `{{date}}`、`{{time}}` 作为变量，在使用模板时自动写入当前日期和时间。

另外，为了便于 `DataView` 的检索，我们会使用 `字段名:: 字段内容` 的方式，为速记内容提供关系数据。

这里我根据上除的录入场景，为卡片设置了三种模板：

### 即兴写作

即兴写作其实不会有很多内容，我通常只会放置 `标题::`、`关键字::` 和 `内容` 三个段落。另外为了在 `Dataview` 中方便检索，我会在模版第一行中使用 `#卡片-即兴` 的标签。

但是在 Obsidian 中，还有一个即兴写作的东西是 Excalidraw，他可不会管你什么 Tag 什么 Dataview，其实有两种方法在 Excalidraw 文件中进行标注：

* 在浏览窗格中，使用`默认编辑器`打开绘图，会看到绘图背后的 Markdown 文档，直接在前面的 `---` 区间加入 Tag 或者 Dataview Field。
    
* 安装 `MetaEdit` 插件，直接在 Excalidraw 文件的右键菜单上就能看到加入 Tag 或者 Field 的选项。
    

### 沟通和会议

沟通和会议，主要关注的是时间、参与人、过程内容和关键结果，时间可以用前面提到的 `{{date}}`、`{{time}}` 自动填充，参与人我做成了字段。

> 涉及人的项目，我通常会用 `[[人名]]` 的方式，这样每个人都有自己的页面，一方面用反向链接查看每个人的所有相关项目，另一方面可以为这个人加入诸如联系方式、邮件、组织关系等的注释。 注意：`参与人::` 后面如果写入多个人名，Dataview 会认为这是一整个字符串，要形成数组方式，应该用 `参与人:: [[张三]] 参与人::[[李四]]` 的方式。

会议结论里通常会包含 TODO 项目，这里可以使用 `Task` 插件，形成待办列表。（后面的 `Dataview` 章节会介绍 `Task` 专属的视图）例如在 7 日之前联系张三：

`- [ ] 会见 [[张三]] 修改诉讼方案 📅 2024-10-07`

### 快速插入模版

因为前面没有给卡片设置缺省模版，所以新建卡片是空白的，这里选择模版再插入就有些麻烦了，因此我安装了 `Hotkeys for templates`，这个插件可以为每个模版设置快捷键，方便你夹着电话的时候快速构建内容。

### 文件往来

文件通常也是沟通的一种，不同的是要对文件进行处理，这里我主要借助的是 `Custom Attachment Location` 插件，在他的配置中，有一个 `Location for New Attachments` 的项目，可以设置把附件文件保存到当前笔记的相对目录下，例如我设置的是 `./assets_of_$filename`，如果当前卡片是 `202410011820`，则黏贴进来附件会被保存到 `assets_of_202410011820` 目录里。

> 注意，需要开启 `选项->文件与链接` 中的 `检测所有类型文件`。

## 使用 Dataview 快速浏览

Dataview 使用一种特定的 DSL 来对 Obsidian 中的数据进行查询，前面一节创建的卡片会有些凌乱，因此我设计了几个视图，让工作变得清晰一些。

### 首页

使用 `Home Page` 插件实现，主要目的是跟踪 Task 列表，其中使用 Dataview 编写了两个简单的视图，分别显示未完成的任务和已完成的任务。Dataview 为 Task 插件定制的语法非常简单：

````markdown
```tasks
not done
sort by due
```
````

展示未完成任务。

以及

````bash
```tasks
done
sort by done revferse
limit 10
````

展示最近十条已完成任务。

### 日记

可以使用在日记的模板里，使用变量和 Dataview 的语法，快速查询某一天的所有卡片。我的用法是，用三个不同的表格，展示每天的三种卡片。例如日记模板中，关于即兴记录：

````markdown
```dataview
TABLE 标题,关键字
FROM (#卡片-即兴 and ("Cards")) or ("Excalidraw")
WHERE (file.day=date({{time:YYYY-MM-DD}}))
```
````

* `TABLE` 这一行，表示会引用卡片中的 `标题::` 和 `关键字::` 字段。
    
* `FROM` 子句，表示从 `Cards` 目录中带有 `#卡片-即兴` 标签的卡片中，或者从 `Excalidraw` 文件中，选择当天的卡片。
    
* `WHERE` 中，要求文件日期等于 `date({{time:YYYY-MM-DD}})`。`date` 是 `Dataview` 的内置函数，负责把日期字符串转换成日期格式；而 `{{time:YYYY-MM-DD}}` 则是模板中的变量，会被替换成当前日期并进行格式化。
    

### 同类列表

除了用日记表达的每日列表之外，我还另外准备了几个页面，用于单独展示同类卡片，例如对于交流内容，我的 `Dataview` 查询是这样的：

````markdown
```dataview
TABLE 时间,主题,关键字,与会人,file.etags
FROM #卡片-沟通 and ("Cards")
SORT 时间 DESC
```
````

* 这里选择所有 `#卡片-沟通` 关键字并且在 `Cards` 目录下的卡片，按照时间降序排列。
    
* `file.etags` 会列出每个卡片中的所有标签
    

## 杂项

* **标签改名**：日常记录中难免会忙中出错，记错标签；或者因为时间的推移，要求合并前面过度细分的标签，可以用 `Tag Wrangler` 插件实现这一功能。
    
* **隐藏附件文件**：模板、或者附件文件夹，通常是无需暴露出来的，插件 `Hidden Folder` 可以使用正则表达式来隐藏这些文件夹。
