From ea2cd9b1c82dc77216af8a90e0d7491627911347 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Wed, 4 Nov 2009 13:41:40 -0500 Subject: [PATCH 1/5] org-babel: make info structure available when removing/inserting results This also eliminates two extra calls to org-babel-get-src-block-info. --- contrib/babel/lisp/org-babel.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/contrib/babel/lisp/org-babel.el b/contrib/babel/lisp/org-babel.el index 90ac447eb..febddd7c4 100644 --- a/contrib/babel/lisp/org-babel.el +++ b/contrib/babel/lisp/org-babel.el @@ -175,7 +175,7 @@ the header arguments specified at the source code block." ;; (message "supplied params=%S" params) ;; debugging (let* ((info (or info (org-babel-get-src-block-info))) (lang (first info)) - (params (org-babel-merge-params (third info) params)) + (params (setf (third info) (org-babel-merge-params (third info) params))) (body (if (assoc :noweb params) (org-babel-expand-noweb-references info) (second info))) (processed-params (org-babel-process-params params)) @@ -192,7 +192,7 @@ the header arguments specified at the source code block." (funcall cmd body params))) (if (eq result-type 'value) (setq result (org-babel-process-value-result result result-params))) - (org-babel-insert-result result result-params) + (org-babel-insert-result result result-params info) result)) (defun org-babel-load-in-session (&optional arg info) @@ -473,7 +473,7 @@ buffer or nil if no such result exists." (concat "#\\+resname:[ \t]*" (regexp-quote name) "[ \t\n\f\v\r]") nil t) (move-beginning-of-line 0) (point)))) -(defun org-babel-where-is-src-block-result (&optional insert) +(defun org-babel-where-is-src-block-result (&optional insert info) "Return the point at the beginning of the result of the current source block. Specifically at the beginning of the #+RESNAME: line. If no result exists for this block then create a @@ -482,7 +482,7 @@ line. If no result exists for this block then create a (let* ((on-lob-line (progn (beginning-of-line 1) (looking-at org-babel-lob-one-liner-regexp))) (name (if on-lob-line (first (org-babel-lob-get-info)) - (fifth (org-babel-get-src-block-info)))) + (fifth (or info (org-babel-get-src-block-info))))) (head (unless on-lob-line (org-babel-where-is-src-block-head))) end) (when head (goto-char head)) (or (and name (org-babel-find-named-result name)) @@ -528,7 +528,7 @@ line. If no result exists for this block then create a (mapcar #'org-babel-read row))) (org-table-to-lisp))) -(defun org-babel-insert-result (result &optional insert) +(defun org-babel-insert-result (result &optional insert info) "Insert RESULT into the current buffer after the end of the current source block. With optional argument INSERT controls insertion of results in the org-mode file. INSERT can take the @@ -566,7 +566,7 @@ code ---- the results are extracted in the syntax of the source (if (member "file" insert) (setq result (org-babel-result-to-file result)))) (unless (listp result) (setq result (format "%S" result)))) (if (and insert (member "replace" insert) (not (member "silent" insert))) - (org-babel-remove-result)) + (org-babel-remove-result info)) (if (= (length result) 0) (if (member "value" result-params) (message "No result returned by source block") @@ -578,7 +578,7 @@ code ---- the results are extracted in the syntax of the source (string-equal (substring result -1) "\r")))) (setq result (concat result "\n"))) (save-excursion - (let ((existing-result (org-babel-where-is-src-block-result t))) + (let ((existing-result (org-babel-where-is-src-block-result t info))) (when existing-result (goto-char existing-result) (forward-line 1))) (cond ;; assume the result is a table if it's not a string @@ -607,11 +607,11 @@ code ---- the results are extracted in the syntax of the source relies on `org-babel-insert-result'." (with-temp-buffer (org-babel-insert-result result) (buffer-string))) -(defun org-babel-remove-result () +(defun org-babel-remove-result (&optional info) "Remove the result of the current source block." (interactive) (save-excursion - (goto-char (org-babel-where-is-src-block-result t)) (forward-line 1) + (goto-char (org-babel-where-is-src-block-result t info)) (forward-line 1) (delete-region (point) (org-babel-result-end)))) (defun org-babel-result-end () From 43bd90ef81f191c41ba69bc16248e70844c929e9 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Wed, 4 Nov 2009 13:49:01 -0500 Subject: [PATCH 2/5] org-babel: new header argument :results_switches If present this should be followed by org-mode block switches to be inserted with the results block. --- contrib/babel/lisp/org-babel.el | 52 ++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/contrib/babel/lisp/org-babel.el b/contrib/babel/lisp/org-babel.el index febddd7c4..cfd8505cb 100644 --- a/contrib/babel/lisp/org-babel.el +++ b/contrib/babel/lisp/org-babel.el @@ -578,28 +578,30 @@ code ---- the results are extracted in the syntax of the source (string-equal (substring result -1) "\r")))) (setq result (concat result "\n"))) (save-excursion - (let ((existing-result (org-babel-where-is-src-block-result t info))) - (when existing-result (goto-char existing-result) (forward-line 1))) - (cond - ;; assume the result is a table if it's not a string - ((not (stringp result)) - (insert (concat (orgtbl-to-orgtbl - (if (and (listp (car result)) (listp (cdr (car result)))) - result (list result)) - '(:fmt (lambda (cell) (format "%S" cell)))) "\n")) - (forward-line -1) (org-cycle)) - ((member "file" insert) - (insert result)) - ((member "html" insert) - (insert (format "#+BEGIN_HTML\n%s#+END_HTML\n" result))) - ((member "latex" insert) - (insert (format "#+BEGIN_LaTeX\n%s#+END_LaTeX\n" result))) - ((member "code" insert) - (insert (format "#+BEGIN_SRC %s\n%s#+END_SRC\n" lang result))) - ((or (member "raw" insert) (member "org" insert)) - (save-excursion (insert result)) (if (org-at-table-p) (org-cycle))) - (t - (org-babel-examplize-region (point) (progn (insert result) (point)))))) + (let ((existing-result (org-babel-where-is-src-block-result t info)) + (results-switches (cdr (assoc :results_switches (third info))))) + (when existing-result (goto-char existing-result) (forward-line 1)) + (setq results-switches (if results-switches (concat " " results-switches) "")) + (cond + ;; assume the result is a table if it's not a string + ((not (stringp result)) + (insert (concat (orgtbl-to-orgtbl + (if (and (listp (car result)) (listp (cdr (car result)))) + result (list result)) + '(:fmt (lambda (cell) (format "%S" cell)))) "\n")) + (forward-line -1) (org-cycle)) + ((member "file" insert) + (insert result)) + ((member "html" insert) + (insert (format "#+BEGIN_HTML%s\n%s#+END_HTML\n" results-switches result))) + ((member "latex" insert) + (insert (format "#+BEGIN_LaTeX%s\n%s#+END_LaTeX\n" results-switches result))) + ((member "code" insert) + (insert (format "#+BEGIN_SRC %s%s\n%s#+END_SRC\n" lang results-switches result))) + ((or (member "raw" insert) (member "org" insert)) + (save-excursion (insert result)) (if (org-at-table-p) (org-cycle))) + (t + (org-babel-examplize-region (point) (progn (insert result) (point)) results-switches))))) (message "finished")))) (defun org-babel-result-to-org-string (result) @@ -643,7 +645,7 @@ RESULT, and the display being the `file-name-nondirectory' if non-nil." (concat "[[file:" result "]]")) -(defun org-babel-examplize-region (beg end) +(defun org-babel-examplize-region (beg end &optional results-switches) "Comment out region using the ': ' org example quote." (interactive "*r") (let ((size (abs (- (line-number-at-pos end) @@ -660,7 +662,9 @@ non-nil." (move-beginning-of-line 1) (insert ": ") (forward-line 1))) (t (goto-char beg) - (insert "#+begin_example\n") + (insert (if results-switches + (format "#+begin_example%s\n" results-switches) + "#+begin_example\n")) (forward-char (- end beg)) (insert "#+end_example\n")))))) From cd405fad22ca6bf60f96c384fa1b1963488eb1cf Mon Sep 17 00:00:00 2001 From: Eric Schulte Date: Wed, 4 Nov 2009 15:14:45 -0700 Subject: [PATCH 3/5] org-babel-tangle: now conservative about whitespace insertion around tangled blocks --- contrib/babel/lisp/org-babel-tangle.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contrib/babel/lisp/org-babel-tangle.el b/contrib/babel/lisp/org-babel-tangle.el index a5886af62..3d443cdd8 100644 --- a/contrib/babel/lisp/org-babel-tangle.el +++ b/contrib/babel/lisp/org-babel-tangle.el @@ -183,17 +183,17 @@ form (link source-name params body)" (flet ((insert-comment (text) (when commentable + (insert "\n") (comment-region (point) (progn (insert text) (point))) - (move-end-of-line nil)))) + (move-end-of-line nil) + (insert "\n")))) (let ((link (first spec)) (source-name (second spec)) (body (fourth spec)) (commentable (not (fifth spec)))) - (insert "\n\n") (insert-comment (format "[[%s][%s]]" (org-link-escape link) source-name)) - (insert (format "\n%s\n" (org-babel-chomp body))) - (insert-comment (format "%s ends here" source-name)) - (insert "\n")))) + (insert (format "%s" (org-babel-chomp body))) + (insert-comment (format "%s ends here" source-name))))) (provide 'org-babel-tangle) ;;; org-babel-tangle.el ends here From 260007e61f5023ff886d5de26c4c3ccb9ee97a97 Mon Sep 17 00:00:00 2001 From: Eric Schulte Date: Wed, 4 Nov 2009 15:18:50 -0700 Subject: [PATCH 4/5] org-babel-tangle: now careful to only add one shebang per file --- contrib/babel/lisp/org-babel-tangle.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/contrib/babel/lisp/org-babel-tangle.el b/contrib/babel/lisp/org-babel-tangle.el index 3d443cdd8..701e6aeb0 100644 --- a/contrib/babel/lisp/org-babel-tangle.el +++ b/contrib/babel/lisp/org-babel-tangle.el @@ -88,7 +88,8 @@ exported source code blocks by language." (lang-specs (cdr (assoc lang org-babel-tangle-langs))) (ext (first lang-specs)) (she-bang (second lang-specs)) - (commentable (not (third lang-specs)))) + (commentable (not (third lang-specs))) + she-banged) (mapc (lambda (spec) (let* ((tangle (cdr (assoc :tangle (third spec)))) @@ -113,7 +114,9 @@ exported source code blocks by language." ;; drop source-block to file (with-temp-buffer (funcall lang-f) - (when she-bang (insert (concat she-bang "\n"))) + (when (and she-bang (not (member file-name she-banged))) + (insert (concat she-bang "\n")) + (setq she-banged (cons file-name she-banged))) (when commentable (comment-region (point) (progn (insert "generated by org-babel-tangle") (point))) From e3bf0b4a8107b6bec1b3e25edfa3fa577e7349b3 Mon Sep 17 00:00:00 2001 From: Eric Schulte Date: Wed, 4 Nov 2009 17:46:55 -0700 Subject: [PATCH 5/5] org-babel-haskell: org-babel-haskell-export-to-lhs now optionally preserves indentation based either on the value of org-src-preserve-indentation or the presence of the -i switch --- contrib/babel/lisp/langs/org-babel-haskell.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/contrib/babel/lisp/langs/org-babel-haskell.el b/contrib/babel/lisp/langs/org-babel-haskell.el index 411807435..d8b56e75b 100644 --- a/contrib/babel/lisp/langs/org-babel-haskell.el +++ b/contrib/babel/lisp/langs/org-babel-haskell.el @@ -153,6 +153,7 @@ constructs (header arguments, no-web syntax etc...) are ignored." (lhs-file (concat base-name ".lhs")) (tex-file (concat base-name ".tex")) (command (concat org-babel-haskell-lhs2tex-command " " lhs-file " > " tex-file)) + (preserve-indentp org-src-preserve-indentation) indentation) ;; escape haskell source-code blocks (with-temp-file tmp-org-file @@ -160,10 +161,14 @@ constructs (header arguments, no-web syntax etc...) are ignored." (goto-char (point-min)) (while (re-search-forward haskell-regexp nil t) (save-match-data (setq indentation (length (match-string 1)))) - (replace-match (save-match-data (concat - "#+begin_latex\n\\begin{code}\n" - (org-remove-indentation (match-string 3)) - "\n\\end{code}\n#+end_latex\n")) + (replace-match (save-match-data + (concat + "#+begin_latex\n\\begin{code}\n" + (if (or preserve-indentp + (string-match "-i" (match-string 2))) + (match-string 3) + (org-remove-indentation (match-string 3))) + "\n\\end{code}\n#+end_latex\n")) t t) (indent-code-rigidly (match-beginning 0) (match-end 0) indentation))) (save-excursion