From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bastien Subject: Re: Indenting source code blocks in lists Date: Wed, 25 Jan 2012 15:37:53 +0100 Message-ID: <87ty3jetku.fsf@altern.org> References: <878vkws4it.fsf@syk.fi> <874nvknuss.fsf@gnu.org> <87d3a8f0fq.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([140.186.70.92]:57434) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rq3xz-0005Pb-Vw for emacs-orgmode@gnu.org; Wed, 25 Jan 2012 09:36:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Rq3xq-0005pE-8y for emacs-orgmode@gnu.org; Wed, 25 Jan 2012 09:36:51 -0500 Received: from mail-bk0-f41.google.com ([209.85.214.41]:41417) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rq3xp-0005p4-QA for emacs-orgmode@gnu.org; Wed, 25 Jan 2012 09:36:42 -0500 Received: by bkbzx1 with SMTP id zx1so5022805bkb.0 for ; Wed, 25 Jan 2012 06:36:40 -0800 (PST) In-Reply-To: <87d3a8f0fq.fsf@gmail.com> (Nicolas Goaziou's message of "Wed, 25 Jan 2012 13:09:45 +0100") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Nicolas Goaziou Cc: Jarmo Hurri , emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Nicolas Goaziou writes: >> I select the region, then `C-x r t' to insert the whitespaces. > > I use C-x r o, which doesn't require to count the spaces, and is more > visual. Clever -- I start to love this mailing list ;) >> But I don't feel very clever neither, we should have a better >> way for this -- something that deactivate folding and indent >> to the beginning of the list item above. > > I'm not sure we should provide this. There are already so many ways, > often in muscle memory, to achieve the same in Emacs that we probably > shouldn't bother. The attached patch let `org-metaright' indent a drawer or a block correctly. It introduces two new function ̀org-indent-block' and `org-indent-drawer' which derive from local hacks I'm using quite often now. Perhaps ̀org-metaright' is not the best keybinding for this function, please suggest a better one. Thanks, --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-org.el-Make-org-metaright-indent-drawers-and-blocks.patch >From 89e8c4e37b7f2f7bbf27b31d85ff8e328046ab1b Mon Sep 17 00:00:00 2001 From: Bastien Guerry Date: Wed, 25 Jan 2012 15:33:45 +0100 Subject: [PATCH] org.el: Make `org-metaright' indent drawers and blocks. * org.el (org-at-drawer-p): Normalize the docstring to match other `org-at-*-p' docstrings. (org-indent-block, org-indent-drawer, org-at-block-p): New functions. (org-metaright): Use the new functions to indent a drawer or a block depending on the context. Also update the docstring. --- lisp/org.el | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 52 insertions(+), 3 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 61cef0a..689784d 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -17990,14 +17990,16 @@ See the individual commands for more information." (t (call-interactively 'backward-word)))) (defun org-metaright (&optional arg) - "Demote subtree or move table column to right. -Calls `org-do-demote' or `org-table-move-column', depending on context. + "Demote a subtree, a list item or move table column to right. +In front of a drawer or a block keyword, indent it correctly. With no specific context, calls the Emacs default `forward-word'. See the individual commands for more information." (interactive "P") (cond ((run-hook-with-args-until-success 'org-metaright-hook)) ((org-at-table-p) (call-interactively 'org-table-move-column)) + ((org-at-drawer-p) (call-interactively 'org-indent-drawer)) + ((org-at-block-p) (call-interactively 'org-indent-block)) ((org-with-limited-levels (or (org-at-heading-p) (and (org-region-active-p) @@ -20161,6 +20163,47 @@ If point is in an inline task, mark that task instead." t t)) (org-move-to-column column))) +(defun org-indent-drawer () + "Indent the drawer at point." + (interactive) + (let ((p (point)) + (e (and (save-excursion (re-search-forward ":END:" nil t)) + (match-end 0))) + (folded + (save-excursion + (end-of-line) + (when (overlays-at (point)) + (member 'invisible (overlay-properties + (car (overlays-at (point))))))))) + (when folded (org-cycle)) + (indent-for-tab-command) + (while (and (move-beginning-of-line 2) (< (point) e)) + (indent-for-tab-command)) + (goto-char p) + (when folded (org-cycle))) + (message "Drawer at point indented")) + +(defun org-indent-block () + "Indent the block at point." + (interactive) + (let ((p (point)) + (case-fold-search t) + (e (and (save-excursion (re-search-forward "#\\+end_?\\(?:[a-z]+\\)?" nil t)) + (match-end 0))) + (folded + (save-excursion + (end-of-line) + (when (overlays-at (point)) + (member 'invisible (overlay-properties + (car (overlays-at (point))))))))) + (when folded (org-cycle)) + (indent-for-tab-command) + (while (and (move-beginning-of-line 2) (< (point) e)) + (indent-for-tab-command)) + (goto-char p) + (when folded (org-cycle))) + (message "Block at point indented")) + (defvar org-adaptive-fill-regexp-backup adaptive-fill-regexp "Variable to store copy of `adaptive-fill-regexp'. Since `adaptive-fill-regexp' is set to never match, we need to @@ -20712,11 +20755,17 @@ This version does not only check the character property, but also (defalias 'org-on-heading-p 'org-at-heading-p) (defun org-at-drawer-p nil - "Whether point is at a drawer." + "Is cursor at a drawer keyword?" (save-excursion (move-beginning-of-line 1) (looking-at org-drawer-regexp))) +(defun org-at-block-p nil + "Is cursor at a block keyword?" + (save-excursion + (move-beginning-of-line 1) + (looking-at org-block-regexp))) + (defun org-point-at-end-of-empty-headline () "If point is at the end of an empty headline, return t, else nil. If the heading only contains a TODO keyword, it is still still considered -- 1.7.8.4 --=-=-= Content-Type: text/plain -- Bastien --=-=-=--