org-roam 使用

安装

Doom 安装 org-roam

init.el

1
2
3
4
(org
 +pandoc
 +present
 +roam2)

doom sync

但是在Windows 下(MAC 没问题)这种安装方法由于 Doom 的匹配中有一个hook 有问题 会导致如下错误

  • 错误源
    1
    2
    
    (use-package! org-roam
      :hook (org-load . +org-init-roam-h)
    
  • 错误信息
    1
    
     (org-load-hook): Error running hook "+org-init-roam-h" because: (error Selecting deleted buffer) 
    

独立安装 org-roam

packages.el

1
(use-package! org-roam)

doom sync

配置

config.el

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(use-package! org-roam
  :init
  ;; 如果出现 emacsql timeout 的话大概率是 emacsql-sqlite 不能正常工作
  ;; 进入 ~\.emacs.d\.local\straight\build-28.1\emacsql-sqlite\sqlite  使用MSYS2 进行编译新的 emacsql-sqlite.exe 即可
  (setq org-roam-db-location "~/org/roam/org-roam.db")
  :bind (("C-c n l" . org-roam-buffer-toggle)
         ("C-c n f" . org-roam-node-find)
         ("C-c n g" . org-roam-graph)
         ("C-c n i" . org-roam-node-insert)
         ("C-c n c" . org-roam-capture)
         ;; Dailies
         ("C-c n j" . org-roam-dailies-capture-today))
  :config
  (if (file-exists-p "~/emacs-notes/")
      (setq org-roam-directory (expand-file-name "~/emacs-notes/"))
    (setq org-roam-directory (expand-file-name "~/emacs_notes/")))
  (use-package! org-roam-graph)
  (setq org-id-link-to-org-use-id t)
  ;; If you're using a vertical completion framework, you might want a more informative completion interface
  (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag)))
  (org-roam-db-autosync-mode)
  ;; If using org-roam-protocol
  (require 'org-roam-protocol))

为以前非org-roam 创建的笔记创建头部ID

my-tools.el

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(defun my/add-id-each-org-file-in-dir ()
  " 为笔记目录下的所有org 文件加上ID 以便 roam 索引"
  (interactive)
  (let* ((roam-dir (expand-file-name "~/emacs_notes/"))
         all-org-files
         file-content)
    ;; (message "roam-dir : %s" roam-dir)
    (setq all-org-files (directory-files-recursively roam-dir (rx ".org" eos)))
    (dolist (each-file all-org-files)
      ;; (dolist (each-file (cl-subseq all-org-files 1 4))
      ;; (message "each-file : %s" each-file)
      (setq file-content (f-read-text each-file))
      ;; 跳过org 中的头部的注释  抄自 org-roam-strip-comments
      (setq file-content  (with-temp-buffer
                            (insert file-content)
                            (goto-char (point-min))
                            (while (not (eobp))
                              (if (org-at-comment-p)
                                  (delete-region (point-at-bol) (progn (forward-line) (point)))
                                (forward-line)))
                            (buffer-string)))

      ;; 判断是否有ID 头 如果没有就创建
      ;; :PROPERTIES:
      ;; :ID:       6ad2b2ed-6961-4db9-852d-06523d0a5c43
      ;; :END:
      (unless (or (string-match "\*.*\n:PROPERTIES:\n:ID:.*\n:END:" (s-left 400 file-content)) (string-match ":PROPERTIES:\n:ID:.*\n:END:" (s-left 200 file-content)))   ;; string-match 不匹配换行符 一定要加上换行符才行
        (message "%s insert ID" each-file)
        (find-file each-file)
        (goto-char (point-min))
        (org-id-store-link)
        (save-buffer)
        (kill-buffer)))))

简单使用

创建日记

C-c n j
这个会在 org-roam-directory/daily 下创建一个日记, 日记名字为日期

创建笔记

C-c n c
如果存在 则跳到对应的地方 更新笔记

查找笔记或者创建笔记

C-c n f

如果笔记不存在则创建笔记

如果笔记存在则打开笔记

在笔记中引用别的笔记

C-c n i
org-roam

查看笔记的2D 图

C-c n g
笔记多了就不好看了 有可能会显示失败

org-roam-ui 使用

packages.el

1
(package! org-roam-ui)

config.el

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
(use-package! websocket
    :after org-roam)

(use-package! org-roam-ui
    :after org-roam ;; or :after org
;;         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))

doom sync

使用

M-x: org-roam-ui-open
这条命令默认会在浏览器显示笔记的2D 图, 第一次打开的时候, 一般来说浏览器都会拒绝要调整一下浏览器对当前页面的设置
以Chrome 为例:


把不安全内容改为允许

2D效果

3D 效果

默认是2D 显示 在左上角可以设置

利用pyim让 vertico, selectrum 等补全框架,通过 orderless 支持拼音搜索候选项功能

packages.el

1
2
(package! pyim)
(package! pyim-basedict)

config.el

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
(use-package! pyim
  :config 
  (require 'pyim-basedict)
  (require 'pyim-cregexp-utils)
  (pyim-basedict-enable)
  ;; (setq default-input-method "pyim")

  ;; 如果使用 popup page tooltip, 就需要加载 popup 包。
  ;; (require 'popup nil t)
  ;; (setq pyim-page-tooltip 'popup)

  ;; 如果使用 pyim-dregcache dcache 后端,就需要加载 pyim-dregcache 包。
  ;; (require 'pyim-dregcache)
  ;; (setq pyim-dcache-backend 'pyim-dregcache)



  ;; 显示5个候选词。
  (setq pyim-page-length 5)

  ;; 金手指设置,可以将光标处的编码,比如:拼音字符串,转换为中文。
  ;; (global-set-key (kbd "M-j") 'pyim-convert-string-at-point)

  ;; 按 "C-<return>" 将光标前的 regexp 转换为可以搜索中文的 regexp.
  (define-key minibuffer-local-map (kbd "C-<return>") 'pyim-cregexp-convert-at-point)

  ;; 我使用全拼
  (pyim-default-scheme 'quanpin)
  ;; (pyim-default-scheme 'wubi)
  ;; (pyim-default-scheme 'cangjie)

  ;; 我使用云拼音
  ;; (setq pyim-cloudim 'baidu)

  ;; pyim 探针设置
  ;; 设置 pyim 探针设置,这是 pyim 高级功能设置,可以实现 *无痛* 中英文切换 :-)
  ;; 我自己使用的中英文动态切换规则是:
  ;; 1. 光标只有在注释里面时,才可以输入中文。
  ;; 2. 光标前是汉字字符时,才能输入中文。
  ;; 3. 使用 M-j 快捷键,强制将光标前的拼音字符串转换为中文。
  ;; (setq-default pyim-english-input-switch-functions
  ;;               '(pyim-probe-dynamic-english
  ;;                 pyim-probe-isearch-mode
  ;;                 pyim-probe-program-mode
  ;;                 pyim-probe-org-structure-template))

  ;; (setq-default pyim-punctuation-half-width-functions
  ;;               '(pyim-probe-punctuation-line-beginning
  ;;                 pyim-probe-punctuation-after-punctuation))

  ;; 开启代码搜索中文功能(比如拼音,五笔码等)
  (pyim-isearch-mode 1)
  ;; 让 vertico, selectrum 等补全框架,通过 orderless 支持拼音搜索候选项功能。
  (defun my-orderless-regexp (orig-func component)
    (let ((result (funcall orig-func component)))
      (pyim-cregexp-build result)))
  ;; 以下解决 在vertico 搜索时按 C-n C-p 卡顿的问题
  (defun my/pyim-advice-add ()
    (advice-add 'orderless-regexp :around #'my-orderless-regexp))

  (defun my/pyim-advice-remove (&optional n)
    (advice-remove 'orderless-regexp #'my-orderless-regexp))

  (advice-add  #'vertico-next :before #'my/pyim-advice-remove)
  (advice-add  #'vertico-previous :before #'my/pyim-advice-remove)
  (advice-add  'abort-recursive-edit :before #'my/pyim-advice-add)
  (advice-add  'abort-minibuffers :before #'my/pyim-advice-add)
  (advice-add  'exit-minibuffer :before #'my/pyim-advice-add)
  (my/pyim-advice-add)   ;; 默认开启
  )

doom sync

效果