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