From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nicolas Goaziou Subject: [PATCH 3/3] Promote and demote inline tasks Date: Wed, 2 Mar 2011 17:56:04 +0100 Message-ID: <1299084964-26440-3-git-send-email-n.goaziou@gmail.com> References: <1299084964-26440-1-git-send-email-n.goaziou@gmail.com> Return-path: Received: from [140.186.70.92] (port=40331 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PupM7-0007zh-38 for emacs-orgmode@gnu.org; Wed, 02 Mar 2011 11:56:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PupM5-0002bU-KW for emacs-orgmode@gnu.org; Wed, 02 Mar 2011 11:56:54 -0500 Received: from mail-fx0-f41.google.com ([209.85.161.41]:33149) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PupM5-0002Ub-FI for emacs-orgmode@gnu.org; Wed, 02 Mar 2011 11:56:53 -0500 Received: by mail-fx0-f41.google.com with SMTP id 5so213793fxm.0 for ; Wed, 02 Mar 2011 08:56:53 -0800 (PST) In-Reply-To: <1299084964-26440-1-git-send-email-n.goaziou@gmail.com> 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: Org mode list Cc: Nicolas Goaziou * lisp/org-inlinetask.el (org-inlinetask-promote, org-inlinetask-demote): new functions. * lisp/org.el (org-metaleft, org-metaright): when point is at an inline task, promote or demote it. --- lisp/org-inlinetask.el | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ lisp/org.el | 28 +++++++++++++++++--------- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/lisp/org-inlinetask.el b/lisp/org-inlinetask.el index 6bf38df..42ba7a4 100644 --- a/lisp/org-inlinetask.el +++ b/lisp/org-inlinetask.el @@ -252,6 +252,55 @@ This assumes the point is inside an inline task." (re-search-backward (org-inlinetask-outline-regexp) nil t) (- (match-end 1) (match-beginning 1)))) +(defun org-inlinetask-promote () + "Promote the inline task at point. +If the task has an end part, promote it. Also, prevents level from +going below `org-inlinetask-min-level'." + (interactive) + (if (not (org-inlinetask-in-task-p)) + (error "Not in an inline task") + (save-excursion + (let* ((lvl (org-inlinetask-get-task-level)) + (next-lvl (org-get-valid-level lvl -1)) + (diff (- next-lvl lvl)) + (down-task (concat (make-string next-lvl ?*))) + beg) + (if (< next-lvl org-inlinetask-min-level) + (error "Cannot promote an inline task at minimum level") + (org-inlinetask-goto-beginning) + (setq beg (point)) + (replace-match down-task nil t nil 1) + (org-inlinetask-goto-end) + (if (eobp) (beginning-of-line) (forward-line -1)) + (unless (= (point) beg) + (replace-match down-task nil t nil 1) + (when org-adapt-indentation + (goto-char beg) + (org-fixup-indentation diff)))))))) + +(defun org-inlinetask-demote () + "Demote the inline task at point. +If the task has an end part, also demote it." + (interactive) + (if (not (org-inlinetask-in-task-p)) + (error "Not in an inline task") + (save-excursion + (let* ((lvl (org-inlinetask-get-task-level)) + (next-lvl (org-get-valid-level lvl 1)) + (diff (- next-lvl lvl)) + (down-task (concat (make-string next-lvl ?*))) + beg) + (org-inlinetask-goto-beginning) + (setq beg (point)) + (replace-match down-task nil t nil 1) + (org-inlinetask-goto-end) + (if (eobp) (beginning-of-line) (forward-line -1)) + (unless (= (point) beg) + (replace-match down-task nil t nil 1) + (when org-adapt-indentation + (goto-char beg) + (org-fixup-indentation diff))))))) + (defvar org-export-current-backend) ; dynamically bound in org-exp.el (defun org-inlinetask-export-handler () "Handle headlines with level larger or equal to `org-inlinetask-min-level'. diff --git a/lisp/org.el b/lisp/org.el index 8ae5e6f..c528707 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -17042,13 +17042,17 @@ See the individual commands for more information." (cond ((run-hook-with-args-until-success 'org-metaleft-hook)) ((org-at-table-p) (org-call-with-arg 'org-table-move-column 'left)) - ((or (org-on-heading-p) - (and (org-region-active-p) - (save-excursion - (goto-char (region-beginning)) - (org-on-heading-p)))) + ((org-with-limited-levels + (or (org-on-heading-p) + (and (org-region-active-p) + (save-excursion + (goto-char (region-beginning)) + (org-on-heading-p))))) (when (org-check-for-hidden 'headlines) (org-hidden-tree-error)) (call-interactively 'org-do-promote)) + ;; At an inline task. + ((org-on-heading-p) + (call-interactively 'org-inlinetask-promote)) ((or (org-at-item-p) (and (org-region-active-p) (save-excursion @@ -17067,13 +17071,17 @@ See the individual commands for more information." (cond ((run-hook-with-args-until-success 'org-metaright-hook)) ((org-at-table-p) (call-interactively 'org-table-move-column)) - ((or (org-on-heading-p) - (and (org-region-active-p) - (save-excursion - (goto-char (region-beginning)) - (org-on-heading-p)))) + ((org-with-limited-levels + (or (org-on-heading-p) + (and (org-region-active-p) + (save-excursion + (goto-char (region-beginning)) + (org-on-heading-p))))) (when (org-check-for-hidden 'headlines) (org-hidden-tree-error)) (call-interactively 'org-do-demote)) + ;; At an inline task. + ((org-on-heading-p) + (call-interactively 'org-inlinetask-demote)) ((or (org-at-item-p) (and (org-region-active-p) (save-excursion -- 1.7.4.1