Org-roam とは

EmacsでZettelkasten Methodを実現するためのOrg-mode実装.

このメモではOrg-roamで表記は統一していく(org-roamではなく).

🤖ChatGPT

はい、org-roamはEmacsユーザー向けのオープンソースのノート管理ツールです。org-roamを使うことで、データベースとしてorg-modeのファイルを使用し、リンクやタグ、キーワード検索などの機能を利用して、自分の書いたメモや知識を統合的に管理することができます。また、org-roamを使うことで、メモの検索性や統合性が飛躍的に向上し、効果的に作業を進めることができます。

💡Org-roamサイト公開

a.k.a. 📝デジタルガーデン.

Org-roamのノートをサイトに公開するには?

org-publishかox-hugoを利用するのが一般的.

  • ox-publish を用いてOrgファイルをHTMLに変換して公開.
  • 📝ox-hugo を用いてHugo用のMarkdownに変換してHugoで公開.

将来的にはorg-roamやorg-roam-uiでpublishの機能がサポートされる可能性ありだが, 1年経ちなんの動きもないので悲観的.

Publishing org-roam-ui · Discussion #109 · org-roam/org-roam-ui · GitHub


Hugoのテーマではなものの, Hugoを改造しているためHugoのノウハウでそのままいける. だがrefrelの設定がうまく行かなかったので移行は保留した.

GitHub - jackyzha0/quartz: 🌱 host your own second brain and digital garden for free

org-hugo-export-mdのそのつど呼び出しexport

現在は更新したorgファイルをその場でorg-hugo-export-to-mdを呼んで変換している.

org-publish方式は更新分だけをexportしてくれてよいと思ったが, メモが2000くらいあると更新をサーチするだけで結構時間がかかるのでやめた.

それにしても, ひとつのorgファイルにたくさんリンクを貼るとexportがとても重くなるので, その点においてもメモ同士のリンクは少なくする代わりにひとつのメモの範囲を狭めたほうがいいかも.

ニコラスルーマンの方法でも, reference noteはせいぜい15個とかと書いてあった気がする.

ninja buildスクリプトによる非同期export

手動exportに限界を感じたので改善した. noteの数が2500を超えるとresolve org-idの時間に時間がかかりすぎる. org-exportを非同期で実行する方法を試したけど, うまく行かなかった(不具合?)

そのため, 以下を参考にPythonスクリプトからorg-exportを修正分にのみ非同期で実行するようにした.

pythonからninjaというビルドツールを呼んでいる. ninjaライブラリはなかなかよいね. かなりストレスレスになった.

https://ninja-build.org/

ninja -k でエラーが発生してもそのままbuildする.

HugoでBacklinksを表示する

たまたまみつけた例が自分が使っているHugo Book Templateと同じだったので拝借した.

ox-hugo との合わせ技. ox-hugoをつかってhugo互換のmarkdownを吐き出してhugoのテンプレートをいじって表示させる.

ref. Ox-hugo export all roam to Hugo | Ben Mezger

ローカルの開発モードだとバックリンクを求めるので時間がかる. サイト公開版だと事前にbuildしているので遅くはならない.

org-exportでbacklinksを表示する

のhooksをつかってorg-export 前に挿入.

(defun my/collect-backlinks-string (backend)
  "Insert backlinks into the end of the org file before parsing it."
  (when (org-roam-node-at-point)
    (goto-char (point-max))
    ;; Add a new header for the references
    (insert "\n\n* 🔗Backlinks\n")
    (let* ((backlinks (org-roam-backlinks-get (org-roam-node-at-point))))
      (dolist (backlink backlinks)
        (let* ((source-node (org-roam-backlink-source-node backlink))
               (node-file (org-roam-node-file source-node))
               (file-name (file-name-nondirectory node-file))
               (title (org-roam-node-title source-node)))
          (insert
           (format "- [[./%s][%s]]\n" file-name title)))))))
 
