From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Maus Subject: [PATCH 3/5] New customization variable: Loop over headlines in active region Date: Thu, 25 Aug 2011 06:25:32 +0200 Message-ID: <1314246334-5053-4-git-send-email-dmaus@ictsoc.de> References: <87obzpl3ec.fsf@gnu.org> Return-path: Received: from eggs.gnu.org ([140.186.70.92]:47476) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QwRW5-0001VS-Jr for emacs-orgmode@gnu.org; Thu, 25 Aug 2011 00:26:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QwRW3-0002VB-OQ for emacs-orgmode@gnu.org; Thu, 25 Aug 2011 00:26:09 -0400 Received: from app1b.xlhost.de ([213.202.242.162]:59406) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QwRW3-0002V3-Ad for emacs-orgmode@gnu.org; Thu, 25 Aug 2011 00:26:07 -0400 In-Reply-To: <87obzpl3ec.fsf@gnu.org> 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: emacs-orgmode@gnu.org Cc: David Maus * org.el (org-loop-over-headlines-in-active-region): New customization variable. Loop over headlines in active region. (org-schedule, org-deadline): Apply to headlines in region depending on new customization variable. --- lisp/org.el | 159 ++++++++++++++++++++++++++++++++++------------------------ 1 files changed, 93 insertions(+), 66 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 27bad52..d15c946 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -402,6 +402,25 @@ XEmacs user should have this variable set to nil, because (const :tag "When outside special context" t) (const :tag "Everywhere except timestamps" always))) +(defcustom org-loop-over-headlines-in-active-region nil + "Shall some commands act upon headlines in the active region? + +When set to `t', some commands will be performed in all headlines +within the active region. + +When set to a string, those commands will be performed on the +matching headlines within the active region. Such string must be +a tags/property/todo match as it is used in the agenda tags view. + +The list of commands is: +- `org-schedule' +- `org-deadline'" + :type '(choice (const :tag "Don't loop" nil) + (const :tag "All headlines in active region" t) + (string :tag "Tags/Property/Todo matcher")) + :group 'org-todo + :group 'org-archive) + (defgroup org-startup nil "Options concerning startup of Org-mode." :tag "Org Startup" @@ -11807,39 +11826,43 @@ With argument REMOVE, remove any deadline from the item. With argument TIME, set the deadline at the corresponding date. TIME can either be an Org date like \"2011-07-24\" or a delta like \"+2d\"." (interactive "P") - (let* ((old-date (org-entry-get nil "DEADLINE")) - (repeater (and old-date - (string-match - "\\([.+-]+[0-9]+[dwmy]\\(?:[/ ][-+]?[0-9]+[dwmy]\\)?\\) ?" - old-date) - (match-string 1 old-date)))) - (if remove - (progn - (when (and old-date org-log-redeadline) - (org-add-log-setup 'deldeadline nil old-date 'findpos - org-log-redeadline)) - (org-remove-timestamp-with-keyword org-deadline-string) - (message "Item no longer has a deadline.")) - (org-add-planning-info 'deadline time 'closed) - (when (and old-date org-log-redeadline - (not (equal old-date - (substring org-last-inserted-timestamp 1 -1)))) - (org-add-log-setup 'redeadline nil old-date 'findpos - org-log-redeadline)) - (when repeater - (save-excursion - (org-back-to-heading t) - (when (re-search-forward (concat org-deadline-string " " - org-last-inserted-timestamp) - (save-excursion - (outline-next-heading) (point)) t) - (goto-char (1- (match-end 0))) - (insert " " repeater) - (setq org-last-inserted-timestamp - (concat (substring org-last-inserted-timestamp 0 -1) - " " repeater - (substring org-last-inserted-timestamp -1)))))) - (message "Deadline on %s" org-last-inserted-timestamp)))) + (if (and (org-region-active-p) org-loop-over-headlines-in-active-region) + (let (org-loop-over-headlines-in-active-region) + (org-map-entries + `(org-deadline ',remove ,time) org-loop-over-headlines-in-active-region 'region)) + (let* ((old-date (org-entry-get nil "DEADLINE")) + (repeater (and old-date + (string-match + "\\([.+-]+[0-9]+[dwmy]\\(?:[/ ][-+]?[0-9]+[dwmy]\\)?\\) ?" + old-date) + (match-string 1 old-date)))) + (if remove + (progn + (when (and old-date org-log-redeadline) + (org-add-log-setup 'deldeadline nil old-date 'findpos + org-log-redeadline)) + (org-remove-timestamp-with-keyword org-deadline-string) + (message "Item no longer has a deadline.")) + (org-add-planning-info 'deadline time 'closed) + (when (and old-date org-log-redeadline + (not (equal old-date + (substring org-last-inserted-timestamp 1 -1)))) + (org-add-log-setup 'redeadline nil old-date 'findpos + org-log-redeadline)) + (when repeater + (save-excursion + (org-back-to-heading t) + (when (re-search-forward (concat org-deadline-string " " + org-last-inserted-timestamp) + (save-excursion + (outline-next-heading) (point)) t) + (goto-char (1- (match-end 0))) + (insert " " repeater) + (setq org-last-inserted-timestamp + (concat (substring org-last-inserted-timestamp 0 -1) + " " repeater + (substring org-last-inserted-timestamp -1)))))) + (message "Deadline on %s" org-last-inserted-timestamp))))) (defun org-schedule (&optional remove time) "Insert the SCHEDULED: string with a timestamp to schedule a TODO item. @@ -11847,39 +11870,43 @@ With argument REMOVE, remove any scheduling date from the item. With argument TIME, scheduled at the corresponding date. TIME can either be an Org date like \"2011-07-24\" or a delta like \"+2d\"." (interactive "P") - (let* ((old-date (org-entry-get nil "SCHEDULED")) - (repeater (and old-date - (string-match - "\\([.+-]+[0-9]+[dwmy]\\(?:[/ ][-+]?[0-9]+[dwmy]\\)?\\) ?" - old-date) - (match-string 1 old-date)))) - (if remove - (progn - (when (and old-date org-log-reschedule) - (org-add-log-setup 'delschedule nil old-date 'findpos - org-log-reschedule)) - (org-remove-timestamp-with-keyword org-scheduled-string) - (message "Item is no longer scheduled.")) - (org-add-planning-info 'scheduled time 'closed) - (when (and old-date org-log-reschedule - (not (equal old-date - (substring org-last-inserted-timestamp 1 -1)))) - (org-add-log-setup 'reschedule nil old-date 'findpos - org-log-reschedule)) - (when repeater - (save-excursion - (org-back-to-heading t) - (when (re-search-forward (concat org-scheduled-string " " - org-last-inserted-timestamp) - (save-excursion - (outline-next-heading) (point)) t) - (goto-char (1- (match-end 0))) - (insert " " repeater) - (setq org-last-inserted-timestamp - (concat (substring org-last-inserted-timestamp 0 -1) - " " repeater - (substring org-last-inserted-timestamp -1)))))) - (message "Scheduled to %s" org-last-inserted-timestamp)))) + (if (and (org-region-active-p) org-loop-over-headlines-in-active-region) + (let (org-loop-over-headlines-in-active-region) + (org-map-entries + `(org-schedule ',remove ,time) org-loop-over-headlines-in-active-region 'region)) + (let* ((old-date (org-entry-get nil "SCHEDULED")) + (repeater (and old-date + (string-match + "\\([.+-]+[0-9]+[dwmy]\\(?:[/ ][-+]?[0-9]+[dwmy]\\)?\\) ?" + old-date) + (match-string 1 old-date)))) + (if remove + (progn + (when (and old-date org-log-reschedule) + (org-add-log-setup 'delschedule nil old-date 'findpos + org-log-reschedule)) + (org-remove-timestamp-with-keyword org-scheduled-string) + (message "Item is no longer scheduled.")) + (org-add-planning-info 'scheduled time 'closed) + (when (and old-date org-log-reschedule + (not (equal old-date + (substring org-last-inserted-timestamp 1 -1)))) + (org-add-log-setup 'reschedule nil old-date 'findpos + org-log-reschedule)) + (when repeater + (save-excursion + (org-back-to-heading t) + (when (re-search-forward (concat org-scheduled-string " " + org-last-inserted-timestamp) + (save-excursion + (outline-next-heading) (point)) t) + (goto-char (1- (match-end 0))) + (insert " " repeater) + (setq org-last-inserted-timestamp + (concat (substring org-last-inserted-timestamp 0 -1) + " " repeater + (substring org-last-inserted-timestamp -1)))))) + (message "Scheduled to %s" org-last-inserted-timestamp))))) (defun org-get-scheduled-time (pom &optional inherit) "Get the scheduled time as a time tuple, of a format suitable -- 1.7.2.5