Carsten Dominik <carsten.domi...@gmail.com> writes:

> On Aug 15, 2010, at 8:43 AM, Dan Davison wrote:
>
>> With this patch TAB in a code block aligns the code according to the
>> major mode. The macro could be used to do the same thing for other
>> commands (i.e. allow other commands to be invoked in the Org buffer,
>> but
>> actually carried out in the code buffer.)
>>
>> Patch attached and in branch src-block-tab at
>> g...@github.com:dandavison/org-devel.git.
>>
>> diff --git a/lisp/org-src.el b/lisp/org-src.el
>> index baa2b11..fc15a83 100644
>> --- a/lisp/org-src.el
>> +++ b/lisp/org-src.el
>> @@ -435,6 +435,19 @@ the fragment in the Org-mode buffer."
>>       (message "%s" msg)
>>       t)))
>>
>> +(defmacro org-src-do-in-edit-buffer (&rest body)
>> +  "Evaluate BODY in edit buffer if there is a code block at point.
>> +Return t if a code block was found at point, nil otherwise."
>> +  `(when (org-edit-src-code)
>
> Wow, an excursion to the temp buffer for every TAB call
> in a source code block?
>
> Sounds heavy.  But I see that it could be nice together with
> the new fontification stuff.  My gut feeling would be to have
> both of these feature off by default.  But I have not tried
> them yet.

Hi Carsten,

In a small code block the TAB is actually not bad at all, but in a big
one there's a delay (that's worst case scenario: a netbook with an atom
processor).

I think it's clear that automatic fontification as you type by emacs
font-lock should be turned off by default. We could consider
fontification of code blocks e.g. on start up, and when
folding/unfolding, but let's discuss that in a separate thread.

We can go one further with the tab command, and supply a general
mechanism for calling major mode commands from the src buffer (patch
attached):

(defun org-src-do-key-sequence-in-edit-buffer (&optional key)
  "Read key sequence and execute the command in edit buffer."
  (interactive)
  (org-src-do-in-edit-buffer
   (call-interactively
    (key-binding (or key (read-key-sequence nil))))))

So I'm proposing to bind that within the org-babel keymap (currently 
C-c C-v x, and C-c C-v C-x). That way for example:

- C-c C-v C-x TAB :: indent code natively

and with an interactive R session:

- C-c C-v C-x C-c C-c :: `ess-eval-function-or-paragraph-and-step'

I've included a variable `org-src-indent-natively' to control the native
TAB by default (currently defaulting to off, seeing as the C-v C-v x
alternative is always available).

Eric and I are planning on providing the inverse also: exposing the
babel keymap when in the edit buffer.

Dan

patch attached and at g...@github.com:dandavison/org-devel.git[1] branch 
src-block-tab

diff --git a/lisp/ob-keys.el b/lisp/ob-keys.el
index e9ba3d9..f953110 100644
--- a/lisp/ob-keys.el
+++ b/lisp/ob-keys.el
@@ -77,7 +77,9 @@ functions which are assigned key bindings, and see
     ("z" . org-babel-switch-to-session)
     ("\C-a" . org-babel-sha1-hash)
     ("a" . org-babel-sha1-hash)
-    ("h" . org-babel-describe-bindings))
+    ("h" . org-babel-describe-bindings)
+    ("\C-x" . org-src-do-key-sequence-in-edit-buffer)
+    ("x" . org-src-do-key-sequence-in-edit-buffer))
   "Alist of key bindings and interactive Babel functions.
 This list associates interactive Babel functions
 with keys.  Each element of this list will add an entry to the
diff --git a/lisp/org-src.el b/lisp/org-src.el
index baa2b11..c9e6f73 100644
--- a/lisp/org-src.el
+++ b/lisp/org-src.el
@@ -321,6 +321,8 @@ the edited version. Optional argument CONTEXT is used by
      (if (eq context 'edit) (delete-other-windows))
      (org-switch-to-buffer-other-window buffer)
      (if (eq context 'exit) (delete-other-windows)))
+    ('switch-invisibly
+     (set-buffer buffer))
     (t
      (message "Invalid value %s for org-src-window-setup"
 	      (symbol-name org-src-window-setup))
@@ -435,6 +437,31 @@ the fragment in the Org-mode buffer."
       (message "%s" msg)
       t)))
 
+(defmacro org-src-do-in-edit-buffer (&rest body)
+  "Evaluate BODY in edit buffer if there is a code block at point.
+Return t if a code block was found at point, nil otherwise."
+  `(let ((org-src-window-setup 'switch-invisibly))
+     (when (org-edit-src-code)
+       ,@body
+       (org-edit-src-exit) t)))
+
+(defun org-src-do-key-sequence-in-edit-buffer (&optional key)
+  "Read key sequence and execute the command in edit buffer."
+  (interactive)
+  (org-src-do-in-edit-buffer
+   (call-interactively
+    (key-binding (or key (read-key-sequence nil))))))
+
+(defvar org-src-indent-natively nil
+  "If non-nil, TAB in a code block indents the code as if it were
+called in the edit buffer.")
+
+(defun org-src-tab-command ()
+  "Do what TAB does in the edit buffer for code block at point."
+  (and org-src-indent-natively
+       (org-src-do-key-sequence-in-edit-buffer (kbd "TAB"))))
+
+(add-hook 'org-tab-first-hook 'org-src-tab-command)
 (defun org-edit-src-find-region-and-lang ()
   "Find the region and language for a local edit.
 Return a list with beginning and end of the region, a string representing


>
> - Carsten
>
>
> _______________________________________________
> Emacs-orgmode mailing list
> Please use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

Reply via email to