diff --git a/modules/lang/org/autoload/org-link.el b/modules/lang/org/autoload/org-link.el index 8ee10aab3..d8e2e4d17 100644 --- a/modules/lang/org/autoload/org-link.el +++ b/modules/lang/org/autoload/org-link.el @@ -9,6 +9,19 @@ (let ((file (funcall (or fn #'read-file-name) (format "%s: " (capitalize key)) dir))) (format "%s:%s" key (file-relative-name file dir)))) +;;;###autoload +(defun +org-read-link-description-at-point (&optional default context) + "TODO" + (if (and (stringp default) (not (string-empty-p default))) + (string-trim default) + (if-let* ((context (or context (org-element-context))) + (context (org-element-lineage context '(link) t)) + (beg (org-element-property :contents-begin context)) + (end (org-element-property :contents-end context))) + (unless (= beg end) + (replace-regexp-in-string + "[ \n]+" " " (string-trim (buffer-substring-no-properties beg end))))))) + ;;;###autoload (defun +org-define-basic-link (key dir-var &rest plist) "Define a link with some basic completion & fontification. @@ -154,3 +167,81 @@ exist, and `org-link' otherwise." (or (+org-play-gif-at-point-h) (user-error "No gif at point"))) + +;; +;;; Org-link parameters + +;;; doom-module: +(defun +org-link--doom-module--read-link (link) + (cl-destructuring-bind (category &optional module flag) + (let ((desc (+org-read-link-description-at-point link))) + (if (string-prefix-p "+" (string-trim-left desc)) + (list nil nil (intern desc)) + (mapcar #'intern (split-string desc " " nil)))) + (list :category category + :module module + :flag flag))) + +;;;###autoload +(defun +org-link--doom-module-follow-fn (link) + (cl-destructuring-bind (&key category module flag) + (+org-link--doom-module--read-link link) + (when category + (if-let* ((path (doom-module-locate-path category module)) + (path (or (car (doom-glob path "README.org")) + path))) + (find-file path) + (user-error "Can't find Doom module '%s'" link))) + (when flag + (goto-char (point-min)) + (and (re-search-forward "^\\*+ \\(?:TODO \\)?Module Flags") + (re-search-forward (format "^\\s-*- %s :: " + (regexp-quote (symbol-name flag))) + (save-excursion (org-get-next-sibling) + (point))) + (recenter))))) + +;;;###autoload +(defun +org-link--doom-module-face-fn (link) + (cl-destructuring-bind (&key category module flag) + (+org-link--doom-module--read-link link) + (if (doom-module-locate-path category module) + `(:inherit org-priority + :weight bold) + 'error))) + + +;;; doom-package: +;;;###autoload +(defun +org-link--doom-package-follow-fn (link) + "TODO" + (doom/describe-package + (intern-soft + (+org-read-link-description-at-point link)))) + + +;;; kbd: + +(defun +org--describe-kbd (keystr) + (dolist (key `(("" . ,doom-leader-key) + ("" . ,doom-localleader-key) + ("" . ,(if (bound-and-true-p evil-mode) + (concat doom-leader-key " u") + "C-u")) + ("" . ,(if (bound-and-true-p evil-mode) + (concat doom-leader-key " h") + "C-h")) + ("\\