part-5 · 插件生态与扩展

Templater 专题:让模板学会思考

从日期函数到用户脚本,掌握 Obsidian 最强大的模板引擎,把重复劳动交给自动化。

核心的 Templates 插件够轻巧,但它只有 {{date}}{{time}}{{title}} 三个占位符,遇到稍微复杂的需求就捉襟见肘。Templater(作者 SilentVoid13)则是它的”究极进化形态”——一种完整的模板语言,支持变量、函数、JavaScript、系统命令,甚至能在新建文件时自动触发。本篇带你从区别讲起,一路走到实战模板库。

Templater 与核心 Templates 的区别

维度核心 TemplatesTemplater
占位符{{date}}{{time}}{{title}}上百个内置函数 + 自定义函数
语法{{...}}<% ... %>
执行逻辑仅做文本替换可执行 JS、调用系统命令、异步操作
触发时机手动调用命令插入可在新建文件时自动触发
光标控制支持多光标跳转

如果你的模板需求超过”插入今天的日期”,就该让 Templater 接手了。

模板文件夹与触发时机

安装并启用 Templater 后,先做两项基础设置:

  1. 模板文件夹:在设置里指定一个存放模板的目录(如 Templates/),Templater 只会从这里读取模板文件。
  2. 触发时机:开启”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.titletp.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.renametp.system.prompt 等进阶函数。当你某天发现,新建一篇笔记后标题、属性、目录、链接全部自动就位,那种”一切就绪”的爽感,会让你再也回不去手动建笔记的日子。