【注意】最后更新于 October 8, 2021 ,文中内容可能已过时,请谨慎使用。
前言 听说 org-roam 已经差不多一年多了,但是一直没有去实践,前面阅读了《认知天性》这本书,
觉得自己还是应该整理一下目前的笔记系统(太乱了,每次都在很多文件里面用grep大法)。趁
这个十一没出门,在家里也不太想工作的事情,于是就折腾一下。
参考连接 主要的参考来源有以下这些(排名不分先后)
安装 因为我使用的是 spacemacs=, 在 =spacemacs 的 layers 中enable org-roam :
1
 2
 3
 4
 5
 6
 7
 8
 9
 ( org  :variables 
     ... 
     org-enable-roam-support  t 
     org-enable-roam-protocol  t 
     org-enable-roam-server  t 
     org-roam-directory  "~/org/roam/" 
     org-roam-v2-ack  t 
     ... 
     ) 
如果想用最新的代码(非melpa),可以直接在 additional-package 里面配置对应的安装方式,这里选择的是 master 分支:
1
 ( org-roam  :location  ( recipe  :fetcher  github  :repo  "org-roam/org-roam"  :branch  "master" )) 
使用 org-roam-version 查看,当前版本为 2.1.0
使用 先使用 org-roam-capture 来创建一篇测试,这个跟 org-capture 是一致的(对于模板,我们后面熟悉后再配置)。
然后文件就船舰在了 ~/org/roam/ 下了。
创建连接测试,使用 org-roam-node-insert 可以链接到其他node或者创建一个新的node,
这样就可以创建关联关系了。
然后使用 org-roam-graph 查看,发现出错了
1
 Wrong type argument: commandp, org-roam-graph
这是什么情况?(后面有说明,org-roam没有安装好)
查看文档,文档上说现在有个 org-roam-buffer 显示对应的关系,可是我这边没有找到,
buffer是空的。
查看日志,发现有个错误:
1
 No such file or directory, org-roam-protocol
是没有安装好的原因,重新安装 org-roam 就可以了。
org-roam-protocol 根据文档配置好desktopfile,见这里 
~/.local/share/applications/org-protocol.desktop
1
 2
 3
 4
 5
 6
 7
 [Desktop Entry]
Name=Org-Protocol
Exec=emacsclient %u
Icon=emacs-icon
Type=Application
Terminal=false
MimeType=x-scheme-handler/org-protocol
1
 xdg-mime default org-protocol.desktop x-scheme-handler/org-protocol
1
 2
 3
 4
 5
 6
 7
 sudo mkdir -p /etc/opt/chrome/policies/managed/
sudo tee /etc/opt/chrome/policies/managed/external_protocol_dialog.json >/dev/null <<'EOF'
 {
   "ExternalProtocolDialogShowAlwaysOpenCheckbox": true
 }
 EOF 
sudo chmod 644  /etc/opt/chrome/policies/managed/external_protocol_dialog.json
模板 这里参考了这里 的模板设置
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 ( setq  org-roam-capture-templates 
      ' ( 
        ( "d"  "default"  plain  ( function  org-roam-capture--get-point ) 
         "%?" 
         :file-name  "%<%Y%m%d%H%M%S>-${slug}" 
         :head  "#+title: ${title}\n#+roam_alias:\n#+roam_key:\n#+roam_tags:\n\n" ) 
        ( "a"  "Annotation"  plain  ( function  org-roam-capture--get-point ) 
         "%U ${body}\n" 
         :file-name  "${slug}" 
         :head  "#+title: ${title}\n#+roam_key: ${ref}\n#+roam_alias:\n#+roam_tags:\n\n" 
         :immediate-finish  t 
         :unnarrowed  t ) 
        ( "g"  "group" ) 
        ( "ga"  "Group A"  plain  ( function  org-roam-capture--get-point ) 
         "%?" 
         :file-name  "%<%Y%m%d%H%M%S>-${slug}" 
         :head  "#+title: ${title}\n#+roam_alias:\n\n" ) 
        ( "gb"  "Group B"  plain  ( function  org-roam-capture--get-point ) 
         "%?" 
         :file-name  "%<%Y%m%d%H%M%S>-${slug}" 
         :head  "#+title: ${title}\n#+roam_alias:\n\n" ) 
        ) 
      ) 
