跳过正文

一篇搞懂 Obsidian 模板系统:模板 + Templater 完整教程

·1902 字·4 分钟· loading ·
Obsidian
目录

前段时间想给自己写周记,每周都要创建一模一样的模板也太累了,我就想用Obsidian的模板功能来帮我完成这个工作。其中我也遇到了很多问题,而且网上的教程有点不全,所以打算自己写一个教程。

模板功能
#

尽管可能很多人都已经知道怎么用,但鉴于这是个傻瓜教程,所以我还是从头介绍一下Obsidian的模板功能吧。

  1. 确认自己打开了模板功能
  2. 去到模板功能设置里,设置好模板文件存放的文件夹位置
  3. 开始编写模板,这里我写了个示例
  4. 创建一个新笔记,然后插入模板,就会得到如图所示的文字:

看起来很简单对吧!但是这个模板功能目前最大的问题就是太简单了,完全没办法满足用户们多变的需求啊啊啊!!!

下图是Obsidian官方提供的模板变量,就三个!!!哪里够用啊!我当时看到的时候就是两眼一黑!

Templater
#

Templater是一种模板语言,可让您将变量函数结果插入到笔记中。它还允许您执行操作这些变量和函数的 JavaScript 代码。

安装了Templater以后就可以使用JavaScript函数给自己定义更多的模板变量从而实现自己各种各样的需求啦!

接下来我会演示几种不同的使用方式。

第一种使用方式:动态命令(Dynamic Commands
#

动态命令,表示这条命令将在进入预览模式时被动态解析,而不是在插入时就马上运行。但是现在官方正在逐步弃用动态命令这种方式,请参见Deprecation of dynamic commands

  1. 安装Templater
  2. 编写模板,这里用了官方的样例代码,但是我做了点小改动,把所有的命令都改成了动态命令(也就是<% ... %>改成了<%+ ... %>
  3. 插入模板,和上面一样的方式。点击【插入模板】按钮后就会出现
    这时,只要点击预览按钮,这些命令就会被解析,生成用户预期中的数据。所以我需要用动态命令,不然就不会在进入预览模式时被解析。解析后的结果如下图:
  4. 还有一种使用模板的方式是通过日记(或者其他周记月记插件)利用这个模板直接生成新笔记。下面我用官方的日记功能演示:
    这样生成新笔记的话,就不需要使用动态命令了,直接用普通命令即可(也就是<% ... %>,没有加号),生成的新笔记如图:
    这个方式与第三步的区别有:
  • 不需要进入预览模式就能看到数据;
  • 有些组件(最下面的Quote)展示出了不一样的效果,第三步的Quote无法成功加载,进行预览模式后还是字符串的形式。 所以更推荐第四步这个方式去利用模板生成新笔记。

第二种使用方式:执行命令(Execution Command
#

这个使用方式和上一个很类似,只是有略微的不同。我会拿我现在在用的周记模板作为例子解释。

  1. 编写模板,我的模板在两个地方用了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
    ---`
    %>
    
  2. 我下载了Periodic Notes这个插件,设置如图。也可以用系统自带的日记功能。

  3. 类似的方式生成这一周的周记,可以得到如图:

    十分方便,十分美丽!不过要注意一点,如果要从 JS 执行命令输出某些内容,要将想要输出的内容附加到该tR字符串变量(参考我的代码,我用tR字符串变量存了笔记属性,所以最后它输出了笔记属性)原理类似,那么以下命令:<%* tR += "test" %>将输出test。

第三种使用方式:自定义js文件
#

这个方式比上面那个复杂很多,花了我老长时间了!这个功能的意思就是可以运行自定义的JavaScript函数,自由空间非常大。

  1. 在Obsidian里创建一个名叫js的文件夹

  2. 切换到操作系统界面,在js文件夹里创建js文件。因为Obsidian没办法创建js文件所以要切换出来。

  3. 编写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;
    
  4. 去设置Templater

  5. 编写模板。用户自己定义的js脚本都通过tp.user去访问,软件会显示检测到的脚本选项。

  6. 生成新笔记。这样导入的js代码只能通过日记(或者其他周记月记插件)基于模板直接生成新笔记的方式使用。如果自己建好新笔记再插入模板,是不生效的。

总结
#

终于写完了,费劲死我了!!!这个模板系统真的是很复杂,我有很努力地减少知识陷阱的存在,希望我讲得足够清楚并可以帮到大家(=´∀`)人(´∀`=)