From 3c2c23f705f3336d2dffa90431808a7a33cad319 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 Feb 2022 18:20:52 +0100 Subject: [PATCH] feat(org): use roam:X link description if X is empty Saves on some typing if you want to link to zettels that don't exist yet. --- modules/lang/org/autoload/contrib-roam2.el | 45 ++++++++++++++++++++++ modules/lang/org/contrib/roam2.el | 5 +++ 2 files changed, 50 insertions(+) diff --git a/modules/lang/org/autoload/contrib-roam2.el b/modules/lang/org/autoload/contrib-roam2.el index 72b6d3d9e..ad242220d 100644 --- a/modules/lang/org/autoload/contrib-roam2.el +++ b/modules/lang/org/autoload/contrib-roam2.el @@ -56,3 +56,48 @@ the tags of, return an empty string." (setq subdirs (propertize (concat ":" (replace-regexp-in-string "/\\|\\\\" ":" subdirs)) 'face '(shadow italic)))) (replace-regexp-in-string ":+" (propertize ":" 'face 'shadow) (concat subdirs tags)))) + + +;; +;;; 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)))))))) diff --git a/modules/lang/org/contrib/roam2.el b/modules/lang/org/contrib/roam2.el index 6f746da90..179219231 100644 --- a/modules/lang/org/contrib/roam2.el +++ b/modules/lang/org/contrib/roam2.el @@ -103,6 +103,11 @@ In case of failure, fail gracefully." ;; Soft-wrap lines in the backlinks buffer (add-hook 'org-roam-mode-hook #'turn-on-visual-line-mode) + ;; Use a 'roam:X' link's description if X is empty. + ;; TODO PR this upstream? + (advice-add #'org-roam-link-follow-link :filter-args #'org-roam-link-follow-link-with-description-a) + (advice-add #'org-roam-link-replace-at-point :override #'org-roam-link-replace-at-point-a) + (map! :map org-mode-map :localleader :prefix ("m" . "org-roam")