Просмотр исходного кода

macro: Small refactoring.

* lisp/org-macro.el (org-macro--collect-macros): Use
`org-collect-keywords'.
Nicolas Goaziou 4 лет назад
Родитель
Сommit
3e44ddbe78
1 измененных файлов с 12 добавлено и 35 удалено
  1. 12 35
      lisp/org-macro.el

+ 12 - 35
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))