emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[O] How to execute org babel src block line by line?


From: Xor3
Subject: [O] How to execute org babel src block line by line?
Date: Mon, 18 Apr 2016 16:44:48 +0800

Hi community,
   I want to execute org babel src block one line a time. 
   Here is what I have tried.
   I use `isend' to send things to REPL buffer. When "C-<return>"  is pressed 
at first time,  a REPL buffer which is decided by  `lang' params  is startd. 
Then everything send to that buffer. An additional param `:dir' is configured 
to decide the starting `default-directry' of the REPL command.  
  
=================================================
(eval-after-load "org"
      '(progn
        ;; ;; (org-defkey org-mode-map (kbd "C-<return>") 'org-isend-send)
        (define-key org-mode-map (kbd "C-<return>") 'org-isend-send)

        (defun org-isend-send()
          (interactive)
          (let* ((oldbuf (current-buffer))
                 (info (org-babel-get-src-block-info))
                 (lang (nth 0 info))
                 (body (nth 1 info))
                 (params (nth 2 info))
                 (session (cdr (assoc :session params)))
                 (dir (cdr (assoc :dir params)))
                 (isend--command-buffer (concat "*" session "*"))
                 (working-directory
                  (or (and dir (file-name-as-directory dir)) 
default-directory)))
            (when  (not (get-buffer isend--command-buffer))
              (cond
               ((string-equal lang "python") (save-current-buffer
                                               (let ((default-directory 
working-directory))
                                                 (call-interactively 
'run-python)
                                                 (with-current-buffer "*Python*"
                                                   (rename-buffer 
isend--command-buffer)))))
               ((string-equal lang "sh") (save-current-buffer
                                           (let ((default-directory 
working-directory))
                                             (if (string-equal session "eshell")
                                                 (eshell)
                                               (progn
                                                 (shell)
                                                 (with-current-buffer "*shell*"
                                                   (rename-buffer 
isend--command-buffer)))))))
               (t (error "session?")))
              (require 'isend)
              (require 'isend-mode)
              (when (not isend-mode)
                (isend-mode 1)
                (make-local-variable 'isend-mode-map)
                (define-key isend-mode-map (kbd "C-<return>") nil)
                (local-set-key (kbd "C-<return>") 'org-isend-send))
              (cond
               ((string-equal lang "python") (isend-ipython-setup))
               (t (isend-shell-setup)))
              )
            ;; (display-buffer isend--command-buffer)
            (isend-display-buffer)
            (call-interactively 'isend-send)
            ;; (with-current-buffer isend--command-buffer
            ;;   (goto-char (point-max))
            ;;   (comint-send-input)
            ;;   (funcall (key-binding (kbd "RET")))
            ;;   )
            ))))
  ========================================

  I want to execute my shells/python/ruby scirpts  this way by writing out them 
first, then `C-<return>' doing the rest.

  Does anyone know a better or more native `org' way to do this?
  Thank you for your help.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]