From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dan Davison Subject: Re: [PATCH] Indent code with TAB in Org buffer Date: Sun, 15 Aug 2010 19:00:07 -0400 Message-ID: <87tymviirs.fsf@stats.ox.ac.uk> References: <87mxsocr4i.fsf@stats.ox.ac.uk> <8E5505D7-A7CD-4EB6-AC4A-D8B8B92115D6@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from [140.186.70.92] (port=34444 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OkmBZ-0007dZ-QG for emacs-orgmode@gnu.org; Sun, 15 Aug 2010 19:00:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OkmBY-0003zF-A8 for emacs-orgmode@gnu.org; Sun, 15 Aug 2010 19:00:13 -0400 Received: from markov.stats.ox.ac.uk ([163.1.210.1]:33153) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OkmBX-0003z5-V5 for emacs-orgmode@gnu.org; Sun, 15 Aug 2010 19:00:12 -0400 In-Reply-To: <8E5505D7-A7CD-4EB6-AC4A-D8B8B92115D6@gmail.com> (Carsten Dominik's message of "Sun, 15 Aug 2010 09:42:07 +0200") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Carsten Dominik Cc: emacs org-mode mailing list --=-=-= Carsten Dominik 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 >> git@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 git@github.com:dandavison/org-devel.git[1] branch src-block-tab --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=src-block-tab.diff 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 --=-=-= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ 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 --=-=-=--