summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2020-04-26 22:57:47 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2020-04-26 22:57:47 +0200
commit3e44ddbe786da4ca990789e182eb2b70374e01bb (patch)
tree7cce1f38e4598fc03daf7b18ba04f771d72f9351
parent0826461bc1248e4f8d33090d867d2feaf324bdd8 (diff)
downloadorg-mode-3e44ddbe786da4ca990789e182eb2b70374e01bb.tar.gz
macro: Small refactoring.
* lisp/org-macro.el (org-macro--collect-macros): Use `org-collect-keywords'.
-rw-r--r--lisp/org-macro.el47
1 files changed, 12 insertions, 35 deletions
diff --git a/lisp/org-macro.el b/lisp/org-macro.el
index 2f78a01..5ddfae4 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))