Org-roamはRoam Research[fn:1]に着想を得て作られたEmacsのメモパッケージ。org-modeをベースに、目的ファイルへのアクセスしやすさ、リンク、グラフ化の機能を強化する。
本文書のトップページInsomniaのグラフは、org-roamが生成するsqliteレコードを加工して作成している。
- GitHubリポジトリ
- https://github.com/org-roam/org-roam
- 公式サイト
- https://www.orgroam.com/
- マニュアル
- https://www.orgroam.com/manual.html
dbへ書き込みできませんエラーが出たとき。
(org-roam-db-location)
でDBが保存されているパスを調べる。- .dbファイルを削除。
(org-roam-db-clear-all)
でキャッシュ削除。(org-roam-db-sync)
によってdbファイルを再作成。
Selecting deleted buffer
が出るとき。
- ライブラリをすべて削除してインストールし直す
- emacsql-sqliteを保存しているディレクトリに行く。sqliteディレクトリ下でmakeしなおす
- make clean && make emacsql-sqlite
いわゆるコネクターパターン。接続に使用する関数を返す関数。
https://github.com/kd-collective/org-roam/blob/abe63b436035049923ae96639b9b856697047779/org-roam-db.el#L123-L137
ZettelkastenやOrg-roamの解説。
マニュアル。
System CraftersのOrg Roam紹介。
具体的なワークフローがわかりやすい。
作者サイトのマニュアル。
org-modeのワークフロー。
https://d12frosted.io/posts/2021-01-16-task-management-with-roam-vol5.html- search emacsql
Default install sqlite on ubuntu, so does not matter.
- find(C-c n f)
- バックリンク(C-c n l)
- Roamリンク挿入(C-c n i)補完を有効にすることであまり使わなくなる。
Unable to resolve link
になる。
(setq org-hugo-base-dir ".")
(setq org-export-with-broken-links t)
するとできるが、idリンクを辿れない。 ほかのサイトではidがあってもできてるように見える。 https://hugocisneros.com/blog/my-org-roam-notes-workflow/ orgのバージョンを最新にしたが変わらず。
公式で言及。 https://github.com/org-roam/org-roam/wiki/Hitchhiker’s-Rough-Guide-to-Org-roam-V2#export
(setq org-id-link-to-org-use-id t)
(setq org-id-extra-files (org-roam--list-files org-roam-directory))
↓で設定していた。これを設定すると成功した。 https://hugocisneros.com/org-config/#configuration
https://gist.github.com/hugcis/1f2d2ad4b98b07ee543f10232ba1b025
(require 'find-lisp)
(defun hugcis/publish-note (file)
"Publish a note in FILE."
(interactive)
(with-current-buffer (find-file-noselect file)
(projectile-mode -1)
(setq org-hugo-section "notes"
org-hugo-base-dir "."
citeproc-org-org-bib-header "* Bibliography\n<ol class=\"biblio-list\">"
citeproc-org-org-bib-footer "</ol>")
(let ((org-id-extra-files (find-lisp-find-files org-roam-directory "\.org$")))
(org-hugo-export-wim-to-md))))
find . -name '*.org' | emacs --batch -l ./publish.el --funcall kd/publish
(require 'org-roam)
(add-hook 'after-init-hook 'org-roam-mode)
(make-directory "~/roam" t)
(setq org-roam-directory "~/roam")
(setq org-roam-completion-everywhere t)
(define-key org-mode-map (kbd "C-M-i") 'completion-at-point)
リンク補完が有効になります。非常に便利。
(define-key org-roam-mode-map (kbd "C-c n l") 'org-roam)
(define-key org-roam-mode-map (kbd "C-c n f") 'org-roam-find-file)
(define-key org-roam-mode-map (kbd "C-c n g") 'org-roam-graph)
(define-key org-mode-map (kbd "C-c n i") 'org-roam-insert)
(define-key org-mode-map (kbd "C-c n I") 'org-roam-insert-immediate)
org-roam-graph
でファイルリンクだけのつながりを表示したい。
v1ではファイルリンクだけで、外部リンクは出てなくてわかりやすかった。
org-roam-uiを使ってみた。めちゃかっこいい。
org-roam-graph-link-hidden-types でhttp, httpsを指定すると消せた。 これでCIでも出力できるはず。
(setq org-roam-graph-link-hidden-types '("https" "http" "file"))
- org-roam-db-syncでdbファイルを生成する
- dbファイルをグラフとしてjsonに変換する
- JavaScriptのd3ライブラリでjsonを読み込む
- ブラウザ描画
(org-roam-db-sync)
をやると Selecting deleted buffer
がエラーが出る。
依存しているemacs-sqlite関係でなにかおかしくなっているよう。同じくemacs-sqliteに依存しているmagit-forgeも動かない。
メインマシン、GitHub Actions環境ではうまくいっているので、sqlite関係か、.emacs.dで何か起きている。 うまくいくようになった。関連ライブラリが修正されたよう。
デフォルトではsqliteを利用しているのは知っているが、実際何をしているのだろうか。結論: ファイルの変更をdbに同期し、再利用しやすいようにしている。まずorg-roam-db.elを見てみる。
https://github.com/kd-collective/org-roam/blob/abe63b436035049923ae96639b9b856697047779/org-roam-db.el#L279-L288
https://github.com/kd-collective/org-roam/blob/abe63b436035049923ae96639b9b856697047779/org-roam-db.el#L309-L323
org-roam-db-insert-fileが呼ばれることによって、orgファイルの追加をdbと同期する。こういった感じで1ファイルの追加、削除、変更に対応する同期関数がある。
↑のみでは1ファイルのみなので、org-roamファイル全体に大して同期をかける関数がある。org-roam-db-sync。変更のタイプを判定して、各関数で処理し、orgファイルとdbの内容を同期する。なるほど。
https://github.com/kd-collective/org-roam/blob/abe63b436035049923ae96639b9b856697047779/org-roam-db.el#L611-L643
直にdbに追加する関数を呼ぶことはなく、ファイルの変更をもとに同期関数経由でdbに追加されるようだ。ファイルの方が先に存在していて、後でdbと同期する。
https://github.com/kd-collective/org-roam/blob/abe63b436035049923ae96639b9b856697047779/org-roam-node.el#L461-L477
- ファイルがあれば、visitを呼び出す
- ファイルがなければ、作成するためにcaptureを呼び出す。dbと関係することは同期時にやるので、ここでは一切考えなくてよく、責務分離できている
dbへの同期をみた。利用はどうしているのだろうか。
探す系は、org-roam-node.elに含まれている。
https://github.com/kd-collective/org-roam/blob/abe63b436035049923ae96639b9b856697047779/org-roam-node.el#L461-L477
- nodeが存在していればファイルを開く。そうでなければorg-roam-captureでテンプレート画面を開く
- 開くときもdbに接続して情報を取ってくるはずだが、コードのどの箇所かわからなかった
- denoteとroamの使い分けが微妙
- 1つの見出しが1つのファイルに属するとは限らない
- 文章としてあまり読みやすいものではない
[fn:1] https://roamresearch.com/ Webでのアウトラインツール。