quartz の導入によって、ObsidianのFrontmatterが重要になった。例えば、titleがそのページのタイトルになるなど、単なるメモ以上にObsidianを利用する場合は、使いこなした方が良さそう。

参考: quartzで参照されるFrontmatter

しかしながら、ノートを作るたびにFrontmatterの設定をするのは面倒なので、これをObsidianのプラグインで解決する。

作るもの

新しいノートを作成したときに、自動でFrontmatterを挿入するObsidian Plugin。 実行されるのは、実質的にはファイル名を「Untitled」から変更したとき(titleの適用のため)。

手順

プラグインの作成方法はObsidian Docsに書いてあるので、これに従う。

  1. .obsidian内にplugins/myfrontディレクトリを作成
    1. myfrontを、今回作成するplugin idとする。
  2. manifest.jsonを作成
  3. main.tsを作成
  4. JavaScriptにコンパイル
  5. Obsidianを再起動
  6. 設定のCommunity pluginsから有効化

main.tsの内容:

import { App, Plugin, TFile, getFrontMatterInfo } from 'obsidian';
 
export default class RenameAutoFrontmatterPlugin extends Plugin {
  async onload() {
    this.registerEvent(
      this.app.vault.on('rename', async (file: TFile, oldPath: string) => {
 
        if (file.extension !== 'md') return;
        if (!/^Untitled\S*/.test(oldPath.split('/').pop() || '')) return;
 
        let content = await this.app.vault.read(file);
        const fmInfo = getFrontMatterInfo(content);
        if (fmInfo.exists) return;
 
        const fileName = file.basename;
        const now = new Date();
        const localNow = new Date(now.getTime() - now.getTimezoneOffset() * 60000);
        const dateStr = localNow.toISOString().split('T')[0];
        const newFrontmatter =
          `---\n` +
          `title: ${fileName}\n` +
          `tags:\n` +
          `date: ${dateStr}\n` +
          `---\n\n`;
 
        content = newFrontmatter + content;
        await this.app.vault.modify(file, content);
      })
    );
  }
 
  onunload() { }
}

その後

  • うまく動作していそう。
  • Plugin名の「Frontmatter」が「Formatter」に見間違えそう。
  • (追記)タイムゾーンの違いがあったため、JSTに対応