用 embark 挺长时间了,深感其对效率提升之大。因此想深入研究一下,看看它有什么奇技淫巧,但是发现除了 FIFTEEN WAYS TO USE EMBARK ,论坛关于 embark 的讨论并不是很多,因此开帖来请教一下大家。
抛砖引玉,我先来分享一下我的一些配置:
- consult-org-heading
(defun consult-heading-insert-backlink (target)
(let* ((marker (plist-get
(text-properties-at 0 target)
'consult--candidate))
(headline-name (substring (org-no-properties target)
0 -1))
(headline-id (save-excursion
(with-current-buffer
(marker-buffer marker)
(goto-char marker)
(org-id-get-create)))))
(org-insert-link
nil (concat "id:" headline-id) headline-name)))
(embark-define-keymap embark-org-heading-map
"Keymap for Embark heading actions."
("i" embark-insert)
("b" consult-heading-insert-backlink)
("w" embark-copy-as-kill)
("q" embark-toggle-quit)
("E" embark-export)
("S" embark-collect)
("L" embark-live)
("B" embark-become)
("A" embark-act-all)
("C-s" embark-isearch)
("SPC" mark)
("DEL" delete-region))
(add-to-list 'embark-keymap-alist '(consult-org-heading . embark-org-heading-map))
主要增加了"快速插入 headline 链接" 的功能, 效果如下
- org-roam support
(defun org-roam-backlinks-query* (NODE)
"Gets the backlinks of NODE with `org-roam-db-query'."
(org-roam-db-query
[:select [source dest]
:from links
:where (= dest $s1)
:and (= type "id")]
(org-roam-node-id NODE)))
(defun org-roam-backlinks-p (SOURCE NODE)
"Predicate function that checks if NODE is a backlink of SOURCE."
(let* ((source-id (org-roam-node-id SOURCE))
(backlinks (org-roam-backlinks-query* SOURCE))
(id (org-roam-node-id NODE))
(id-list (list id source-id)))
(member id-list backlinks)))
(defun org-roam-backlinks--read-node-backlinks (source)
"Runs `org-roam-node-read' on the backlinks of SOURCE.
The predicate used as `org-roam-node-read''s filter-fn is
`org-roam-backlinks-p'."
(org-roam-node-read nil (apply-partially #'org-roam-backlinks-p source)))
(defun org-roam-backlinks-node-read (entry)
"Read a NODE and run `org-roam-backlinks--read-node-backlinks'."
(let* ((node (get-text-property 0 'node entry))
(backlink (org-roam-backlinks--read-node-backlinks node)))
(find-file (org-roam-node-file backlink))))
(embark-define-keymap embark-org-roam-map
"Keymap for Embark org roam actions."
("i" org-roam-node-insert)
("s" embark-collect)
("b" eli-org-roam-backlinks-node-read))
(add-to-list 'embark-keymap-alist '(org-roam-node . embark-org-roam-map))
在 org-roam-node-find
界面,可以使用 embark 来查看所选节点的反向链接节点和插入此节点,也可以批量操作节点。和节点有关操作用统一入口 org-roam-node-find
就能解决,减少记忆和快捷键负担。
edit: 根据reddit 的一篇帖子优化了 embark 代码
不知道大家还有什么小技巧或者 hack ?