Browse Source

adding a replace option, and simplified result insertion

Eric Schulte 16 years ago
parent
commit
f7d0dd1fda
2 changed files with 60 additions and 32 deletions
  1. 37 28
      litorgy/litorgy.el
  2. 23 4
      rorg.org

+ 37 - 28
litorgy/litorgy.el

@@ -1,4 +1,4 @@
-;;; litorgy.el --- literate programing in org-mode 
+;;; litorgy.el --- literate programing in org-mode
 
 
 ;; Copyright (C) 2009 Eric Schulte, Dan Davison, Austin F. Frank
 ;; Copyright (C) 2009 Eric Schulte, Dan Davison, Austin F. Frank
 
 
@@ -44,12 +44,6 @@ so then run `litorgy-execute-src-block'."
 
 
 (add-hook 'org-ctrl-c-ctrl-c-hook 'litorgy-execute-src-block-maybe)
 (add-hook 'org-ctrl-c-ctrl-c-hook 'litorgy-execute-src-block-maybe)
 
 
-(defcustom litorgy-example-size-cutoff 10
-  "Number at lines at which to switch from using the ': '
-org-mode quote sytax to using a '#+BEGIN_EXAMPLE' block"
-  :group 'litorgy
-  :type 'integer)
-
 (defvar litorgy-src-block-regexp nil
 (defvar litorgy-src-block-regexp nil
   "Regexp used to test when inside of a litorgical src-block")
   "Regexp used to test when inside of a litorgical src-block")
 
 
@@ -65,7 +59,7 @@ org-mode quote sytax to using a '#+BEGIN_EXAMPLE' block"
 (defcustom litorgy-interpreters '()
 (defcustom litorgy-interpreters '()
   "Interpreters allows for evaluation tags.
   "Interpreters allows for evaluation tags.
 This is a list of program names (as strings) that can evaluate code and
 This is a list of program names (as strings) that can evaluate code and
-insert the output into an Org-mode buffer.  Valid choices are 
+insert the output into an Org-mode buffer.  Valid choices are
 
 
 R          Evaluate R code
 R          Evaluate R code
 emacs-lisp Evaluate Emacs Lisp code and display the result
 emacs-lisp Evaluate Emacs Lisp code and display the result
@@ -90,7 +84,7 @@ into the buffer immediately following the block.  Results are
 commented by `litorgy-make-region-example'.  With optional prefix
 commented by `litorgy-make-region-example'.  With optional prefix
 don't dump results into buffer."
 don't dump results into buffer."
   (interactive "P")
   (interactive "P")
-  (let* ((info (litorgy-get-current-src-block-info))
+  (let* ((info (litorgy-get-src-block-info))
          (lang (first info))
          (lang (first info))
          (body (second info))
          (body (second info))
          (params (third info))
          (params (third info))
@@ -99,7 +93,7 @@ don't dump results into buffer."
     (unless (member lang litorgy-interpreters)
     (unless (member lang litorgy-interpreters)
       (error "Language is not in `litorgy-interpreters': %s" lang))
       (error "Language is not in `litorgy-interpreters': %s" lang))
     (setq result (funcall cmd body params))
     (setq result (funcall cmd body params))
-    (unless arg (litorgy-insert-result result))))
+    (unless arg (litorgy-insert-result result (assoc :replace params)))))
 
 
 (defun litorgy-eval-subtree (&optional arg)
 (defun litorgy-eval-subtree (&optional arg)
   "Replace EVAL snippets in the entire subtree."
   "Replace EVAL snippets in the entire subtree."
@@ -111,7 +105,7 @@ don't dump results into buffer."
       (litorgy-eval-src-block arg))
       (litorgy-eval-src-block arg))
     (widen)))
     (widen)))
 
 
-(defun litorgy-get-current-src-block-info ()
+(defun litorgy-get-src-block-info ()
   "Return the information of the current source block (the point
   "Return the information of the current source block (the point
 should be on the '#+begin_src' line) as a list of the following
 should be on the '#+begin_src' line) as a list of the following
 form.  (language body header-arguments-alist)"
 form.  (language body header-arguments-alist)"
