Org-roam事始め

(An [English version](https://www.linkedin.com/pulse/org-roam-introduction-hideki-saito/) of this article is also available.)
# Org-roamとは
[Org-roam](https://www.orgroam.com/)は[Emacs](https://www.gnu.org/software/emacs/)で動作する、[Org mode](https://orgmode.org/)と連動して動く、リンク連動型ノートシステムです。[Roam Research](https://roamresearch.com/)というリンク連動型のオンラインサービスがありますが、それと類似した機能をローカルなシステムとして使用することができます。

特徴としては以下の通りです。

- Org modeと連動して動作することにより、Org modeの様々な機能をそのまま使える。
- それぞれのノートの関係をグラフ化して表示したり、またリンク元を辿ることで、動的に関連付けが可能。
- テンプレート機能等を使用することにより、情報をすばやく取り込むことが可能。

画面としては以下のような形になります。

![org-roam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80859/91af8f3b-d906-5763-7cc2-e11f3a7e8ebf.png)

（文章は[WikipediaのServal項目](https://en.wikipedia.org/wiki/Serval)から引用。）

この画面ではサーバルについて書かれた文章のうち、cat、Africa、North Africa、Sahel、sub-Saharanなどの言葉がタグ付けされており、それぞれのページへのリンクになっています。また、グラフから、North Africa、Sahel、sub-SaharanのページからAfricaへのリンクが存在していることを意味しています。

リンクに関してはOrg表記が使用されますので、上記の例では、以下のようになります。

```text
* Serval

The serval (Leptailurus serval) is a wild [[file:20200721173848-cat.org][cat]] native to [[file:20200721174109-africa.org][Africa]]. It is rare in [[file:20200721174138-north_africa.org][North Africa]] and the [[file:20200721174231-sahel.org][Sahel]], but widespread in [[file:20200721174320-sub_saharan.org][sub-Saharan]] countries except rainforest regions. On the IUCN Red List it is listed as Least Concern.
```
ファイル名は数字によるプレフィックがついていますが、これは`org-roam-insert`や`org-roam-capture`などにより自動的に付け加えられます。（挙動は設定可能）

# インストール方法
## ダウンロードとインストール

### MELPAよりのダウンロード
一番簡単な方法はMELPAによりインストールする方法です。パッケージ名は`org-roam`でこれをインストールすることにより楽に使うことができます。

- [安定版](https://stable.melpa.org/#/org-roam)
- [スナップショット版](https://melpa.org/#/org-roam)

依存パッケージも合わせてインストールされます。

### ZIPよりのダウンロード
[リリース](https://github.com/org-roam/org-roam/releases)よりのZIPファイルを使用する場合は他のライブラリと同様、load-pathに組み込み、読み込む形になります。

```emacs-lisp
(add-to-list 'load-path "~/.emacs.d/site-lisp/org-roam")
(require 'org-roam)
```

依存パッケージは自分で用意するか、MELPAなどからインストールしてください。（emacsql-sqlite3などが必要です。MELPAの[パッケージページ](https://stable.melpa.org/#/org-roam)を参考にして下さい。


## 各種設定
### 変数
基本的な変数は以下のようなものになります。上からデータベースの保存先、ドキュメントツリーの保存先、インデックスファイルの保存先になります。尚、複数のマシンでDropboxなどで共有する場合においては、データベースにはフルパスが保存されるため、ポータビリティーは高くありません。ドキュメントツリーを共有し、必要に応じてデータベースの再構築を行うのが最適解かと思われます。再構築は```org-roam-db-build-cache```で行えます。

```emacs-lisp
(setq org-roam-db-location "/path/to/database/database.db")
(setq org-roam-directory "/path/to/Roam/Docs")
(setq org-roam-index-file "/path/to/Roam/Docs/Index.org")
```

### フックの設定
Org-roamを読み込むのには以下のようにフックを設定しておくと起動時に有効になります。必要に応じて設定して下さい。

```emacs-lisp
(add-hook 'after-init-hook 'org-roam-mode)
```

### キーボードショートカットの設定

```emacs-lisp

;; キーボード・ショートカットの設定
(global-set-key (kbd "C-c n l") 'org-roam) ;; バックリンクの表示の切り替え
(global-set-key (kbd "C-c n f") 'org-roam-find-file) ;; org-roamドキュメントツリーを検索
(global-set-key (kbd "C-c n g") 'org-roam-graph-show) ;; グラフを作成し、表示
(global-set-key (kbd "C-c n i") 'org-roam-insert) ;; ドキュメントの作成し、現バッファにリンクを設定
```

## Windowsで使用する場合の注意
- [SQLite](https://sqlite.org/index.html)の中からsqlite3.exeが必要です。公式で[配布されているパッケージ](https://sqlite.org/download.html)のsqlite-tools-win32-x86をダウンロードして下さい。自分でコンパイルする場合は`SQLITE_ENABLE_JSON1`が有効になっていることを確認して下さい。（`C-u`を通した場合のグラフ作成に失敗します。）
- グラフ描画には[Graphviz](https://graphviz.org/)が必要です。こちらは[ダウンロード](https://graphviz.org/download/)ページからダウンロードできます。
- Windowsを含む、大文字・小文字を区別しないファイルシステムを使用している場合においては、データベース内に格納されるファイル名と実際のファイル名に違いが発生し、バックリンク機能がうまく動作しない場合があります。こちらは調査を行ったところ、HOME変数に例えば、`c:/users`が`c:/Users`の代わりに使用されている場合などにより発生するようです。既定では後者を使用するようにして下さい。（ユーザー名もシステム上の大文字・小文字と合わせて下さい。）
    - 尚、この問題はMacなどでも発生する可能性があります。
- ```backup-by-copying```を有効にする。（CustomizeにおいてはBackup By Copyingになります。）

# 基本的な使い方
上記のキーボードショートカットが有効になっていると仮定します。

- ```C-n n f```でファイルを開きます。検索はファイル名ではなくそれぞれのファイルのタイトルです。```#+roam_tags```タグが指定されている場合はそれがプレフィックスされます。例えば、```project```というタグがついていると、検索パターンは```(project) hoge```となります。
- ```C-n n i```で開いているファイルにリンクを作成します。上記と同じようなファイル選択が行われ、タイトルを冠したリンクが作成されます。新規ファイルである場合は、入力した名称のファイルが新たに作成され、一時バッファで```C-c C-c```で完了することによりリンクが作成されます。
- ```C-n n g```で関連性を示すグラフを作成します。```C-u x```を使用し、```x```の数字に応じた度数の範囲を表示します。例えば、```2```を指定すると、現バッファより2ホップ範囲内の関連性を示すグラフを作成します。
- ```C-n n l```で現バッファへのバックリンク（リンク元）を表示します。

# 最後に
Org-roamを使用することにより、リンク連動型のノートを簡単に作成することができます。使い方としては以下のようなものが考えられます。

- アイデアをまとめるマインドマッピングや、メモ帳代わり。
- 個人用のタスク管理。

Org modeベースですので、すでにOrg modeを使用している場合はその資産を活かすことが出来ますし、また多彩な出力機能を使用することにより、他のシステム向けにドキュメントを出力する、というような使い方も可能になります。