🪨

Obsidianプラグイン開発備忘録

2024/10/14に公開

公式のサンプル だけでは結構苦戦したので備忘録まで。

作ったもの

https://github.com/AWtnb/obsidian-yonda

読書管理用の自作プラグインです。

  • 日本のISBNにしか対応していない
  • OpenBDで書誌情報を検索している

といったことで完全に個人使用目的なのでコミュニティプラグインとしては未公開です。

ISBNを自動補完してノートを新規作成したり、

ノート名がISBN13桁であればそこから書誌情報を検索してフロントマターを生成するモーダルを表示したり、

ノート内であれば引用やメモ用の記号を挿入しやすくしたり、色々と機能を盛り込んでみました。


コマンドの追加方法は3つ

callback によるシンプルな登録

https://github.com/obsidianmd/obsidian-sample-plugin/blob/daa0cba23c36bbdd033087a1f7e6463b57b5ebf5/main.ts#L31-L38

コマンドパレットから選択して実行したい関数を callback に登録する。

checkCallback で条件を詳細にチェックして登録

https://github.com/AWtnb/obsidian-yonda/blob/e9be8c6b5f4e56d3ee18ddf4354ae430d3dc0626/main.ts#L28-L37

コマンドを実行できる状況かを事前にチェックしたいときは checkCallback を使う。
checkCallbacktrue を返したときだけコマンドパレットに表示されるようになるので、特定の種類のファイルを開いているときだけパレットに表示したいような場合に適しているのがこの方法。

さらに詳しい解説 によると、Obsidianはコマンドパレット表示時に各コマンドの checkCallbacktrue を渡すことで一覧表示可能か判定しているとのこと。

ということで、(上記の yonda-open-register-modal など)常にパレットに表示していいようなコマンドであれば前述の callback を使っても変わりない。

editorCallback でエディタのテキスト操作を登録

https://github.com/AWtnb/obsidian-yonda/blob/e9be8c6b5f4e56d3ee18ddf4354ae430d3dc0626/main.ts#L50-L57

開いているノートの内容を操作するなど、エディタのマクロ的なコマンドを登録するのであれば editorCallback を使う。

引数として editorview が渡されるので、コールバック側ではこのようにして文字列の挿入・置換やカーソル移動などを制御できる。

https://github.com/AWtnb/obsidian-yonda/blob/460ad1ba0c054dc575f2e059ee16fb9130336333/helpers/inlist.ts#L43-L61

アイコンは外部サイトから指定する

公式 にあるように、各コマンドのアイコンは lucide.dev から読み込んでいる様子。

リボンにコマンドを表示させる

https://github.com/AWtnb/obsidian-yonda/blob/460ad1ba0c054dc575f2e059ee16fb9130336333/main.ts#L20-L22

addRibbonIcon を使えばOK。

モーダル作成

Modal クラスを継承することで自作のモーダルを作れる。

要素の作成

onOpen 内で createSpan / createDiv / createEl を使うことで要素を追加していく。入れ子にすることもできる。

const { contentEl } = this; // サンプルに準拠
contentEl.createEl("label", {
	text: "ラベルです",
}).createEl("button", {
	text: "ボタンです",
})

上記のコードは下記の要素を生成する。

<label>ラベルです<button>ボタンです</button></label>

各種属性は {text: "ボタンです"} のようにオブジェクトとして渡す(補完も対応しているので困ったらCtrl+Space)。

クラスは {cls: "hogehoge"} とするほかに addClass() も用意されている。

スタイル指定

styles.css で指定。
モーダル全般に反映されるので、各モーダルの生成時にidを指定しておくとベター。

https://github.com/AWtnb/obsidian-yonda/blob/460ad1ba0c054dc575f2e059ee16fb9130336333/Modals/Register.ts#L14-L15

https://github.com/AWtnb/obsidian-yonda/blob/460ad1ba0c054dc575f2e059ee16fb9130336333/Modals/Frontmatter.ts#L69-L70

https://github.com/AWtnb/obsidian-yonda/blob/460ad1ba0c054dc575f2e059ee16fb9130336333/Modals/Chapter.ts#L19-L20

モバイルアプリのエミュレート

公式 にあるように、Ctrl+Shift+I で開くコンソールにコマンドを入力してエミュレートできる。

this.app.emulateMobile(true);

トグルする場合は次のように。

this.app.emulateMobile(!this.app.isMobile);

Discussion