🐡

ObsidianでRibbonに設定したボタンで特定のテンプレートのファイルを生成する

2025/03/02に公開

概要

obsidianでzettelkastenを始めてみようと思う。
zettelkastenはアイディアのカードと書籍のカードを作るのがお作法。

この時アイディアや書籍のカードを簡単に作れるようにするため、ノートの名前は重複させないようにユニークノートクリエイターを使うのが定石らしい。
ということで、設定をして使ってみた、

しかしユニークノートクリエイターは単一の設定しかできないらしく、以下の点がで困った。

  • アイディアと書籍でFrontMatterの内容を変えたいが、できない
  • アイディア用のカードと書籍用のカードがファイル名で区別できない

アイディア用のカードを作ってからテンプレートの挿入で書籍拗音FrontMatterを上書きする方針でやってみたが、チョットめんどくさい。
ということで初めてのカスタムプラグインを作って対応してみた。

Ribbonアイコンクリックで特定のテンプレートのファイルを生成する。

最初はtemplaterをカスタムプラグインから呼び出して対応できるかと思い、方法を探してみたのですが、やり方がわかりませんでした。
ChatGPTにきいても存在しないAPIを呼びだすハルシネーション情報しか出してくれず困りました。

ということで、カッコ悪いですが、テンプレートはプラグイン内にconstで定義してファイルを作ることにしました。
必要なのは以下の2ファイル。これをvaultの.obsidian/pluginsにmy-add-book-plugin 等のディレクトリを作成して配置する。

.obsidian
├── plugins
│   ├── my-add-book-plugin
│   │   ├── main.js
│   │   └── manifest.json

main.js

const { Plugin } = require("obsidian");

const datetime = moment().format("YYYY-MM-DD HH:mm:ss");
// ファイルのテンプレート
const content = `---
alias:
date: ${datetime}
tags:
 - 書籍/著者/unknown
 - 書籍/出版社/unknown
 - 書籍/発売日/unknown
 - ISBN/unknown
---

# 概要

# ためになったところ

# 残った疑問

# どう活かすか
`

class MyAddBookPlugin extends Plugin {
    async onload() {
        console.log("[MyAddBookPlugin] onload() が実行されました。");

        // リボンボタンを追加
        this.addRibbonIcon("book", "書籍メモ作成", async () => {
            console.log("[MyAddBookPlugin] ボタンがクリックされました!");

            // ノート作成のための情報
            const fileName = `book-${window.moment().format("YYYYMMDDHHmmss")}.md`; // ユニークなファイル名
            const folderPath = "temp"; // メモを保存するフォルダ
            const templatePath = "templater/book"; // 使用するテンプレートのパス

            // 新規ノートを作成
            const filePath = `${folderPath}/${fileName}`;
            const file = await this.app.vault.create(filePath, content);
            console.log(`[MyAddBookPlugin] 新規メモを作成: ${filePath}`);

            // 作成したノートをエディタで開く
            const leaf = this.app.workspace.getLeaf(true);
            await leaf.openFile(file);
            console.log("[MyAddBookPlugin] ノートをエディタで開きました");
        }); 

        console.log("[MyAddBookPlugin] リボンボタンの追加が完了しました。");
    }   

    onunload() {
        console.log("[MyAddBookPlugin] プラグインをアンロードしました。");
    }   
}

// Obsidian にプラグインとして登録
module.exports = MyAddBookPlugin;

manifest.json

{
    "id": "my-add-book-plugin",
    "name": "My add book plugin",
    "version": "1.0.0",
    "minAppVersion": "0.12.0",
    "author": "hoge",
    "description": "書籍ページ作成",
    "isDesktopOnly": true
}

こんな感じ

templateファイルを使うようにしたい!
もっといい方法あったら教えて下さい 🙇

Discussion