@@ -122,25 +116,44 @@ form.  (language body header-arguments-alist)"
   (let ((lang (litorgy-clean-text-properties (match-string 1)))
   (let ((lang (litorgy-clean-text-properties (match-string 1)))
         (args (litorgy-clean-text-properties (or (match-string 3) "")))
         (args (litorgy-clean-text-properties (or (match-string 3) "")))
         (body (litorgy-clean-text-properties (match-string 4))))
         (body (litorgy-clean-text-properties (match-string 4))))
-    (list lang body
-          (mapc (lambda (arg)
-                  (if (string-match "\\([^ :]+\\):\\([^ :]+\\)" arg)
-                      (cons (match-string 1 arg) (match-string 2 arg))))
-                (split-string args)))))
-
-(defun litorgy-insert-result (result)
+    (list lang body (litorgy-parse-header-arguments args))))
+
+(defun litorgy-parse-header-arguments (arg-string)
+  "Parse a string of header arguments returning an alist."
+  (delq nil
+        (mapcar
+         (lambda (arg) (if (string-match "\\([^ \f\t\n\r\v]+\\)[ \f\t\n\r\v]*\\([^ \f\t\n\r\v]*\\)" arg)
+                      (cons (intern (concat ":" (match-string 1 arg))) (match-string 2 arg))))
+         (split-string (concat " " arg-string) "[ \f\t\n\r\v]+:"))))
+
+(defun litorgy-insert-result (result &optional replace)
+  "Insert RESULT into the current buffer after the end of the
+current source block.  With optional argument REPLACE replace any
+existing results currently located after the source block."
+  (if replace (litorgy-remove-result))
   (save-excursion
   (save-excursion
     (re-search-forward "^#\\+end_src" nil t) (open-line 1) (forward-char 2)
     (re-search-forward "^#\\+end_src" nil t) (open-line 1) (forward-char 2)
     (let ((beg (point))
     (let ((beg (point))
           (end (progn (insert result)
           (end (progn (insert result)
                       (point))))
                       (point))))
-      (message (format "from %S %S" beg end))
       (litorgy-make-region-example beg end))))
       (litorgy-make-region-example beg end))))
 
 
