Templater

Obsidian 向けの高機能テンプレートプラグイン。日付・ファイル操作・JavaScript 実行・カーソル移動など、静的テキスト置換を超えた動的テンプレートを作成できる。

できること

  • 日付・時刻の動的挿入(Moment.js フォーマット対応)
  • ファイルの移動・リネーム
  • JavaScript による条件分岐・計算処理
  • テンプレート適用後のカーソル位置自動移動
  • プロンプトダイアログによるインタラクティブ入力
  • frontmatter の動的生成・後から書き換え

設定方法

  1. Obsidian の Community Plugins から “Templater” をインストール・有効化
  2. 設定画面の Template folder location にテンプレートファイルを置くフォルダを指定(例: Templates/

使い方の流れ

  1. テンプレートフォルダにテンプレートファイルを作成
  2. コマンドパレットからコマンドを実行:
    • Create new note from template — テンプレートから新規ノート作成
    • Open Insert Template Modal — 現在のノートにテンプレートを挿入
  3. 使用するテンプレートを選択
  4. (必要に応じて)カーソル移動ホットキーで入力箇所に移動

構文リファレンス

基本タグ

構文説明
<% 式 %>式の評価結果を挿入
<%* コード %>JavaScript を実行(tR で出力制御)
-%>末尾の改行・空白を除去

tR 変数

<%* ... %> ブロック内で JavaScript を書く場合、出力したい文字列を tR += で追加する。
tR =(代入)にするとそれ以前の出力が消えてしまうため注意。

<%*
let result = "";
if (tp.frontmatter.type === "ほのお") {
  result = "ほのおタイプの";
}
tR += result;
%>

内蔵モジュール(よく使うもの)

tp.date — 日付操作

// 現在の日付(デフォルト: YYYY-MM-DD)
<% tp.date.now() %>
 
// フォーマット指定
<% tp.date.now("YYYY年MM月DD日(ddd)") %>
 
// N日後(負の値で過去)
<% tp.date.now("YYYY-MM-DD", 7) %>
<% tp.date.now("YYYY-MM-DD", -7) %>

フォーマット記法は Moment.js に準拠。

tp.file — ファイル操作

// ファイルタイトル
<% tp.file.title %>
 
// 作成日時
<% tp.file.creation_date("YYYY-MM-DD HH:mm:ss") %>
 
// カーソル位置(テンプレート適用後にジャンプ先になる)
<% tp.file.cursor() %>
 
// マルチカーソル(同番号で同期)
<% tp.file.cursor(1) %>
 
// ファイルの移動とリネーム
<%* await tp.file.move("inbox/20240501120000"); -%>
<%* await tp.file.rename("新しいタイトル"); -%>

tp.system — UI操作

// プロンプトダイアログで入力を受け取る
<% tp.system.prompt("名前は?") %>

tp.frontmatter — frontmatter 参照

// frontmatter の値を条件に使う
<%* if (tp.frontmatter.status === "draft") { tR += "下書き"; } %>

tp.hooks — タイミング制御

// 全テンプレート適用後に frontmatter を書き換える
<%*
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"] = "計算した値";
  });
});
-%>

実践パターン

日時を含む frontmatter テンプレート

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

ファイルを自動的に整理する

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

同じ文字列を複数箇所に同時入力(マルチカーソル)

僕の名前は<% tp.file.cursor(1) %>です。
はじめまして、<% tp.file.cursor(1) %>です。

同じ番号を振った箇所で入力が同期される。入力完了後はエスケープキーでマルチカーソルモードを抜ける。

日付の言語を変える

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

moment.locales() で対応言語の一覧を確認できる(2024年5月時点で136言語対応)。

ボタンからワンクリック起動

Meta Bind プラグインと組み合わせることで、特定テンプレートからノートを作るボタンを Vault 内に設置できる。コマンドパレットを開く手間を省ける。

ホワイトスペース制御

-%> を使うと末尾の改行・空白が除去される。JavaScriptのみ実行して何も出力しない行の空行を消したい場合に便利。

// 空行が残る
<%* await tp.file.move("inbox/file"); %>
 
// 空行が消える
<%* await tp.file.move("inbox/file"); -%>

詳細: Whitespace Control - Templater

カーソル移動のホットキー設定

コマンド Jump to next cursor location にホットキーを割り当てると tp.file.cursor() で定義した次の位置に素早くジャンプできる。スペルは “cursor”(“cursor”)なので注意。

実践例: ノートメタデータの自動付与(Reo)

俺的Obsidianのつかいかた で紹介されている Templater 活用パターン。新規ノート作成時にファイルの stat.ctime(作成日時)を取得し、createdDate / updatedDate / private / aliases / url を含む frontmatter を自動挿入する。日付フォーマットは ja-JP ロケール・JST で YYYY-MM-DD HH:mm 形式。

ポイント: ファイルを workspace:save-file で保存後に 200ms 遅延して addMetadata() を実行することで、作成直後の stat.ctime を正確に取得している。

---
createdDate: <自動取得>
updatedDate: <実行時刻>
private: true
aliases: []
url: ""
---

実践例: 前日の日記への自動リンク(nasubi_dev)

Obsidianが大学生活を変える! 学生必見の活用術 で紹介されている学生向けシンプル活用。デイリーノート作成時に前日の日記ノートへ自動リンクするテンプレート。

[[<% tp.date.now("YYYY-MM-DD",-1) %>の日記]]

テンプレートに保存して使用するだけで、前日エントリへのナビゲーションが自動化される。

関連