Obsidianにはまっている

Obsidian
今まで、メモツールは、いろんなマークダウンエディタ試したり(BoostNoteとか)、VSCode使ってみたり、jupyternotebook使ってみたり、最終的には自作ツール作ってみたり(ReactとElectronなど)、かなり漂流していたのだけれど、ほしい機能が全部入りのメモツールにであってしまった。
Obsidian…。
いろいろメモをとりたいとメモを開く→気が付くとObsidianに関するメモを延々に取り続けてしまうというObsidian沼にどっぷりハマってしまう不思議ツール。
今じゃ毎日触って、メモとって、個人的なプラグインまで作ってカスタムしまくって楽しんでいる。
VSCodeでも、似たようなことができるとは思うけれど、あくまでもメモ特化なところがいい。公式コミュニティでいろんな人たちのメモ管理術覗けるのも楽しい。そして、スマホアプリまである。
ある程度Javascriptが触れれば、自分だけの自分のためだけの記憶の図書館が作れてしまうので、非常におすすめ。したいけれど、おすすめする相手がいないのでひっそりとここに記す。

コミュニティプラグインのリポジトリは要チェック
大きめのプラグインのリポジトリにはたいてい、SampleVaultが入っていて、プラグイン実際に使ったデータが入っている。フォルダをvaultとして開けばドキュメントよりも参考になるので、有名どころのプラグイン使う場合は要チェック。

メタデータなのかプロパティなのかフロントマターなのか
私だけかもしれないけれど、ファイルの冒頭に記述できるyamlの項目のことを色んな呼び方しててわけがわからない!となる。
メタデータ
ファイルに保存されている様々なオプションデータのこと。Obsidianでメタデータと言うときはプロパティ機能で表示できるデータだけではなく、表示できない隠し値なんかもも含めて指し示す場合がある。Markdownのmetadataという仕組み自体はマークダウン界隈では一般的なもの(ただし、標準仕様ではない)。
プロパティ
Obsidian独自の呼称。1.4のバージョンアップ(2023年8月ごろ)で追加された機能(Obsidian 1.4 Desktop (Public) - Obsidian)。ノートのメタデータを簡単に編集できる仕組み。もしくはプロパティ機能で編集できるデータそのもののことをプロパティと呼んでいる。と思われる。
フロントマター
Obsidianではファイル冒頭に記述されたyaml部分のことを指す。YAML Frontmatterという形式自体はJekyll(静的サイトジェネレータ)により普及した形式。YAML front matter の使用 - GitHub Docs
おぼろげな私の理解はこんな感じ。

ノート内でjavascriptを実行する方法
あまりにもたくさんの方法があるので自分が主に使っているもの。
dataview
プラグインのdataviewをインストールして、dataviewjsを利用する。
dataviewjsというコードブロックに記載したコードが即時実行される。
dv変数から各種APIにアクセスできる。
// luxon
dv.paragraph(this.luxon.DateTime.now().toFormat('yyyy年MM月dd日(cccc) HH:mm:ss'));
// obsidian Api
dv.paragraph(dv.app.workspace.getActiveFile().path);
// dataview
dv.table(
['name', 'created'],
dv
.pages()
.slice(0, 10)
.map(page => [page.file.name, page.file.ctime.toFormat('yyyy-MM-dd HH:mm:ss')])
);
▼実行結果
js-engine
mProjectsCode/obsidian-js-engine-plugin (github.com)
プラグインのjs-engneをインストールして利用する。
meta-bindという、プロパティをカスタムフォームから扱える便利なプラグインを利用するのに必須なので、よくこれを利用させてもらっている。
engine変数から各種APIにアクセスできる。
returnで返したものが、描画される。
至れり尽くせりなAPIが用意されているので、ノートのプロパティの変更を監視して、関数を呼び出したり描画したりと、いろいろなことができる。
const markdownBuilder = engine.markdown.createBuilder();
// obsidian Api
markdownBuilder.createParagraph(engine.app.workspace.getActiveFile().path);
// contextから呼び出し元の様々な情報(メタデータなど)が取得できる
markdownBuilder.createParagraph(context.file.path);
// 現在のブロックのコードをそのままコードブロックにして出力
markdownBuilder.createCodeBlock('javascript', component.content);
return markdownBuilder;
▼実行結果