ObsidianのTemplaterの使い方 入門

· 12 min read

とっつきにくそうな印象のあるObsidianのプラグインTemplaterの使い方を初心者向けに紹介します。

Templaterって何ができるの?

Templaterは柔軟にテンプレートを作成・呼び出しできるプラグインです。

JavaScriptを使った日付やファイル操作、カーソル移動のAPI(機能を呼び出すしくみのこと)が用意されているため、ある程度自動化できるのがうれしいポイントです。

一次情報まとめ

先に一次情報のリンクをまとめておきます。

使い方

テンプレートの書き方解説の前に、設定と実際に使う時の流れを書いておきます。

設定

Templaterの設定Template folder locationにテンプレートファイルを置いておくフォルダを指定します。

設定でフォルダを指定すること

流れ

Templaterを使う流れは次のとおりです。

  1. テンプレートファイルを作る
  2. コマンドを実行
  3. (任意)カーソル移動

コマンドパレットからコマンドを呼び出すことでテンプレートが適用できます。

コマンドパレットで呼び出す例

Create new note from templateがテンプレートから新しくノートを作るコマンドです。
テンプレートを現在のノートに挿入するコマンドはOpen Insert Template Modalです。

どちらのコマンドでも「どのテンプレートを使うか」を選ぶ画面が出てきます。

モーダルの例

書き方

まずはファイルを作りましょう。前述のとおり、テンプレートファイルは設定で指定したフォルダにノートとして保存します。

ただの文字列ならそのまま書くだけで終わりです。お疲れさまでした~。

ただこれではTemplaterの真価を発揮できません。Templaterの真の姿、見たいですよね。

次のように<%%>で囲んだ部分は、Templaterの特別な書き方として扱われます。

<% tp.file.title %>

この囲んだ中に「日付」や「カーソル移動」など操作を書くと、テンプレート適用時に<% ... %>が指定した内容に書き換わります。

テンプレートの使用例

日付を挿入

先にサクッと日付操作の例を見ちゃいましょう。

現在の日時を挿入

一番使いそうな例から。tp.date.now()を使うと現在の日付が挿入されます。

テンプレートファイル
現在の日時: <% tp.date.now() %>

テンプレートとして使った例は次のとおりです。<%%>で囲んだ部分が2024-05-02書き換わっています。

テンプレート適用後
現在の日時: 2024-05-02

日付のフォーマットを指定する場合は、次のように括弧の中に書きます。

テンプレートファイル
フォーマットを指定した現在の日付: <% tp.date.now("YYYY年MM月DD日(ddd)") %>
テンプレート適用後
フォーマットを指定した現在の日付: 2024年05月02日(木)

たとえば年-月-日 時:分:秒(例:2024-05-01 17:22:40)で書きたいならYYYY-MM-DD HH:mm:ssと書きます。

詳しいフォーマットの書き方はMoment.jsを読みましょう。

N日後の日付を挿入

次の例は現在の7日後の日付を挿入しています。2番目の引数(プログラムに渡す値)に数値を指定することで日付を前後できます。

テンプレートファイル
一週間後の日付: <% tp.date.now("YYYY-MM-DD", 7) %>
テンプレート適用後
一週間後の日付: 2024-05-09

ちなみに-7だったら一週間前になります。

ファイルの作成日時を挿入

tp.file.creation_dateではテンプレートを適用されたファイルの作成日時を扱います。同じくフォーマットの指定が可能です。

テンプレートファイル
ファイルの作成日時: <% tp.file.creation_date("YYYY-MM-DD HH:mm:ss") %>
テンプレート適用後
ファイルの作成日時: 2024-05-01 17:22:40

カーソル移動

書き込む場所が決まっているなら、テンプレート内にカーソル移動場所を定義しておくと便利です。

<% tp.file.cursor() %>

コマンドJump to next cursor locationにホットキーを設定しておきましょう。

筆者はよく間違えてしまうのですが、スペルは”cursor”です(戒め)。補完を使っているのに手癖でぱぱっと入力し、痛い目に遭っています。

マルチカーソル

同じ文字列を別の場所にも書くなら、マルチカーソルにしておくと便利です。

cursor(1)のように文字列を使い回す箇所で同じ番号を振ると、入力が同期されます。
入力が終わったらエスケープを押してマルチカーソルモードを抜けましょう。

僕の名前は<% tp.file.cursor(1) %>です。
```
はじめまして、<% tp.file.cursor(1) %>です。
よろしくお願いいたします。
```

プロンプト

プロンプトを使った入力もできます。

プロンプト

<%%>で囲んだ部分がプロンプトで入力した文字列に書き換わります。

