diff --git a/lisp/ob.el b/lisp/ob.el index c90b51c54..1248acad5 100644 --- a/lisp/ob.el +++ b/lisp/ob.el @@ -1842,13 +1842,21 @@ block but are passed literally to the \"example-block\"." (lang (nth 0 info)) (body (nth 1 info)) (comment (string= "noweb" (cdr (assoc :comments (nth 2 info))))) - (new-body "") index source-name evaluate prefix) + (new-body "") index source-name evaluate prefix blocks-in-buffer) (flet ((nb-add (text) (setq new-body (concat new-body text))) (c-wrap (text) (with-temp-buffer (funcall (intern (concat lang "-mode"))) (comment-region (point) (progn (insert text) (point))) - (org-babel-trim (buffer-string))))) + (org-babel-trim (buffer-string)))) + (blocks () ;; return the info lists of all blocks in this buffer + (let (infos) + (save-restriction + (widen) + (org-babel-map-src-blocks nil + (setq infos (cons (org-babel-get-src-block-info 'light) + infos)))) + (reverse infos)))) (with-temp-buffer (insert body) (goto-char (point-min)) (setq index (point)) @@ -1873,35 +1881,32 @@ block but are passed literally to the \"example-block\"." (if evaluate (let ((raw (org-babel-ref-resolve source-name))) (if (stringp raw) raw (format "%S" raw))) - (or (nth 2 (assoc (intern source-name) - org-babel-library-of-babel)) - (save-restriction - (widen) - (let ((point (org-babel-find-named-block - source-name))) - (if point - (save-excursion - (goto-char point) - ;; possibly wrap body in comments - (let* ((i (org-babel-get-src-block-info 'light)) - (body (org-babel-trim - (org-babel-expand-noweb-references - i)))) - (if comment - ((lambda (cs) (concat (c-wrap (car cs)) "\n" - body - "\n" (c-wrap (cadr cs)))) - (org-babel-tangle-comment-links i)) - body))) - ;; optionally raise an error if named - ;; source-block doesn't exist - (if (member lang org-babel-noweb-error-langs) - (error "%s" - (concat + (or + ;; retrieve from the library of babel + (nth 2 (assoc (intern source-name) + org-babel-library-of-babel)) + ;; find the expansion of reference in this buffer + (or (mapconcat + (lambda (i) + (when (string= source-name + (or (cdr (assoc :noweb-ref (nth 2 i))) + (nth 4 i))) + (let ((body (org-babel-expand-noweb-references i))) + (if comment + ((lambda (cs) (concat (c-wrap (car cs)) "\n" + body "\n" (c-wrap (cadr cs)))) + (org-babel-tangle-comment-links i)) + body)))) + (or blocks-in-buffer + (setq blocks-in-buffer (blocks))) + "") + ;; possibly raise an error if named block doesn't exist + (if (member lang org-babel-noweb-error-langs) + (error "%s" (concat "<<" source-name ">> " "could not be resolved (see " "`org-babel-noweb-error-langs')")) - "")))))) + "")))) "[\n\r]") (concat "\n" prefix))))) (nb-add (buffer-substring index (point-max))))) new-body))