diff options
author | Nicolas Goaziou <n.goaziou@gmail.com> | 2013-04-01 15:44:15 +0200 |
---|---|---|
committer | Nicolas Goaziou <n.goaziou@gmail.com> | 2013-04-01 15:47:39 +0200 |
commit | a82b06ae4b88f59b5f7d22578139555e947dc648 (patch) | |
tree | 7d08aa47d43f716831e059c2c540d3fc38574222 | |
parent | 55db57dc0a20ec7b6a4eb4c611c2bc9da1778c2f (diff) | |
download | org-mode-a82b06ae4b88f59b5f7d22578139555e947dc648.tar.gz |
org-macro: Properly handle macros in setup files
* lisp/org-macro.el (org-macro--collect-macros): Fix a bug where
reading a macro in a setup file would remove other macros read so
far from template. Change function signature.
(org-macro-initialize-templates): Apply signature change from function
above.
* testing/lisp/test-org-macro.el: Add test.
-rw-r--r-- | lisp/org-macro.el | 69 | ||||
-rw-r--r-- | testing/lisp/test-org-macro.el | 9 |
2 files changed, 43 insertions, 35 deletions
diff --git a/lisp/org-macro.el b/lisp/org-macro.el index 88cbdf7..0bd0da6 100644 --- a/lisp/org-macro.el +++ b/lisp/org-macro.el @@ -61,37 +61,44 @@ directly, use instead: ;;; Functions -(defun org-macro--collect-macros (files) +(defun org-macro--collect-macros () "Collect macro definitions in current buffer and setup files. -FILES is a list of setup files names read so far, used to avoid -circular dependencies. Return an alist containing all macro -templates found." - (let ((case-fold-search t) templates) - ;; Install buffer-local macros. Also enter SETUPFILE keywords. - (org-with-wide-buffer - (goto-char (point-min)) - (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 (org-element-property :key element) "SETUPFILE") - ;; Enter setup file. - (let ((file (expand-file-name (org-remove-double-quotes val)))) - (unless (member file files) - (with-temp-buffer - (org-mode) - (insert (org-file-contents file 'noerror)) - (setq templates - (org-macro--collect-macros (cons file files)))))) - ;; Install macro in TEMPLATES. - (when (string-match "^\\(.*?\\)\\(?:\\s-+\\(.*\\)\\)?\\s-*$" val) - (let* ((name (match-string 1 val)) - (template (or (match-string 2 val) "")) - (old-cell (assoc name templates))) - (if old-cell (setcdr old-cell template) - (push (cons name template) templates)))))))))) - ;; Return value. - templates)) +Return an alist containing all macro templates found." + (let* (collect-macros ; For byte-compiler. + (collect-macros + (lambda (files templates) + ;; Return an alist of macro templates. FILES is a list of + ;; setup files names read so far, used to avoid circular + ;; dependencies. TEMPLATES is the alist collected so far. + (let ((case-fold-search t)) + (org-with-wide-buffer + (goto-char (point-min)) + (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 (org-element-property :key element) "MACRO") + ;; Install macro in TEMPLATES. + (when (string-match + "^\\(.*?\\)\\(?:\\s-+\\(.*\\)\\)?\\s-*$" val) + (let* ((name (match-string 1 val)) + (template (or (match-string 2 val) "")) + (old-cell (assoc name templates))) + (if old-cell (setcdr old-cell template) + (push (cons name template) templates)))) + ;; Enter setup file. + (let ((file (expand-file-name + (org-remove-double-quotes val)))) + (unless (member file files) + (with-temp-buffer + (org-mode) + (insert (org-file-contents file 'noerror)) + (setq templates + (funcall collect-macros (cons file files) + templates))))))))))) + templates)))) + (funcall collect-macros nil nil))) (defun org-macro-initialize-templates () "Collect macro templates defined in current buffer. @@ -100,7 +107,7 @@ Templates are stored in buffer-local variable function installs the following ones: \"property\", \"time\". and, if the buffer is associated to a file, \"input-file\" and \"modification-time\"." - (let* ((templates (org-macro--collect-macros nil)) + (let* ((templates (org-macro--collect-macros)) (update-templates (lambda (cell) (let ((old-template (assoc (car cell) templates))) diff --git a/testing/lisp/test-org-macro.el b/testing/lisp/test-org-macro.el index 75265e4..ce8d630 100644 --- a/testing/lisp/test-org-macro.el +++ b/testing/lisp/test-org-macro.el @@ -66,11 +66,12 @@ ;; Macros in setup file. (should (string-match - "success\\'" + "success success\\'" (org-test-with-temp-text - (format - "#+SETUPFILE: \"%sexamples/macro-templates.org\"\n{{{included-macro}}}" - org-test-dir) + (format "#+MACRO: other-macro success +#+SETUPFILE: \"%sexamples/macro-templates.org\" +{{{included-macro}}} {{{other-macro}}}" + org-test-dir) (org-macro-initialize-templates) (org-macro-replace-all org-macro-templates) (buffer-string))))) |