自作プラグイン紹介
...

Note

この記事は Obsidian Advent Calendar 2023 の 11 日目の記事です。

発起人の tadashi-aikawa さん、Another Quick Switcher(まだフルには使いこなしきれてませんが)お世話になっています。

手前味噌ですが、最近おもしろいプラグインをいくつか作ったのでご紹介したいと思います。またそれと同時に、非 web エンジニアの方(自分を含む)に、プラグイン制作のハードルって意外と高くないかものかもしれないと思ってもらえたらという気持ちも込めて書いています。

前置きをスキップしたい方は こちら

はじめに
...

自己紹介
...

大学院で機械学習の研究をしている学生です。
(機械学習といえば最近話題の AI のコア技術ですが、僕の研究はあんまりああいったキラキラした感じではなく、主に機械学習の数学的な理論に興味を持って研究をしています。)

また、これまでに以下の Obsidian プラグインたちを作ってきました。

また、MathLinks というプラグインのメンテナンスと、その API の開発を collaborator としてやっています。

プラグインを作り始めた経緯
...

僕が Obsidian を使い始めたのは今年 (2023) の 7 月初頭でした。それまでは LaTeX で勉強した本や読んだ論文の自分なりのまとめノートを作っていたのですが、600 ページくらいの量になってくるとコンパイルも遅いし、目的のページにジャンプするのも一苦労だし...ということでほかのツールを探し始め、出会ったのが Obsidian でした。

しかし、正直言って当時の Obsidian は数学をやるには苦痛が大きすぎました。LaTeX では当たり前のように使えた

  • 定理環境
  • 数式の自動番号付け
  • 数式番号で数式を参照する
  • ...

といった機能が全部用意されていなかったのです。

しかし、強力なリンク機能をはじめとして Obsidian の魅力はみなさんよくご存知だと思います。僕も当然、なんとかして Obsidian で数学をやりたい...と思いました。

同時に、もしかして JavaScript さえ書ければどんな機能も作れちゃったりする??ということにうっすら気づき始めてしまってもいました。

そんなこんなで、Obsidian を使い始めた 7 月の終わり頃には、これらの不満を解消するべく最初のプラグイン LaTeX-like Theorem & Equation Referencer の制作に着手しました。

Note

このプラグインはつい最近になって "Math Booster" から改名しました。Obsidian 内のコミュニティプラグインの検索機能では、2023/12/11 現在はまだ新しい名前が反映されていないので、もしご興味のある方がいらっしゃれば "Math Booster" で検索していただく必要があります。

実は、それまでは JavaScript, TypeScript, HTML, CSS, ... などといった web 系のプログラミングには触れたことがありませんでした。(<div> ってなんだ??という状態でした)
それでもある程度の頑張りによってプラグイン開発ができてしまう API と、「あったらいいのに」というアイデアがだいたいすべて実現可能な高い拡張性とを提供してくれている Obsidian は本当にありがたい存在です。
類似のノートアプリがいくら出てきても、Obsidian と同等以上の拡張性がなければ多分乗り換えることはないと思います。

そんなこんなで、これまでに 8 つほどのプラグインを作ってきました。上述の経緯からもわかるように、大半は数学関係のものなのですが、ここ最近で書いたうちの 3 つのプラグインはどんな目的で Obsidian を使っている方にも役立ちうると思っていますので、ご紹介させていただければと思います。

Note

今回ご紹介するプラグインはいずれも新しいものなので、まだ Obsidian チームのレビューを待っている状態です。もうしばらくすれば通常の方法でインストールできるようになると思いますが、2023/12/11 時点では BRAT を使ってインストールしていただくことになります。

BRAT の最新バージョン (>=0.8.1) をインストール・有効化した状態で、以下の Install via BRAT ボタンをクリック→Add Plugin ですぐにインストールできます。有効化もお忘れなく。

Quick Preview
...

ひとことでいうと、Obsidian のリンクのサジェスト機能や Quick Switcher (さらには他のコミュニティプラグイン)に、ノートの選択前にその中身を覗き見する「クイックプレビュー」の機能を追加するプラグインです。


