我是怎么用模版增强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 [[]]
等。
自动化关联
1. backlink
如下所示,在指定的文档中添加当前文档的 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+"]]")
}
2. outgoing link
如下所示,根据文档命名的规则或者固定文档名添加 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") %>"
> ```
效率改善
将模版直接绑定快捷键从而提升使用模版的效率:
- 在 Obsidian vault 中创建一个模版目录,例如
8.templates
; - 在第一步创建的目录下创建 markdown 文件,文件自行命名即可;
- templater 配置,如下图所示三处需要配置:1)指定模版目录;2)打开触发执行;3)配置快捷键;
- 创建好笔记文档之后,直接用 Templater 中配置的对应模版的快捷键(例如 cmd + 1)自动生效模版;
附录
读者们很好奇我用了哪些插件和自定义样式,文末我就附上在使用的 obsidian plugin 和自定义用的 snippets,具体内容都以在我的 pkm-template 中找到。
plugin list
- personal-assistant
- calendar
- callout-manager
- dataview
- find-unlinked-files
- hotkeysplus-obsidian
- markdown-table-editor
- obsidian-advanced-uri
- obsidian-charts
- obsidian-contextual-typography
- obsidian-emoji-toolbar
- obsidian-frontmatter-tag-suggest
- obsidian-git
- obsidian-hider
- obsidian-hover-editor
- obsidian-html-plugin
- obsidian-image-toolkit
- obsidian-kanban
- obsidian-memos
- obsidian-minimal-settings
- obsidian-quiet-outline
- obsidian-reminder-plugin
- obsidian-snippet-downloader
- obsidian-style-settings
- obsidian42-brat
- quickadd
- readwise-official
- table-editor-obsidian
- tag-search
- tag-wrangler
- tasks-calendar-wrapper
- templater-obsidian
- obsidian-importer
- telegram-sync
- better-word-count
- novel-word-count
- send-to-ghost
- surfing
- auto-card-link
- gemini-assistant
- note-gallery
- code-styler
- canvas-mindmap
- apple-books-import-highlights
- advanced-canvas
- homepage
- mononote
- tabs
- canvas-css-class
snippets
snippets 中大多是 css 文件,这里就不贴了,具体内容在 pkm-template 中。