[[📒Articles]] > [[📒2021 Articles]]
![[2021-11-07.jpg|cover-picture]]
[[🦉Another Quick Switcher]]という[[Obsidianプラグイン]]を作って公開した話です。
## はじめに
[[Obsidian]]には[[Quick switcher]]という機能があります。これは曖昧なクエリを入力するとマッチするファイルをサジェストし、選択するとファイルへ移動できる機能になります。[[IntelliJ IDEA]]で言うところの`Go to File...`のようなものです。
また、[[Quick switcher]]を強化した[[Obsidianプラグイン]]に[[Quick Switcher++]]というものがあります。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - darlal/obsidian-switcher-plus: Enhanced Quick Switcher plugin for Obsidian.md</p>
</div>
</div>
<img src="https://opengraph.githubassets.com/05a44982b41a3471c65949861b6ef9b12c6610a8293bec9d7f50e67823bbbce0/darlal/obsidian-switcher-plus" class="link-card-image"/>
</div>
<a href="https://github.com/darlal/obsidian-switcher-plus"></a>
</div>
このプラグインを使うと以下のような拡張機能が使えるようになります。
- クエリを`#`から始めるとファイル内の見出しを検索
- ファイル内のヘッダ、ハッシュタグ、リンク、埋め込みを検索
- 開いたエディタ間の移動
- ワークスペースの変更
実に素晴らしい機能ばかりで[[Obsidian]]を使い始めた当初から愛用しています。今も2つ目のヘッダ検索には非常にお世話になっています。
## [[Quick switcher]]に対する小さな不満
[[Obsidian]]を半年ほど使い、[[🦉Various Complements]]、[[🦉Embedded Code Title]]など必要な機能はプラグインとして自作出来るようになってきた頃、[[Quick Switcher++]]の一部仕様について小さな不満を抱えていました。 具体的には以下のようなもの[^1]です。
### クエリトークンの登場順が意味をもつ
たとえばこの記事ファイル、`📘自分だけのObsidian Quick Switcherを作ってみた`について検索したいとします。==`obsidian switcher`と検索するとヒットしますが、`switcher obsidian`ではヒットしません==。これは登場順序が逆転しているからです。
この仕様は意図的です。[[Obsidian]]では検索ノイズを減らすため、敢えて順序が合うもののみをヒットさせているという話をどこかで見ました。しかし、以下のような気分によって順番が変わるタイトルの場合はなかなかハードモードです。
- `Pythonとaws-samを使ってチャットを作ってみた`
- `チャットをaws-samとPythonで作ってみた`
`aws-sam python`、`python aws`、どちらのクエリでもヒットして欲しいですよね。
### 最近開いたファイル順でフィルタできない
[[Quick switcher]]は起動した直後、最近開いた順に一覧を表示します。しかし、==何か1つでもクエリを入力すると==、**Fuzzy searchのマッチ順に並びかわってしまいます**。これでは、
> 『最近開いたPythonとAWSに関するNoteを開きたい』
というケースに対応できません。`python aws`と入力した瞬間に、マッチ率が高いものが上に来てしまうからです。もちろん、その方が都合がいいケースは多いですが、様々な状況に対応したいのです。
## プラグインを作ろうと思ったワケ
他にも小さな不満はありましたが、プラグインを作ろうとした理由の決定打は先ほどの2つです。なぜなら、[[Quick Switcher++]]を少し改修しただけでは、上記の不満を解消できないことが分かったからです。
[[Quick Switcher++]]の実装を確認したところ、[[Quick switcher]]の基本動作を継承するように作られていました。正直、1から実装するのは[[車輪の再発明]]感もあるので当然だと思います。しかし、それでは[[Quick switcher]]の仕様による制限から逃れることはできません。
幸いなことにこの機能はコンテンツへの影響がありません。[[Obsidian]]のバージョンアップにより万が一使えなくなったとしても、作成済みNoteの中身を変更する必要はないわけです。最悪でも作る前の状態に戻るだけなら気楽なものでしょう。
今回のプラグイン開発にあたって、開発体験を向上させるため以下の対応をしたりもしました。
<div class="link-card">
<div class="link-card-header">
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" class="link-card-site-icon"/>
<span class="link-card-site-name">minerva.mamansoft.net</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">📘Obsidianプラグイン開発で自動リロードさせる</p>
</div>
<div class="link-card-description">
Obsidianプラグインを開発しているとき、コードベースに変更があったら自動でObsidianをリロードする仕組みを整えました。
</div>
</div>
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/%F0%9F%93%98Articles/attachments/2021-09-20.jpg" class="link-card-image"/>
</div>
<a href="https://minerva.mamansoft.net/%F0%9F%93%98Articles/%F0%9F%93%98Obsidian%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E9%96%8B%E7%99%BA%E3%81%A7%E8%87%AA%E5%8B%95%E3%83%AA%E3%83%AD%E3%83%BC%E3%83%89%E3%81%95%E3%81%9B%E3%82%8B"></a>
</div>
## [[🦉Another Quick Switcher]]
そうして作ったものが[[🦉Another Quick Switcher]]です。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/obsidian-another-quick-switcher: This is an Obsidian plugin which is another choice of Quick switcher.</p>
</div>
</div>
<img src="https://opengraph.githubassets.com/f755d43770f6cb54d54548a06b1a86447f578dc344fdf4ffdc75a1cd0a9d0fe7/tadashi-aikawa/obsidian-another-quick-switcher" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/obsidian-another-quick-switcher"></a>
</div>
ありがたいことに、2021-11-07時点では私が[[GitHub]]で公開しているどのリポジトリよりも★がついています。私と同じような考えの人が少なからずいることを知り、少し嬉しくなりました。
READMEにも記載していますが、[[🦉Another Quick Switcher]]の主な特徴について紹介させてください。
### クエリトークンの順番に依存せず検索できる
[[#クエリトークンの登場順が意味をもつ]] という不満を解消する機能です。
![[📘Articles/attachments/2021-11-07.gif]]
### タイプしても最近開いた順を維持できる
[[#最近開いたファイル順でフィルタできない]]不満を解消する機能です。なお、最近開いたファイルを優先して表示するのは[Recent Search]という機能です。
[Recent Search]: https://github.com/tadashi-aikawa/obsidian-another-quick-switcher#recent-search
![[2021-11-07 1.gif]]
### キーボードから手を離さずに[[バックリンク]]を検索できる
[[Backlinks]]で表示されたファイルの絞り込みから移動まで、[[🦉Another Quick Switcher]]を使えば**キーボードから手を離さず**に完結できます。これは[Backlink Search]という機能です。
[Backlink Search]: https://github.com/tadashi-aikawa/obsidian-another-quick-switcher#backlink-search
![[Pasted image 20211107174336.png]]
選択すると、該当ファイルで一番最初にリンクが出現する箇所へ移動します。
### タグを条件に検索できる
通常のクエリと一緒にタグで検索も可能です。また、オプションで設定すれば、サジェストリストにタグを併せて表示できます。
![[Pasted image 20211107174626.png]]
上記はファイル名に`obsidian`を含み、`#2021/11`タグのついたファイル検索結果です。タグによる検索は、サジェストリストのタグを非表示にしても動作します。邪魔でしたら非表示にしてしまった方がいいですね。
### ファイルを移動できる
コアプラグインの[File explorer]の`Move file to another folder`と同じ機能を提供しています。同じ機能のため実装する気はなかったのですが、
> 『この機能のためだけに[File explorer]を有効にしているが、サイドバーをシンプルにしたいので[[🦉Another Quick Switcher]]で対応してもらえると嬉しい』
という旨のFeature requestをいただいたので対応することにしました。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">Feature Request: New Note Location · Issue #8 · tadashi-aikawa/obsidian-another-quick-switcher</p>
</div>
<div class="link-card-description">
The addition of cmd + shift was a great idea! Ad far as I can tell, it always places the new note in the Vault root. Would it be possible to add some customization where new notes get placed? Ideal...
</div>
</div>
<img src="https://opengraph.githubassets.com/791ec635fc1ea2e8bd59f67b3d8e27812d2c464b8bd93e0173001fa3258f9fc2/tadashi-aikawa/obsidian-another-quick-switcher/issues/8" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/issues/8"></a>
</div>
ある意味、Quick Switcherと言えなくもない機能ですからね。
[File explorer]: https://help.obsidian.md/Plugins/File+explorer
### 現在のカーソルに[[内部リンク]]を挿入できる
これは、`Alt + Enter`で選択した項目を[[内部リンク]]として挿入する機能です。
![[2021-11-07 2.gif]]
オートコンプリートによる挿入がベストではありますが、[Recent search]や[Backlink search]のように、目当てのファイルを見つけるのが難しい場合は、こちらの機能を使った方が早いこともあります。
余談ですが、[[Quick switcher]]同様、`Ctrl/Cmd + Enter`や`Shift + Enter`にも対応しています。`Shift + Enter`は画面上に案内が出ませんが、ちゃんと新しいファイルを作成します。
### [[prefixアイコン]]を考慮して検索できる
[[prefixアイコン]]はファイル名の先頭につける絵文字のことです。たとえば、[[📕Obsidianプラグイン開発チュートリアル]]の場合は📕が[[prefixアイコン]]です。[[Minerva]]では[[📓MinervaのPrefixアイコンルール]]という形でルール化して活用しています。
[[prefixアイコン]]はファイルに意味合いを持たせるために使いますが、検索クエリに都度入力するのは手間です。[[📕Obsidianプラグイン開発チュートリアル]]を検索するたびに、📕を入力などしていられません。`Obsidianプラグイン`と入力したら上位に出てきてほしいものです。しかし、[[Quick switcher]]では`Obsidian`が先頭のファイルが優先され、[[📕Obsidianプラグイン開発チュートリアル]]が登場するのはその後になります。
[[🦉Another Quick Switcher]]では、表示順を計算するとき[[prefixアイコン]]を除外するようにしています[^2]。その結果、以下のような順で表示されます。
![[Pasted image 20211107181034.png]]
[[Quick switcher]]の場合は赤丸の順で表示されます。
### その他違うところ
上記以外で[[Quick switcher]]と異なるところを過剰書きにしてみました。
- 現在のファイルは候補に表示されない
- エイリアスはまとめて1候補になる
- パスではなくファイル名が表示される
- ディレクトリは親ディレクトリのみ右側に表示される
- ほとんどFuzzyではない
- 大文字小文字やスペースの考慮をする程度
他にもあるかもしれませんが、代表的なものはこれくらいです。
## まとめ
[[Quick switcher]]や[[Quick Switcher++]]では拭いきれない仕様制限があったため、[[🦉Another Quick Switcher]]を開発し、公開しました。
当初は自分だけが使うこぢんまりしたものを作ろうととも思ってましたが、[[GitHub]]の★やIssueをいただいたり、[[Twitter]]や[[Discord]]でもFeature Requestをいただいたりしたのを見ると、ちゃんと公開するように作って良かったと思っています。
エイリアスや表示、設定周りはまだまだ改善の余地があると思います。機能要望やバグなどありましたら[[Twitter]]や[[Discord]]、[[GitHub]]のIssueでご報告いただければと思います😄
---
[^1]: あくまで私の主観であり、何が必要で何が不要かは使い手次第だと思います。参考までに。
[^2]: もちろん[[prefixアイコン]]を含むクエリの検索にはヒットする