この記事は Obsidian Advent Calendar 2023 の 11 日目の記事です。
発起人の tadashi-aikawa さん、Another Quick Switcher(まだフルには使いこなしきれてませんが)お世話になっています。
手前味噌ですが、最近おもしろいプラグインをいくつか作ったのでご紹介したいと思います。またそれと同時に、非 web エンジニアの方(自分を含む)に、プラグイン制作のハードルって意外と高くないかものかもしれないと思ってもらえたらという気持ちも込めて書いています。
前置きをスキップしたい方は こちら。
大学院で機械学習の研究をしている学生です。
(機械学習といえば最近話題の AI のコア技術ですが、僕の研究はあんまりああいったキラキラした感じではなく、主に機械学習の数学的な理論に興味を持って研究をしています。)
また、これまでに以下の Obsidian プラグインたちを作ってきました。
僕が Obsidian を使い始めたのは今年 (2023) の 7 月初頭でした。それまでは LaTeX で勉強した本や読んだ論文の自分なりのまとめノートを作っていたのですが、600 ページくらいの量になってくるとコンパイルも遅いし、目的のページにジャンプするのも一苦労だし...ということでほかのツールを探し始め、出会ったのが Obsidian でした。
しかし、正直言って当時の Obsidian は数学をやるには苦痛が大きすぎました。LaTeX では当たり前のように使えた
といった機能が全部用意されていなかったのです。
しかし、強力なリンク機能をはじめとして Obsidian の魅力はみなさんよくご存知だと思います。僕も当然、なんとかして Obsidian で数学をやりたい...と思いました。
同時に、もしかして JavaScript さえ書ければどんな機能も作れちゃったりする??ということにうっすら気づき始めてしまってもいました。
そんなこんなで、Obsidian を使い始めた 7 月の終わり頃には、これらの不満を解消するべく最初のプラグイン LaTeX-like Theorem & Equation Referencer の制作に着手しました。
このプラグインはつい最近になって "Math Booster" から改名しました。Obsidian 内のコミュニティプラグインの検索機能では、2023/12/11 現在はまだ新しい名前が反映されていないので、もしご興味のある方がいらっしゃれば "Math Booster" で検索していただく必要があります。
実は、それまでは JavaScript, TypeScript, HTML, CSS, ... などといった web 系のプログラミングには触れたことがありませんでした。(<div>
ってなんだ??という状態でした)
それでもある程度の頑張りによってプラグイン開発ができてしまう API と、「あったらいいのに」というアイデアがだいたいすべて実現可能な高い拡張性とを提供してくれている Obsidian は本当にありがたい存在です。
類似のノートアプリがいくら出てきても、Obsidian と同等以上の拡張性がなければ多分乗り換えることはないと思います。
そんなこんなで、これまでに 8 つほどのプラグインを作ってきました。上述の経緯からもわかるように、大半は数学関係のものなのですが、ここ最近で書いたうちの 3 つのプラグインはどんな目的で Obsidian を使っている方にも役立ちうると思っていますので、ご紹介させていただければと思います。
今回ご紹介するプラグインはいずれも新しいものなので、まだ Obsidian チームのレビューを待っている状態です。もうしばらくすれば通常の方法でインストールできるようになると思いますが、2023/12/11 時点では BRAT を使ってインストールしていただくことになります。
BRAT の最新バージョン (>=0.8.1) をインストール・有効化した状態で、以下の Install via BRAT
ボタンをクリック→Add Plugin
ですぐにインストールできます。有効化もお忘れなく。
ひとことでいうと、Obsidian のリンクのサジェスト機能や Quick Switcher (さらには他のコミュニティプラグイン)に、ノートの選択前にその中身を覗き見する「クイックプレビュー」の機能を追加するプラグインです。
Obsidian では、エディタで [[
と打つとリンクのサジェスト機能が発動しますよね。こういうやつです。
また、Cmd
/Ctrl
+O
で起動する Quick Switcher もみなさん使われていると思います。
これらはめちゃくちゃ便利な機能ですが、サジェストされたノート名だけではどんなノートだったか思い出せないことってないでしょうか。
マークダウンのノートなら、命名に十分気を遣っている方なら内容がわからないということはないかもしれません。しかし画像だったらどうでしょうか。Pasted image 20231208034438.png
のような文字列だけでどんな画像か思い出せる超人はたぶんいないでしょう。
それが、Quick Preview を使うと、こうなります。
Alt
/Option
キー(デフォルト; 設定で変更可能)を押したままにすると、現在選択されているノートのプレビューが表示されます。これで、わざわざサジェストを中断してノートの中身を見にいかなくても一瞬で内容がわかりますね。もちろんマークダウンファイルだけでなく、画像や動画、PDF などもプレビューできます。
また、Heading へのリンクのサジェスト ([[note#
) やブロックへのリンクのサジェスト ([[note^
) に対しても、さらに Quick Switcher でも同様に機能します。
さらに、他のコミュニティプラグインの開発者が、自分のプラグインのサジェスト機能 (SuggestModal, EditorSuggest, AbstractInputSuggest など) に対して簡単に同様の機能を追加するための方法を提供しています(詳細は こちら)。
続いてのプラグインも、リンクのサジェスト機能に関するもので、特に ブロックへのリンク のサジェストにおいて、マークダウンをレンダリングして表示してくれるというものです。
Obsidian では、ノート全体へのリンク [[note]]
だけでなく、ノート内の特定のブロックへのリンク [[Folder Note#^block-id]]
も作ることができますよね。
[[
と打って出てきたサジェストからあるノートを選択した状態で...^
と打つと、選択されていたノート内のブロックの一覧が表示されます。
この状態で Enter
を押すと選択したブロックへのリンクを挿入することができます。
でも正直、単調な文字ばかりであんまり見やすくないな...と個人的には感じていました。
しかしこのプラグインをインストールすると、こうなります。
マークダウンがレンダリングされて、めちゃくちゃ視認性が上がったと思います。
さらに、上でご紹介した Quick Preview と組み合わせることもできます。こうすると、選択対象のブロックの周辺のコンテクストがより見やすくなります。
ただ、なんでもかんでもレンダリングすればいいってわけじゃないんだよな...という方もいると思います。ただの文字のほうが目に優しい場合もありえますよね。
そこで、このプラグインではどんな種類のブロックはレンダリングして、どんな種類のブロックはしないか、ということを細かく設定できるようになっています。たとえば、callout と数式だけはレンダリングしたいけどそれ以外はそのままでいいや、といったことも可能です。
最後に紹介するこのプラグインは、はっきり言ってめちゃくちゃ地味です。自分で書いたくせに、有効になっているかどうかわからなくことさえあります。一体なにごとでしょうか。
日本語を含む 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:
After:
はい、この通りめちゃくちゃ地味です。しかし、個人的には確実に役に立っています。
CJK 文字が含まれる行の line-height
をいくつにするかは、Style Settings から設定できます。Obsidian のデフォルトフォントなら 1.6〜1.65 くらいが好みです。僕の研究用の vault で使っている CMU Serif+ Noto Serif JP フォントの場合は、1.75〜1.8 くらいは欲しくなります。
今回は、僕の制作しているプラグインをいくつかご紹介させていただきました。前にも書いたように、僕は本物の web エンジニアでもなんでもありません(React とかまだ全然わかりません)が、それでも頑張れば(頑張りが必要だったことは確かです)、Obsidian API のおかげでほしい機能を実現するプラグインが作れてしまいました。(正直、まだ Obsidian にまったく無関係な場所では JavaScript とか CSS とか書いたことがない気がします。)
この高い拡張性こそが Obsidian の魅力だと思っています。まだ JavaScript とか CSS とかよくわからないという場合でも、頑張れば意外となんとかなりますので、もし「こんなことできたらいいのに...」という不満がある方はぜひチャレンジしてみてほしいなと思います。
(とはいえ、API の 公式 docs はまだまだ親切とは言い難い部分も多く残っており、僕がプラグインを作り始めたときにもいろいろ苦労したのは事実です。自分のためのメモも兼ねて、このサイトには公式 docs には書いてないけど大事なことを中心にいろいろと書き溜めていこうかなと考えているので、もしご興味があれば覗いてみてください。)
せっかく記事を書いたので、ほかの Obsidian ユーザの方にちょっと聞いてみたいことがあります。
Obsidian を使っていると、「フォルダーは使わずタグを使おう」というような意見をよく耳にします。ただ、正直タグ付けってちょっと苦痛じゃないですか?
フォルダーによってカテゴライズする場合は、同じフォルダ内にノートを作り続けている限りはなにも考えなくても勝手にノートがカテゴライズされていきます。
しかし、タグだけでカテゴライズしようとすると、ノートを新規作成するたびに毎回タグ付けによるカテゴリ分けを強要されます。この負荷は個人的には無視できないものがあると感じます。また、一貫性のあるタグ付けができるようになるためには相当の訓練を要するような気がしています。
もちろん、タグにはひとつのノートに複数のカテゴリを付与できるといった無視できないメリットも多くあります。なので、タグ付けの苦痛を軽減できるような何らかの仕組みがあれば最強だと思うのですが...。
なにかアイデア等あればシェアしていただけるとありがたいです。
ありがとうございました!
TagFolder や Self-hosted LiveSync などの作者のvorotamoroz aka きみのぶさんがアンサーをくださいました。
Pouhonさんのサイト創造性原理にて紹介+アンサーをいただきました。やはり自分は深く考えすぎなのかな、もっと気楽にやればいいのかなと考えるきっかけになりました。しかしこれがいちばん難しい...笑(逆に、こういう性分じゃなかったらプラグインなんか作ってなかった気もします)