summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Davison <davison@stats.ox.ac.uk>2010-08-17 17:45:47 -0400
committerDan Davison <davison@stats.ox.ac.uk>2010-08-17 17:45:47 -0400
commit441288ee72778931c3e1853b8221f7049289df91 (patch)
tree5564f7da7266a3b3b1cb4aeeaf11641ccc0f068d
parenta4c8bcd31b7dfae9e9922671ccee0ba7ddffd288 (diff)
downloadorg-mode-441288ee72778931c3e1853b8221f7049289df91.tar.gz
Make Org-babel commands available in code edit buffers
* org-src.el (ob-keys): Require ob-keys, because `org-babel-map' is used. (org-src-do-at-code-block): New macro to evaluate lisp with point at the start of the Org code block containing the code in this edit buffer. (org-src-do-key-sequence-at-code-block): New function to execute command bound to key at the Org code block containing the code in this edit buffer.
-rw-r--r--lisp/org-src.el35
1 files changed, 35 insertions, 0 deletions
diff --git a/lisp/org-src.el b/lisp/org-src.el
index e029bf3..039681f 100644
--- a/lisp/org-src.el
+++ b/lisp/org-src.el
@@ -34,6 +34,7 @@
(require 'org-macs)
(require 'org-compat)
+(require 'ob-keys)
(eval-when-compile
(require 'cl))
@@ -165,6 +166,40 @@ For example, there is no ocaml-mode in Emacs, but the mode to use is
(defvar org-src-mode-map (make-sparse-keymap))
(define-key org-src-mode-map "\C-c'" 'org-edit-src-exit)
+
+(defmacro org-src-do-at-code-block (&rest body)
+ "Execute a command from an edit buffer in the Org-mode buffer."
+ `(let ((beg-marker org-edit-src-beg-marker))
+ (if beg-marker
+ (with-current-buffer (marker-buffer beg-marker)
+ (goto-char (marker-position beg-marker))
+ ,@body))))
+
+(defun org-src-do-key-sequence-at-code-block (&optional key)
+ "Execute key sequence at code block in the source Org buffer.
+The command bound to KEY in the Org-babel key map is executed
+remotely with point temporarily at the start of the code block in
+the Org buffer.
+
+This command is not bound to a key by default, to avoid conflicts
+with language major mode bindings. To bind it to C-c @ in all
+language major modes, you could use
+
+ (add-hook 'org-src-mode-hook
+ (lambda () (define-key org-src-mode-map \"\\C-c@\"
+ 'org-src-do-key-sequence-at-code-block)))
+
+In that case, for example, C-c @ t issued in code edit buffers
+would tangle the current Org code block, C-c @ e would execute
+the block and C-c @ h would display the other available
+Org-babel commands."
+ (interactive "kOrg-babel key: ")
+ (if (equal key (kbd "C-g")) (keyboard-quit)
+ (org-edit-src-save)
+ (org-src-do-at-code-block
+ (call-interactively
+ (lookup-key org-babel-map key)))))
+
(defvar org-edit-src-force-single-line nil)
(defvar org-edit-src-from-org-mode nil)
(defvar org-edit-src-allow-write-back-p t)