测试一下,发现出错了,错误如下:
1
 Template needs to specify ‘:target’
原来是因为模板的格式已经变化了。修改一下:
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 ( setq  org-roam-capture-templates 
      ' ( 
        ( "d"  "default"  plain  "%?" 
         :target  ( file+head  "%<%Y%m%d%H%M%S>-${slug}.org" 
                            "#+title: ${title}\n#+roam_alias:\n#+roam_key:\n#+roam_tags:\n\n" ) 
         :unnarrowed  t ) 
        ) 
      ) 
( setq  org-roam-capture-ref-templates 
      ' ( 
        ( "a"  "Annotation"  plain 
         "%U ${body}\n" 
         :target  ( file+head  "${slug}.org" 
                            "#+title: ${title}\n#+roam_key: ${ref}\n#+roam_alias:\n#+roam_tags:\n\n" ) 
         ;; :immediate-finish t 
         :unnarrowed  t 
         ) 
        ( "r"  "ref"  plain  "" 
         :target  ( file+head  "${slug}.org" 
                            "#+title: ${title}\n#+roam_key: ${ref}\n#+roam_alias:\n#+roam_tags:\n\n" ) 
         :unnarrowed  t ) 
        ) 
      ) 
添加俩个 chrome 书签,内容如下:
1
 javascript : location . href  =  'org-protocol://roam-ref?template=r&ref='  +  encodeURIComponent ( location . href )  +  '&title='  +  encodeURIComponent ( document . title ) 
1
 javascript : location . href  =  'org-protocol://roam-ref?template=a&ref='  +  encodeURIComponent ( location . href )  +  '&title=' + encodeURIComponent ( document . title )  +  '&body=' + encodeURIComponent ( function (){ var  html  =  "" ; var  sel  =  window . getSelection (); if  ( sel . rangeCount )  { var  container  =  document . createElement ( "div" ); for  ( var  i  =  0 ,  len  =  sel . rangeCount ;  i  <  len ;  ++ i )  { container . appendChild ( sel . getRangeAt ( i ). cloneContents ());} html  =  container . innerHTML ;} var  dataDom  =  document . createElement ( 'div' ); dataDom . innerHTML  =  html ;[ 'p' ,  'h1' ,  'h2' ,  'h3' ,  'h4' ]. forEach ( function ( tag ,  idx ){ dataDom . querySelectorAll ( tag ). forEach ( function ( item ,  index )  { var  content  =  item . innerHTML . trim (); if  ( content . length  >  0 )  { item . innerHTML  =  content  +  '
' ;}});}); return  dataDom . innerText . trim ();}()) 
基本搞定。现在是思考怎么用起来的问题了。
org-roam-ui 安装,首先在addtional pacakges里面添加
1
 ( org-roam-ui  :location  ( recipe  :fetcher  github  :repo  "org-roam/org-roam-ui"  :branch  "main"  :files  ( "*.el"  "out" ))) 
然后配置
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 ( use-package  org-roam-ui 
  :after  org-roam 
  ;;         normally we'd recommend hooking orui after org-roam, but since org-roam does not have 
  ;;         a hookable mode anymore, you're advised to pick something yourself 
  ;;         if you don't care about startup time, use 
  ;;  :hook (after-init . org-roam-ui-mode) 
  :config 
  ( setq  org-roam-ui-sync-theme  t 
        org-roam-ui-follow  t 
        org-roam-ui-update-on-save  t 
        org-roam-ui-open-on-start  t ) 
  ) 
虽然提供了ui,但是我并不是很喜欢这个功能(因为我感觉有点无用),反而我想要的是这里 的效果。