用 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 插件定制的语法非常简单:

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

展示未完成任务。

以及

```tasks
done
sort by done revferse
limit 10

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

日记

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

```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}})dateDataview 的内置函数,负责把日期字符串转换成日期格式;而 {{time:YYYY-MM-DD}} 则是模板中的变量,会被替换成当前日期并进行格式化。

同类列表

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

```dataview
TABLE 时间,主题,关键字,与会人,file.etags
FROM #卡片-沟通 and ("Cards")
SORT 时间 DESC
```
  • 这里选择所有 #卡片-沟通 关键字并且在 Cards 目录下的卡片,按照时间降序排列。
  • file.etags 会列出每个卡片中的所有标签

杂项

  • 标签改名:日常记录中难免会忙中出错,记错标签;或者因为时间的推移,要求合并前面过度细分的标签,可以用 Tag Wrangler 插件实现这一功能。

  • 隐藏附件文件:模板、或者附件文件夹,通常是无需暴露出来的,插件 Hidden Folder 可以使用正则表达式来隐藏这些文件夹。

comments powered by Disqus
下一页
上一页