+(defun litorgy-remove-result ()
+  "Remove the result following the current source block"
+  (save-excursion
+    (re-search-forward "^#\\+end_src" nil t)
+    (forward-char 1)
+    (delete-region (point)
+                   (save-excursion (forward-line 1)
+                                   (while (if (looking-at ": ")
+                                              (progn (while (looking-at ": ")
+                                                       (forward-line 1)) t))
+                                     (forward-line 1))
+                                   (forward-line -1)
+                                   (point)))))
+
 (defun litorgy-make-region-example (beg end)
 (defun litorgy-make-region-example (beg end)
-  "Comment out region using either the '^:' or the BEGIN_EXAMPLE
-syntax based on the size of the region as compared to
-`litorgy-example-size-cutoff'."
+  "Comment out region using the ': ' org example quote."
   (interactive "*r")
   (interactive "*r")
   (let ((size (abs (- (line-number-at-pos end)
   (let ((size (abs (- (line-number-at-pos end)
 		      (line-number-at-pos beg)))))
 		      (line-number-at-pos beg)))))
@@ -148,14 +161,10 @@ syntax based on the size of the region as compared to
 	(let ((result (buffer-substring beg end)))
 	(let ((result (buffer-substring beg end)))
 	  (delete-region beg end)
 	  (delete-region beg end)
 	  (insert (concat ": " result)))
 	  (insert (concat ": " result)))
-      (if (<= size litorgy-example-size-cutoff)
-	  (save-excursion
+      (save-excursion
 	    (goto-char beg)
 	    (goto-char beg)
 	    (dotimes (n size)
 	    (dotimes (n size)
-	      (move-beginning-of-line 1) (insert ": ") (forward-line 1)))
-	(let ((result (buffer-substring beg end)))
-	  (delete-region beg end)
-	  (insert (concat "#+BEGIN_EXAMPLE\n" result "#+END_EXAMPLE\n")))))))  
+	      (move-beginning-of-line 1) (insert ": ") (forward-line 1))))))
 
 
 (defun litorgy-clean-text-properties (text)
 (defun litorgy-clean-text-properties (text)
   "Strip all properties from text return."
   "Strip all properties from text return."

+ 23 - 4
rorg.org

@@ -24,6 +24,7 @@ The main objectives of this project are...
 - [[* evaluation of embedded source code][evaluation of embedded source code]]
 - [[* evaluation of embedded source code][evaluation of embedded source code]]
   - [[* execution on demand and on export][execution on demand and on export]]
   - [[* execution on demand and on export][execution on demand and on export]]
   - [[* source blocks][source blocks]]
   - [[* source blocks][source blocks]]
+  - [[* header arguments][header arguments]]
   - [[* inline source evaluation][inline source evaluation]]
   - [[* inline source evaluation][inline source evaluation]]
   - [[* included source file evaluation][included source file evaluation]] ?? maybe
   - [[* included source file evaluation][included source file evaluation]] ?? maybe
   - [[* caching of evaluation][caching of evaluation]]
   - [[* caching of evaluation][caching of evaluation]]
@@ -117,6 +118,14 @@ The main objectives of this project are...
 *** source blocks
 *** source blocks
 (see [[* Special editing and evaluation of source code][Special editing and evaluation of source code]])
 (see [[* Special editing and evaluation of source code][Special editing and evaluation of source code]])
 
 
+*** header arguments
+(see [[* block headers/parameters][block headers/parameters]])
+
+There are going to be many cases where we want to use header arguments
+to change the evaluation options of source code, to pass external
+information to a block of source code and control the inclusion of
+evaluation results.
+
 *** inline source evaluation
 *** inline source evaluation
 *** included source file evaluation
 *** included source file evaluation
 It may be nice to be able to include an entire external file of source
 It may be nice to be able to include an entire external file of source
@@ -269,7 +278,6 @@ plus a table reference within that org file. Thus maybe something like
   (R-obj-name-2 . (:tblref tbl-name-or-id-2 :file file-2)))
   (R-obj-name-2 . (:tblref tbl-name-or-id-2 :file file-2)))
 #+end_src emacs-lisp
 #+end_src emacs-lisp
 
 
-
 *** source-target pairs
 *** source-target pairs
 
 
     The following can be used for special considerations based on
     The following can be used for special considerations based on
@@ -287,7 +295,6 @@ plus a table reference within that org file. Thus maybe something like
 **** org properties from source block
 **** org properties from source block
 **** org properties from org table
 **** org properties from org table
      
      
-     
 ** export
 ** export
    once the previous objectives are met export should be fairly simple.
    once the previous objectives are met export should be fairly simple.
    Basically it will consist of triggering the evaluation of source code
    Basically it will consist of triggering the evaluation of source code
@@ -450,6 +457,17 @@ should include (but should certainly not be limited to)
 - file :: names of file to which graphical/textual/numerical/tabular output
 - file :: names of file to which graphical/textual/numerical/tabular output
   should be written.  Do we need this, or should this be controlled
   should be written.  Do we need this, or should this be controlled
   through the source code itself?
   through the source code itself?
+- results :: indication of where the results should be placed, maybe
+             the following values...
+  - append :: *default* meaning just append to the current buffer
+              immediately following the current source block
+  - replace :: like append, but replace any results currently there
+  - file :: save the results in a new file, and place a link to the
+            file into the current buffer immediately following the
+            source code block
+  - table :: save the results into a table, maybe use a table id:range
+             to identify which table and where therein
+  - nil :: meaning just discard the results
 - not sure of a good name here :: flags for when/if the block should
 - not sure of a good name here :: flags for when/if the block should
      be evaluated (on export etc...)
      be evaluated (on export etc...)
 - again can't thing of a concise name :: flags for how the results of
 - again can't thing of a concise name :: flags for how the results of
@@ -459,6 +477,8 @@ should include (but should certainly not be limited to)
 - flags specific to the language of the source block
 - flags specific to the language of the source block
 - etc...
 - etc...
 
 
+I think fleshing out this list is an important next step.
+
 ** Interaction with the R process
 ** Interaction with the R process
 
 
 We should take care to implement this in such a way that all of the
 We should take care to implement this in such a way that all of the
@@ -523,7 +543,7 @@ to evaluate the following blocks of code by pressing =\C-c\C-c= on the
 header lines.  *Note*: your version of org-mode must be at least 6.23
 header lines.  *Note*: your version of org-mode must be at least 6.23
 or later.
 or later.
 
 
-#+begin_src sh
+#+begin_src sh  :replace t
 date
 date
 #+end_src
 #+end_src
 
 
@@ -581,6 +601,5 @@ to use for evaluating R code files.
 See the [[* litorgy.el beginning functionality][Sandbox]] for evaluable examples.
 See the [[* litorgy.el beginning functionality][Sandbox]] for evaluable examples.
 
 
 
 
-
 * Buffer Dictionary
 * Buffer Dictionary
  LocalWords:  DBlocks dblocks litorgy el
  LocalWords:  DBlocks dblocks litorgy el