Obsidian では、エディタで [[ と打つとリンクのサジェスト機能が発動しますよね。こういうやつです。

Obsidian Advent Calendar 2023-20231208034841296.webp

また、Cmd/Ctrl+O で起動する Quick Switcher もみなさん使われていると思います。

これらはめちゃくちゃ便利な機能ですが、サジェストされたノート名だけではどんなノートだったか思い出せないことってないでしょうか。

マークダウンのノートなら、命名に十分気を遣っている方なら内容がわからないということはないかもしれません。しかし画像だったらどうでしょうか。Pasted image 20231208034438.png のような文字列だけでどんな画像か思い出せる超人はたぶんいないでしょう。

それが、Quick Preview を使うと、こうなります。

Alt/Option キー(デフォルト; 設定で変更可能)を押したままにすると、現在選択されているノートのプレビューが表示されます。これで、わざわざサジェストを中断してノートの中身を見にいかなくても一瞬で内容がわかりますね。もちろんマークダウンファイルだけでなく、画像や動画、PDF などもプレビューできます。

また、Heading へのリンクのサジェスト ([[note#) やブロックへのリンクのサジェスト ([[note^) に対しても、さらに Quick Switcher でも同様に機能します。

Note

さらに、他のコミュニティプラグインの開発者が、自分のプラグインのサジェスト機能 (SuggestModal, EditorSuggest, AbstractInputSuggest など) に対して簡単に同様の機能を追加するための方法を提供しています(詳細は こちら)。

続いてのプラグインも、リンクのサジェスト機能に関するもので、特に ブロックへのリンク のサジェストにおいて、マークダウンをレンダリングして表示してくれるというものです。


Obsidian では、ノート全体へのリンク [[note]] だけでなく、ノート内の特定のブロックへのリンク [[Folder Note#^block-id]] も作ることができますよね。

[[
と打って出てきたサジェストからあるノートを選択した状態で...
Obsidian Advent Calendar 2023-20231211131740227.webp
^ と打つと、選択されていたノート内のブロックの一覧が表示されます。
Obsidian Advent Calendar 2023-20231211132127299.webp
この状態で Enter を押すと選択したブロックへのリンクを挿入することができます。
でも正直、単調な文字ばかりであんまり見やすくないな...と個人的には感じていました。

しかしこのプラグインをインストールすると、こうなります。

Obsidian Advent Calendar 2023-20231211132054520.webp

マークダウンがレンダリングされて、めちゃくちゃ視認性が上がったと思います。

さらに、上でご紹介した Quick Preview と組み合わせることもできます。こうすると、選択対象のブロックの周辺のコンテクストがより見やすくなります。

ただ、なんでもかんでもレンダリングすればいいってわけじゃないんだよな...という方もいると思います。ただの文字のほうが目に優しい場合もありえますよね。

そこで、このプラグインではどんな種類のブロックはレンダリングして、どんな種類のブロックはしないか、ということを細かく設定できるようになっています。たとえば、callout と数式だけはレンダリングしたいけどそれ以外はそのままでいいや、といったことも可能です。

Dynamic Line Height for CJK
...

最後に紹介するこのプラグインは、はっきり言ってめちゃくちゃ地味です。自分で書いたくせに、有効になっているかどうかわからなくことさえあります。一体なにごとでしょうか。


日本語を含む CJK (Chinese/Japanese/Korean) 言語の文字は、英語などのアルファベットとは異なる特性をもっています。要するになんかデカいのです。

そこで、たとえば日本語のノートと英語のノートが混在する vault では、使っているフォントにもよりますが、言語に応じてノートごとに cssclasses プロパティを設定して、CSS snippet で line-height を調節する、つまり

  • 日本語のノートでは line-height を大きくする
  • 英語のノートでは line-height を小さくする

などの対策をとらないと、日本語のノートでは行間が詰まって読みにくいということが起きてしまいます。

ノートごとに切り替えるだけならまだいいのですが、同一ノート内に日本語ばっかりの部分と英語ばっかりの部分が混在していると cssclasses では対処しきれません。日本語に合わせると英語の部分の行間が大きすぎるし、かといって英語に合わせると日本語の部分の行間が狭すぎるし、という状態になってしまいます。

そこでこのプラグインの登場です。このプラグインは、ノート内の各行について、CJK 文字が含まれるか否かに応じて大小 2 種類の line-height を自動で使い分けてくれるというものになっています。

要するに、行ごとに line-height を大きくする必要がある(=CJK 文字が含まれている)かどうかを判定して、各行に適した line-height を行単位で設定してくれます。

たとえばこんな感じです(文章は こちら からの引用):

Before:

自作プラグイン紹介-20231211152447981.webp

After:

自作プラグイン紹介-20231211152931580.webp

はい、この通りめちゃくちゃ地味です。しかし、個人的には確実に役に立っています。

CJK 文字が含まれる行の line-height をいくつにするかは、Style Settings から設定できます。Obsidian のデフォルトフォントなら 1.6〜1.65 くらいが好みです。僕の研究用の vault で使っている CMU Serif+ Noto Serif JP フォントの場合は、1.75〜1.8 くらいは欲しくなります。

自作プラグイン紹介-20231211152614556.webp

おわりに
...

今回は、僕の制作しているプラグインをいくつかご紹介させていただきました。前にも書いたように、僕は本物の web エンジニアでもなんでもありません(React とかまだ全然わかりません)が、それでも頑張れば(頑張りが必要だったことは確かです)、Obsidian API のおかげでほしい機能を実現するプラグインが作れてしまいました。(正直、まだ Obsidian にまったく無関係な場所では JavaScript とか CSS とか書いたことがない気がします。)

この高い拡張性こそが Obsidian の魅力だと思っています。まだ JavaScript とか CSS とかよくわからないという場合でも、頑張れば意外となんとかなりますので、もし「こんなことできたらいいのに...」という不満がある方はぜひチャレンジしてみてほしいなと思います。

(とはいえ、API の 公式 docs はまだまだ親切とは言い難い部分も多く残っており、僕がプラグインを作り始めたときにもいろいろ苦労したのは事実です。自分のためのメモも兼ねて、このサイトには公式 docs には書いてないけど大事なことを中心にいろいろと書き溜めていこうかなと考えているので、もしご興味があれば覗いてみてください。)

ついでに
...

せっかく記事を書いたので、ほかの Obsidian ユーザの方にちょっと聞いてみたいことがあります。

Obsidian を使っていると、「フォルダーは使わずタグを使おう」というような意見をよく耳にします。ただ、正直タグ付けってちょっと苦痛じゃないですか?

フォルダーによってカテゴライズする場合は、同じフォルダ内にノートを作り続けている限りはなにも考えなくても勝手にノートがカテゴライズされていきます。

しかし、タグだけでカテゴライズしようとすると、ノートを新規作成するたびに毎回タグ付けによるカテゴリ分けを強要されます。この負荷は個人的には無視できないものがあると感じます。また、一貫性のあるタグ付けができるようになるためには相当の訓練を要するような気がしています。

もちろん、タグにはひとつのノートに複数のカテゴリを付与できるといった無視できないメリットも多くあります。なので、タグ付けの苦痛を軽減できるような何らかの仕組みがあれば最強だと思うのですが...。

なにかアイデア等あればシェアしていただけるとありがたいです。

ありがとうございました!

Update
  • TagFolderSelf-hosted LiveSync などの作者のvorotamoroz aka きみのぶさんがアンサーをくださいました。

  • Pouhonさんのサイト創造性原理にて紹介+アンサーをいただきました。やはり自分は深く考えすぎなのかな、もっと気楽にやればいいのかなと考えるきっかけになりました。しかしこれがいちばん難しい...笑(逆に、こういう性分じゃなかったらプラグインなんか作ってなかった気もします)