[ESS] ESS + Stata: not reading continuation lines in syntax ///

Brendan Halpin brendan.halpin at ul.ie
Tue Jan 20 22:23:00 CET 2015


Generally speaking, ESS doesn't deal with the fact that Stata has
different rules for handling code is in files (executed by "run" or
"do", or in batch) compared with code that is entered a line at a time.
Similarly, it doesn't deal with the fact the end-of-command delimiters
can be changed (in batch mode).

I deal with this by over-riding the C-c C-r key binding to run the
function at the end of this mail, which is in part based on the
corresponding ESS code. This emulates Stata's manner of running blocks
of code from the do-file editor, by saving the region to a temporary
file, and executing a "do" command on the temporary file (then deleting
it). It also scans backwards for a "#delimit ;" command in case it is
set. 

Regards,

Brendan

;; Jun 14 2014 21:57:03
;; Merged delimit-do and ess-eval-region to make a new solution
(defun delimit-do (start end toggle &optional clear message)
  "Send the current region to the inferior ESS process, Stata do-editor style.
Creates a temporary file, \"do\"-es it, deletes it. 
With prefix argument toggle the meaning of `ess-eval-visibly-p';
this does not apply when using the S-plus GUI, see `ess-eval-region-ddeclient'."
  (interactive "r\nP")
  (ess-force-buffer-current "Process to use: ")
  (message "Starting evaluation...")
  (setq message (or message "Eval region"))

  (save-excursion
    ;; don't send new lines (avoid screwing the debugger)
    (goto-char start)
    (skip-chars-forward "\n\t ")
    (setq start (point))

    (unless mark-active
      (ess-blink-region start end))

    ;; don't send new lines at the end (avoid screwing the debugger)
    (goto-char end)
    (skip-chars-backward "\n\t ")
    (setq end (point)))

  (let* (delimit
         (commands (buffer-substring-no-properties start end))
         (delimit-do-file (make-temp-file "delimit-do" nil ".do"))
         (proc (get-process ess-local-process-name))
         (visibly (if toggle (not ess-eval-visibly-p) ess-eval-visibly-p))
         (dev-p (process-get proc 'developer))
         (tb-p  (process-get proc 'tracebug)))
    ;; Go to the start of the section and look back for #delimit
    ;; if found set delimit unless the delimiter is not ";" 
    (goto-char start)
    (setq delimit (re-search-backward "^#delimit +\\(.+\\)$" nil t))
    (if delimit 
        (if (not (string-match ";" (match-string 1))) (setq delimit nil)))

    (with-temp-buffer
      (if clear (insert "clear\n"))
      (if delimit (insert "#delimit ;\n" 
                          commands
                          "\n#delimit cr\n")
        (insert commands "\n"))
      (write-file delimit-do-file nil)
      (kill-buffer (current-buffer)))

    (process-send-string 
     (get-ess-process ess-current-process-name)
     (format "do %s\nrm %s\n" delimit-do-file delimit-do-file))
    )
  (if (and (fboundp 'deactivate-mark) ess-eval-deactivate-mark)
      (deactivate-mark))
  ;; return value
  (list start end))

-- 
Brendan Halpin, Head, Department of Sociology, University of Limerick, Ireland
Tel: w +353-61-213147  f +353-61-202569  h +353-61-338562;  Room F1-002 x 3147
mailto:brendan.halpin at ul.ie    ULSociology on Facebook: http://on.fb.me/fjIK9t
http://teaching.sociology.ul.ie/bhalpin/wordpress         twitter:@ULSociology



More information about the ESS-help mailing list