2021-07-19 00:53:07 +03:00
|
|
|
;;; lang/org/autoload/contrib-roam2.el -*- lexical-binding: t; -*-
|
2022-08-12 20:29:19 +02:00
|
|
|
;;;###if (modulep! +roam2)
|
2021-07-19 00:53:07 +03:00
|
|
|
|
|
|
|
;;; Custom node accessors
|
|
|
|
;;;###autoload (autoload 'org-roam-node-doom-filetitle "lang/org/autoload/contrib-roam2" nil t)
|
|
|
|
(cl-defmethod org-roam-node-doom-filetitle ((node org-roam-node))
|
2021-07-24 17:52:25 +03:00
|
|
|
"Return the value of \"#+title:\" (if any) from file that NODE resides in.
|
|
|
|
If there's no file-level title in the file, return empty string."
|
2021-07-19 00:53:07 +03:00
|
|
|
(or (if (= (org-roam-node-level node) 0)
|
|
|
|
(org-roam-node-title node)
|
2022-05-09 15:38:40 +02:00
|
|
|
(org-roam-node-file-title node))
|
2021-07-19 00:53:07 +03:00
|
|
|
""))
|
|
|
|
|
|
|
|
;;;###autoload (autoload 'org-roam-node-doom-hierarchy "lang/org/autoload/contrib-roam2" nil t)
|
|
|
|
(cl-defmethod org-roam-node-doom-hierarchy ((node org-roam-node))
|
2021-07-24 17:52:25 +03:00
|
|
|
"Return hierarchy for NODE, constructed of its file title, OLP and direct title.
|
|
|
|
If some elements are missing, they will be stripped out."
|
2021-07-19 00:53:07 +03:00
|
|
|
(let ((title (org-roam-node-title node))
|
|
|
|
(olp (org-roam-node-olp node))
|
|
|
|
(level (org-roam-node-level node))
|
2021-07-24 17:52:25 +03:00
|
|
|
(filetitle (org-roam-node-doom-filetitle node))
|
2022-02-10 19:36:15 +01:00
|
|
|
(separator (propertize org-eldoc-breadcrumb-separator 'face 'shadow)))
|
2021-07-19 00:53:07 +03:00
|
|
|
(cl-case level
|
|
|
|
;; node is a top-level file
|
|
|
|
(0 filetitle)
|
|
|
|
;; node is a level 1 heading
|
2021-07-24 17:52:25 +03:00
|
|
|
(1 (concat (propertize filetitle 'face '(shadow italic))
|
|
|
|
separator title))
|
2021-07-19 00:53:07 +03:00
|
|
|
;; node is a heading with an arbitrary outline path
|
2021-07-24 17:52:25 +03:00
|
|
|
(t (concat (propertize filetitle 'face '(shadow italic))
|
2022-02-10 19:36:15 +01:00
|
|
|
separator (propertize (string-join olp separator) 'face '(shadow italic))
|
2021-07-24 17:52:25 +03:00
|
|
|
separator title)))))
|
2021-07-19 00:53:07 +03:00
|
|
|
|
|
|
|
;;;###autoload (autoload 'org-roam-node-doom-subdirs "lang/org/autoload/contrib-roam2" nil t)
|
|
|
|
(cl-defmethod org-roam-node-doom-subdirs ((node org-roam-node))
|
2021-07-24 17:52:25 +03:00
|
|
|
"Return subdirectories of `org-roam-directory' in which NODE resides in.
|
|
|
|
If there's none, return an empty string."
|
2022-02-10 19:37:48 +01:00
|
|
|
(thread-first
|
|
|
|
node
|
|
|
|
(org-roam-node-file)
|
|
|
|
(file-relative-name org-roam-directory)
|
|
|
|
(file-name-directory)))
|
2021-07-19 00:53:07 +03:00
|
|
|
|
|
|
|
;;;###autoload (autoload 'org-roam-node-doom-tags "lang/org/autoload/contrib-roam2" nil t)
|
|
|
|
(cl-defmethod org-roam-node-doom-tags ((node org-roam-node))
|
2022-02-10 19:37:48 +01:00
|
|
|
"Return tags formatted in the same way how they appear in org files."
|
2022-02-11 01:55:44 +01:00
|
|
|
(cl-remove-if (doom-rpartial
|
|
|
|
#'member (delq
|
|
|
|
nil (append
|
|
|
|
(list (bound-and-true-p org-archive-tag)
|
|
|
|
(bound-and-true-p org-attach-auto-tag))
|
|
|
|
(bound-and-true-p org-num-skip-tags))))
|
|
|
|
(org-roam-node-tags node)))
|
2022-02-10 19:37:48 +01:00
|
|
|
|
|
|
|
;;;###autoload (autoload 'org-roam-node-doom-type "lang/org/autoload/contrib-roam2" nil t)
|
|
|
|
(cl-defmethod org-roam-node-doom-type ((node org-roam-node))
|
|
|
|
"Return the directory relative to `org-roam-directory' as a note's \"type\"."
|
|
|
|
(when-let (dir (thread-first
|
|
|
|
node
|
|
|
|
(org-roam-node-file)
|
|
|
|
(file-relative-name org-roam-directory)
|
|
|
|
(file-name-directory)))
|
|
|
|
(directory-file-name dir)))
|
|
|
|
|
|
|
|
|
2022-02-10 19:41:18 +01:00
|
|
|
;;
|
|
|
|
;;; Hooks
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun +org-roam-manage-backlinks-buffer-h ()
|
|
|
|
"Open or close roam backlinks buffer depending on visible org-roam buffers.
|
|
|
|
|
|
|
|
Intended to be added to `doom-switch-buffer-hook' in `org-roam-find-file-hook'.
|
|
|
|
Controlled by `+org-roam-open-buffer-on-find-file'."
|
|
|
|
(when (and +org-roam-auto-backlinks-buffer
|
|
|
|
(not org-roam-capture--node) ; not for roam capture buffers
|
|
|
|
(not org-capture-mode) ; not for capture buffers
|
|
|
|
(not (bound-and-true-p +popup-buffer-mode)))
|
|
|
|
(let ((visible-p (eq 'visible (org-roam-buffer--visibility))))
|
|
|
|
(if (cl-some #'org-roam-buffer-p (doom-visible-buffers))
|
|
|
|
(unless visible-p
|
|
|
|
(org-roam-buffer-toggle))
|
|
|
|
(when visible-p
|
|
|
|
(org-roam-buffer-toggle))
|
|
|
|
(unless (doom-buffers-in-mode 'org-mode)
|
|
|
|
(remove-hook 'doom-switch-buffer-hook #'+org-roam-manage-backlinks-buffer-h))))))
|
2022-02-10 18:20:52 +01:00
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
;;; Advice
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun org-roam-link-follow-link-with-description-a (args)
|
|
|
|
"Use a 'roam:X' link's description if X is empty."
|
|
|
|
(when (or (string-empty-p (car args))
|
|
|
|
(null (car args)))
|
|
|
|
(setcar
|
|
|
|
args (let ((link (org-element-context)))
|
|
|
|
(and (org-element-property :contents-begin link)
|
|
|
|
(org-element-property :contents-end link)
|
|
|
|
(buffer-substring-no-properties
|
|
|
|
(org-element-property :contents-begin link)
|
|
|
|
(org-element-property :contents-end link))))))
|
|
|
|
args)
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun org-roam-link-replace-at-point-a (&optional link)
|
|
|
|
"Replace \"roam:\" LINK at point with an \"id:\" link."
|
|
|
|
(save-excursion
|
|
|
|
(save-match-data
|
|
|
|
(let* ((link (or link (org-element-context)))
|
|
|
|
(type (org-element-property :type link))
|
|
|
|
(path (org-element-property :path link))
|
|
|
|
(desc (and (org-element-property :contents-begin link)
|
|
|
|
(org-element-property :contents-end link)
|
|
|
|
(buffer-substring-no-properties
|
|
|
|
(org-element-property :contents-begin link)
|
|
|
|
(org-element-property :contents-end link))))
|
|
|
|
node)
|
|
|
|
(goto-char (org-element-property :begin link))
|
|
|
|
(when (and (org-in-regexp org-link-any-re 1)
|
|
|
|
(string-equal type "roam")
|
|
|
|
;; Added `desc' ref here
|
|
|
|
(setq node (save-match-data
|
|
|
|
(org-roam-node-from-title-or-alias
|
|
|
|
(if (string-empty-p path)
|
|
|
|
desc
|
|
|
|
path)))))
|
|
|
|
(replace-match (org-link-make-string
|
|
|
|
(concat "id:" (org-roam-node-id node))
|
|
|
|
(or desc path))))))))
|