|
@@ -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)
|