(add-hook 'org-export-before-processing-functions
          'my/collect-backlinks-string)

org-roam publishデプロイ自動化

Org-roamから生成したサイトまとめ

Quartzをつかう

🔧Quartz📝ox-hugoをつかった方法.

ページタイトルがファイル名になるのをタイトル属性を参照させるには?

これはfromtmatterがyamlではなくtomlであるから. 現状はyamlのみサポートらしい.

✅ox-hugo: frontmatterをdefaultのtomlからyamlへするを参照.

relrefのリンクをうまく表示する

ox-hugoのサイト内リンクはrelref形式で吐き出すがquartzはHugoのshortcodeはつかわないMarkdownの素の書式なのでここに適合させる必要がある.

[📝データ前処理](</* relref "20220926135908.md#067a7a61-8276-4d60-8e4f-45902f1c0543" */>)
  • 現状のox-export: “20220926135908.md#067a7a61-8276-4d60-8e4f-45902f1c0543”
  • quartz: “20220926135908.md#独自anchor”
    • これはox-hugoのorg-hugo-get-heading-slugとは一致しない.

<2025-01-02 Thu 12:26> このinternalLinkの独自実装を解析してelispでexportする必要あり. https://github.com/jackyzha0/quartz/blob/3c01b92cc46589ac4607d994b49f1327dba3f38e/quartz/util/path.ts#L73

Refs

https://github.com/geekodour/mogoz, org-roam+quartz

Org-roam 検索Tips(org-roam-node-find)

✅Org-roamの検索であいまい検索(fuzzy find)するには?

affeをつかう.

小文字で大文字の検索をするみたいな. (migemo連携は調査中… )

✅Org-roamのカテゴリとタグによる検索

Org-roamではサブディレクトリ構造がそのままカテゴリになる. また, Org-modeのfiletagsによるproperty設定でタグがつく.

これを利用することで, 検索ワードの前に @xxx とか #*yyy のようなキーワードを入力することでカテゴリやタグで絞り込ができる.

  • @xxx: カテゴリ
  • #yyy: タグ

✅Org-roamのバックリンクを素早く検索するには?

consult-org-roamの機能の一つである, consult-org-roam-backlinksをつかう.

ref. https://github.com/jgru/consult-org-roam

わたしのボロPCだからかもしれないがbacklinkのbufferを開きっぱなしにしていると重すぎて作業にならないので普段は閉じていて必要になったら開いている. しかしそもそも開くのが重い.

なのでこの拡張機能により必要なときだけ検索をする.

✅Org-roam管理下のノートの全文検索

Using consult-ripgrep with org-roam for searching notes - How To - Org-roam

consult-ripgrepを deft の代わりに使う. より高速.

(defun my/org-roam-rg-search ()
  "Search org-roam directory using consult-ripgrep. With live-preview."
  (interactive)
  (counsel-rg nil org-roam-directory))
(global-set-key (kbd "C-c r s") 'my/org-roam-rg-search)

ちなみにconsult-org-roamにもripgrepで検索する拡張があるが, 動かないので使っていない.

しかしこのorg-roamの全文検索機能はorg-roamを使いこなす上での 最重要必須機能 だと考えており, 古くはるびきちさんの発明したanything->helmから続くEmacsの生み出した絞り込み検索というIFからの知識検索はEmacs最強を裏付ける機能だ.

memoizeによる検索キャッシュによる高速化

拾い物スクリプトだけど, これを試したらかなりストレスは減った.

Org-roam slows down as nodes increase.. solution? : orgmode

メモが増えすぎるとだんだんきつくなってくる. これがメモの増加とともに加速度的に使いづらくなるならば, もうWikipedia的なwebサービスを検討してもいいかもしれない.

Org-roam Tips(Others)

🆚org-journal vs org-roam-dailies

現状org-roam-diliesはorg-journalの劣化版になっている.

なぜならそしてだいたい同じ用途でありzotzorg-agenda周りの機能との連携がorg-journalのほうがいい.

ref. Org-journal vs org-roam-dailies - Troubleshooting - Org-roam

Org-roamで作成したメモをスマホ端末からみるには?

📝Logseq連携させてアプリからみるのがよさそう.

Org-roam管理のsubtreeをfileへ移動

M-x org-roam-extract-subtreeで新規ファイルに移動できる. はじめはサブツリーで書いていてあとから分離したいときは便利.

逆(file->subtree)の方法は調査中…(たぶんorg-refileだとsubtreeなら移動できるがfileまるごとはできない).

ファイルをorg-roam管理から外すには?

:ROAM_EXCLUDE: t のプロパティをつける. もしくはtagで除外.

(setq org-roam-db-node-include-function
      (lambda ()
        (not (member "PRIVATE" (org-get-tags)))))

urlをorg-link形式にして挿入する

org-web-toolsのorg-web-tools-insert-link-for-urlをつかうと, clipboardにあるurlをorg-link形式にして挿入.

地味な機能でこれ以外にも手段があるかもしれないが, 実はこの関数をorg-roamのメモ作成でヘビーユーズしている. ページタイトルをeww経由でfetchしてくれるのがいい.

https://github.com/alphapapa/org-web-tools

(use-package! org-web-tools
  :bind
  ("C-c i l" . org-web-tools-insert-link-for-url))

Org-roam-ui

ref. GitHub - org-roam/org-roam-ui

org-roam-uiのメモをブラウザで表示する. ORUIと略す.

このツールはムダに凄すぎる!もちろんグラフィカルな表示は他のZettelツールでもあるのだが, ORUIのスゴイところはEmacsの入力にUIが追随してリアルタイムにグイグイと画面が切り替わっていくところ. この操作感は感動した.

しかしわたしのもうすぐ10年になるボロPCではちょっと動かすのがつらい. Chromeの表示でメモリを使うので. なので新しいPCが買えるようになったらまた試す.

org-roam のメモが多すぎる時のfind高速化Tip

拾い物だけど, たしかにこれですごく高速化した.

Org-roam slows down as nodes increase.. solution? : orgmode

🆚Org-roam vs Denote

Denote vs Org-roam - Wai Hon’s Blog


Org-roamの類似ソフトウェアで人気なのは2022の後発Denote. リンクがOrg-idではなくファイル名なところが一番の違い.

Org-roamに今は満足しているが, ファイルが増えれば増えるほどに検索が遅くなりプレインテキストの魅力とsqliteの辛さが天秤にかけられる. 検索が重くなったら検討する.

✅org-roamのメモをcompany-modeで補完する

`roam:` まで入力して補完を起動すると, 候補がcompany-modeの候補としてオーバレイされる.

または, C-M-iで補完が起動する.

Org-roam Insights

Org-roamの魅力

個人的に発見したOrg-roamの魅力. 他のツールにそれがあるのかは不明.

見出しに別のaliasをつけることができる

見出しを元に検索で引っ掛けるが, 見出しにいくつも別の名前をaliasでつけることができる.

これによって, ひとつのzettel noteのなかで複数の主張があるときに, それぞれの角度からメモにリンクが貼れる.

Orgサブツリー単位でメモを束ねられる

複数のメモをサブツリーという形でツリー状にまとめることができる.

見出しごとに柔軟に org-idを振ることができる

必要に応じてorg-idを設定することで, それをorg-roamで管理するものかを柔軟に変更できる.

これがよいところは, 小さなTopicsだとまだそれは単体でorg-roamにいれるほどではないので, あるTopicsのサブツリーとしておいていくが, だんたん調べものをして追記していてTopicsが大きくなると, org-idをつけて見出しをそれっぽくすることで独立できる.

さらには, org-roam-extract-subtreeをつかって, サブツリーから新規ファイルへ取り出すことができる.

絞り込みifによる絞り込みとgrep全文高速検索

Emacsのキラー機能のひとつである, るびきち氏anything派生のifで絞り込みができる.

さらに, プレインテキストを操ることに長けるEmacsからはgrepで簡単に単語を引っ掛けてジャンプすることができる. 今はgrepよりもagやripgrepをつかうひとが多いかな?

ただし, 全文検索でメモをひっかけるのはメンテの失敗で, 通常ならば適切な見出しとタグをつけたいところ.

References

Org-roamを解説した有料記事

🗒Logseq