From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kyle Meyer Subject: [PATCH] org-clone-subtree-with-time-shift: Accept 0 clones Date: Sun, 21 Jun 2015 22:02:29 -0400 Message-ID: <87h9q08pqi.fsf@kmlap.domain.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:45918) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z6r4N-0002Yh-0W for emacs-orgmode@gnu.org; Sun, 21 Jun 2015 22:02:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z6r4I-0002H4-Jd for emacs-orgmode@gnu.org; Sun, 21 Jun 2015 22:02:42 -0400 Received: from mail-qk0-f180.google.com ([209.85.220.180]:36026) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z6r4I-0002Gv-E9 for emacs-orgmode@gnu.org; Sun, 21 Jun 2015 22:02:38 -0400 Received: by qkfe185 with SMTP id e185so93536102qkf.3 for ; Sun, 21 Jun 2015 19:02:38 -0700 (PDT) Received: from localhost ([2601:18a:c201:560f:9e4e:36ff:fe3d:ae9c]) by mx.google.com with ESMTPSA id 84sm9479717qha.47.2015.06.21.19.02.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 Jun 2015 19:02:37 -0700 (PDT) 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: Org-mode --=-=-= Content-Type: text/plain Hello, I'd like to clone a subtree with a repeating timestamp so that the repeater is removed from the original subtree and a single shifted and repeating clone is created. I don't think this is currently possible with org-clone-subtree-with-time-shift. For example, running org-clone-subtree-with-time-shift with 1 clone and a shift of +2d on * sub <2015-06-21 Sun +1w> results in * sub <2015-06-21 Sun> * sub <2015-06-23 Tue> * sub <2015-06-25 Thu +1w> This is inline with the docstring of org-clone-subtree-with-time-shift. The one clone is the subtree in the middle, and the two flanking subtrees are how a repeating timestamp is handled. The attached patch allows the number of specified clones to be 0, resulting in * sub <2015-06-21 Sun> * sub <2015-06-23 Tue +1w> which is still consistent with the documented behavior. --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-org-clone-subtree-with-time-shift-Accept-0-clones.patch >From 37a917e4f7e4d2c05355735ab08f1f555b9dc942 Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Sun, 21 Jun 2015 21:46:54 -0400 Subject: [PATCH] org-clone-subtree-with-time-shift: Accept 0 clones * lisp/org.el (org-clone-subtree-with-time-shift): Allow argument specifying number of clones to be 0. * testing/lisp/test-org.el (test-org/clone-with-time-shift): Add tests. This makes it possible to clone a subtree with a repeating timestamp so that the repeater is removed from the original subtree and a single shifted, repeating clone is created. If the original subtree does not have a repeating timestamp, no clones will be made. --- etc/ORG-NEWS | 4 ++++ lisp/org.el | 9 +++++++-- testing/lisp/test-org.el | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 92be86b..bcbd068 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -392,6 +392,10 @@ of tables and lists of listings can be inserted in the document with *** Countdown timer support hh:mm:ss format In addition to setting countdown timers in minutes, they can also be set using the hh:mm:ss format. +*** Extend ~org-clone-subtree-with-time-shift~ +~org-clone-subtree-with-time-shift~ now accepts 0 as an argument for +the number of clones, which removes the repeater from the original +subtree and creates one shifted, repeating clone. ** Miscellaneous *** Strip all meta data from ITEM special property ITEM special property does not contain TODO, priority or tags anymore. diff --git a/lisp/org.el b/lisp/org.el index 7b720f8..25f8cd0 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -8739,7 +8739,12 @@ (defun org-clone-subtree-with-time-shift (n &optional shift) - the start days in the repeater in the original entry will be shifted to past the last clone. In this way you can spell out a number of instances of a repeating task, -and still retain the repeater to cover future instances of the task." +and still retain the repeater to cover future instances of the task. + +As described above, N+1 clones are produced when the original +subtree has a repeater. Setting N to 0, then, can be used to +remove the repeater from a subtree and create a shifted clone +with the original repeater." (interactive "nNumber of clones to produce: ") (let ((shift (or shift @@ -8757,7 +8762,7 @@ (defun org-clone-subtree-with-time-shift (n &optional shift) (org-clock-re (format "^[ \t]*%s.*$" org-clock-string)) beg end template task idprop shift-n shift-what doshift nmin nmax) - (if (not (and (integerp n) (> n 0))) + (if (not (and (integerp n) (>= n 0))) (user-error "Invalid number of replications %s" n)) (if (and (setq doshift (and (stringp shift) (string-match "\\S-" shift))) (not (string-match "\\`[ \t]*\\+?\\([0-9]+\\)\\([hdwmy]\\)[ \t]*\\'" diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 04e0843..e8287a2 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -1067,6 +1067,44 @@ (ert-deftest test-org/insert-todo-heading-respect-content () (org-insert-todo-heading-respect-content) (and (eobp) (org-at-heading-p))))) +(ert-deftest test-org/clone-with-time-shift () + "Test `org-clone-subtree-with-time-shift'." + ;; Clone non-repeating once. + (should + (equal "\ +* H1\n<2015-06-21 Sun> +* H1\n<2015-06-23 Tue> +" + (org-test-with-temp-text "* H1\n<2015-06-21 Sun>" + (org-clone-subtree-with-time-shift 1 "+2d") + (buffer-string)))) + ;; Clone repeating once. + (should + (equal "\ +* H1\n<2015-06-21 Sun> +* H1\n<2015-06-23 Tue> +* H1\n<2015-06-25 Thu +1w> +" + (org-test-with-temp-text "* H1\n<2015-06-21 Sun +1w>" + (org-clone-subtree-with-time-shift 1 "+2d") + (buffer-string)))) + ;; Clone non-repeating zero times. + (should + (equal "\ +* H1\n<2015-06-21 Sun> +" + (org-test-with-temp-text "* H1\n<2015-06-21 Sun>" + (org-clone-subtree-with-time-shift 0 "+2d") + (buffer-string)))) + ;; Clone repeating "zero" times. + (should + (equal "\ +* H1\n<2015-06-21 Sun> +* H1\n<2015-06-23 Tue +1w> +" + (org-test-with-temp-text "* H1\n<2015-06-21 Sun +1w>" + (org-clone-subtree-with-time-shift 0 "+2d") + (buffer-string))))) ;;; Fixed-Width Areas -- 2.4.4 --=-=-= Content-Type: text/plain -- Kyle --=-=-=--