我是怎么用模版增强Obsidian的

书接上回,在我是如何用Obsidian进行创作管理的一文中我介绍了如何使用 Dashboard 模版进行个人的写作管理,有订阅者私信想知道除了 Dashboard 模版之外,我还有哪些 Obsidian 模版可以直接复用的,另外有哪些 Obsidian 插件或者工具推荐的,这篇文章就是介绍一下这些内容。

关于 Obsidian 模版、工具、插件这些辅助工具我的思考跟开发插件 Personal Assistant 是一样的,我期望使用 Obsidian 的时候它可以解放我的时间精力,让我少耗费时间来做管理,多把时间花在记录和思考上,就像我很喜欢的博主小胡在他的印记中写道的 —— 多写点内容,少折腾工具 | 印记,所以模版、工具、插件我也是抱着同样的态度,能帮助我减少管理成本专注于记录和思考就好。

当然,这只是我自己的态度,不是对读者的劝诫,折腾工具甚至赚到不菲的报酬的大有人在,读者知道自己要什么就好。

基本原理

除了格式化文本之外,模版我主要依赖的是 Templater 插件和 js 脚本,同时我尝试 go wasm 技术栈,技术路径行得通但是效率不高,用在 Obsidian 模版上有点杀鸡用牛刀(可以参考我的技术验证文档:go WASM 技术在 Obsidian 中的 MVP 验证),另外我也尝试过 python 脚本,它需要用到 nodejs 的 API 会导致模版只能在桌面端生效,移动端无法使用。

模版

我常用的模版涉及到 Obsidian 的多个场景,主要包括:kanban、canvas、diary、专题写作、时间进度条模版工具等,具体内容可以在 pkm-template/8.templates 中找到,可以按需自取。因为技术是大同小异,我以 Diary 模版为例介绍一下怎么定制和应用模版的,如下是 Diary 模版:

---
title: <% tp.file.title %>
date: <% tp.file.creation_date("YYYY-MM-DD HH:mm:ss") %>
modify: <% tp.file.last_modified_date("YYYY-MM-DD HH:mm:ss") %>
author: edony.zpc
tags: []
aliases:
  - <% tp.file.creation_date("YYYY-MM-DD") %>
---
%%
subject: #005-diary
status: 
type: 
publish: false
%%
# <% tp.file.title %>
> ==[[<% tp.date.now("YYYY") %>]]==,甲辰年,我在杭州。记录自己的生活,经历自己的生命,观察这个可爱的世界。

## reminder
%%
- **yesterday**:
> [!abstract]-  [[Diary-<% tp.date.yesterday("YYYY-MM-DD") %>]]      ❌  =  **`= length(filter([[Diary-<% tp.date.yesterday("YYYY-MM-DD") %>]].file.tasks, (t) => !t.checked))`**,✅  =  **`= length(filter([[Diary-<% tp.date.yesterday("YYYY-MM-DD") %>]].file.tasks, (t) => t.checked))`**
> 
> \`\`\`dataview
> TASK FROM "4.permanent/permanent-diary/permanent-<% tp.date.now("YYYY") %>/Diary-<% tp.date.yesterday("YYYY-MM-DD") %>"
> \`\`\`

- **reminder**:记录 daily task,结合 Reminder 插件进行适当提醒
%%
- [ ] 

## memos
%%
memos:一个摘抄和浏览的地方,一些好词、好句、好的思考的聚集地,这里都是别人的东西,作为一个语料库,同时满足自己的收藏癖……
%%
$$\textcolor[RGB]{250,0,0}{------\varkappa------}$$

<%* 
    let fileName = tp.file.title
    let year = tp.date.now("YYYY")
    let targetFile = tp.file.find_tfile("1.index/index-diary/"+year)
    let content = await this.app.vault.read(targetFile)
    if (content.includes("- " + "[[" + fileName + "]]")) {
        new this.window.Notice("already have linked " + fileName + "in " + year)
    } else {
        this.app.vault.append(targetFile, "\n"+"- "+"[["+fileName+"]]")
    }
%>

**关键词总结**:

结构化文本

结构化文本可以根据需要填写固定的稳定和格式内容,Diary 模版包括了 obsidian property 以及一些固定的文本内容章节段落结构、关键词、标签等,还包括一些结构化的 markdown 语法内容,例如待办事项 - [ ]、wiki link [[]] 等。

自动化关联

如下所示,在指定的文档中添加当前文档的 backlink,以 Diary 模版为例,因为我的模版 index 管理 Diary 笔记是根据年进行划分的,所以就在 index-diary/{year} 中添加当前 Diary 笔记文档的 backlink。

let fileName = tp.file.title
let year = tp.date.now("YYYY")
let targetFile = tp.file.find_tfile("1.index/index-diary/"+year)
let content = await this.app.vault.read(targetFile)
if (content.includes("- " + "[[" + fileName + "]]")) {
    new this.window.Notice("already have linked " + fileName + "in " + year)
} else {
    this.app.vault.append(targetFile, "\n"+"- "+"[["+fileName+"]]")
}

如下所示,根据文档命名的规则或者固定文档名添加 outgoing link。

[[<% tp.date.now("YYYY") %>]]

[[Diary-<% tp.date.yesterday("YYYY-MM-DD") %>]]

3. dataview DSL

模版中会添加一些用 dataview 做统计或者数据分析之类的能力,如下所示 Diary 添加 dataview 的 DSL 用作昨天任务(task)的统计和现实,并结合 callout 现实相关未完成任务的内容信息:

- **yesterday**:
> [!abstract]-  [[Diary-<% tp.date.yesterday("YYYY-MM-DD") %>]]      ❌  =  **`= length(filter([[Diary-<% tp.date.yesterday("YYYY-MM-DD") %>]].file.tasks, (t) => !t.checked))`**,✅  =  **`= length(filter([[Diary-<% tp.date.yesterday("YYYY-MM-DD") %>]].file.tasks, (t) => t.checked))`**
> 
> ```dataview
> TASK FROM "4.permanent/permanent-diary/permanent-<% tp.date.now("YYYY") %>/Diary-<% tp.date.yesterday("YYYY-MM-DD") %>"
> ```

效率改善

将模版直接绑定快捷键从而提升使用模版的效率:

  1. 在 Obsidian vault 中创建一个模版目录,例如 8.templates
  2. 在第一步创建的目录下创建 markdown 文件,文件自行命名即可;
  3. templater 配置,如下图所示三处需要配置:1)指定模版目录;2)打开触发执行;3)配置快捷键;
  4. 创建好笔记文档之后,直接用 Templater 中配置的对应模版的快捷键(例如 cmd + 1)自动生效模版;

附录

读者们很好奇我用了哪些插件和自定义样式,文末我就附上在使用的 obsidian plugin 和自定义用的 snippets,具体内容都以在我的 pkm-template 中找到。

plugin list

snippets

snippets 中大多是 css 文件,这里就不贴了,具体内容在 pkm-template 中。

References

  1. User Scripts - Templater
  2. Dataview