emacs/lisp/org/org-archive.el
Carsten Dominik b349f79f74 2008-06-17 Carsten Dominik <dominik@science.uva.nl>
* org-colview.el (org-columns-next-allowed-value): Bug fix.

	* org-colview-xemacs.el (org-columns-next-allowed-value): Bug fix.

	* org-agenda.el (org-agenda-get-closed): Get the end time into the
	agenda prefix as well.

	* org-publish.el (org-publish-org-index): Make a properly indented
	list.

	* org.el (org-calendar-agenda-action-key): New option.
	(org-get-cursor-date): New function.
	(org-mark-entry-for-agenda-action): New command.
	(org-overriding-default-time): New variable.
	(org-read-date): Respect `org-overriding-default-time'.

	* org-remember.el (org-remember-apply-template): Respect the
	ovverriding default time.

	* org-agenda.el (org-agenda-action-marker): New variable.
	(org-agenda-action): New command.
	(org-agenda-do-action): New function.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-schedule, org-deadline): Protect scheduled and
	deadline tasks against changes that accidently remove the
	repeater.  Also show a message with the new date when done.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-beginning-of-line): Cater for the case when there
	are tags but no headline text.
	(org-align-tags-here): Convert to tabs only when indent-tabs-mode
	it set.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-mhe.el (org-mhe-get-message-folder-from-index): Make sure
	the return value is nil instead of "nil" when there is no match.

	* org-exp.el (org-insert-centered): Use fill-column instead of
	80.
	(org-export-as-ascii): Use string-width to measure the width of
	the heading.

	* org.el (org-diary-to-ical-string): No longer kill buffer
	FROMBUF, this is now done by the caller.

	* org-exp.el (org-print-icalendar-entries): Move the call to
	`org-diary-to-ical-string' out of the loop, and kill the buffer
	afterwords.

	* org-remember.el (org-remember-visit-immediately): Position
	cursor after moving to the note.
	(org-remember-apply-template): Use a text property to record the
	cursor position.
	(org-remember-handler): Align tags after pasting the note.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-bbdb.el (org-bbdb-follow-anniversary-link): New function.

	* org-agenda.el (org-agenda-open-link): If there is an
	org-bbdb-name property in the current line, jump to that bbdb
	entry.

	* org-bbdb.el (org-bbdb-anniversaries): Add the bbdb-name as a
	text property, so that the agenda knows where this entry comes
	from.

	* org-agenda.el (org-agenda-clock-in): Fixed bug in the
	interaction between clocking-in from the agenda, and  automatic
	task state switching.

	* org-macs.el (org-with-point-at): Bug fix in macro defintion.

	* org.el (org-beginning-of-line, org-end-of-line): Make sure the
	zmacs-region stays after this command in XEmacs.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-scan-tags): Allow new values for ACTION parameter.

	* org-remember.el (org-remember-templates): Fix bug in
	customization type definition.

	* org.el (org-map-entries): New function.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-agenda.el (org-agenda-skip-comment-trees): New option.
	(org-agenda-skip): Respect `org-agenda-skip-comment-trees'.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-remember.el (org-jump-to-target-location): New variable.
	(org-remember-apply-template): Set
	`org-remember-apply-template' if requested by template.
	(org-remember-handler): Start an idle timer to jump to
	remember location.

	* org-exp.el (org-get-current-options): Add the FILETAGS setting.

	* org.el (org-set-regexps-and-options): Fix bug with parsing of
	file tags.
	(org-get-tags-at): Add the content of `org-file-tags'.

	* org-exp.el (org-export-handle-comments): Fix bug with several
	comment lines after each other.
	(org-number-to-roman, org-number-to-counter): New functions.
	(org-export-section-number-format): New option.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-exp.el (org-export-protect-examples): Catch the case of a
	missing end_example line.

	* org.el (org-set-regexps-and-options): Set `org-file-properties' and
	`org-file-tags' to nil.

	* org-colview.el (org-columns-next-allowed-value): Handle next
	argument NTH to directly select a value.

	* org-colview-xemacs.el (org-columns-next-allowed-value): Handle next
	argument NTH to directly select a value.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-agenda.el (org-agenda-scheduled-leaders): Fix docstring.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-columns-ellipses): New option.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-colview.el (org-columns-add-ellipses): New function.
	(org-columns-compact-links): New function.
	(org-columns-cleanup-item): Call `org-columns-compact-links'.
	(org-columns-display-here): Call `org-agenda-columns-cleanup-item'
	when in agenda.
	(org-columns-edit-value): Fixed bug with editing values from
	agenda column view.
	(org-columns-redo): Also redo the agenda itself.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-agenda.el (org-agenda-columns-remove-prefix-from-item): New
	option.

	* org-colview.el (org-agenda-columns-cleanup-item): New function.

	* org-exp.el (org-export-ascii-preprocess): Renamed from
	`org-export-ascii-clean-string'.
	(org-export-kill-licensed-text)
	(org-export-define-heading-targets)
	(org-export-handle-invisible-targets)
	(org-export-target-internal-links)
	(org-export-remove-or-extract-drawers)
	(org-export-remove-archived-trees)
	(org-export-protect-quoted-subtrees)
	(org-export-protect-verbatim, org-export-protect-examples)
	(org-export-select-backend-specific-text)
	(org-export-mark-blockquote-and-verse)
	(org-export-remove-comment-blocks-and-subtrees)
	(org-export-handle-comments, org-export-mark-radio-links)
	(org-export-remove-special-table-lines)
	(org-export-normalize-links)
	(org-export-concatenate-multiline-links)
	(org-export-concatenate-multiline-emphasis): New functions,
	obtained from spliiting the export preprocessor.

	* org-table.el (org-table-recalculate): Improve error message if
	the row number is invalid.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-archive.el (org-archive-save-context-info): Fix bugs in
	customization setup and docstring.

	* org-exp.el (org-export-html-style): Changed the size of in the
	<pre> element to 90%.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-find-src-example-start): Function removed.
	(org-edit-src-find-region-and-lang): New function.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-edit-src-exit): New function.
	(org-exit-edit-mode): New minor mode.

	* org-exp.el (org-export-preprocess-string): Fix bug with removing
	comment-like lines from protected examples.

	* org.el (org-edit-src-example, org-find-src-example-start)
	(org-protect-source-example, org-edit-special): New functions.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-publish.el (org-publish-project-alist): Fix typo in
	docstring.
	(org-publish-project-alist): Handle :index-title property.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-export-latex.el (org-export-as-latex): Make sure region
	bounds are correct.  Parse subtree properties relating to export.

	* org-exp.el (org-export-add-options-to-plist): New function.
	(org-infile-export-plist): Use `org-export-add-options-to-plist'.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-default-properties): Add EXPORT_FILE_NAME and
	EXPORT_TITLE.

	* org-exp.el (org-export-get-title-from-subtree)
	(org-export-as-ascii, org-export-as-html): Make sure the original
	region-beginning and region-end are used, even after moving
	point.
	(org-export-get-title-from-subtree): Also try the EXPORT_TITLE
	property.

	* org-remember.el (org-remember-last-stored-marker): New variable.
	(org-remember-goto-last-stored): Use `org-goto-marker-or-bmk'.
	(org-remember-handler): Also use marker to remember
	last-stored position.

	* org.el (org-goto-marker-or-bmk): New function.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-file-properties): Renamed from `org-local-properties'.
	(org-scan-tags): Take file tags into account.
	(org-tags-match-list-sublevels): Default changed to t.

	* org-exp.el (org-export-as-html): Close paragraph after a
	footnote.

	* org.el (org-update-parent-todo-statistics): New function.

	* org-exp.el (org-icalendar-store-UID): New option.
	(org-icalendar-force-UID): Option removed.
	(org-print-icalendar-entries): IMplement UIDs.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-mhe.el (org-mhe-follow-link): Fix bug in mhe searches.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-faces.el (org-column): Document how this face is being used
	and why sometimes the background faces shine through.

	* org-mhe.el (org-mhe-follow-link): Improve handling of searches.

	* org-publish.el (org-publish-attachment): Create publishing
	directory if it does not yet exist.

	* org-table.el (org-calc-default-modes): Change default number
	format to (float 8).

	* org.el (org-olpath-completing-read): New function.
	(org-time-clocksum-format): New option.
	(org-minutes-to-hh:mm-string): Use `org-time-clocksum-format'.

	* org-clock.el (org-clock-display, org-clock-out)
	(org-update-mode-line): Use `org-time-clocksum-format'.

	* org-colview-xemacs.el (org-columns-number-to-string): Use
	`org-time-clocksum-format'.

	* org-colview.el (org-columns-number-to-string): Use
	`org-time-clocksum-format'.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-id.el: New file, move from contrib to core.

	* org-exp.el (org-icalendar-force-UID): New option.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-exp.el (org-print-icalendar-entries): Make sure DTEND is
	shifted by one day if theere is a date range without an end
	time.

	* org.el (org-try-structure-completion): New function.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-set-font-lock-defaults): Improve fontification of
	description lists.
	(org-insert-item): Handle description lists.
	(org-adaptive-fill-function): Improve auto indentation in
	description lists.

	* org-exp.el (org-export-as-html, org-export-preprocess-string):
	Implement VERSE environment.
	(org-export-preprocess-string): Implement the COMMENT
	environment.

	* org-export-latex.el (org-export-latex-preprocess): Implement
	VERSE environment.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-jsinfo.el (org-infojs-opts-table): Add entry for FIXED_TOC
	option.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-table.el (orgtbl-to-tsv, orgtbl-to-csv): New functions.

	* org.el (org-quote-csv-field): New functions.

	* org-table.el (org-table-export-default-format): Remove :splice
	from default format, we get the same effect by not specifying
	:tstart and :tend.
	(org-table-export): Improve setup, distinguish better between
	interactive and non-interactive use, allow specifying the format
	on the fly, better protection against wrong file names.
	(orgtbl-to-generic): Fix documentation.  Do not require :tstart
	and :tend when :splice is omitted.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-clock.el (org-clock-select-task): Make sure the selection
	letters are 1-9 and A-Z, no special characters.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-exp.el (org-export-htmlize): New group.
	(org-export-htmlize-output-type)
	(org-export-htmlize-css-font-prefix): New options.
	(org-export-htmlize-region-for-paste): New function.
	(org-export-htmlize-generate-css): New command.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-set-visibility-according-to-property): New function.
	(org-ctrl-c-ctrl-c): Do not restart org-mode, just get the options
	and compute the regular expressions, and update font-lock.
	(org-property-re): Allow a dash in property names.

	* org-archive.el (org-extract-archive-file): Insert the file name
	without the path into the format, to allow the location format to
	contain a subdirectory.

	* org-agenda.el (org-agenda-post-command-hook): If point is at end
	of buffer, and the `org-agenda-type' property undefined, use the
	value from the character before.

	* org.el (org-add-planning-info): Don't let indentation for
	would-be timestamp become extra whitespace at the end of headline.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-remove-double-quotes, org-file-contents): New
	functions.

	* org-exp.el (org-infile-export-plist): Also parse the
	contents of #+SETUPFILE files, recursively.

	* org.el (org-set-regexps-and-options): Also parse the
	contents of #+SETUPFILE files, recursively.

	* org-exp.el (org-export-handle-include-files): New function.
	(org-export-preprocess-string): Call
	`org-export-handle-include-files'.

	* org.el (org-delete-property-globally)
	(org-delete-property, org-set-property): Ignore case during
	completion.
	(org-set-property): Use `org-completing-read' instead of
	`completing-read'.

	* org.el (org-complete-expand-structure-template): New,
	experimental function.
	(org-structure-template-alist): New, experimental option.
	(org-complete): Call `org-complete-expand-structure-template'.

