diff options
author | Dan Davison <davison@stats.ox.ac.uk> | 2010-08-17 17:45:47 -0400 |
---|---|---|
committer | Dan Davison <davison@stats.ox.ac.uk> | 2010-08-17 17:45:47 -0400 |
commit | 441288ee72778931c3e1853b8221f7049289df91 (patch) | |
tree | 5564f7da7266a3b3b1cb4aeeaf11641ccc0f068d | |
parent | a4c8bcd31b7dfae9e9922671ccee0ba7ddffd288 (diff) | |
download | org-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.el | 35 |
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) |