From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Hyatt Subject: [PATCH] Add the ability to archive to the datetree. Date: Wed, 9 Nov 2011 10:26:48 -0500 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Return-path: Received: from eggs.gnu.org ([140.186.70.92]:40786) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ROA3D-00061M-K7 for emacs-orgmode@gnu.org; Wed, 09 Nov 2011 10:26:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ROA37-00051S-PQ for emacs-orgmode@gnu.org; Wed, 09 Nov 2011 10:26:55 -0500 Received: from mail-vx0-f169.google.com ([209.85.220.169]:34923) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ROA37-00051K-MB for emacs-orgmode@gnu.org; Wed, 09 Nov 2011 10:26:49 -0500 Received: by vcbfo11 with SMTP id fo11so479319vcb.0 for ; Wed, 09 Nov 2011 07:26:49 -0800 (PST) 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 * org.el (org-archive-location): Add documentation on new datetree option. * org-archive.el (org-archive-subtree): Add special handling of datetree options to archive to datetree. --- doc/org.texi | 22 +++++++++++++--------- lisp/org-archive.el | 21 +++++++++++++++++---- lisp/org.el | 7 +++++++ 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/doc/org.texi b/doc/org.texi index 143b184..128f966 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -6854,16 +6854,20 @@ is invoked, the level 1 trees will be checked. @cindex archive locations The default archive location is a file in the same directory as the current file, with the name derived by appending @file{_archive} to the -current file name. For information and examples on how to change this, +current file name. You can also choose what heading to file archived +items under, with the possibility to add them to a datetree in a file. +For information and examples on how to specify the file and the heading, see the documentation string of the variable -@code{org-archive-location}. There is also an in-buffer option for -setting this variable, for example@footnote{For backward compatibility, -the following also works: If there are several such lines in a file, -each specifies the archive location for the text below it. The first -such line also applies to any text before its definition. However, -using this method is @emph{strongly} deprecated as it is incompatible -with the outline structure of the document. The correct method for -setting multiple archive locations in a buffer is using properties.}: +@code{org-archive-location}. + +There is also an in-buffer option for setting this variable, for +example@footnote{For backward compatibility, the following also works: +If there are several such lines in a file, each specifies the archive +location for the text below it. The first such line also applies to any +text before its definition. However, using this method is +@emph{strongly} deprecated as it is incompatible with the outline +structure of the document. The correct method for setting multiple +archive locations in a buffer is using properties.}: @cindex #+ARCHIVE @example diff --git a/lisp/org-archive.el b/lisp/org-archive.el index 16c35cf..35ef290 100644 --- a/lisp/org-archive.el +++ b/lisp/org-archive.el @@ -213,13 +213,14 @@ this heading." (current-time))) category todo priority ltags itags atags ;; end of variables that will be used for saving context - location afile heading buffer level newfile-p infile-p visiting) + location afile heading buffer level newfile-p infile-p visiting + datetree-date) ;; Find the local archive location (setq location (org-get-local-archive-location) afile (org-extract-archive-file location) heading (org-extract-archive-heading location) - infile-p (equal file (abbreviate-file-name afile))) + infile-p (equal file (abbreviate-file-name (or afile "")))) (unless afile (error "Invalid `org-archive-location'")) @@ -230,6 +231,12 @@ this heading." (setq buffer (current-buffer))) (unless buffer (error "Cannot access file \"%s\"" afile)) + (when (string-match "\\`datetree/" heading) + ;; Replace with ***, to represent the 3 levels of headings the + ;; datetree has. + (setq heading (string-replace-match "\\`datetree/" heading "***")) + (setq datetree-date (org-date-to-gregorian + (or (org-entry-get nil "CLOSED" t) time)))) (if (and (> (length heading) 0) (string-match "^\\*+" heading)) (setq level (match-end 0)) @@ -262,6 +269,9 @@ this heading." (goto-char (point-max)) (insert (format "\nArchived entries from file %s\n\n" (buffer-file-name this-buffer)))) + (when datetree-date + (org-datetree-find-date-create datetree-date) + (org-narrow-to-subtree)) ;; Force the TODO keywords of the original buffer (let ((org-todo-line-regexp tr-org-todo-line-regexp) (org-todo-keywords-1 tr-org-todo-keywords-1) @@ -285,7 +295,8 @@ this heading." ;; Heading not found, just insert it at the end (goto-char (point-max)) (or (bolp) (insert "\n")) - (insert "\n" heading "\n") + ;; datetrees don't need too much spacing + (if datetree-date (insert heading) (insert "\n" heading "\n")) (end-of-line 0)) ;; Make the subtree visible (show-subtree) @@ -296,7 +307,8 @@ this heading." (org-end-of-subtree t)) (skip-chars-backward " \t\r\n") (and (looking-at "[ \t\r\n]*") - (replace-match "\n\n"))) + ;; datetree archives don't need so much spacing. + (replace-match (if datetree-date "\n" "\n\n")))) ;; No specific heading, just go to end of file. (goto-char (point-max)) (insert "\n")) ;; Paste @@ -326,6 +338,7 @@ this heading." (setq n (concat "ARCHIVE_" (upcase (symbol-name e)))) (org-entry-put (point) n v))))) + (widen) ;; Save and kill the buffer, if it is not the same buffer. (when (not (eq this-buffer buffer)) (save-buffer)))) diff --git a/lisp/org.el b/lisp/org.el index 6ee3b4e..e19894a 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -4046,6 +4046,13 @@ Here are a few examples: Archive in file ./basement (relative path), as level 3 trees below the level 2 heading \"** Finished Tasks\". +\"~/org/datetree.org::datetree/* Finished Tasks\" + The \"datetree/\" string is special, signifying to + archive items to the datetree. Items are placed in + either the CLOSED date of the item, or the current date + if there is no CLOSED date. The heading will be a + subentry to the current date. + You may set this option on a per-file basis by adding to the buffer a line like -- 1.7.3.1