2008-06-17 Bastien Guerry  <bzg@altern.org>

	* org-export-latex.el (org-export-latex-preprocess): Added
	support for blockquotes.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-read-date-analyze): Catch the case where only a
	weekday is given.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-set-font-lock-defaults): Make the description
	tag bold.

	* org-exp.el (org-export-as-html, org-close-li): Implement
	description lists.

2008-06-17 Jason Riedy  <jason@acm.org>

	* org-table.el (*orgtbl-default-fmt*): New variable.
	(orgtbl-format-line): Use the value of *orgtbl-default-fmt*
	when there is no other fmt available.

	(orgtbl-to-generic): Allow an explicitly nil :tstart or
	:tend to suppress the appropriate string.

	(orgtbl-to-orgtbl): New function for translating to another orgtbl
	table.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.el (org-read-date-analyze): "." as an alias for "+0" in
	read date.

	* org-clock.el (org-clock-save-markers-for-cut-and-paste):
	New function.

	* org-agenda.el (org-agenda-save-markers-for-cut-and-paste):
	New function.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-clock.el (org-clock-find-position): Don't include notes
	into clock drawer.

	* org-archive.el (org-archive-subtree): No longer remove an
	extra line after cutting the subtree.  `org-cut-subtree' already
	takes care of this.

	* org-remember.el (org-remember-handler): Only kill the target
	buffer if it does not contain the running clock.

	* org.el (org-markers-to-move): New variable.
	(org-save-markers-in-region, org-check-and-save-marker)
	(org-reinstall-markers-in-region): New function.
	(org-move-subtree-down, org-copy-subtree): Remember relative
	marker positions before cutting.
	(org-move-subtree-down, org-paste-subtree): Restore relative
	marker positions after pasting.

	* org-remember.el (org-remember-clock-out-on-exit): New option.
	(org-remember-finalize): Clock out only if the setting in
	`org-remember-clock-out-on-exit' requires it.
	(org-remember-handler): Do the cleanup in the buffer, to make sure
	that the clock marker remains in tact.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-clock.el (org-clock-goto): Widen buffer if necessary.
	(org-clock-in): Make sure that also tasks outside the narrowed
	region will be clocked in correctly.
	(org-clock-insert-selection-line): Widen the buffer so that we can
	find the correct task heading.

	* org.el (org-base-buffer): New function.

	* org-exp.el (org-icalendar-cleanup-string): Make sure ',"
	and ";" are escaped.
	(org-print-icalendar-entries): Also apply
	`org-icalendar-cleanup-string' to the headline, not only to the
	summary property.

2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org-exp.el (org-export-preprocess-hook): New hook.
	(org-export-preprocess-string): Call
	`org-export-preprocess-hook'.

	* org.el (org-font-lock-hook): New variable.
	(org-font-lock-hook): New function.
	(org-set-font-lock-defaults): Call `org-font-lock-hook'.



2008-06-17  Carsten Dominik  <dominik@science.uva.nl>

	* org.texi: Modify license to no longer include back- and front
	cover matters.
	(Using the mapping API): New section.
	(Agenda column view): New section.
	(Moving subtrees): Document archiving to the archive
	sibling.
	(Agenda commands): Document columns view in the agenda.
	(Using the property API): Document the API for
	multi-valued properties.
2008-06-17 15:22:00 +00:00

420 lines
15 KiB
EmacsLisp

;;; org-archive.el --- Archiving for Org-mode
;; Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
;; Version: 6.05a
;;
;; This file is part of GNU Emacs.
;;
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Commentary:
;; This file contains the face definitons for Org.
;;; Code:
(require 'org)
(defcustom org-archive-sibling-heading "Archive"
"Name of the local archive sibling that is used to archive entries locally.
Locally means: in the tree, under a sibling.
See `org-archive-to-archive-sibling' for more information."
:group 'org-archive
:type 'string)
(defcustom org-archive-mark-done t
"Non-nil means, mark entries as DONE when they are moved to the archive file.
This can be a string to set the keyword to use. When t, Org-mode will
use the first keyword in its list that means done."
:group 'org-archive
:type '(choice
(const :tag "No" nil)
(const :tag "Yes" t)
(string :tag "Use this keyword")))
(defcustom org-archive-stamp-time t
"Non-nil means, add a time stamp to entries moved to an archive file.
This variable is obsolete and has no effect anymore, instead add or remove
`time' from the variable `org-archive-save-context-info'."
:group 'org-archive
:type 'boolean)
(defcustom org-archive-save-context-info '(time file olpath category todo itags)
"Parts of context info that should be stored as properties when archiving.
When a subtree is moved to an archive file, it loses information given by
context, like inherited tags, the category, and possibly also the TODO
state (depending on the variable `org-archive-mark-done').
This variable can be a list of any of the following symbols:
time The time of archiving.
file The file where the entry originates.
ltags The local tags, in the headline of the subtree.
itags The tags the subtree inherits from further up the hierarchy.
todo The pre-archive TODO state.
category The category, taken from file name or #+CATEGORY lines.
olpath The outline path to the item. These are all headlines above
the current item, separated by /, like a file path.
For each symbol present in the list, a property will be created in
the archived entry, with a prefix \"PRE_ARCHIVE_\", to remember this
information."
:group 'org-archive
:type '(set :greedy t
(const :tag "Time" time)
(const :tag "File" file)
(const :tag "Category" category)
(const :tag "TODO state" todo)
(const :tag "Priority" priority)
(const :tag "Inherited tags" itags)
(const :tag "Outline path" olpath)
(const :tag "Local tags" ltags)))
(defun org-get-local-archive-location ()
"Get the archive location applicable at point."
(let ((re "^#\\+ARCHIVE:[ \t]+\\(\\S-.*\\S-\\)[ \t]*$")
prop)
(save-excursion
(save-restriction
(widen)
(setq prop (org-entry-get nil "ARCHIVE" 'inherit))
(cond
((and prop (string-match "\\S-" prop))
prop)
((or (re-search-backward re nil t)
(re-search-forward re nil t))
(match-string 1))
(t org-archive-location (match-string 1)))))))
(defun org-add-archive-files (files)
"Splice the archive files into the list f files.
This implies visiting all these files and finding out what the
archive file is."
(apply
'append
(mapcar
(lambda (f)
(if (not (file-exists-p f))
nil
(with-current-buffer (org-get-agenda-file-buffer f)
(cons f (org-all-archive-files)))))
files)))
(defun org-all-archive-files ()
"Get a list of all archive files used in the current buffer."
(let (file files)
(save-excursion
(save-restriction
(goto-char (point-min))
(while (re-search-forward
"^\\(#\\+\\|[ \t]*:\\)ARCHIVE:[ \t]+\\(.*\\)"
nil t)
(setq file (org-extract-archive-file
(org-match-string-no-properties 2)))
(and file (> (length file) 0) (file-exists-p file)
(add-to-list 'files file)))))
(setq files (nreverse files))
(setq file (org-extract-archive-file))
(and file (> (length file) 0) (file-exists-p file)
(add-to-list 'files file))
files))
(defun org-extract-archive-file (&optional location)
"Extract and expand the file name from archive LOCATION.
if LOCATION is not given, the value of `org-archive-location' is used."
(setq location (or location org-archive-location))
(if (string-match "\\(.*\\)::\\(.*\\)" location)
(if (= (match-beginning 1) (match-end 1))
(buffer-file-name)
(expand-file-name
(format (match-string 1 location)
(file-name-nondirectory buffer-file-name))))))
(defun org-extract-archive-heading (&optional location)
"Extract the heading from archive LOCATION.
if LOCATION is not given, the value of `org-archive-location' is used."
(setq location (or location org-archive-location))
(if (string-match "\\(.*\\)::\\(.*\\)" location)
(match-string 2 location)))
(defun org-archive-subtree (&optional find-done)
"Move the current subtree to the archive.
The archive can be a certain top-level heading in the current file, or in
a different file. The tree will be moved to that location, the subtree
heading be marked DONE, and the current time will be added.
When called with prefix argument FIND-DONE, find whole trees without any
open TODO items and archive them (after getting confirmation from the user).
If the cursor is not at a headline when this comand is called, try all level
1 trees. If the cursor is on a headline, only try the direct children of
this heading."
(interactive "P")
(if find-done
(org-archive-all-done)
;; Save all relevant TODO keyword-relatex variables
(let ((tr-org-todo-line-regexp org-todo-line-regexp) ; keep despite compiler
(tr-org-todo-keywords-1 org-todo-keywords-1)
(tr-org-todo-kwd-alist org-todo-kwd-alist)
(tr-org-done-keywords org-done-keywords)
(tr-org-todo-regexp org-todo-regexp)
(tr-org-todo-line-regexp org-todo-line-regexp)
(tr-org-odd-levels-only org-odd-levels-only)
(this-buffer (current-buffer))
;; start of variables that will be used for saving context
;; The compiler complains about them - keep them anyway!
(file (abbreviate-file-name (buffer-file-name)))
(olpath (mapconcat 'identity (org-get-outline-path) "/"))
(time (format-time-string
(substring (cdr org-time-stamp-formats) 1 -1)
(current-time)))
category todo priority ltags itags
;; end of variables that will be used for saving context
location afile heading buffer level newfile-p visiting)
;; Find the local archive location
(setq location (org-get-local-archive-location)
afile (org-extract-archive-file location)
heading (org-extract-archive-heading location))
(unless afile
(error "Invalid `org-archive-location'"))
(if (> (length afile) 0)
(setq newfile-p (not (file-exists-p afile))
visiting (find-buffer-visiting afile)
buffer (or visiting (find-file-noselect afile)))
(setq buffer (current-buffer)))
(unless buffer
(error "Cannot access file \"%s\"" afile))
(if (and (> (length heading) 0)
(string-match "^\\*+" heading))
(setq level (match-end 0))
(setq heading nil level 0))
(save-excursion
(org-back-to-heading t)
;; Get context information that will be lost by moving the tree
(org-refresh-category-properties)
(setq category (org-get-category)
todo (and (looking-at org-todo-line-regexp)
(match-string 2))
priority (org-get-priority
(if (match-end 3) (match-string 3) ""))
ltags (org-get-tags)
itags (org-delete-all ltags (org-get-tags-at)))
(setq ltags (mapconcat 'identity ltags " ")
itags (mapconcat 'identity itags " "))
;; We first only copy, in case something goes wrong
;; we need to protect `this-command', to avoid kill-region sets it,
;; which would lead to duplication of subtrees
(let (this-command) (org-copy-subtree 1 nil t))
(set-buffer buffer)
;; Enforce org-mode for the archive buffer
(if (not (org-mode-p))
;; Force the mode for future visits.
(let ((org-insert-mode-line-in-empty-file t)
(org-inhibit-startup t))
(call-interactively 'org-mode)))
(when newfile-p
(goto-char (point-max))
(insert (format "\nArchived entries from file %s\n\n"
(buffer-file-name this-buffer))))
;; 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)
(org-todo-kwd-alist tr-org-todo-kwd-alist)
(org-done-keywords tr-org-done-keywords)
(org-todo-regexp tr-org-todo-regexp)
(org-todo-line-regexp tr-org-todo-line-regexp)
(org-odd-levels-only
(if (local-variable-p 'org-odd-levels-only (current-buffer))
org-odd-levels-only
tr-org-odd-levels-only)))
(goto-char (point-min))
(show-all)
(if heading
(progn
(if (re-search-forward
(concat "^" (regexp-quote heading)
(org-re "[ \t]*\\(:[[:alnum:]_@:]+:\\)?[ \t]*\\($\\|\r\\)"))
nil t)
(goto-char (match-end 0))
;; Heading not found, just insert it at the end
(goto-char (point-max))
(or (bolp) (insert "\n"))
(insert "\n" heading "\n")
(end-of-line 0))
;; Make the subtree visible
(show-subtree)
(org-end-of-subtree t)
(skip-chars-backward " \t\r\n")
(and (looking-at "[ \t\r\n]*")
(replace-match "\n\n")))
;; No specific heading, just go to end of file.
(goto-char (point-max)) (insert "\n"))
;; Paste
(org-paste-subtree (org-get-valid-level level 1))
;; Mark the entry as done
(when (and org-archive-mark-done
(looking-at org-todo-line-regexp)
(or (not (match-end 2))
(not (member (match-string 2) org-done-keywords))))
(let (org-log-done org-todo-log-states)
(org-todo
(car (or (member org-archive-mark-done org-done-keywords)
org-done-keywords)))))
;; Add the context info
(when org-archive-save-context-info
(let ((l org-archive-save-context-info) e n v)
(while (setq e (pop l))
(when (and (setq v (symbol-value e))
(stringp v) (string-match "\\S-" v))
(setq n (concat "ARCHIVE_" (upcase (symbol-name e))))
(org-entry-put (point) n v)))))
;; Save and kill the buffer, if it is not the same buffer.
(when (not (eq this-buffer buffer))
(save-buffer)
;; Check if it is OK to kill the buffer
(unless
(or visiting
(equal (marker-buffer org-clock-marker) (current-buffer)))
(kill-buffer buffer)))
))
;; Here we are back in the original buffer. Everything seems to have
;; worked. So now cut the tree and finish up.
(let (this-command) (org-cut-subtree))
(setq org-markers-to-move nil)
(message "Subtree archived %s"
(if (eq this-buffer buffer)
(concat "under heading: " heading)
(concat "in file: " (abbreviate-file-name afile)))))))
(defun org-archive-to-archive-sibling ()
"Archive the current heading by moving it under the archive sibling.
The archive sibling is a sibling of the heading with the heading name
`org-archive-sibling-heading' and an `org-archive-tag' tag. If this
sibling does not exist, it will be created at the end of the subtree."
(interactive)
(save-restriction
(widen)
(let (b e pos leader level)
(org-back-to-heading t)
(looking-at outline-regexp)
(setq leader (match-string 0)
level (funcall outline-level))
(setq pos (point))
(condition-case nil
(outline-up-heading 1 t)
(error (goto-char (point-min))))
(setq b (point))
(condition-case nil
(org-end-of-subtree t t)
(error (goto-char (point-max))))
(setq e (point))
(goto-char b)
(unless (re-search-forward
(concat "^" (regexp-quote leader)
"[ \t]*"
org-archive-sibling-heading
"[ \t]*:"
org-archive-tag ":") e t)
(goto-char e)
(or (bolp) (newline))
(insert leader org-archive-sibling-heading "\n")
(beginning-of-line 0)
(org-toggle-tag org-archive-tag 'on))
(beginning-of-line 1)
(org-end-of-subtree t t)
(save-excursion
(goto-char pos)
(org-cut-subtree))
(org-paste-subtree (org-get-valid-level level 1))
(org-set-property
"ARCHIVE_TIME"
(format-time-string
(substring (cdr org-time-stamp-formats) 1 -1)
(current-time)))
(outline-up-heading 1 t)
(hide-subtree)
(goto-char pos))))
(defun org-archive-all-done (&optional tag)
"Archive sublevels of the current tree without open TODO items.
If the cursor is not on a headline, try all level 1 trees. If
it is on a headline, try all direct children.
When TAG is non-nil, don't move trees, but mark them with the ARCHIVE tag."
(let ((re (concat "^\\*+ +" org-not-done-regexp)) re1
(rea (concat ".*:" org-archive-tag ":"))
(begm (make-marker))
(endm (make-marker))
(question (if tag "Set ARCHIVE tag (no open TODO items)? "
"Move subtree to archive (no open TODO items)? "))
beg end (cntarch 0))
(if (org-on-heading-p)
(progn
(setq re1 (concat "^" (regexp-quote
(make-string
(1+ (- (match-end 0) (match-beginning 0) 1))
?*))
" "))
(move-marker begm (point))
(move-marker endm (org-end-of-subtree t)))
(setq re1 "^* ")
(move-marker begm (point-min))
(move-marker endm (point-max)))
(save-excursion
(goto-char begm)
(while (re-search-forward re1 endm t)
(setq beg (match-beginning 0)
end (save-excursion (org-end-of-subtree t) (point)))
(goto-char beg)
(if (re-search-forward re end t)
(goto-char end)
(goto-char beg)
(if (and (or (not tag) (not (looking-at rea)))
(y-or-n-p question))
(progn
(if tag
(org-toggle-tag org-archive-tag 'on)
(org-archive-subtree))
(setq cntarch (1+ cntarch)))
(goto-char end)))))
(message "%d trees archived" cntarch)))
(defun org-toggle-archive-tag (&optional find-done)
"Toggle the archive tag for the current headline.
With prefix ARG, check all children of current headline and offer tagging
the children that do not contain any open TODO items."
(interactive "P")
(if find-done
(org-archive-all-done 'tag)
(let (set)
(save-excursion
(org-back-to-heading t)
(setq set (org-toggle-tag org-archive-tag))
(when set (hide-subtree)))
(and set (beginning-of-line 1))
(message "Subtree %s" (if set "archived" "unarchived")))))
(provide 'org-archive)
;; arch-tag: 0837f601-9699-43c3-8b90-631572ae6c85
;;; org-archive.el ends here