diff --git a/lisp/org-macro.el b/lisp/org-macro.el index 2f78a01cb..5ddfae4e1 100644 --- a/lisp/org-macro.el +++ b/lisp/org-macro.el @@ -50,6 +50,7 @@ (require 'org-macs) (require 'org-compat) +(declare-function org-collect-keywords "org" (keywords &optional unique directory)) (declare-function org-element-at-point "org-element" ()) (declare-function org-element-context "org-element" (&optional element)) (declare-function org-element-copy "org-element" (datum)) @@ -94,42 +95,18 @@ templates. Return the updated list." (t (push (cons name (or value "")) templates)))) templates) -(defun org-macro--collect-macros (&optional files templates) +(defun org-macro--collect-macros () "Collect macro definitions in current buffer and setup files. -Return an alist containing all macro templates found. - -FILES is a list of setup files names read so far, used to avoid -circular dependencies. TEMPLATES is the alist collected so far. -The two arguments are used in recursive calls." - (let ((case-fold-search t)) - (org-with-point-at 1 - (while (re-search-forward "^[ \t]*#\\+\\(MACRO\\|SETUPFILE\\):" nil t) - (let ((element (org-element-at-point))) - (when (eq (org-element-type element) 'keyword) - (let ((val (org-element-property :value element))) - (if (equal "MACRO" (org-element-property :key element)) - ;; Install macro in TEMPLATES. - (when (string-match "^\\(\\S-+\\)[ \t]*" val) - (let ((name (match-string 1 val)) - (value (substring val (match-end 0)))) - (setq templates - (org-macro--set-template name value templates)))) - ;; Enter setup file. - (let* ((uri (org-strip-quotes val)) - (uri-is-url (org-file-url-p uri)) - (uri (if uri-is-url - uri - (expand-file-name uri)))) - ;; Avoid circular dependencies. - (unless (member uri files) - (with-temp-buffer - (unless uri-is-url - (setq default-directory (file-name-directory uri))) - (org-mode) - (insert (org-file-contents uri 'noerror)) - (setq templates - (org-macro--collect-macros - (cons uri files) templates))))))))))) +Return an alist containing all macro templates found." + (let ((templates nil)) + (pcase (org-collect-keywords '("MACRO")) + (`(("MACRO" . ,values)) + (dolist (value values) + (when (string-match "^\\(\\S-+\\)[ \t]*" value) + (let ((name (match-string 1 value)) + (definition (substring value (match-end 0)))) + (setq templates + (org-macro--set-template name definition templates))))))) (let ((macros `(("author" . ,(org-macro--find-keyword-value "AUTHOR")) ("email" . ,(org-macro--find-keyword-value "EMAIL")) ("title" . ,(org-macro--find-keyword-value "TITLE" t))