僕の名前は<% tp.system.prompt("名前は?") %>です。

tRとは?

ここまでは「<%%>で囲んだ部分の中身の実行結果」がそのまま文字列になっていました。
ここからはJavaScriptで加工した変数を挿入するパターンです。

たとえば、次のようなJavaScriptの変数resultを挿入するにはどうすればよいでしょうか?このまま<%%>で囲んでもエラーになります。

let result = "";
if (tp.frontmatter.type === "ほのお") {
result = "ほのおタイプの";
}
if (tp.file.tags.contains("#test")) {
result += "テスト中です";
}

<%*%>で囲み、変数tRに挿入したい変数を足すのが正解です。*tRの登場です。

<%*
let result = "";
if (tp.frontmatter.type === "ほのお") {
result = "ほのおタイプの";
}
if (tp.file.tags.contains("#test")) {
result += "テスト中です";
}
tR += result;
%>

開始タグを<%*のようにアスタリスクありにすると、変数宣言やif文など、JavaScriptを書いて実行できます。
単純にJavaScriptを実行したいだけであればここで終わりです。

変数に入れた文字列を挿入したいなら、Templaterで用意されている特別な変数tRに足します。

tRはそれまでのTemplaterの実行結果を累積していく変数です。

次のようにtRに足さずに代入してしまうと、1行目の「現在の~」の行はテンプレートとして挿入されません。

現在の日付: <% tp.date.now("YYYY-MM-DD (ddd)") %>
<%*
let result = "";
if (tp.frontmatter.type === "ほのお") {
result = "ほのおタイプの";
}
if (tp.file.tags.contains("#test")) {
result += "テスト中です";
}
tR = result;
%>

frontmatterの書き換え

frontmatterをテンプレートで書き換えたいなら2つの方法があります。

直接書き換える

まずは普通にテンプレート内にYAML形式で仕込む書き方です。通常はこれで問題ありません。

---
aliases:
tags:
created: <% tp.file.creation_date("YYYY-MM-DD HH:mm:ss") %>
---

後から書き換える

次に何らかの事情で計算した値を元にプロパティを書き換えたい場合、少し複雑です。

<%*
const title = "foooooo";
tp.hooks.on_all_templates_executed(async () => {
const file = tp.file.find_tfile(tp.file.path(true));
await app.fileManager.processFrontMatter(file, (frontmatter) => {
frontmatter["title"] = title;
});
});
-%>

tp.hooks.on_all_templates_executedで他のテンプレートの適用が終わってから実行します。そうしないと現在開かれている別の意図していないファイルのfrontmatterが書き換えられてしまうため注意です。

-%>は次の項目で解説します。

使われている関数を詳しく知りたい人向けに、関連ドキュメントのリンクも貼っておきます。

実例

ここからはもう少し実用的なテクニックの紹介です。

使った後に残る空行を消したい

TemplaterでJavaScriptの実行だけをした場合、空行になります。
空行を消したいなら終わりを-%>のようにダッシュを付けます。

ホワイトスペースの比較

ホワイトスペースの扱いは何種類かありますが基本的には「最後に-ありで空行が消える」を覚えておくだけで事足ります。

ホワイトスペースに興味のある方は公式ドキュメントWhitespace Controlをご覧ください。

日時の言語を変えたい

曜日などの言語を変えたい場合、moment.localeを使って変更します。

<%* moment.locale('en') -%>
現在の日付: <% tp.date.now("YYYY-MM-DD (ddd)") %>

英語環境の方が日本語に変えたい場合はenの代わりにjaと書きます。

対応言語と指定すべき文字列の一覧は、次のコマンドを開発者ツールなりTemplaterのスクリプトなりで呼び出して確認してください。

moment.locales()

ちなみに2024年5月2日現在は136の言語に対応しているようです。すごい!

特定のフォルダへ移動・リネーム

特定のフォルダへファイルを移動したい場合はtp.file.moveを使います。

<%*
const folder = "inbox";
const filename = tp.file.creation_date("YYYYMMDDHHmmss");
await tp.file.move(`${folder}/${filename}`);
-%>

単純にファイル名を変更したいだけならtp.file.renameも用意されています。

ボタンでワンクリック

コマンドパレットから毎回選んで呼び出すのはやや面倒です。

筆者は「ワンクリックでテンプレートからノートを作るボタン」を設置しています。便利です。

横並びボタン

画像の例ではプラグインMeta Bindを使っています。

詳しくは別の記事【Obsidian】ボタンを作れるプラグインMeta Bindの使い方に書きました。


ObsidianのプラグインTemplaterを紹介しました。
単なるテンプレートの挿入だけではなくJavaScriptが実行できるのは強力ですね。