Templater 专题:让模板学会思考
从日期函数到用户脚本,掌握 Obsidian 最强大的模板引擎,把重复劳动交给自动化。
核心的 Templates 插件够轻巧,但它只有 {{date}}、{{time}}、{{title}} 三个占位符,遇到稍微复杂的需求就捉襟见肘。Templater(作者 SilentVoid13)则是它的”究极进化形态”——一种完整的模板语言,支持变量、函数、JavaScript、系统命令,甚至能在新建文件时自动触发。本篇带你从区别讲起,一路走到实战模板库。
Templater 与核心 Templates 的区别
| 维度 | 核心 Templates | Templater |
|---|---|---|
| 占位符 | {{date}}、{{time}}、{{title}} | 上百个内置函数 + 自定义函数 |
| 语法 | {{...}} | <% ... %> |
| 执行逻辑 | 仅做文本替换 | 可执行 JS、调用系统命令、异步操作 |
| 触发时机 | 手动调用命令插入 | 可在新建文件时自动触发 |
| 光标控制 | 无 | 支持多光标跳转 |
如果你的模板需求超过”插入今天的日期”,就该让 Templater 接手了。
模板文件夹与触发时机
安装并启用 Templater 后,先做两项基础设置:
- 模板文件夹:在设置里指定一个存放模板的目录(如
Templates/),Templater 只会从这里读取模板文件。 - 触发时机:开启”Trigger Templater on new file creation”后,新建文件时会自动应用匹配的模板。可配合文件夹规则,让不同目录的新文件套不同模板——比如在
日记/下新建就自动套日记模板。
两种命令语法
Templater 用 <% %> 包裹命令,分两类:
- 动态命令
<% %>:执行后把返回值插入到笔记里。最常用。今天是 <% tp.date.now("YYYY年MM月DD日") %> - 执行命令
<%* %>:执行 JavaScript 逻辑但不输出内容,用于做”动作”而非”插入”。<%* await tp.file.rename("笔记-" + tp.date.now("YYYYMMDD")) %>
内置函数速览
Templater 把函数按模块组织,调用形如 tp.模块.函数(参数)。日期格式遵循 Moment.js 规范。
tp.date——日期
tp.date.now(format, offset, reference, reference_format):当前日期,offset 可为数字(天)或 ISO 8601 字符串。tp.date.tomorrow(format)、tp.date.yesterday(format):明天、昨天。tp.date.weekday(format, weekday, reference, reference_format):本周某天。
<% tp.date.now() %> // 2026-07-02
<% tp.date.now("Do MMMM YYYY") %> // 2nd July 2026
<% tp.date.now("YYYY-MM-DD", -7) %> // 上周同一天
<% tp.date.now("YYYY-MM-DD", "P1M") %> // 下个月(ISO 8601)
<% tp.date.now("YYYY-MM-DD", 1, tp.file.title, "YYYY-MM-DD") %> // 标题日期+1天
tp.file——文件
tp.file.title、tp.file.content:当前文件标题、内容(属性,非函数)。tp.file.creation_date(format)、tp.file.last_modified_date(format):创建/修改时间。tp.file.cursor(order):设置光标落点,插入模板后光标跳到这里,可设多个序号依次跳转。tp.file.rename(new_title)、tp.file.move(new_path):重命名、移动文件。tp.file.create_new(template, filename, open_new, folder):创建新文件。tp.file.folder(absolute)、tp.file.path(relative)、tp.file.tags:文件夹、路径、标签。tp.file.include(link):引入另一篇文件的内容并解析其中的模板命令。
<% tp.file.title %>
<% tp.file.creation_date("YYYY-MM-DD HH:mm") %>
<% tp.file.cursor(1) %>这里填正文<% tp.file.cursor(2) %>
tp.system 与 tp.web——系统与网络
tp.system.prompt(prompt)、tp.system.suggester(values):弹窗输入、选择器。tp.web.daily_quote():插入一句每日名言。tp.web.random_picture(size, query):插入一张随机图片。
tp.frontmatter 与 tp.hooks
tp.frontmatter:读取当前文件的 YAML 属性。tp.hooks:在模板执行生命周期的特定时刻插入逻辑,进阶用法。
用户自定义函数
当内置函数不够时,Templater 支持两种扩展:
用户脚本(User Scripts):在指定文件夹里放一个 .js 文件,导出一个函数,即可在模板里用 tp.user.脚本名(参数) 调用。适合封装复杂逻辑,比如调用 API 抓数据、按规则生成文件名。
// scripts/greet.js
async function greet (args) {
const name = await args.tp.system.prompt("你叫什么?")
return `你好,${name}!`
}
module.exports = greet
模板里:<% tp.user.greet() %>
系统命令(System Commands):把一条 shell 命令的输出插入模板。比如 <% tp.system.command("date") %> 会执行系统 date 命令。
[!warning] 系统命令的安全红线 系统命令拥有与你终端同等的权限,能读写文件、能联网、能执行任意程序。只在自己写的、或完全信任的模板里使用,绝不要运行来路不明的模板。这是 Templater 最强大、也最需要谨慎的能力。
实战模板示例库
日记模板
---
date: <% tp.date.now("YYYY-MM-DD") %>
tags: [日记]
---
# <% tp.date.now("YYYY年MM月DD日 dddd") %>
<< [[<% tp.date.now("YYYY-MM-DD", -1) %>]] | [[<% tp.date.now("YYYY-MM-DD", 1) %>]] >>
## 今日待办
- [ ]
## 记录
<% tp.file.cursor() %>
## 复盘
-
读书笔记模板
---
title: <% tp.file.title %>
type: 读书笔记
author:
rating:
status: 未读
created: <% tp.date.now("YYYY-MM-DD") %>
---
# 《<% tp.file.title %>》
## 基本信息
- 作者:
- 读完日期:
## 核心观点
1. <% tp.file.cursor(1) %>
## 摘抄
>
## 我的思考
-
会议纪要模板
---
date: <% tp.date.now("YYYY-MM-DD") %>
type: 会议
attendees:
---
# 会议纪要 - <% tp.date.now("MM-DD") %>
## 议题
1. <% tp.file.cursor(1) %>
## 决议
-
## 待办
- [ ] @某人
项目模板(自动重命名)
---
project: <% tp.file.title %>
status: 规划中
created: <% tp.date.now("YYYY-MM-DD") %>
---
# 项目:<% tp.file.title %>
## 目标
<% tp.file.cursor(1) %>
## 里程碑
- [ ] 启动 <% tp.date.now("YYYY-MM-DD") %>
## 相关笔记
<%* await tp.file.move("项目/" + tp.file.title) %>
Templater + Dataview 联动
两者结合,能做出”自更新的动态笔记”。典型场景:用 Templater 生成带属性的新文件,再用 Dataview 把它们汇总成视图。
例如项目模板里写入 status: 规划中,然后在看板笔记里用 Dataview 查询:
TABLE status, created
FROM "项目"
WHERE status = "规划中"
SORT created DESC
更进一步,可以在 Templater 模板里嵌入一段 Dataview 查询,让每篇新建的”项目首页”自动列出该项目的所有子任务——Templater 负责生成结构,Dataview 负责填充内容,分工明确,配合默契。
Templater 的学习回报是”复利型”的:模板写一次,受益无数次。建议从日记模板起步,把 tp.date 系列用熟;再逐步引入 tp.file.rename、tp.system.prompt 等进阶函数。当你某天发现,新建一篇笔记后标题、属性、目录、链接全部自动就位,那种”一切就绪”的爽感,会让你再也回不去手动建笔记的日子。