前段时间想给自己写周记,每周都要创建一模一样的模板也太累了,我就想用Obsidian的模板功能来帮我完成这个工作。其中我也遇到了很多问题,而且网上的教程有点不全,所以打算自己写一个教程。
模板功能#
尽管可能很多人都已经知道怎么用,但鉴于这是个傻瓜教程,所以我还是从头介绍一下Obsidian的模板功能吧。
- 确认自己打开了模板功能
- 去到模板功能设置里,设置好模板文件存放的文件夹位置
- 开始编写模板,这里我写了个示例
- 创建一个新笔记,然后插入模板,就会得到如图所示的文字:
看起来很简单对吧!但是这个模板功能目前最大的问题就是太简单了,完全没办法满足用户们多变的需求啊啊啊!!!
下图是Obsidian官方提供的模板变量,就三个!!!哪里够用啊!我当时看到的时候就是两眼一黑!
Templater#
Templater是一种模板语言,可让您将变量和函数结果插入到笔记中。它还允许您执行操作这些变量和函数的 JavaScript 代码。
安装了Templater以后就可以使用JavaScript函数给自己定义更多的模板变量从而实现自己各种各样的需求啦!
接下来我会演示几种不同的使用方式。
第一种使用方式:动态命令(Dynamic Commands)#
动态命令,表示这条命令将在进入预览模式时被动态解析,而不是在插入时就马上运行。但是现在官方正在逐步弃用动态命令这种方式,请参见Deprecation of dynamic commands。
- 安装Templater
- 编写模板,这里用了官方的样例代码,但是我做了点小改动,把所有的命令都改成了动态命令(也就是
<% ... %>
改成了<%+ ... %>
) - 插入模板,和上面一样的方式。点击【插入模板】按钮后就会出现
这时,只要点击预览按钮,这些命令就会被解析,生成用户预期中的数据。所以我需要用动态命令,不然就不会在进入预览模式时被解析。解析后的结果如下图: - 还有一种使用模板的方式是通过日记(或者其他周记月记插件)利用这个模板直接生成新笔记。下面我用官方的日记功能演示:
这样生成新笔记的话,就不需要使用动态命令了,直接用普通命令即可(也就是<% ... %>
,没有加号),生成的新笔记如图: 这个方式与第三步的区别有:
- 不需要进入预览模式就能看到数据;
- 有些组件(最下面的Quote)展示出了不一样的效果,第三步的Quote无法成功加载,进行预览模式后还是字符串的形式。 所以更推荐第四步这个方式去利用模板生成新笔记。
第二种使用方式:执行命令(Execution Command)#
这个使用方式和上一个很类似,只是有略微的不同。我会拿我现在在用的周记模板作为例子解释。
编写模板,我的模板在两个地方用了Templater,这个代码会给我计算这一周每天的日期,并存在
weekDays
这个变量里,接着代码会输出---
开头的笔记属性。展开代码/收起
<%* const created = tp.file.creation_date(); const m = window.moment(created); const monday = m.clone().startOf("isoWeek"); const weekDays = []; for (let i = 0; i < 7; i++) { const day = monday.clone().add(i, 'days').format("MM-DD"); weekDays.push(day); } tR += `---\n Year: 2025 Date: ${weekDays[0]} ~ ${weekDays[6]} Location: Utrecht, Netherlands \n ---` %>
我下载了Periodic Notes这个插件,设置如图。也可以用系统自带的日记功能。
类似的方式生成这一周的周记,可以得到如图:
十分方便,十分美丽!不过要注意一点,如果要从 JS 执行命令输出某些内容,要将想要输出的内容附加到该tR
字符串变量(参考我的代码,我用tR字符串变量存了笔记属性,所以最后它输出了笔记属性)原理类似,那么以下命令:<%* tR += "test" %>
将输出test。
第三种使用方式:自定义js文件#
这个方式比上面那个复杂很多,花了我老长时间了!这个功能的意思就是可以运行自定义的JavaScript函数,自由空间非常大。
在Obsidian里创建一个名叫
js
的文件夹切换到操作系统界面,在
js
文件夹里创建js文件。因为Obsidian没办法创建js文件所以要切换出来。编写js代码。以下是我从GitHub复制来的示例代码,我把它存为
Get_Weather.js
文件。展开代码/收起
/* * @Author : 稻米鼠 * @Date : 2022-11-22 13:18:46 * @LastEditTime : 2022-11-26 08:48:27 * @FilePath : \ob-templates\Templater-Scripts\Get_Weather.js * @Description : 获取天气 * @HomePage : https://github.com/dmscode/Obsidian-Templates */ async function get_weather (city='beijing', format="天气:%c %C 气温:%t 风力:%w \\n月相:%m 日出时间:%S 日落时间:%s") { const response = await fetch("https://wttr.in/"+city+"?Tm2&lang=zh-cn&format="+format) const data = await response.text() return data } module.exports = get_weather;
去设置Templater
编写模板。用户自己定义的js脚本都通过
tp.user
去访问,软件会显示检测到的脚本选项。生成新笔记。这样导入的js代码只能通过日记(或者其他周记月记插件)基于模板直接生成新笔记的方式使用。如果自己建好新笔记再插入模板,是不生效的。
总结#
终于写完了,费劲死我了!!!这个模板系统真的是很复杂,我有很努力地减少知识陷阱的存在,希望我讲得足够清楚并可以帮到大家(=´∀`)人(´∀`=)