资讯动态

告别手工排版:Templater 动态模板引擎从入门到精通的完整指南

发布时间:2026/8/19 18:58:44 来源:尧图企业网站定制
告别手工排版Templater 动态模板引擎从入门到精通的完整指南【免费下载链接】TemplaterA template plugin for obsidian项目地址: https://gitcode.com/gh_mirrors/te/Templater你是否也有过这样的早晨打开 Obsidian新建一篇笔记然后花上两分钟手动敲入日期、星期、标题再复制粘贴上周遗留的模板格式最后还要记得删掉上一份笔记里忘记改的旧数据。我曾经的日常就是这样直到同事随手甩给我一句这种活让模板去干。今天这篇文章就是要带你把这句轻描淡写变成实实在在的本事——主角是 Obsidian 生态里最出名的动态模板插件Templater一款让你用「命令 JavaScript」自动生成笔记内容的模板引擎核心价值一句话把一切重复的排版动作交给机器你只管填写内容。一、先讲个真实故事被 200 篇会议纪要逼疯的人小林是某互联网公司的运营习惯把每次会议都记成一篇独立笔记。半年下来他的知识库里躺着 200 多篇格式各不相同的纪要有的开头没日期有的标题带了三个感叹号有的把待办事项写成Action Items想按项目汇总时根本无从下手。更糟的是每次新建纪要他都要手动完成一整套重复动作敲日期 → 敲星期 → 敲参会人 → 复制表头 → 翻日历找下次开会时间。他真正想记录的只有讨论内容四个字却被排版工作消耗了 90% 的注意力。如果你也体会过这种明明在记笔记却在干打字员的活的憋屈那么恭喜你你和 Templater 的缘分到了。它的全部使命就是让你把格式和内容彻底分离格式写一次内容每次填。二、一分钟快速上手让你的笔记第一次学会说话别急着啃文档我们先做一个 30 秒就能看到效果的最小例子。第一步建一个模板文件在 Obsidian 的任意文件夹里新建一个笔记命名随意比如快速测试粘贴下面这 3 行内容今天是 % tp.date.now(YYYY年MM月DD日 dddd) % 文件名叫% tp.file.title % 距年底还有 % tp.date.now(DDD, 0, tp.date.now(YYYY-12-31), YYYY-MM-DD) % 天先别管第二、三行是什么意思照着抄就行。第二步把模板套用到一个新笔记把光标移到一个新笔记里打开命令面板Ctrl/Cmd P输入并执行Templater: Open insert template modal选择刚才那个快速测试模板。你会看到新笔记里瞬间出现了类似这样的内容今天是 2026年08月18日 星期二 文件名叫未命名 距年底还有 135 天日期自动生成了文件名自动读出来了连距年底还有多少天这种以前要开计算器的活都被顺手干完了。 这就是 Templater 的第一印象你在笔记里写的是命令插件替你换成结果。现在你已经有资格说我用过 Templater了。接下来我们把它真正搞懂——从它到底是怎么运作的开始。三、核心机制它其实是一台自助点餐机把 Templater 想象成一台自助点餐机可能是我能想到的最贴切的比喻。你在笔记里写下的% ... %就是点餐窗口。看到这个符号插件就知道这里有订单要处理。点餐窗口里写的tp.xxx.xxx()就是菜单上的菜品。tp是菜单本身tp.date、tp.file、tp.system是菜单的分类页最后的函数名才是具体那道菜。你按下确定也就是把模板套用到笔记机器开始出餐——把命令替换成真实计算结果。整个点餐过程分两种下单方式用%下单机器会把菜结果直接端上桌用%*下单机器只在后厨干活执行代码默认不把结果端出来。那菜单上到底有哪些菜一张图带你看清整个结构图片来自项目官方文档展示的就是用户管理模板的界面后面我们会做出属于自己的那一批命令的两种下单方式下单方式长什么样机器会做什么什么时候用插值命令% 内容 %把内容算出来的结果写进笔记要输出日期、标题等简单值执行命令%* 内容 %执行 JavaScript代码本身默认不输出判断、循环、弹窗、复杂逻辑命令的三种加料在点餐窗口前后还能加三个调料符号一个都不难记调料写法作用动态%预览模式才会出餐适合显示最后修改时间这类会变的值去空格-如-%吃掉命令旁边多余的空行/空白全清除_如%_清掉命令前后所有空白菜单tp对象分类速览tp.date.now() // 日期现在、明天、昨天 tp.file.title // 文件标题、路径、内容、标签、光标位置 tp.system.prompt() // 系统弹窗问用户、下拉选择、读剪贴板 tp.web.request() // 网络请求接口、拉取每日一句 tp.frontmatter.xxx // 属性读取笔记 YAML 头里的字段 tp.app / tp.obsidian // 高层直接操作 Obsidian 本体进阶 要记住的核心只有一句一切命令都以tp.开头tp是一棵大树模块是枝干函数是叶子。四、能力地图速览这棵菜单树到底能点哪些菜在动手写模板之前花 30 秒把整棵树的枝干过一遍你会少走很多弯路。以下是 Templater 内置的全部模块及代表作模块一句话作用常用函数 / 属性举例tp.date日期时间的计算与格式化now()、tomorrow()、yesterday()tp.file当前文件的元信息与操作title、path、folder、content、tags、cursor()、include()、move()、rename()、create_new()tp.system与用户交互prompt()、suggester()、clipboard()tp.frontmatter读写笔记 YAML 头部属性tp.frontmatter.书名等任意自定义字段tp.web网络请求与内容拉取request()、daily_quote()tp.config读取插件配置tp.config.target_file、tp.config.run_modetp.hooks钩子机制如文件创建时触发用于新建即套模板的场景tp.app/tp.obsidian直接触达 Obsidian 与常用类库可调用app.vault等深层 API⚠️ 注意这张表是认知地图不是背诵清单。真正写模板时你只需要记一个查询口诀——要什么找哪个模块查哪个函数。官方文档文末有路径里每个函数都标了参数类型写错会直接报错提示你。五、实战演练三个由浅入深的原创模板理论到此为止接下来我们连着做三个能立刻上手的模板难度从入门到综合递进。请务必亲手敲一遍光看不敲等于没学。案例 1入门晨间工作日志模板——每天 3 秒开启新的一天场景与问题每天早上都要新建一篇工作日志手动敲日期、星期再把昨天的日志链接进今天的页面方便回顾。这套动作虽然不难但每天都在重复而且偶尔会记错星期。完整代码新建模板文件内容如下--- 创建日期: % tp.date.now(YYYY-MM-DD) % 星期: % tp.date.now(dddd) % 类型: 工作日志 --- # % tp.date.now(YYYY年MM月DD日) % 的工作日志等一下上面有行是故意写错的——%是无效标签别复制。这是给你的第一个陷阱测试。正确的完整版如下--- 创建日期: % tp.date.now(YYYY-MM-DD) % 星期: % tp.date.now(dddd) % 类型: 工作日志 --- # % tp.date.now(YYYY年MM月DD日) % 的工作日志 ## 今日三件要事 - [ ] - [ ] - [ ] ## 昨日回顾 [[% tp.date.now(YYYY-MM-DD, -1) %]] ## 临时记录 % tp.file.cursor() %分步讲解头部三段 YAML 属性创建日期、星期、类型全部由命令生成——日期不会再写错星期也不用再查。tp.date.now(YYYY-MM-DD, -1)里的第二个参数-1表示往前偏移 1 天也就是昨天直接生成昨天日志的链接。最后一行tp.file.cursor()是 Templater 的一个贴心功能模板套用后光标会自动停在这个位置你不需要手动往下滚直接开写就行。使用说明把这个模板放到你的模板文件夹之后每天新建笔记 → 命令面板执行Templater: Open insert template modal→ 选中它3 秒搞定一天的开场。效果预览--- 创建日期: 2026-08-18 星期: 星期二 类型: 工作日志 --- # 2026年08月18日 的工作日志 ## 今日三件要事 - [ ] - [ ] - [ ] ## 昨日回顾 [[2026-08-17]] ## 临时记录 █✅ 恭喜你已经掌握了 Templater 最核心的三个能力日期计算、属性注入、光标定位。接下来加点互动进去。案例 2进阶客户跟进记录模板——让模板会问问题场景与问题销售或运营同学每天要记录客户跟进每次都要填客户名称、客户等级、下次跟进时间还得根据等级决定话术重点。字段一多就容易漏填等级不同写法还不同。完整代码--- 客户名称: % await tp.system.prompt(请输入客户名称) % 客户等级: % await tp.system.suggester([A 级 - 重点客户, B 级 - 潜力客户, C 级 - 一般客户], [A, B, C]) % 跟进日期: % tp.date.now(YYYY-MM-DD) % 下次跟进: % tp.date.now(YYYY-MM-DD, 7) % --- # % tp.frontmatter.客户名称 % 跟进记录 ## 本次沟通要点 % await tp.system.prompt(本次沟通了哪些内容) % %* if (tp.frontmatter.客户等级 A) { -% ## A 级客户重点动作 - [ ] 一周内给出正式方案 - [ ] 约产品负责人上门演示 %* } else if (tp.frontmatter.客户等级 B) { -% ## B 级客户培育动作 - [ ] 推送行业案例 - [ ] 两周内回访一次 %* } else { -% ## C 级客户保持触达 - [ ] 每月发一次产品动态 %* } -% ## 客户原话记录 %* tR (await tp.system.prompt(客户说了什么值得记下来的话)) \n %分步讲解await tp.system.prompt(...)会弹出一个输入框把用户输入的内容写进 YAML 属性。注意这个await绝对省不得原因在进阶技巧第 1 条详述。tp.system.suggester([显示文字], [实际值])是下拉选择框第一个数组是用户看到的话第二个数组是真正写入的短值。这样 YAML 里只存A/B/C干净又好统计。中间那段%* if ... else if ... else %是真正的逻辑根据客户等级自动生成不同的动作清单。这里用了-%尾部短横线作用是吃掉执行命令带来的多余空行让输出干净。最后一行展示了tR变量的用法执行命令默认不输出想输出就把内容追加到tR字符串上。这里还顺手给客户原话加了引用符号排版一步到位。使用说明新建客户跟进笔记 → 套用模板 → 依次回答两个弹窗和一次下拉选择一份格式统一的跟进记录就完成了。等级一变动作清单自动跟着变。效果预览假设选了 B 级--- 客户名称: 王总 客户等级: B 跟进日期: 2026-08-18 下次跟进: 2026-08-25 --- # 王总 跟进记录 ## 本次沟通要点 对现有方案有兴趣主要关注落地成本。 ## B 级客户培育动作 - [ ] 推送行业案例 - [ ] 两周内回访一次 ## 客户原话记录 如果价格能再谈月底就能签。✅ 这一案例你已经用上了 Templater 的灵魂三件套用户交互prompt/suggester、条件逻辑if/else、手动输出tR。能做到这一步你已经超越了绝大多数只会贴日期的用户。案例 3综合周报自动生成器——一份模板打通数据统计与排版场景与问题每周五下午写周报要回忆这周做了啥、有哪些数据、下周计划还得统计本周新建了多少篇笔记、翻日历确认本周的起止日期。信息散落在各个笔记里回忆全靠脑补统计全靠手数。完整代码%* // ---------- 第一部分收集用户输入 ---------- const highlights (await tp.system.prompt(本周亮点用分号 ; 分隔多个)).split(;); const plans (await tp.system.prompt(下周计划用分号 ; 分隔多个)).split(;); const concern await tp.system.prompt(需要同步的困难或风险); // ---------- 第二部分计算本周时间范围周一 到 周日 ---------- const thisMonday moment().startOf(isoWeek); // 本周一 0 点 const thisSunday moment().endOf(isoWeek); // 本周日 23:59 const mondayStr thisMonday.format(MM月DD日); const sundayStr thisSunday.format(MM月DD日); // ---------- 第三部分统计本周新建的笔记数量 ---------- const files app.vault.getFiles(); let newNoteCount 0; files.forEach(file { const ctime file.stat.ctime; // 笔记创建时间戳 if (ctime thisMonday.valueOf() ctime thisSunday.valueOf()) { newNoteCount; } }); // ---------- 第四部分用 tR 组装整份周报 ---------- tR # 周报${mondayStr} - ${sundayStr}\n\n; tR ## 本周亮点\n; highlights.forEach((item, i) { tR ${i 1}. ${item.trim()}\n; }); tR \n## 本周产出数据\n; tR - 新建笔记${newNoteCount} 篇\n; tR - 周报生成时间${tp.date.now(YYYY-MM-DD HH:mm)}\n; tR \n## ️ 下周计划\n; plans.forEach((item, i) { tR - [ ] ${item.trim()}\n; }); tR \n## ⚠️ 风险与求助\n; tR ${concern}\n; %分步讲解输入收集先用三个await弹窗收集亮点、计划、风险并把亮点和计划用split(;)拆成数组——这样用户输入多少条模板就自动生成多少行不需要固定模板的条目数。时间计算moment()是 Templater 全局暴露的时间库官方文档专门提到startOf(isoWeek)/endOf(isoWeek)分别拿到本周一和本周日的准确时刻再把它们格式化成语义化字符串。数据统计app是 Templater 执行命令能直接访问的全局对象。app.vault.getFiles()拿到知识库全部文件通过file.stat.ctime创建时间判断是否落在这周从而统计出本周新建笔记数。这是纯 JavaScript 能力Templater 只是给了你一个入口。整体输出注意这里直接对tR重新赋值tR ...而不是用追加——因为前面的模板正文我们一个字都不想要整个周报全部由代码生成这样连空行都是可控的。使用说明在任意笔记中套用此模板依次回答三个弹窗整份周报即刻生成。把它绑定到一个快捷键Obsidian 设置 → 快捷键 → 搜索Templater: Open insert template modal关联周五写周报就变成按快捷键 答三个问题。效果预览模拟一次输入# 周报08月17日 - 08月23日 ## 本周亮点 1. 完成新客户演示流程梳理 2. 上线知识库搜索功能 ## 本周产出数据 - 新建笔记12 篇 - 周报生成时间2026-08-18 14:20 ## ️ 下周计划 - [ ] 跟进 A 级客户方案确认 - [ ] 输出 Q3 复盘文档 ## ⚠️ 风险与求助 演示环境偶尔卡顿需要运维支持。✅ 到这里你已经把 Templater 从填日期工具用成了轻量自动化平台用户交互 全局 API 逻辑组装三者一结合模板的想象力就没有上限了。六、进阶技巧高手都在用的 5 个提效方法技巧 1异步函数必须用await接住问题引出为什么我明明弹了输入框变量却是undefined// ❌ 错误prompt 是异步函数代码不等弹窗结果就往下跑了 const name tp.system.prompt(你的名字); tR 你好${name}; // 输出你好undefined // ✅ 正确await 会暂停模板等用户填完再继续 const name await tp.system.prompt(你的名字); tR 你好${name}; 一句话小结凡是tp.system下需要弹窗的函数前面都必须加await。技巧 2用tR精确控制整篇输出问题引出模板里有些信息只想用于判断、不想出现在最终笔记里怎么办// ❌ 错误frontmatter 也被原样输出或逻辑代码产生了一堆空行 --- 模板ID: weekly --- %* const x 1 1; % 正文开始 // ✅ 正确tR 清空一切历史输出全文由代码掌控 %* tR ; const x 1 1; % %* tR # 全新生成的标题\n\n正文内容; % 一句话小结tR是最终的稿纸想写就想重来就 。技巧 3动态命令%让内容随预览刷新问题引出笔记里显示最后修改时间可改完文件它却不更新只能重开笔记// ❌ 普通命令在套用瞬间写死之后不再变化 最后修改% tp.file.last_modified_date() % // ✅ 动态命令在预览模式下实时解析 最后修改% tp.file.last_modified_date() %⚠️ 一句话小结%能让会变的值在预览时重新计算但预览有缓存且性能有损耗只对真正需要刷新的内容使用。技巧 4用-%与%_驯服空白行问题引出套用模板后正文上方总有一堆空行看着很脏// ❌ 错误if 执行命令自身占的行会留下空行 %* if (true) { % 内容 %* } % // ✅ 正确在标签末尾加短横线吃掉执行命令产生的换行 %* if (true) { -% 内容 %* } -% 一句话小结-删一个换行_删所有空白if/else结构配合-%使用输出立变清爽。技巧 5把重复逻辑提取成用户函数问题引出好几个模板里都有同一段根据等级生成清单的代码每次都复制粘贴// ❌ 错误同一段逻辑在三个模板里各写一遍改一处忘两处 // ✅ 正确在插件设置 → 用户函数中注册一个函数模板里一行调用 %* function actionList(level) { const map { A: 重点动作, B: 培育动作, C: 保持触达 }; tR ## 动作清单${map[level]}; } actionList(tp.frontmatter.客户等级); % 一句话小结Templater 支持注册tp.user.xxx()用户函数一份逻辑、处处复用模板库越大收益越高。七、排错问答新手最容易踩的 6 个坑Q1命令没有任何输出笔记里还是原来的样子❌ 写了%* tp.date.now() % 执行命令默认不输出 ✅ 改成% tp.date.now() %要点想输出结果用%%*只执行代码输出要靠tR。Q2弹窗明明填了内容结果却是undefined❌ const name tp.system.prompt(名字); ✅ const name await tp.system.prompt(名字);要点异步函数不await拿到的就是一个未兑现的承诺打印出来自然是undefined。Q3套用模板后出现一堆莫名的空行❌ %* if (...) { % %* } % ✅ %* if (...) { -% %* } -%要点执行命令占用的行会在输出里留白用短横线-吃掉它。Q4模板里用了变量但不同命令块之间传不过去❌ 一个块里定义另一个块里使用 %* const x 1; % %* tR x; % // ReferenceError: x is not defined ✅ 在同一个执行命令块里完成定义和使用 %* const x 1; tR x; %要点每个命令块是相对独立的执行环境跨块共享请用tp.user用户函数或 YAML 属性中转。Q5套用了模板但文件名/路径引用的对象不存在❌ 直接在模板里写死路径/日记/2026-08-18.md ✅ 用动态属性% tp.file.path % 或 % tp.file.folder %要点笔记库路径因人而异永远用tp.file提供的动态值别写死。Q6动态命令%用了一堆页面卡到怀疑人生❌ 把日期、天气、文件大小全标成动态每次预览都重算 ✅ 只对真正需要每次打开都更新的少数内容用 %要点动态命令有性能成本且 Obsidian 对预览有缓存改动后需要关闭重开才会刷新。八、是时候动手了给你的行动清单从今天起把这篇文章沉淀成你自己的技能只需要三步第一步10 分钟照着一分钟快速上手建第一个模板亲眼看到日期自动生成。第二步30 分钟把三个实战案例逐个敲一遍重点感受await、tR、-%这三个核心语感。第三步长期梳理你日常重复率最高的笔记场景逐个做成模板存入你的模板库。进阶路上下面这些项目内的资源是你的随身地图均在仓库docs/src/目录下完整语法与参数规则docs/src/syntax.md两类命令的差异docs/src/commands/overview.md各内置模块函数清单docs/src/internal-functions/internal-modules/date-module.md、file-module.md、system-module.md进阶的tp.web网络能力docs/src/internal-functions/internal-modules/web-module.md想深入源码理解实现核心逻辑在 src/core/parser/Parser.ts命令解析器与 src/core/functions/internal_functions/各模块源码安装配置与 FAQdocs/src/installation.md、docs/src/faq.md最后送你一句话模板不是写给现在的你的是写给一年后还要重复这套动作的你的。今天花半小时搭一个模板明天你就多了半小时去做真正重要的事。现在就打开 Obsidian新建你的第一个% tp.date.now() %吧——你的效率革命就从这一行开始。【免费下载链接】TemplaterA template plugin for obsidian项目地址: https://gitcode.com/gh_mirrors/te/Templater创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价