summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Dominik <dominik@nb-dominik2.science.uva.nl>2008-01-31 16:04:26 +0100
committerCarsten Dominik <dominik@nb-dominik2.science.uva.nl>2008-01-31 16:04:26 +0100
commit93c665b56da394fdb19049bbd05f7d66c90a9cc2 (patch)
tree959ca4751d67f45b3d6947c2736234cabbe4296e
parent011a15f3a91c1af0e2780b428e4c0fc0e2bc57ee (diff)
downloadorg-mode-93c665b56da394fdb19049bbd05f7d66c90a9cc2.tar.gz
Intermediate state, I am just trying comiting now.
-rw-r--r--BUGFIXING/org-log.el348
-rw-r--r--CONTRIB/org-depend.el235
-rwxr-xr-xCONTRIB/org-export-freemind-0.1.0/ChangeLog33
-rwxr-xr-xCONTRIB/org-export-freemind-0.1.0/README50
-rwxr-xr-xCONTRIB/org-export-freemind-0.1.0/org-export-freemind-install.el7
-rwxr-xr-xCONTRIB/org-export-freemind-0.1.0/org-export-freemind.el196
-rw-r--r--CONTRIB/org-export-freemind.el196
-rw-r--r--CONTRIB/org-mairix.el153
-rw-r--r--CONTRIB/org-man.el39
-rw-r--r--CONTRIB/org-toc.el488
-rw-r--r--ChangeLog41
-rw-r--r--EXPERIMENTAL/find-links-to-local.el3
-rw-r--r--EXPERIMENTAL/interactive-query/org-interactive-query.patch.txt328
-rw-r--r--EXPERIMENTAL/interactive-query/org.el28057
-rw-r--r--EXPERIMENTAL/interactive-query/org.el.orig (renamed from org_xemacs.el)10856
-rw-r--r--EXPERIMENTAL/john.el70
-rw-r--r--EXPERIMENTAL/org-bibtex.el154
-rw-r--r--EXPERIMENTAL/org-depend.el235
-rw-r--r--EXPERIMENTAL/org-elisp-symbol.el158
-rw-r--r--EXPERIMENTAL/org-fastup.el135
-rw-r--r--EXPERIMENTAL/org-indent.el107
-rw-r--r--EXPERIMENTAL/org-panel.el642
-rw-r--r--EXPERIMENTAL/org-pic.el191
-rw-r--r--EXPERIMENTAL/sacha-load.el111
-rw-r--r--Makefile27
-rw-r--r--ORGWEBPAGE/.DS_Storebin0 -> 12292 bytes
-rw-r--r--ORGWEBPAGE/Changes.html6354
-rw-r--r--ORGWEBPAGE/Changes.org3353
-rw-r--r--ORGWEBPAGE/Changes.txt3152
-rw-r--r--ORGWEBPAGE/faq.html555
-rw-r--r--ORGWEBPAGE/faq.org372
-rw-r--r--ORGWEBPAGE/freeshell2.css66
-rw-r--r--ORGWEBPAGE/index.html403
-rw-r--r--ORGWEBPAGE/index.org211
-rw-r--r--ORGWEBPAGE/index.txt151
-rw-r--r--ORGWEBPAGE/org.texi5
-rw-r--r--ORGWEBPAGE/org/index.html24
-rw-r--r--ORGWEBPAGE/qanda.org231
-rw-r--r--ORGWEBPAGE/survey.html2195
-rw-r--r--ORGWEBPAGE/survey.org1158
-rw-r--r--ORGWEBPAGE/tmp/.DS_Storebin0 -> 6148 bytes
-rw-r--r--ORGWEBPAGE/tmp/Changes.html6368
-rw-r--r--ORGWEBPAGE/tmp/Changes.txt3562
-rw-r--r--ORGWEBPAGE/tmp/faq.html663
-rw-r--r--ORGWEBPAGE/tmp/freeshell2.css65
-rw-r--r--ORGWEBPAGE/tmp/index.html419
-rw-r--r--ORGWEBPAGE/tmp/orgcard.txt457
-rw-r--r--ORGWEBPAGE/tmp/qanda.html449
-rw-r--r--ORGWEBPAGE/tmp/request-assign-future.txt44
-rw-r--r--ORGWEBPAGE/tmp/survey.html2169
-rw-r--r--ORGWEBPAGE/tmp/todo.html1209
-rw-r--r--ORGWEBPAGE/tmp/tutorials.html317
-rw-r--r--ORGWEBPAGE/todo.html920
-rw-r--r--ORGWEBPAGE/todo.org649
-rw-r--r--ORGWEBPAGE/tutorials.html340
-rw-r--r--ORGWEBPAGE/tutorials.org105
-rw-r--r--TODO206
-rwxr-xr-xUTILITIES/fake_change_log.pl72
-rw-r--r--org.el754
-rw-r--r--org.texi47
-rw-r--r--orgcard.tex6
-rw-r--r--orgcard.txt457
-rw-r--r--texinfo.tex6688
63 files changed, 84222 insertions, 2834 deletions
diff --git a/BUGFIXING/org-log.el b/BUGFIXING/org-log.el
new file mode 100644
index 0000000..8ebedfe
--- /dev/null
+++ b/BUGFIXING/org-log.el
@@ -0,0 +1,348 @@
+(defun org-agenda-switch-to (&optional delete-other-windows)
+ "Go to the Org-mode file which contains the item at point."
+ (interactive)
+ (let ((cb (current-buffer))
+ (line (org-current-line))
+ (col (current-column))
+ (buf (current-buffer))
+ (pos (point)))
+ (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")
+ (goto-char (point-max))
+ (insert "--------------------------------------------------------\n")
+ (insert (format "This command: %s\n" this-command))
+ (insert (format "Last command: %s\n" last-command))
+ (insert (format "Line/Column/Point: %d/%d/%d\n" line col pos))))
+ (orglog-describe-char (point))
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker)))
+ (switch-to-buffer buffer)
+ (and delete-other-windows (delete-other-windows))
+ (widen)
+ (goto-char pos)
+ (when (org-mode-p)
+ (org-show-context 'agenda)
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil))))
+ (let ((cb (current-buffer))
+ (pos (point)))
+ (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")
+ (goto-char (point-max))
+ (insert (format "Arrived: %s %d\n" cb pos))))))
+
+(defun org-agenda-goto (&optional highlight)
+ "Go to the Org-mode file which contains the item at point."
+ (interactive)
+ (let ((cb (current-buffer))
+ (line (org-current-line))
+ (col (current-column))
+ (buf (current-buffer))
+ (pos (point)))
+ (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")
+ (goto-char (point-max))
+ (insert "--------------------------------------------------------\n")
+ (insert (format "This command: %s\n" this-command))
+ (insert (format "Last command: %s\n" last-command))
+ (insert (format "Line/Column/Point: %d/%d/%d\n" line col pos))))
+ (orglog-describe-char (point))
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker)))
+ (switch-to-buffer-other-window buffer)
+ (widen)
+ (goto-char pos)
+ (when (org-mode-p)
+ (org-show-context 'agenda)
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil)))) ; show the next heading
+ (run-hooks 'org-agenda-after-show-hook)
+ (and highlight (org-highlight (point-at-bol) (point-at-eol)))
+ (let ((cb (current-buffer))
+ (pos (point)))
+ (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")
+ (goto-char (point-max))
+ (insert (format "Arrived: %s %d\n" cb pos))))))
+
+
+(defun orglog-describe-char (pos)
+ "Describe the character after POS (interactively, the character after point).
+The information includes character code, charset and code points in it,
+syntax, category, how the character is encoded in a file,
+character composition information (if relevant),
+as well as widgets, buttons, overlays, and text properties."
+ (interactive "d")
+ (if (>= pos (point-max))
+ (error "No character follows specified position"))
+ (let* ((char (char-after pos))
+ (charset (char-charset char))
+ (composition (find-composition pos nil nil t))
+ (component-chars nil)
+ (display-table (or (window-display-table)
+ buffer-display-table
+ standard-display-table))
+ (disp-vector (and display-table (aref display-table char)))
+ (multibyte-p enable-multibyte-characters)
+ (overlays (mapcar #'(lambda (o) (overlay-properties o))
+ (overlays-at pos)))
+ (char-description (if (not multibyte-p)
+ (single-key-description char)
+ (if (< char 128)
+ (single-key-description char)
+ (string-to-multibyte
+ (char-to-string char)))))
+ (text-props-desc
+ (let ((tmp-buf (generate-new-buffer " *text-props*")))
+ (unwind-protect
+ (progn
+ (describe-text-properties pos tmp-buf)
+ (with-current-buffer tmp-buf (buffer-string)))
+ (kill-buffer tmp-buf))))
+ item-list max-width unicode)
+
+ (if (or (< char 256)
+ (memq 'mule-utf-8 (find-coding-systems-region pos (1+ pos)))
+ (get-char-property pos 'untranslated-utf-8))
+ (setq unicode (or (get-char-property pos 'untranslated-utf-8)
+ (encode-char char 'ucs))))
+ (setq item-list
+ `(("character"
+ ,(format "%s (%d, #o%o, #x%x%s)"
+ (apply 'propertize char-description
+ (text-properties-at pos))
+ char char char
+ (if unicode
+ (format ", U+%04X" unicode)
+ "")))
+ ("charset"
+ ,`(insert-text-button
+ ,(symbol-name charset)
+ 'type 'help-character-set 'help-args '(,charset))
+ ,(format "(%s)" (charset-description charset)))
+ ("code point"
+ ,(let ((split (split-char char)))
+ `(insert-text-button
+ ,(if (= (charset-dimension charset) 1)
+ (format "#x%02X" (nth 1 split))
+ (format "#x%02X #x%02X" (nth 1 split)
+ (nth 2 split)))
+ 'action (lambda (&rest ignore)
+ (list-charset-chars ',charset)
+ (with-selected-window
+ (get-buffer-window "*Character List*" 0)
+ (goto-char (point-min))
+ (forward-line 2) ;Skip the header.
+ (let ((case-fold-search nil))
+ (search-forward ,(char-to-string char)
+ nil t))))
+ 'help-echo
+ "mouse-2, RET: show this character in its character set")))
+ ("syntax"
+ ,(let ((syntax (syntax-after pos)))
+ (with-temp-buffer
+ (internal-describe-syntax-value syntax)
+ (buffer-string))))
+ ("category"
+ ,@(let ((category-set (char-category-set char)))
+ (if (not category-set)
+ '("-- none --")
+ (mapcar #'(lambda (x) (format "%c:%s"
+ x (category-docstring x)))
+ (category-set-mnemonics category-set)))))
+ ,@(let ((props (aref char-code-property-table char))
+ ps)
+ (when props
+ (while props
+ (push (format "%s:" (pop props)) ps)
+ (push (format "%s;" (pop props)) ps))
+ (list (cons "Properties" (nreverse ps)))))
+ ("to input"
+ ,@(let ((key-list (and (eq input-method-function
+ 'quail-input-method)
+ (quail-find-key char))))
+ (if (consp key-list)
+ (list "type"
+ (mapconcat #'(lambda (x) (concat "\"" x "\""))
+ key-list " or ")
+ "with"
+ `(insert-text-button
+ ,current-input-method
+ 'type 'help-input-method
+ 'help-args '(,current-input-method))))))
+ ("buffer code"
+ ,(encoded-string-description
+ (string-as-unibyte (char-to-string char)) nil))
+ ("file code"
+ ,@(let* ((coding buffer-file-coding-system)
+ (encoded (encode-coding-char char coding)))
+ (if encoded
+ (list (encoded-string-description encoded coding)
+ (format "(encoded by coding system %S)" coding))
+ (list "not encodable by coding system"
+ (symbol-name coding)))))
+ ("display"
+ ,(cond
+ (disp-vector
+ (setq disp-vector (copy-sequence disp-vector))
+ (dotimes (i (length disp-vector))
+ (setq char (aref disp-vector i))
+ (aset disp-vector i
+ (cons char (describe-char-display
+ pos (glyph-char char)))))
+ (format "by display table entry [%s] (see below)"
+ (mapconcat
+ #'(lambda (x)
+ (format "?%c" (glyph-char (car x))))
+ disp-vector " ")))
+ (composition
+ (let ((from (car composition))
+ (to (nth 1 composition))
+ (next (1+ pos))
+ (components (nth 2 composition))
+ ch)
+ (setcar composition
+ (and (< from pos) (buffer-substring from pos)))
+ (setcar (cdr composition)
+ (and (< next to) (buffer-substring next to)))
+ (dotimes (i (length components))
+ (if (integerp (setq ch (aref components i)))
+ (push (cons ch (describe-char-display pos ch))
+ component-chars)))
+ (setq component-chars (nreverse component-chars))
+ (format "composed to form \"%s\" (see below)"
+ (buffer-substring from to))))
+ (t
+ (let ((display (describe-char-display pos char)))
+ (if (display-graphic-p (selected-frame))
+ (if display
+ (concat
+ "by this font (glyph code)\n"
+ (format " %s (#x%02X)"
+ (car display) (cdr display)))
+ "no font available")
+ (if display
+ (format "terminal code %s" display)
+ "not encodable for terminal"))))))
+ ,@(let ((face
+ (if (not (or disp-vector composition))
+ (cond
+ ((and show-trailing-whitespace
+ (save-excursion (goto-char pos)
+ (looking-at "[ \t]+$")))
+ 'trailing-whitespace)
+ ((and nobreak-char-display unicode (eq unicode '#xa0))
+ 'nobreak-space)
+ ((and nobreak-char-display unicode (eq unicode '#xad))
+ 'escape-glyph)
+ ((and (< char 32) (not (memq char '(9 10))))
+ 'escape-glyph)))))
+ (if face (list (list "hardcoded face"
+ `(insert-text-button
+ ,(symbol-name face)
+ 'type 'help-face 'help-args '(,face))))))
+ ,@(let ((unicodedata (and unicode
+ (describe-char-unicode-data unicode))))
+ (if unicodedata
+ (cons (list "Unicode data" " ") unicodedata)))))
+ (setq max-width (apply #'max (mapcar #'(lambda (x)
+ (if (cadr x) (length (car x)) 0))
+ item-list)))
+ (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")
+ (goto-char (point-max))
+ (set-buffer-multibyte multibyte-p)
+ (let ((formatter (format "%%%ds:" max-width)))
+ (dolist (elt item-list)
+ (when (cadr elt)
+ (insert (format formatter (car elt)))
+ (dolist (clm (cdr elt))
+ (if (eq (car-safe clm) 'insert-text-button)
+ (progn (insert " ") (eval clm))
+ (when (>= (+ (current-column)
+ (or (string-match "\n" clm)
+ (string-width clm))
+ 1)
+ (window-width))
+ (insert "\n")
+ (indent-to (1+ max-width)))
+ (insert " " clm)))
+ (insert "\n"))))
+
+ (when overlays
+ (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "character:[ \t\n]+")
+ (let* ((end (+ (point) (length char-description))))
+ (mapc #'(lambda (props)
+ (let ((o (make-overlay (point) end)))
+ (while props
+ (overlay-put o (car props) (nth 1 props))
+ (setq props (cddr props)))))
+ overlays))))
+
+ (when disp-vector
+ (insert
+ "\nThe display table entry is displayed by ")
+ (if (display-graphic-p (selected-frame))
+ (progn
+ (insert "these fonts (glyph codes):\n")
+ (dotimes (i (length disp-vector))
+ (insert (glyph-char (car (aref disp-vector i))) ?:
+ (propertize " " 'display '(space :align-to 5))
+ (if (cdr (aref disp-vector i))
+ (format "%s (#x%02X)" (cadr (aref disp-vector i))
+ (cddr (aref disp-vector i)))
+ "-- no font --")
+ "\n")
+ (let ((face (glyph-face (car (aref disp-vector i)))))
+ (when face
+ (insert (propertize " " 'display '(space :align-to 5))
+ "face: ")
+ (insert (concat "`" (symbol-name face) "'"))
+ (insert "\n")))))
+ (insert "these terminal codes:\n")
+ (dotimes (i (length disp-vector))
+ (insert (car (aref disp-vector i))
+ (propertize " " 'display '(space :align-to 5))
+ (or (cdr (aref disp-vector i)) "-- not encodable --")
+ "\n"))))
+
+ (when composition
+ (insert "\nComposed")
+ (if (car composition)
+ (if (cadr composition)
+ (insert " with the surrounding characters \""
+ (car composition) "\" and \""
+ (cadr composition) "\"")
+ (insert " with the preceding character(s) \""
+ (car composition) "\""))
+ (if (cadr composition)
+ (insert " with the following character(s) \""
+ (cadr composition) "\"")))
+ (insert " by the rule:\n\t("
+ (mapconcat (lambda (x)
+ (format (if (consp x) "%S" "?%c") x))
+ (nth 2 composition)
+ " ")
+ ")")
+ (insert "\nThe component character(s) are displayed by ")
+ (if (display-graphic-p (selected-frame))
+ (progn
+ (insert "these fonts (glyph codes):")
+ (dolist (elt component-chars)
+ (insert "\n " (car elt) ?:
+ (propertize " " 'display '(space :align-to 5))
+ (if (cdr elt)
+ (format "%s (#x%02X)" (cadr elt) (cddr elt))
+ "-- no font --"))))
+ (insert "these terminal codes:")
+ (dolist (elt component-chars)
+ (insert "\n " (car elt) ":"
+ (propertize " " 'display '(space :align-to 5))
+ (or (cdr elt) "-- not encodable --"))))
+ (insert "\nSee the variable `reference-point-alist' for "
+ "the meaning of the rule.\n"))
+
+ (if text-props-desc (insert text-props-desc)))))
diff --git a/CONTRIB/org-depend.el b/CONTRIB/org-depend.el
new file mode 100644
index 0000000..1f0fb17
--- /dev/null
+++ b/CONTRIB/org-depend.el
@@ -0,0 +1,235 @@
+;;; org-depend.el --- TODO dependencies for Org-mode
+
+;; This file is not part of GNU Emacs.
+;;
+;; This file 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, 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; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+;;
+;; WARNING: This file is just a PROOF OF CONCEPT, not a supported part
+;; of Org-mode.
+;;
+;; This is an example implementation of TODO dependencies in Org-mode.
+;; It uses the new hooks in version 5.13 of Org-mode,
+;; `org-trigger-hook' and `org-blocker-hook'.
+;;
+;; It implements the following:
+;;
+;; Triggering
+;; ----------
+;;
+;; 1) If an entry contains a TRIGGER property that contains the string
+;; "chain-siblings(KEYWORD)", then switching that entry to DONE does
+;; do the following:
+;; - The sibling following this entry switched to todo-state KEYWORD.
+;; - The sibling also gets a TRIGGER property "chain-sibling(KEYWORD)",
+;; property, to make sure that, when *it* is DONE, the chain will
+;; continue.
+;;
+;; 2) If the TRIGGER property contains any other words like
+;; XYZ(KEYWORD), these are treated as entry id's with keywords. That
+;; means, Org-mode will search for an entry with the ID property XYZ
+;; and switch that entry to KEYWORD as well.
+;;
+;; Blocking
+;; --------
+;;
+;; 1) If an entry contains a BLOCKER property that contains the word
+;; "previous-sibling", the sibling above the current entry is
+;; checked when you try to mark it DONE. If it is still in a TODO
+;; state, the current state change is blocked.
+;;
+;; 2) If the BLOCKER property contains any other words, these are
+;; treated as entry id's. That means, Org-mode will search for an
+;; entry with the ID property exactly equal to this word. If any
+;; of these entries is not yet marked DONE, the current state change
+;; will be blocked.
+;;
+;; 3) Whenever a state change is blocked, an org-mark is pushed, so that
+;; you can find the offending entry with `C-c &'.
+;;
+;;; Example:
+;;
+;; When trying this example, make sure that the settings for TODO keywords
+;; have been activated, i.e. include the following line and press C-c C-c
+;; on the line before working with the example:
+;;
+;; #+TYP_TODO: TODO NEXT | DONE
+;;
+;; * TODO Win a million in Las Vegas
+;; The "third" TODO (see above) cannot become a TODO without this money.
+;;
+;; :PROPERTIES:
+;; :ID: I-cannot-do-it-without-money
+;; :END:
+;;
+;; * Do this by doing a chain of TODO's
+;; ** NEXT This is the first in this chain
+;; :PROPERTIES:
+;; :TRIGGER: chain-siblings(NEXT)
+;; :END:
+;;
+;; ** This is the second in this chain
+;;
+;; ** This is the third in this chain
+;; :PROPERTIES:
+;; :BLOCKER: I-cannot-do-it-without-money
+;; :END:
+;;
+;; ** This is the forth in this chain
+;; When this is DONE, we will also trigger entry XYZ-is-my-id
+;; :PROPERTIES:
+;; :TRIGGER: XYZ-is-my-id(TODO)
+;; :END:
+;;
+;; ** This is the fifth in this chain
+;;
+;; * Start writing report
+;; :PROPERTIES:
+;; :ID: XYZ-is-my-id
+;; :END:
+;;
+;;
+
+(require 'org)
+
+(defun org-depend-trigger-todo (change-plist)
+ "Trigger new TODO entries after the current is switched to DONE.
+This does two different kinds of triggers:
+
+- If the current entry contains a TRIGGER property that contains
+ \"chain-siblings(KEYWORD)\", it goes to the next sibling, marks it
+ KEYWORD and also installs the \"chain-sibling\" trigger to continue
+ the chain.
+- Any other word (space-separated) like XYZ(KEYWORD) in the TRIGGER
+ property is seen as an entry id. Org-mode finds the entry with the
+ corresponding ID property and switches it to the state TODO as well."
+
+ ;; Get information from the plist
+ (let* ((type (plist-get change-plist :type))
+ (pos (plist-get change-plist :position))
+ (from (plist-get change-plist :from))
+ (to (plist-get change-plist :to))
+ (org-log-done nil) ; IMPROTANT!: no logging during automatic trigger!
+ trigger triggers tr p1 kwd)
+ (catch 'return
+ (unless (eq type 'todo-state-change)
+ ;; We are only handling todo-state-change....
+ (throw 'return t))
+ (unless (and (member from org-not-done-keywords)
+ (member to org-done-keywords))
+ ;; This is not a change from TODO to DONE, ignore it
+ (throw 'return t))
+
+ ;; OK, we just switched from a TODO state to a DONE state
+ ;; Lets see if this entry has a TRIGGER property.
+ ;; If yes, split it up on whitespace.
+ (setq trigger (org-entry-get pos "TRIGGER")
+ triggers (and trigger (org-split-string trigger "[ \t]+")))
+
+ ;; Go through all the triggers
+ (while (setq tr (pop triggers))
+ (cond
+ ((string-match "\\`chain-siblings(\\(.*?\\))\\'" tr)
+ ;; This is a TODO chain of siblings
+ (setq kwd (match-string 1 tr))
+ (catch 'exit
+ (save-excursion
+ (goto-char pos)
+ ;; find the sibling, exit if no more siblings
+ (condition-case nil
+ (outline-forward-same-level 1)
+ (error (throw 'exit t)))
+ ;; mark the sibling TODO
+ (org-todo kwd)
+ ;; make sure the sibling will continue the chain
+ (org-entry-add-to-multivalued-property
+ nil "TRIGGER" (format "chain-siblings(%s)" kwd)))))
+
+ ((string-match "\\`\\(\\S-+\\)(\\(.*?\\))\\'" tr)
+ ;; This seems to be ENTRY_ID(KEYWORD)
+ (setq id (match-string 1 tr)
+ kwd (match-string 2 tr)
+ p1 (org-find-entry-with-id id))
+ (when p1
+ ;; there is an entry with this ID, mark it TODO
+ (save-excursion
+ (goto-char p1)
+ (org-todo kwd)))))))))
+
+(defun org-depend-block-todo (change-plist)
+ "Block turning an entry into a TODO.
+This checks for a BLOCKER property in an entry and checks
+all the entries listed there. If any of them is not done,
+block changing the current entry into a TODO entry. If the property contains
+the word \"previous-sibling\", the sibling above the current entry is checked.
+Any other words are treated as entry id's. If an entry exists with the
+this ID property, that entry is also checked."
+ ;; Get information from the plist
+ (let* ((type (plist-get change-plist :type))
+ (pos (plist-get change-plist :position))
+ (from (plist-get change-plist :from))
+ (to (plist-get change-plist :to))
+ (org-log-done nil) ; IMPROTANT!: no logging during automatic trigger
+ blocker blockers bl p1)
+ (catch 'return
+ (unless (eq type 'todo-state-change)
+ ;; We are not handling this kind of change
+ (throw 'return t))
+ (unless (and (not from) (member to org-not-done-keywords))
+ ;; This is not a change from nothing to TODO, ignore it
+ (throw 'return t))
+
+ ;; OK, the plan is to switch from nothing to TODO
+ ;; Lets see if we will allow it. Find the BLOCKER property
+ ;; and split it on whitespace.
+ (setq blocker (org-entry-get pos "BLOCKER")
+ blockers (and blocker (org-split-string blocker "[ \t]+")))
+
+ ;; go through all the blockers
+ (while (setq bl (pop blockers))
+ (cond
+ ((equal bl "previous-sibling")
+ ;; the sibling is required to be DONE.
+ (catch 'ignore
+ (save-excursion
+ (goto-char pos)
+ ;; find the older sibling, exit if no more siblings
+ (condition-case nil
+ (outline-backward-same-level 1)
+ (error (throw 'ignore t)))
+ ;; Check if this entry is not yet done and block
+ (unless (org-entry-is-done-p)
+ ;; return nil, to indicate that we block the change!
+ (org-mark-ring-push)
+ (throw 'return nil)))))
+
+ ((setq p1 (org-find-entry-with-id bl))
+ ;; there is an entry with this ID, check it out
+ (save-excursion
+ (goto-char p1)
+ (unless (org-entry-is-done-p)
+ ;; return nil, to indicate that we block the change!
+ (org-mark-ring-push)
+ (throw 'return nil))))))
+ t ; return t to indicate that we are not blocking
+ )))
+
+(add-hook 'org-trigger-hook 'org-depend-trigger-todo)
+(add-hook 'org-blocker-hook 'org-depend-block-todo)
+
+;;; org-depend.el ends here
diff --git a/CONTRIB/org-export-freemind-0.1.0/ChangeLog b/CONTRIB/org-export-freemind-0.1.0/ChangeLog
new file mode 100755
index 0000000..db86127
--- /dev/null
+++ b/CONTRIB/org-export-freemind-0.1.0/ChangeLog
@@ -0,0 +1,33 @@
+2007-06-25 Marco Vezzoli <noise dot otn at alice dot it>
+
+ * org-export-freemind-install.el (org-export-as-freemind):
+ - created installation file
+
+2007-06-25 Marco Vezzoli <noise dot otn at alice dot it>
+
+ * org-export-freemind.el (org-export-as-freemind):
+ - created customization variables for org-freemind-icons-alist and
+ org-freemind-cloud-alist
+
+ - fixed export bug to handle level jump (e.g. a * followed by a ***)
+
+ - added keybinding 'C-c C-x f' org-export-as-freemind
+
+2007-06-02 Marco Vezzoli <noise dot otn at alice dot it>
+
+ * org-export-freemind.el (org-export-as-freemind):
+
+ - fixed conversion bug: all headings are converted inserting html
+ entities
+
+ - added configuration with org-freemind-icons-alist: an alist that
+ allows to associate regexp with builtins freemind icons
+
+ - added configuration with org-freemind-cloud-alist: an alist that
+ allows to associate regexp with cloud colors
+
+ - added org-export-as-freemind-agenda-files : exports all agenda
+ files in separate files with the same name and extension .mm
+
+ - added org-export-as-freemind-agenda-files-one-file : do the same
+ but grouping all trees in a single file \ No newline at end of file
diff --git a/CONTRIB/org-export-freemind-0.1.0/README b/CONTRIB/org-export-freemind-0.1.0/README
new file mode 100755
index 0000000..97d0ac3
--- /dev/null
+++ b/CONTRIB/org-export-freemind-0.1.0/README
@@ -0,0 +1,50 @@
+The project
+-----------
+
+This is an extension to emacs Org Mode [1] to export into FreeMind
+[2], two very valuable productivity tools.
+
+This code is donated to both porjects and is distributable under any
+of the copyright notices of these.
+
+Current status of the code is alpha: use it at your own
+risk. Nonetheless I'm happy to support user of this code as far as I
+can.
+
+Install
+-------
+
+Before use this code please verify you have Org Mode correctly
+installed in your emacs.
+
+Installation:
+copy all *.el files into the org installation directory.
+add the following line to your .emacs
+
+(require org-export-freemind-install)
+
+This will define the following functions:
+
+org-export-as-freemind: export current buffer into a freemind file
+with the same name, placed in the XOXO publishing directory
+
+org-export-as-freemind-agenda-files: export all agenda files into
+separate freemind files, placed on the XOXO publishing directory
+
+org-export-as-freemind-agenda-files-one-file: export all agenda files
+into a single freemind file
+
+also the following variables are set
+
+org-freemind-icons-alist: an alist which associates regexp with
+freemind builtin icons
+
+org-freemind-cloud-alist: an alist which associates regexp with
+freemind cloud colors (rrggbb hex notation)
+
+Todos
+-----
+- try to export html parts
+
+[1] http://staff.science.uva.nl/~dominik/Tools/org/
+[2] http://freemind.sourceforge.net/wiki/index.php/Main_Page \ No newline at end of file
diff --git a/CONTRIB/org-export-freemind-0.1.0/org-export-freemind-install.el b/CONTRIB/org-export-freemind-0.1.0/org-export-freemind-install.el
new file mode 100755
index 0000000..dab60f1
--- /dev/null
+++ b/CONTRIB/org-export-freemind-0.1.0/org-export-freemind-install.el
@@ -0,0 +1,7 @@
+(autoload 'org-export-as-freemind "org-export-freemind"
+ "export a single org file in freemind format" t)
+(autoload 'org-export-as-freemind-agenda-files "org-export-freemind"
+ "export all agenda files file in freemind format" t)
+(autoload 'org-export-as-freemind-agenda-files-one-file "org-export-freemind"
+ "export all agenda files file in freemind format into a single file" t)
+(provide 'org-export-freemind-install) \ No newline at end of file
diff --git a/CONTRIB/org-export-freemind-0.1.0/org-export-freemind.el b/CONTRIB/org-export-freemind-0.1.0/org-export-freemind.el
new file mode 100755
index 0000000..5879141
--- /dev/null
+++ b/CONTRIB/org-export-freemind-0.1.0/org-export-freemind.el
@@ -0,0 +1,196 @@
+;;; org-export-freemind - exporting utilities from org-mode to freemind
+
+;; Copyright (C) 2007 Marco Vezzoli
+
+;; Author: marco vezzoli <noise.otn@alice.it>
+;; Created:
+;; Version: 0.1.0
+;; Keywords: org-mode export freemind
+;; Commentary:
+
+;; This file is *not* part of GNU Emacs.
+;; This program 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 2 of
+;; the License, or (at your option) any later version.
+
+;; This program 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 this program; if not, write to the Free
+;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301 USA
+
+;;; Code:
+(defgroup org-export-freemind ()
+ "This group let you customize your own export into freemind format"
+ :group 'org-export)
+
+(defcustom org-freemind-icons-alist
+ '(("TODO" . "button_cancel")
+ ("SPEC" . "pencil")
+ ("WIP" . "pencil")
+ ("TEST" . "xmag")
+ ("DONE" . "button_ok"))
+ "change the icon according to a regular expression"
+ :type '(alist :key-type regexp
+ :value-type string)
+ :group 'org-export-freemind)
+
+(defcustom org-freemind-cloud-alist
+ '((":PROJECT:" . "ccffcc")
+ (":MEETING:" . "ccccff"))
+ "create a cloud with the defined color if title match a regexp"
+ :type '(alist :key-type regexp :value-type string)
+ :group 'org-export-freemind)
+
+(defun org-export-as-freemind (&optional buffer outbuffer)
+ "Export the org buffer as FreeMind XML.
+"
+ (interactive (list (current-buffer) ()))
+ ;; A quickie abstraction
+
+ ;; Output everything as FreeMind
+ (with-current-buffer (get-buffer buffer)
+ (goto-char (point-min)) ;; CD: beginning-of-buffer is not allowed.
+ (let* ((opt-plist (org-combine-plists (org-default-export-plist)
+ (org-infile-export-plist)))
+ (title (or (plist-get opt-plist :title)
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))))
+ (filename (concat (file-name-as-directory
+ (org-export-directory :xoxo opt-plist))
+ title
+ ".mm"))
+ (out (if (bufferp outbuffer)
+ outbuffer
+ (find-file-noselect filename)))
+ (last-level 0)
+ (hanging-li nil))
+
+ ;; Check the output buffer is empty.
+ ;; Kick off the output
+ (unless (bufferp outbuffer)
+ (progn
+ (with-current-buffer out (erase-buffer))
+ (org-export-as-xoxo-insert-into out "<map version='0.8.0'>\n")))
+ (org-export-as-xoxo-insert-into out
+ "<node TEXT='" title "'"
+ (if (bufferp outbuffer)
+ " FOLDED='true'" "")
+ ">\n")
+ (if (bufferp outbuffer)
+ (org-export-as-xoxo-insert-into out "<cloud COLOR='#ccffff'/>\n"))
+ (while (re-search-forward "^\\(\\*+\\) \\(.+\\)" (point-max) 't)
+ (let* ((hd (match-string-no-properties 1))
+ (level (length hd))
+ (text (match-string-no-properties 2)))
+ (save-excursion
+ (goto-char (match-end 0))
+ (catch 'loop
+ (while 't
+ (forward-line)
+ (if (looking-at "^[ \t]\\(.*\\)")
+ ()
+ (throw 'loop "")))))
+
+ ;; Handle level rendering
+ (cond
+ ((> level last-level)
+ (let ((rept (- level last-level 1))
+ (value ()))
+ (dotimes (i rept value)
+ (org-export-as-xoxo-insert-into out "<node FOLDED='false' TEXT='.'>\n")))
+ (org-export-as-xoxo-insert-into out "\n<node FOLDED='true' TEXT='"))
+
+ ((< level last-level)
+ (let ((rept (+ (- last-level level) 1))
+ (value ()))
+ (dotimes (i rept value)
+ (org-export-as-xoxo-insert-into out "</node>\n")))
+ (org-export-as-xoxo-insert-into out "<node FOLDED='true' TEXT='"))
+
+ ((equal level last-level)
+ (org-export-as-xoxo-insert-into out "</node>\n<node FOLDED='true' TEXT='")))
+
+ (setq last-level level)
+
+ ;; And output the new node
+ (let* ((heading
+ (concat "<html><h3>"
+ (replace-regexp-in-string
+ ":.*:"
+ (lambda (x)
+ (concat "<font color='red'>" x "</font>"))
+ text)
+ "</h3></html>"))
+ (html-quoted-heading (org-html-expand heading))
+ (exp-quote-heading (replace-regexp-in-string "'" "&quot;" html-quoted-heading)))
+ (org-export-as-xoxo-insert-into out exp-quote-heading "'>\n"))
+
+ (dolist (rule org-freemind-icons-alist)
+ (if (string-match (car rule) text)
+ (org-export-as-xoxo-insert-into out "<icon BUILTIN='" (cdr rule) "'/>\n")))
+ (dolist (rule org-freemind-cloud-alist)
+ (when (string-match (car rule) text)
+ (progn
+ (org-export-as-xoxo-insert-into out
+ "<cloud COLOR='#" (cdr rule) "'/>\n")
+ (message (cdr rule))
+ )))
+ ))
+
+ ;; Finally finish off the map
+ (let ((value ()))
+ (org-export-as-xoxo-insert-into out "\n")
+ (dotimes (i last-level value)
+ (org-export-as-xoxo-insert-into out "</node>\n")))
+ (org-export-as-xoxo-insert-into out "</node>\n")
+
+ ;; Finish the buffer off and clean it up.
+ (unless (bufferp outbuffer)
+ (progn
+ (org-export-as-xoxo-insert-into out "</map>\n")
+ (switch-to-buffer-other-window out)
+ (indent-region (point-min) (point-max) nil)
+ (save-buffer)
+ (goto-char (point-min))
+ )))))
+
+(defun org-export-as-freemind-agenda-files ()
+ "Export all agenda files into Freemind format
+each files is saved with .mm extension
+into the XOXO publishing directory"
+ (interactive)
+ (dolist (file org-agenda-files)
+ (org-check-agenda-file file)
+ (set-buffer (org-get-agenda-file-buffer file))
+ (org-export-as-freemind (current-buffer))
+ ))
+
+(defun org-export-as-freemind-agenda-files-one-file (filename)
+ "Export all agenda files into FreeMind format.
+All results are grouped in a single .mm file"
+ (interactive "FFile to save: ")
+ (let* ((title (file-name-sans-extension
+ (file-name-nondirectory filename)))
+ (out (find-file-noselect filename)))
+ (with-current-buffer out (erase-buffer))
+ (org-export-as-xoxo-insert-into out "<map version='0.8.0'><node TEXT='" title "'>\n")
+ (dolist (file org-agenda-files)
+ (org-check-agenda-file file)
+ (set-buffer (org-get-agenda-file-buffer file))
+ (org-export-as-freemind (current-buffer) out)
+ )
+ (org-export-as-xoxo-insert-into out "</node></map>\n")
+ (switch-to-buffer-other-window out)
+ (indent-region (point-min) (point-max) nil)
+ (save-buffer)
+ (goto-char (point-min))
+ ))
+
+(define-key org-mode-map "\C-c\C-xf" 'org-export-as-freemind)
+;;; org-export-freemind ends here \ No newline at end of file
diff --git a/CONTRIB/org-export-freemind.el b/CONTRIB/org-export-freemind.el
new file mode 100644
index 0000000..5879141
--- /dev/null
+++ b/CONTRIB/org-export-freemind.el
@@ -0,0 +1,196 @@
+;;; org-export-freemind - exporting utilities from org-mode to freemind
+
+;; Copyright (C) 2007 Marco Vezzoli
+
+;; Author: marco vezzoli <noise.otn@alice.it>
+;; Created:
+;; Version: 0.1.0
+;; Keywords: org-mode export freemind
+;; Commentary:
+
+;; This file is *not* part of GNU Emacs.
+;; This program 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 2 of
+;; the License, or (at your option) any later version.
+
+;; This program 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 this program; if not, write to the Free
+;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301 USA
+
+;;; Code:
+(defgroup org-export-freemind ()
+ "This group let you customize your own export into freemind format"
+ :group 'org-export)
+
+(defcustom org-freemind-icons-alist
+ '(("TODO" . "button_cancel")
+ ("SPEC" . "pencil")
+ ("WIP" . "pencil")
+ ("TEST" . "xmag")
+ ("DONE" . "button_ok"))
+ "change the icon according to a regular expression"
+ :type '(alist :key-type regexp
+ :value-type string)
+ :group 'org-export-freemind)
+
+(defcustom org-freemind-cloud-alist
+ '((":PROJECT:" . "ccffcc")
+ (":MEETING:" . "ccccff"))
+ "create a cloud with the defined color if title match a regexp"
+ :type '(alist :key-type regexp :value-type string)
+ :group 'org-export-freemind)
+
+(defun org-export-as-freemind (&optional buffer outbuffer)
+ "Export the org buffer as FreeMind XML.
+"
+ (interactive (list (current-buffer) ()))
+ ;; A quickie abstraction
+
+ ;; Output everything as FreeMind
+ (with-current-buffer (get-buffer buffer)
+ (goto-char (point-min)) ;; CD: beginning-of-buffer is not allowed.
+ (let* ((opt-plist (org-combine-plists (org-default-export-plist)
+ (org-infile-export-plist)))
+ (title (or (plist-get opt-plist :title)
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))))
+ (filename (concat (file-name-as-directory
+ (org-export-directory :xoxo opt-plist))
+ title
+ ".mm"))
+ (out (if (bufferp outbuffer)
+ outbuffer
+ (find-file-noselect filename)))
+ (last-level 0)
+ (hanging-li nil))
+
+ ;; Check the output buffer is empty.
+ ;; Kick off the output
+ (unless (bufferp outbuffer)
+ (progn
+ (with-current-buffer out (erase-buffer))
+ (org-export-as-xoxo-insert-into out "<map version='0.8.0'>\n")))
+ (org-export-as-xoxo-insert-into out
+ "<node TEXT='" title "'"
+ (if (bufferp outbuffer)
+ " FOLDED='true'" "")
+ ">\n")
+ (if (bufferp outbuffer)
+ (org-export-as-xoxo-insert-into out "<cloud COLOR='#ccffff'/>\n"))
+ (while (re-search-forward "^\\(\\*+\\) \\(.+\\)" (point-max) 't)
+ (let* ((hd (match-string-no-properties 1))
+ (level (length hd))
+ (text (match-string-no-properties 2)))
+ (save-excursion
+ (goto-char (match-end 0))
+ (catch 'loop
+ (while 't
+ (forward-line)
+ (if (looking-at "^[ \t]\\(.*\\)")
+ ()
+ (throw 'loop "")))))
+
+ ;; Handle level rendering
+ (cond
+ ((> level last-level)
+ (let ((rept (- level last-level 1))
+ (value ()))
+ (dotimes (i rept value)
+ (org-export-as-xoxo-insert-into out "<node FOLDED='false' TEXT='.'>\n")))
+ (org-export-as-xoxo-insert-into out "\n<node FOLDED='true' TEXT='"))
+
+ ((< level last-level)
+ (let ((rept (+ (- last-level level) 1))
+ (value ()))
+ (dotimes (i rept value)
+ (org-export-as-xoxo-insert-into out "</node>\n")))
+ (org-export-as-xoxo-insert-into out "<node FOLDED='true' TEXT='"))
+
+ ((equal level last-level)
+ (org-export-as-xoxo-insert-into out "</node>\n<node FOLDED='true' TEXT='")))
+
+ (setq last-level level)
+
+ ;; And output the new node
+ (let* ((heading
+ (concat "<html><h3>"
+ (replace-regexp-in-string
+ ":.*:"
+ (lambda (x)
+ (concat "<font color='red'>" x "</font>"))
+ text)
+ "</h3></html>"))
+ (html-quoted-heading (org-html-expand heading))
+ (exp-quote-heading (replace-regexp-in-string "'" "&quot;" html-quoted-heading)))
+ (org-export-as-xoxo-insert-into out exp-quote-heading "'>\n"))
+
+ (dolist (rule org-freemind-icons-alist)
+ (if (string-match (car rule) text)
+ (org-export-as-xoxo-insert-into out "<icon BUILTIN='" (cdr rule) "'/>\n")))
+ (dolist (rule org-freemind-cloud-alist)
+ (when (string-match (car rule) text)
+ (progn
+ (org-export-as-xoxo-insert-into out
+ "<cloud COLOR='#" (cdr rule) "'/>\n")
+ (message (cdr rule))
+ )))
+ ))
+
+ ;; Finally finish off the map
+ (let ((value ()))
+ (org-export-as-xoxo-insert-into out "\n")
+ (dotimes (i last-level value)
+ (org-export-as-xoxo-insert-into out "</node>\n")))
+ (org-export-as-xoxo-insert-into out "</node>\n")
+
+ ;; Finish the buffer off and clean it up.
+ (unless (bufferp outbuffer)
+ (progn
+ (org-export-as-xoxo-insert-into out "</map>\n")
+ (switch-to-buffer-other-window out)
+ (indent-region (point-min) (point-max) nil)
+ (save-buffer)
+ (goto-char (point-min))
+ )))))
+
+(defun org-export-as-freemind-agenda-files ()
+ "Export all agenda files into Freemind format
+each files is saved with .mm extension
+into the XOXO publishing directory"
+ (interactive)
+ (dolist (file org-agenda-files)
+ (org-check-agenda-file file)
+ (set-buffer (org-get-agenda-file-buffer file))
+ (org-export-as-freemind (current-buffer))
+ ))
+
+(defun org-export-as-freemind-agenda-files-one-file (filename)
+ "Export all agenda files into FreeMind format.
+All results are grouped in a single .mm file"
+ (interactive "FFile to save: ")
+ (let* ((title (file-name-sans-extension
+ (file-name-nondirectory filename)))
+ (out (find-file-noselect filename)))
+ (with-current-buffer out (erase-buffer))
+ (org-export-as-xoxo-insert-into out "<map version='0.8.0'><node TEXT='" title "'>\n")
+ (dolist (file org-agenda-files)
+ (org-check-agenda-file file)
+ (set-buffer (org-get-agenda-file-buffer file))
+ (org-export-as-freemind (current-buffer) out)
+ )
+ (org-export-as-xoxo-insert-into out "</node></map>\n")
+ (switch-to-buffer-other-window out)
+ (indent-region (point-min) (point-max) nil)
+ (save-buffer)
+ (goto-char (point-min))
+ ))
+
+(define-key org-mode-map "\C-c\C-xf" 'org-export-as-freemind)
+;;; org-export-freemind ends here \ No newline at end of file
diff --git a/CONTRIB/org-mairix.el b/CONTRIB/org-mairix.el
new file mode 100644
index 0000000..ede278e
--- /dev/null
+++ b/CONTRIB/org-mairix.el
@@ -0,0 +1,153 @@
+;;; org-mairix.el ---
+
+;; Copyright 2007 Bastien Guerry
+;;
+;; Author: Bastien.Guerry@ens.fr
+;; Version: $Id: org-mairix.el,v 0.0 2007/08/11 17:23:40 guerry Exp $
+;; Keywords:
+;; X-URL: not distributed yet
+
+;; This program 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 2, or (at your option)
+;; any later version.
+;;
+;; This program 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 this program; if not, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Commentary:
+
+;; Code and ideas from Carsten Dominik, Adam Spiers and Georg C. F. Greve.
+
+;; Put this file into your load-path and the following into your ~/.emacs:
+;; (require 'org-mairix)
+
+;;; Code:
+
+(require 'org)
+
+(defgroup org-mairix nil
+ "Mairix link support for Org."
+ :tag "Org Mairix"
+ :group 'org)
+
+(defcustom mairix-results-group "nnmaildir+index:mfolder"
+ "Gnus groupe where to list mairix search results."
+ :group 'org-mairix
+ :type '(string))
+
+(defun org-add-link-type (type &optional follow publish)
+ "Add TYPE to the list of `org-link-types'.
+Re-compute all regular expressions depending on `org-link-types'."
+ (add-to-list 'org-link-types type t)
+ (setq org-link-re-with-space
+ (concat
+ "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^" org-non-link-chars " ]"
+ "[^" org-non-link-chars "]*"
+ "[^" org-non-link-chars " ]\\)>?"))
+ (setq org-link-re-with-space2
+ (concat
+ "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^" org-non-link-chars " ]"
+ "[^]\t\n\r]*"
+ "[^" org-non-link-chars " ]\\)>?"))
+ (setq org-angle-link-re
+ (concat
+ "<\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^" org-non-link-chars " ]"
+ "[^" org-non-link-chars "]*"
+ "\\)>"))
+ (setq org-plain-link-re
+ (concat
+ "\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^]\t\n\r<>,;() ]+\\)"))
+ (setq org-bracket-link-analytic-regexp
+ (concat
+ "\\[\\["
+ "\\(\\(" (mapconcat 'identity org-link-types "\\|") "\\):\\)?"
+ "\\([^]]+\\)"
+ "\\]"
+ "\\(\\[" "\\([^]]+\\)" "\\]\\)?"
+ "\\]"))
+ (add-hook 'org-follow-link-functions follow)
+ (add-hook 'org-publish-link-functions publish))
+
+(defun org-mairix-follow-link (path)
+ "Follow a Mairix link."
+ (require 'gnus)
+ (funcall (cdr (assq 'gnus org-link-frame-setup)))
+ (if gnus-other-frame-object (select-frame gnus-other-frame-object))
+ (mairix-search path))
+
+(defun org-mairix-publish-link (path)
+ "Convert mairix PATH into a (dummy) raw link."
+ ;; FIXME: should we have a format argument for HTML/LaTeX publishing?
+ (if (string-match org-bracket-link-analytic-regexp path)
+ (match-string 5 path) path))
+
+(defun org-mairix-store-link (path)
+ "Store a mairix link."
+ (when (memq major-mode '(gnus-summary-mode gnus-article-mode))
+ (let* ((group gnus-newsgroup-name)
+ (article (gnus-summary-article-number))
+ (header (gnus-summary-article-header article))
+ (from (mail-header-from header))
+ (message-id (mail-header-id header))
+ (date (mail-header-date header))
+ (subject (gnus-summary-subject-string)))
+ (org-store-link-props :type "mairix"
+ :from from
+ :subject subject
+ :message-id message-id
+ :group group)
+;; FIXME: what about cpltxt and link vars we used so far?
+;; (setq cpltxt (org-email-link-description))
+;; (setq link (org-make-link "mairix:m:"
+;; (substring message-id 1 -1))))))
+ (org-make-link "mairix:m:" (substring message-id 1 -1)))))
+
+;; mairix internals
+(defun mairix-result-evaluate (string)
+ "Display search results of previous mairix process."
+ (let ((mmatches (string-to-number (substring string 7 -8))))
+ (if (eq mmatches 0)
+ (message "Mairix returned no matches, sorry.")
+ (message "Mairix returned %d matches." mmatches)
+ (gnus-group-quick-select-group 0 mairix-results-group)
+ (gnus-summary-reselect-current-group t t))))
+
+
+(org-add-link-type "mairix"
+ 'org-mairix-follow-link
+ 'org-mairix-publish-link)
+
+(add-hook 'org-store-link-functions 'org-mairix-store-link)
+
+(defun mairix-search (string)
+ "Uses mairix to search through my mail, replacing current search results."
+ (interactive "MMairix search: ")
+ (mairix-result-evaluate
+ (shell-command-to-string (concat "mairix " string))))
+
+(provide 'org-mairix)
+(eval-when-compile
+ (require 'cl))
+
+
+
+;;;;##########################################################################
+;;;; User Options, Variables
+;;;;##########################################################################
+
+
+
+
+
+;;; org-mairix.el ends here
diff --git a/CONTRIB/org-man.el b/CONTRIB/org-man.el
new file mode 100644
index 0000000..f4933d0
--- /dev/null
+++ b/CONTRIB/org-man.el
@@ -0,0 +1,39 @@
+;;; org-man.el - Support for links to manpages in Org-mode
+
+(require 'org)
+
+(org-add-link-type "man" 'org-man-open)
+(add-hook 'org-store-link-functions 'org-man-store-link)
+
+(defcustom org-man-command 'man
+ "The Emacs command to be used to display a man page."
+ :group 'org-link
+ :type '(choice (const man) (const woman)))
+
+(defun org-man-open (path)
+ "Visit the manpage on PATH.
+PATH should be a topic that can be thrown at the man command."
+ (funcall org-man-command path))
+
+(defun org-man-store-link ()
+ "Store a link to a README file."
+ (when (memq major-mode '(Man-mode woman-mode))
+ ;; This is a man page, we do make this link
+ (let* ((page (org-man-get-page-name))
+ (link (concat "man:" page))
+ (description (format "Manpage for %s" page)))
+ (org-store-link-props
+ :type "man"
+ :link link
+ :description description))))
+
+(defun org-man-get-page-name ()
+ "Extract the page name from the buffer name."
+ ;; This works for both `Man-mode' and `woman-mode'.
+ (if (string-match " \\(\\S-+\\)\\*" (buffer-name))
+ (match-string 1 (buffer-name))
+ (error "Cannot create link to this man page")))
+
+(provide 'org-man)
+
+;;; org-man.el ends here
diff --git a/CONTRIB/org-toc.el b/CONTRIB/org-toc.el
new file mode 100644
index 0000000..cc2a46e
--- /dev/null
+++ b/CONTRIB/org-toc.el
@@ -0,0 +1,488 @@
+;;; org-toc.el --- Table of contents for Org-mode buffer
+
+;; Copyright 2007 Bastien Guerry
+;;
+;; Author: Bastien Guerry <bzg AT altern DOT org>
+;; Keywords: Org table of contents
+;; Homepage: http://www.cognition.ens.fr/~guerry/u/org-toc.el
+;; Version: 0.8
+
+;; This program 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, or (at your option)
+;; any later version.
+;;
+;; This program 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 this program; if not, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Commentary:
+
+;; This library implements a browsable table of contents for Org files.
+
+;; Put this file into your load-path and the following into your ~/.emacs:
+;; (require 'org-toc)
+
+;;; Code:
+
+(provide 'org-toc)
+(eval-when-compile
+ (require 'cl))
+
+;;; Custom variables:
+(defvar org-toc-base-buffer nil)
+(defvar org-toc-columns-shown nil)
+(defvar org-toc-odd-levels-only nil)
+(defvar org-toc-config-alist nil)
+(defvar org-toc-cycle-global-status nil)
+(defalias 'org-show-table-of-contents 'org-toc-show)
+
+(defgroup org-toc nil
+ "Options concerning the browsable table of contents of Org-mode."
+ :tag "Org TOC"
+ :group 'org)
+
+(defcustom org-toc-default-depth 1
+ "Default depth when invoking `org-toc-show' without argument."
+ :group 'org-toc
+ :type '(choice
+ (const :tag "same as base buffer" nil)
+ (integer :tag "level")))
+
+(defcustom org-toc-follow-mode nil
+ "Non-nil means navigating through the table of contents will
+move the point in the Org buffer accordingly."
+ :group 'org-toc
+ :type 'boolean)
+
+(defcustom org-toc-info-mode nil
+ "Non-nil means navigating through the table of contents will
+show the properties for the current headline in the echo-area."
+ :group 'org-toc
+ :type 'boolean)
+
+(defcustom org-toc-show-subtree-mode nil
+ "Non-nil means show subtree when going to headline or following
+it while browsing the table of contents."
+ :group 'org-toc
+ :type '(choice
+ (const :tag "show subtree" t)
+ (const :tag "show entry" nil)))
+
+(defcustom org-toc-recenter-mode t
+ "Non-nil means recenter the Org buffer when following the
+headlines in the TOC buffer."
+ :group 'org-toc
+ :type 'boolean)
+
+(defcustom org-toc-recenter 0
+ "Where to recenter the Org buffer when unfolding a subtree.
+This variable is only used when `org-toc-recenter-mode' is set to
+'custom. A value >=1000 will call recenter with no arg."
+ :group 'org-toc
+ :type 'integer)
+
+(defcustom org-toc-info-exclude '("ALLTAGS")
+ "A list of excluded properties when displaying info in the
+echo-area. The COLUMNS property is always exluded."
+ :group 'org-toc
+ :type 'lits)
+
+;;; Org TOC mode:
+(defvar org-toc-mode-map (make-sparse-keymap)
+ "Keymap for `org-toc-mode'.")
+
+(defun org-toc-mode ()
+ "A major mode for browsing the table of contents of an Org buffer.
+
+\\{org-toc-mode-map}"
+ (interactive)
+ (kill-all-local-variables)
+ (use-local-map org-toc-mode-map)
+ (setq mode-name "Org TOC")
+ (setq major-mode 'org-toc-mode))
+
+;; toggle modes
+(define-key org-toc-mode-map "f" 'org-toc-follow-mode)
+(define-key org-toc-mode-map "S" 'org-toc-show-subtree-mode)
+(define-key org-toc-mode-map "s" 'org-toc-store-config)
+(define-key org-toc-mode-map "g" 'org-toc-restore-config)
+(define-key org-toc-mode-map "i" 'org-toc-info-mode)
+(define-key org-toc-mode-map "r" 'org-toc-recenter-mode)
+
+;; navigation keys
+(define-key org-toc-mode-map "p" 'org-toc-previous)
+(define-key org-toc-mode-map "n" 'org-toc-next)
+(define-key org-toc-mode-map [(left)] 'org-toc-previous)
+(define-key org-toc-mode-map [(right)] 'org-toc-next)
+(define-key org-toc-mode-map [(up)] 'org-toc-previous)
+(define-key org-toc-mode-map [(down)] 'org-toc-next)
+(define-key org-toc-mode-map "1" (lambda() (interactive) (org-toc-show 1 (point))))
+(define-key org-toc-mode-map "2" (lambda() (interactive) (org-toc-show 2 (point))))
+(define-key org-toc-mode-map "3" (lambda() (interactive) (org-toc-show 3 (point))))
+(define-key org-toc-mode-map "4" (lambda() (interactive) (org-toc-show 4 (point))))
+(define-key org-toc-mode-map " " 'org-toc-goto)
+(define-key org-toc-mode-map "q" 'org-toc-quit)
+(define-key org-toc-mode-map "x" 'org-toc-quit)
+;; go to the location and stay in the base buffer
+(define-key org-toc-mode-map [(tab)] 'org-toc-jump)
+(define-key org-toc-mode-map "v" 'org-toc-jump)
+;; go to the location and delete other windows
+(define-key org-toc-mode-map [(return)]
+ (lambda() (interactive) (org-toc-jump t)))
+
+;; special keys
+(define-key org-toc-mode-map "c" 'org-toc-columns)
+(define-key org-toc-mode-map "?" 'org-toc-help)
+(define-key org-toc-mode-map ":" 'org-toc-cycle-subtree)
+(define-key org-toc-mode-map "\C-c\C-o" 'org-open-at-point)
+;; global cycling in the base buffer
+(define-key org-toc-mode-map (kbd "C-S-<iso-lefttab>")
+ 'org-toc-cycle-base-buffer)
+;; subtree cycling in the base buffer
+(define-key org-toc-mode-map [(control tab)]
+ (lambda() (interactive) (org-toc-goto nil t)))
+
+;;; Toggle functions:
+(defun org-toc-follow-mode ()
+ "Toggle follow mode in a `org-toc-mode' buffer."
+ (interactive)
+ (setq org-toc-follow-mode (not org-toc-follow-mode))
+ (message "Follow mode is %s"
+ (if org-toc-follow-mode "on" "off")))
+
+(defun org-toc-info-mode ()
+ "Toggle info mode in a `org-toc-mode' buffer."
+ (interactive)
+ (setq org-toc-info-mode (not org-toc-info-mode))
+ (message "Info mode is %s"
+ (if org-toc-info-mode "on" "off")))
+
+(defun org-toc-show-subtree-mode ()
+ "Toggle show subtree mode in a `org-toc-mode' buffer."
+ (interactive)
+ (setq org-toc-show-subtree-mode (not org-toc-show-subtree-mode))
+ (message "Show subtree mode is %s"
+ (if org-toc-show-subtree-mode "on" "off")))
+
+(defun org-toc-recenter-mode (&optional line)
+ "Toggle recenter mode in a `org-toc-mode' buffer. If LINE is
+specified, then make `org-toc-recenter' use this value."
+ (interactive "P")
+ (setq org-toc-recenter-mode (not org-toc-recenter-mode))
+ (when (numberp line)
+ (setq org-toc-recenter-mode t)
+ (setq org-toc-recenter line))
+ (message "Recenter mode is %s"
+ (if org-toc-recenter-mode
+ (format "on, line %d" org-toc-recenter) "off")))
+
+(defun org-toc-cycle-subtree ()
+ "Locally cycle a headline through two states: 'children and
+'folded"
+ (interactive)
+ (let ((beg (point))
+ (end (save-excursion (end-of-line) (point)))
+ (ov (car (org-overlays-at (point))))
+ status)
+ (if ov (setq status (org-overlay-get ov 'status))
+ (setq ov (org-make-overlay beg end)))
+ ;; change the folding status of this headline
+ (cond ((or (null status) (eq status 'folded))
+ (show-children)
+ (message "CHILDREN")
+ (org-overlay-put ov 'status 'children))
+ ((eq status 'children)
+ (show-branches)
+ (message "BRANCHES")
+ (org-overlay-put ov 'status 'branches))
+ (t (hide-subtree)
+ (message "FOLDED")
+ (org-overlay-put ov 'status 'folded)))))
+
+;;; Main show function:
+;; FIXME name this org-before-first-heading-p?
+(defun org-toc-before-first-heading-p ()
+ "Before first heading?"
+ (save-excursion
+ (null (re-search-backward "^\\*+ " nil t))))
+
+;;;###autoload
+(defun org-toc-show (&optional depth position)
+ "Show the table of contents of the current Org-mode buffer."
+ (interactive "P")
+ (if (org-mode-p)
+ (progn (setq org-toc-base-buffer (current-buffer))
+ (setq org-toc-odd-levels-only org-odd-levels-only))
+ (if (eq major-mode 'org-toc-mode)
+ (switch-to-buffer org-toc-base-buffer)
+ (error "Not in an Org buffer")))
+ ;; create the new window display
+ (let ((pos (or position
+ (save-excursion
+ (if (org-toc-before-first-heading-p)
+ (progn (re-search-forward "^\\*+ " nil t)
+ (match-beginning 0))
+ (point))))))
+ (setq org-toc-cycle-global-status org-cycle-global-status)
+ (delete-other-windows)
+ (and (get-buffer "*org-toc*") (kill-buffer "*org-toc*"))
+ (switch-to-buffer-other-window
+ (make-indirect-buffer org-toc-base-buffer "*org-toc*"))
+ ;; make content before 1st headline invisible
+ (goto-char (point-min))
+ (let* ((beg (point-min))
+ (end (and (re-search-forward "^\\*" nil t)
+ (1- (match-beginning 0))))
+ (ov (org-make-overlay beg end))
+ (help (format "Table of contents for %s (press ? for a quick help):\n"
+ (buffer-name org-toc-base-buffer))))
+ (org-overlay-put ov 'invisible t)
+ (org-overlay-put ov 'before-string help))
+ ;; build the browsable TOC
+ (cond (depth
+ (let* ((dpth (if org-toc-odd-levels-only
+ (1- (* depth 2)) depth)))
+ (org-content dpth)
+ (setq org-toc-cycle-global-status
+ `(org-content ,dpth))))
+ ((null org-toc-default-depth)
+ (if (eq org-toc-cycle-global-status 'overview)
+ (progn (org-overview)
+ (setq org-cycle-global-status 'overview)
+ (run-hook-with-args 'org-cycle-hook 'overview))
+ (progn (org-overview)
+ ;; FIXME org-content to show only headlines?
+ (org-content)
+ (setq org-cycle-global-status 'contents)
+ (run-hook-with-args 'org-cycle-hook 'contents))))
+ (t (let* ((dpth0 org-toc-default-depth)
+ (dpth (if org-toc-odd-levels-only
+ (1- (* dpth0 2)) dpth0)))
+ (org-content dpth)
+ (setq org-toc-cycle-global-status
+ `(org-content ,dpth)))))
+ (goto-char pos))
+ (move-beginning-of-line nil)
+ (org-toc-mode)
+ (shrink-window-if-larger-than-buffer)
+ (setq buffer-read-only t))
+
+;;; Navigation functions:
+(defun org-toc-goto (&optional jump cycle)
+ "From Org TOC buffer, follow the targeted subtree in the Org window.
+If JUMP is non-nil, go to the base buffer.
+If JUMP is 'delete, go to the base buffer and delete other windows.
+If CYCLE is non-nil, cycle the targeted subtree in the Org window."
+ (interactive)
+ (let ((pos (point))
+ (toc-buf (current-buffer)))
+ (switch-to-buffer-other-window org-toc-base-buffer)
+ (goto-char pos)
+ (if cycle (org-cycle)
+ (progn (org-overview)
+ (if org-toc-show-subtree-mode
+ (org-show-subtree)
+ (org-show-entry))
+ (org-show-context)))
+ (if org-toc-recenter-mode
+ (if (>= org-toc-recenter 1000) (recenter)
+ (recenter org-toc-recenter)))
+ (cond ((null jump)
+ (switch-to-buffer-other-window toc-buf))
+ ((eq jump 'delete)
+ (delete-other-windows)))))
+
+(defun org-toc-cycle-base-buffer ()
+ "Call `org-cycle' with a prefix argument in the base buffer."
+ (interactive)
+ (switch-to-buffer-other-window org-toc-base-buffer)
+ (org-cycle t)
+ (other-window 1))
+
+(defun org-toc-jump (&optional delete)
+ "From Org TOC buffer, jump to the targeted subtree in the Org window.
+If DELETE is non-nil, delete other windows when in the Org buffer."
+ (interactive "P")
+ (if delete (org-toc-goto 'delete)
+ (org-toc-goto t)))
+
+(defun org-toc-previous ()
+ "Go to the previous headline of the TOC."
+ (interactive)
+ (if (save-excursion
+ (beginning-of-line)
+ (re-search-backward "^\\*" nil t))
+ (outline-previous-visible-heading 1)
+ (message "No previous heading"))
+ (if org-toc-info-mode (org-toc-info))
+ (if org-toc-follow-mode (org-toc-goto)))
+
+(defun org-toc-next ()
+ "Go to the next headline of the TOC."
+ (interactive)
+ (outline-next-visible-heading 1)
+ (if org-toc-info-mode (org-toc-info))
+ (if org-toc-follow-mode (org-toc-goto)))
+
+(defun org-toc-quit ()
+ "Quit the current Org TOC buffer."
+ (interactive)
+ (kill-this-buffer)
+ (other-window 1)
+ (delete-other-windows))
+
+;;; Special functions:
+(defun org-toc-columns ()
+ "Toggle columns view in the Org buffer from Org TOC."
+ (interactive)
+ (let ((indirect-buffer (current-buffer)))
+ (switch-to-buffer org-toc-base-buffer)
+ (if (not org-toc-columns-shown)
+ (progn (org-columns)
+ (setq org-toc-columns-shown t))
+ (progn (org-columns-remove-overlays)
+ (setq org-toc-columns-shown nil)))
+ (switch-to-buffer indirect-buffer)))
+
+(defun org-toc-info ()
+ "Show properties of current subtree in the echo-area."
+ (interactive)
+ (let ((pos (point))
+ (indirect-buffer (current-buffer))
+ props prop msg)
+ (switch-to-buffer org-toc-base-buffer)
+ (goto-char pos)
+ (setq props (org-entry-properties))
+ (while (setq prop (pop props))
+ (unless (or (equal (car prop) "COLUMNS")
+ (member (car prop) org-toc-info-exclude))
+ (let ((p (car prop))
+ (v (cdr prop)))
+ (if (equal p "TAGS")
+ (setq v (mapconcat 'identity (split-string v ":" t) " ")))
+ (setq p (concat p ":"))
+ (add-text-properties 0 (length p) '(face org-special-keyword) p)
+ (setq msg (concat msg p " " v " ")))))
+ (switch-to-buffer indirect-buffer)
+ (message msg)))
+
+;;; Store and restore TOC configuration:
+(defun org-toc-store-config ()
+ "Store the current status of the tables of contents in
+`org-toc-config-alist'."
+ (interactive)
+ (let ((file (buffer-file-name org-toc-base-buffer))
+ (pos (point))
+ (hlcfg (org-toc-get-headlines-status)))
+ (setq org-toc-config-alist
+ (delete (assoc file org-toc-config-alist)
+ org-toc-config-alist))
+ (add-to-list 'org-toc-config-alist
+ `(,file ,pos ,org-toc-cycle-global-status ,hlcfg))
+ (message "TOC configuration saved: (%s)"
+ (if (listp org-toc-cycle-global-status)
+ (concat "org-content "
+ (number-to-string
+ (cadr org-toc-cycle-global-status)))
+ (symbol-name org-toc-cycle-global-status)))))
+
+(defun org-toc-restore-config ()
+ "Get the stored status in `org-toc-config-alist' and set the
+current table of contents to it."
+ (interactive)
+ (let* ((file (buffer-file-name org-toc-base-buffer))
+ (conf (cdr (assoc file org-toc-config-alist)))
+ (pos (car conf))
+ (status (cadr conf))
+ (hlcfg (caddr conf)) hlcfg0 ov)
+ (cond ((listp status)
+ (org-toc-show (cadr status) (point)))
+ ((eq status 'overview)
+ (org-overview)
+ (setq org-cycle-global-status 'overview)
+ (run-hook-with-args 'org-cycle-hook 'overview))
+ (t
+ (org-overview)
+ (org-content)
+ (setq org-cycle-global-status 'contents)
+ (run-hook-with-args 'org-cycle-hook 'contents)))
+ (while (setq hlcfg0 (pop hlcfg))
+ (save-excursion
+ (goto-char (point-min))
+ (when (search-forward (car hlcfg0) nil t)
+ (unless (org-overlays-at (match-beginning 0))
+ (setq ov (org-make-overlay (match-beginning 0)
+ (match-end 0))))
+ (cond ((eq (cdr hlcfg0) 'children)
+ (show-children)
+ (message "CHILDREN")
+ (org-overlay-put ov 'status 'children))
+ ((eq (cdr hlcfg0) 'branches)
+ (show-branches)
+ (message "BRANCHES")
+ (org-overlay-put ov 'status 'branches))))))
+ (goto-char pos)
+ (if org-toc-follow-mode (org-toc-goto))
+ (message "Last TOC configuration restored")
+ (sit-for 1)
+ (if org-toc-info-mode (org-toc-info))))
+
+(defun org-toc-get-headlines-status ()
+ "Return an alist of headlines and their associated folding
+status."
+ (let (output ovs)
+ (save-excursion
+ (goto-char (point-min))
+ (while (and (not (eobp))
+ (goto-char (next-overlay-change (point))))
+ (when (looking-at "^\\*+ ")
+ (add-to-list
+ 'output
+ (cons (buffer-substring-no-properties
+ (match-beginning 0)
+ (save-excursion
+ (end-of-line) (point)))
+ (overlay-get
+ (car (overlays-at (point))) 'status))))))
+ ;; return an alist like (("* Headline" . 'status))
+ output))
+
+;; In Org TOC buffer, hide headlines below the first level.
+(defun org-toc-help ()
+ "Display a quick help message in the echo-area for `org-toc-mode'."
+ (interactive)
+ (let ((st-start 0)
+ (help-message
+ "\[space\] show heading \[1-4\] hide headlines below this level
+\[TAB\] jump to heading \[f\] toggle follow mode (currently %s)
+\[return\] jump and delete others windows \[i\] toggle info mode (currently %s)
+\[S-TAB\] cycle subtree (in Org) \[S\] toggle show subtree mode (currently %s)
+\[C-S-TAB\] global cycle (in Org) \[r\] toggle recenter mode (currently %s)
+\[:\] cycle subtree (in TOC) \[c\] toggle column view (currently %s)
+\[n/p\] next/previous heading \[s\] save TOC configuration
+\[q\] quit the TOC \[g\] restore last TOC configuration"))
+ (while (string-match "\\[[^]]+\\]" help-message st-start)
+ (add-text-properties (match-beginning 0)
+ (match-end 0) '(face bold) help-message)
+ (setq st-start (match-end 0)))
+ (message help-message
+ (if org-toc-follow-mode "on" "off")
+ (if org-toc-info-mode "on" "off")
+ (if org-toc-show-subtree-mode "on" "off")
+ (if org-toc-recenter-mode (format "on, line %s" org-toc-recenter) "off")
+ (if org-toc-columns-shown "on" "off"))))
+
+
+;;;;##########################################################################
+;;;; User Options, Variables
+;;;;##########################################################################
+
+
+
+;;; org-toc.el ends here
diff --git a/ChangeLog b/ChangeLog
index 9fe9a20..c7a5f06 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,13 +1,46 @@
+2008-01-26 Carsten Dominik <dominik@science.uva.nl>
+
+ * org.el (org-archive-all-done): Fixed incorrect number of stars
+ in regexp.
+
+2008-01-25 Carsten Dominik <dominik@science.uva.nl>
+
+ * org.el (org-refile-get-location): New function.
+ (org-refile-goto-last-stored): New function.
+ (org-global-tags-completion-table): Add the value of org-tag-alist
+ in each buffer, to make sure that also unused tags will be
+ available for completion.
+
+2008-01-24 Carsten Dominik <dominik@carsten-dominiks-macbook-pro.local>
+
+ * org.el (org-columns-edit-value)
+ (org-columns-next-allowed-value): Only update if not in agenda.
+
+2008-01-22 Carsten Dominik <dominik@science.uva.nl>
+
+ * org.el (org-clocktable-steps): New function.
+ (org-dblock-write:clocktable): Call `org-clocktable-steps'.
+ (org-archive-subtree): Add the outline tree context as a
+ property.
+ (org-closest-date): New optional argument `prefer'.
+ (org-goto-auto-isearch): New option.
+ (org-goto-map, org-get-location): Implement auto-isearch.
+ (org-goto-local-auto-isearch-map): New variable.
+ (org-goto-local-search-forward-headings)
+ (org-goto-local-auto-isearch): New functions
+
+-----------------------------------------------------------------------
+
+Installed as 5.19a
+
+
2008-01-18 Carsten Dominik <dominik@science.uva.nl>
* org.el (org-entry-properties): Include the CLOCKSUM special
property.
(org-columns-edit-value): Do not allow to edit the special
CLOCKSUM property.
-
-2008-01-15 Carsten Dominik <dominik@science.uva.nl>
-
- * org.el (org-flag-drawer): Use the original value of
+ (org-flag-drawer): Use the original value of
`outline-regexp'.
(org-remember-handler): Add invisible-ok flag to call to
`org-end-of-subtree'
diff --git a/EXPERIMENTAL/find-links-to-local.el b/EXPERIMENTAL/find-links-to-local.el
new file mode 100644
index 0000000..d9a94c1
--- /dev/null
+++ b/EXPERIMENTAL/find-links-to-local.el
@@ -0,0 +1,3 @@
+(defun org-find-links ()
+ (let* ((file (buffer-file-name))
+ (tname (file-truename file)))
diff --git a/EXPERIMENTAL/interactive-query/org-interactive-query.patch.txt b/EXPERIMENTAL/interactive-query/org-interactive-query.patch.txt
new file mode 100644
index 0000000..35c47a5
--- /dev/null
+++ b/EXPERIMENTAL/interactive-query/org-interactive-query.patch.txt
@@ -0,0 +1,328 @@
+--- org-vendor/org.el 2008-01-06 10:30:26.000000000 -0500
++++ org/org.el 2008-01-12 17:19:15.000000000 -0500
+@@ -15078,7 +15078,8 @@
+ (let ((org-last-tags-completion-table
+ (org-global-tags-completion-table)))
+ (setq match (completing-read
+- "Match: " 'org-tags-completion-function nil nil nil
++ "Match: " 'org-tags-completion-function nil nil
++ org-agenda-query-string
+ 'org-tags-history))))
+
+ ;; Parse the string and create a lisp form
+@@ -18812,6 +18813,7 @@
+ (defvar org-agenda-follow-mode nil)
+ (defvar org-agenda-show-log nil)
+ (defvar org-agenda-redo-command nil)
++(defvar org-agenda-query-string nil)
+ (defvar org-agenda-mode-hook nil)
+ (defvar org-agenda-type nil)
+ (defvar org-agenda-force-single-file nil)
+@@ -18947,6 +18949,10 @@
+ (org-defkey org-agenda-mode-map [(right)] 'org-agenda-later)
+ (org-defkey org-agenda-mode-map [(left)] 'org-agenda-earlier)
+ (org-defkey org-agenda-mode-map "\C-c\C-x\C-c" 'org-agenda-columns)
++(org-defkey org-agenda-mode-map "=" 'org-agenda-query-clear-cmd)
++(org-defkey org-agenda-mode-map "/" 'org-agenda-query-and-cmd)
++(org-defkey org-agenda-mode-map ";" 'org-agenda-query-or-cmd)
++(org-defkey org-agenda-mode-map "\\" 'org-agenda-query-not-cmd)
+
+ (defvar org-agenda-keymap (copy-keymap org-agenda-mode-map)
+ "Local keymap for agenda entries from Org-mode.")
+@@ -20423,9 +20429,10 @@
+ (setq matcher (org-make-tags-matcher match)
+ match (car matcher) matcher (cdr matcher))
+ (org-prepare-agenda (concat "TAGS " match))
++ (setq org-agenda-query-string match)
+ (setq org-agenda-redo-command
+ (list 'org-tags-view (list 'quote todo-only)
+- (list 'if 'current-prefix-arg nil match)))
++ (list 'if 'current-prefix-arg nil 'org-agenda-query-string)))
+ (setq files (org-agenda-files)
+ rtnall nil)
+ (while (setq file (pop files))
+@@ -20461,7 +20468,7 @@
+ (add-text-properties pos (1- (point)) (list 'face 'org-warning))
+ (setq pos (point))
+ (unless org-agenda-multi
+- (insert "Press `C-u r' to search again with new search string\n"))
++ (insert "Press `C-u r' to enter new search string; use `/;\\=' to adjust interactively\n"))
+ (add-text-properties pos (1- (point)) (list 'face 'org-agenda-structure)))
+ (when rtnall
+ (insert (org-finalize-agenda-entries rtnall) "\n"))
+@@ -20471,6 +20478,275 @@
+ (org-finalize-agenda)
+ (setq buffer-read-only t)))
+
++;;; Agenda interactive query manipulation
++
++(defcustom org-agenda-query-selection-single-key t
++ "Non-nil means, query manipulation exits after first change.
++When nil, you have to press RET to exit it.
++During query selection, you can toggle this flag with `C-c'.
++This variable can also have the value `expert'. In this case, the window
++displaying the tags menu is not even shown, until you press C-c again."
++ :group 'org-agenda
++ :type '(choice
++ (const :tag "No" nil)
++ (const :tag "Yes" t)
++ (const :tag "Expert" expert)))
++
++(defun org-agenda-query-selection (current op table &optional todo-table)
++ "Fast query manipulation with single keys.
++CURRENT is the current query string, OP is the initial
++operator (one of \"+|-=\"), TABLE is an alist of tags and
++corresponding keys, possibly with grouping information.
++TODO-TABLE is a similar table with TODO keywords, should these
++have keys assigned to them. If the keys are nil, a-z are
++automatically assigned. Returns the new query string, or nil to
++not change the current one."
++ (let* ((fulltable (append table todo-table))
++ (maxlen (apply 'max (mapcar
++ (lambda (x)
++ (if (stringp (car x)) (string-width (car x)) 0))
++ fulltable)))
++ (fwidth (+ maxlen 3 1 3))
++ (ncol (/ (- (window-width) 4) fwidth))
++ (expert (eq org-agenda-query-selection-single-key 'expert))
++ (exit-after-next org-agenda-query-selection-single-key)
++ (done-keywords org-done-keywords)
++ tbl char cnt e groups ingroup
++ tg c2 c c1 ntable rtn)
++ (save-window-excursion
++ (if expert
++ (set-buffer (get-buffer-create " *Org tags*"))
++ (delete-other-windows)
++ (split-window-vertically)
++ (org-switch-to-buffer-other-window (get-buffer-create " *Org tags*")))
++ (erase-buffer)
++ (org-set-local 'org-done-keywords done-keywords)
++ (insert "Query: " current "\n")
++ (org-agenda-query-op-line op)
++ (insert "\n\n")
++ (org-fast-tag-show-exit exit-after-next)
++ (setq tbl fulltable char ?a cnt 0)
++ (while (setq e (pop tbl))
++ (cond
++ ((equal e '(:startgroup))
++ (push '() groups) (setq ingroup t)
++ (when (not (= cnt 0))
++ (setq cnt 0)
++ (insert "\n"))
++ (insert "{ "))
++ ((equal e '(:endgroup))
++ (setq ingroup nil cnt 0)
++ (insert "}\n"))
++ (t
++ (setq tg (car e) c2 nil)
++ (if (cdr e)
++ (setq c (cdr e))
++ ;; automatically assign a character.
++ (setq c1 (string-to-char
++ (downcase (substring
++ tg (if (= (string-to-char tg) ?@) 1 0)))))
++ (if (or (rassoc c1 ntable) (rassoc c1 table))
++ (while (or (rassoc char ntable) (rassoc char table))
++ (setq char (1+ char)))
++ (setq c2 c1))
++ (setq c (or c2 char)))
++ (if ingroup (push tg (car groups)))
++ (setq tg (org-add-props tg nil 'face
++ (cond
++ ((not (assoc tg table))
++ (org-get-todo-face tg))
++ (t nil))))
++ (if (and (= cnt 0) (not ingroup)) (insert " "))
++ (insert "[" c "] " tg (make-string
++ (- fwidth 4 (length tg)) ?\ ))
++ (push (cons tg c) ntable)
++ (when (= (setq cnt (1+ cnt)) ncol)
++ (insert "\n")
++ (if ingroup (insert " "))
++ (setq cnt 0)))))
++ (setq ntable (nreverse ntable))
++ (insert "\n")
++ (goto-char (point-min))
++ (if (and (not expert) (fboundp 'fit-window-to-buffer))
++ (fit-window-to-buffer))
++ (setq rtn
++ (catch 'exit
++ (while t
++ (message "[a-z..]:Toggle [SPC]:clear [RET]:accept [TAB]:free%s%s"
++ (if groups " [!] no groups" " [!]groups")
++ (if expert " [C-c]:window" (if exit-after-next " [C-c]:single" " [C-c]:multi")))
++ (setq c (let ((inhibit-quit t)) (read-char-exclusive)))
++ (cond
++ ((= c ?\r) (throw 'exit t))
++ ((= c ?!)
++ (setq groups (not groups))
++ (goto-char (point-min))
++ (while (re-search-forward "[{}]" nil t) (replace-match " ")))
++ ((= c ?\C-c)
++ (if (not expert)
++ (org-fast-tag-show-exit
++ (setq exit-after-next (not exit-after-next)))
++ (setq expert nil)
++ (delete-other-windows)
++ (split-window-vertically)
++ (org-switch-to-buffer-other-window " *Org tags*")
++ (and (fboundp 'fit-window-to-buffer)
++ (fit-window-to-buffer))))
++ ((or (= c ?\C-g)
++ (and (= c ?q) (not (rassoc c ntable))))
++ (setq quit-flag t))
++ ((= c ?\ )
++ (setq current "")
++ (if exit-after-next (setq exit-after-next 'now)))
++ ((= c ?\[) ; clear left
++ (org-agenda-query-decompose current)
++ (setq current (concat "/" (match-string 2 current)))
++ (if exit-after-next (setq exit-after-next 'now)))
++ ((= c ?\]) ; clear right
++ (org-agenda-query-decompose current)
++ (setq current (match-string 1 current))
++ (if exit-after-next (setq exit-after-next 'now)))
++ ((= c ?\t)
++ (condition-case nil
++ (setq current (read-string "Query: " current))
++ (quit))
++ (if exit-after-next (setq exit-after-next 'now)))
++ ;; operators
++ ((or (= c ?/) (= c ?+)) (setq op "+"))
++ ((or (= c ?\;) (= c ?|)) (setq op "|"))
++ ((or (= c ?\\) (= c ?-)) (setq op "-"))
++ ((= c ?=) (setq op "="))
++ ;; todos
++ ((setq e (rassoc c todo-table) tg (car e))
++ (setq current (org-agenda-query-manip
++ current op groups 'todo tg))
++ (if exit-after-next (setq exit-after-next 'now)))
++ ;; tags
++ ((setq e (rassoc c ntable) tg (car e))
++ (setq current (org-agenda-query-manip
++ current op groups 'tag tg))
++ (if exit-after-next (setq exit-after-next 'now))))
++ (if (eq exit-after-next 'now) (throw 'exit t))
++ (goto-char (point-min))
++ (beginning-of-line 1)
++ (delete-region (point) (point-at-eol))
++ (insert "Query: " current)
++ (beginning-of-line 2)
++ (delete-region (point) (point-at-eol))
++ (org-agenda-query-op-line op)
++ (goto-char (point-min)))))
++ (if rtn current nil))))
++
++(defun org-agenda-query-op-line (op)
++ (insert "Operator: "
++ (org-agenda-query-op-entry (equal op "+") "/+" "and")
++ (org-agenda-query-op-entry (equal op "|") ";|" "or")
++ (org-agenda-query-op-entry (equal op "-") "\\-" "not")
++ (org-agenda-query-op-entry (equal op "=") "=" "clear")))
++
++(defun org-agenda-query-op-entry (matchp chars str)
++ (if matchp
++ (org-add-props (format "[%s %s] " chars (upcase str))
++ nil 'face 'org-todo)
++ (format "[%s]%s " chars str)))
++
++(defun org-agenda-query-decompose (current)
++ (string-match "\\([^/]*\\)/?\\(.*\\)" current))
++
++(defun org-agenda-query-clear (current prefix tag)
++ (if (string-match (concat prefix "\\b" (regexp-quote tag) "\\b") current)
++ (replace-match "" t t current)
++ current))
++
++(defun org-agenda-query-manip (current op groups kind tag)
++ "Apply an operator to a query string and a tag.
++CURRENT is the current query string, OP is the operator, GROUPS is a
++list of lists of tags that are mutually exclusive. KIND is 'tag for a
++regular tag, or 'todo for a TODO keyword, and TAG is the tag or
++keyword string."
++ ;; If this tag is already in query string, remove it.
++ (setq current (org-agenda-query-clear current "[-\\+&|]?" tag))
++ (if (equal op "=") current
++ ;; When using AND, also remove mutually exclusive tags.
++ (if (equal op "+")
++ (loop for g in groups do
++ (if (member tag g)
++ (mapc (lambda (x)
++ (setq current
++ (org-agenda-query-clear current "\\+" x)))
++ g))))
++ ;; Decompose current query into q1 (tags) and q2 (TODOs).
++ (org-agenda-query-decompose current)
++ (let* ((q1 (match-string 1 current))
++ (q2 (match-string 2 current)))
++ (cond
++ ((eq kind 'tag)
++ (concat q1 op tag "/" q2))
++ ;; It's a TODO; when using AND, drop all other TODOs.
++ ((equal op "+")
++ (concat q1 "/+" tag))
++ (t
++ (concat q1 "/" q2 op tag))))))
++
++(defun org-agenda-query-global-todo-keys (&optional files)
++ "Return alist of all TODO keywords and their fast keys, in all FILES."
++ (let (alist)
++ (unless (and files (car files))
++ (setq files (org-agenda-files)))
++ (save-excursion
++ (loop for f in files do
++ (set-buffer (find-file-noselect f))
++ (loop for k in org-todo-key-alist do
++ (setq alist (org-agenda-query-merge-todo-key
++ alist k)))))
++ alist))
++
++(defun org-agenda-query-merge-todo-key (alist entry)
++ (let (e)
++ (cond
++ ;; if this is not a keyword (:startgroup, etc), ignore it
++ ((not (stringp (car entry))))
++ ;; if keyword already exists, replace char if it's null
++ ((setq e (assoc (car entry) alist))
++ (when (null (cdr e)) (setcdr e (cdr entry))))
++ ;; if char already exists, prepend keyword but drop char
++ ((rassoc (cdr entry) alist)
++ (error "TRACE POSITION 2")
++ (setq alist (cons (cons (car entry) nil) alist)))
++ ;; else, prepend COPY of entry
++ (t
++ (setq alist (cons (cons (car entry) (cdr entry)) alist)))))
++ alist)
++
++(defun org-agenda-query-generic-cmd (op)
++ "Activate query manipulation with OP as initial operator."
++ (let ((q (org-agenda-query-selection org-agenda-query-string op
++ org-tag-alist
++ (org-agenda-query-global-todo-keys))))
++ (when q
++ (setq org-agenda-query-string q)
++ (org-agenda-redo))))
++
++(defun org-agenda-query-clear-cmd ()
++ "Activate query manipulation, to clear a tag from the string."
++ (interactive)
++ (org-agenda-query-generic-cmd "="))
++
++(defun org-agenda-query-and-cmd ()
++ "Activate query manipulation, initially using the AND (+) operator."
++ (interactive)
++ (org-agenda-query-generic-cmd "+"))
++
++(defun org-agenda-query-or-cmd ()
++ "Activate query manipulation, initially using the OR (|) operator."
++ (interactive)
++ (org-agenda-query-generic-cmd "|"))
++
++(defun org-agenda-query-not-cmd ()
++ "Activate query manipulation, initially using the NOT (-) operator."
++ (interactive)
++ (org-agenda-query-generic-cmd "-"))
++
+ ;;; Agenda Finding stuck projects
+
+ (defvar org-agenda-skip-regexp nil
diff --git a/EXPERIMENTAL/interactive-query/org.el b/EXPERIMENTAL/interactive-query/org.el
new file mode 100644
index 0000000..0d2f0a5
--- /dev/null
+++ b/EXPERIMENTAL/interactive-query/org.el
@@ -0,0 +1,28057 @@
+;;; org.el --- Outline-based notes management and organizer
+;; Carstens outline-mode for keeping track of everything.
+;; 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: 5.18a
+;;
+;; 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, 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; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+;;
+;; Org-mode is a mode for keeping notes, maintaining ToDo lists, and doing
+;; project planning with a fast and effective plain-text system.
+;;
+;; Org-mode develops organizational tasks around NOTES files that contain
+;; information about projects as plain text. Org-mode is implemented on
+;; top of outline-mode, which makes it possible to keep the content of
+;; large files well structured. Visibility cycling and structure editing
+;; help to work with the tree. Tables are easily created with a built-in
+;; table editor. Org-mode supports ToDo items, deadlines, time stamps,
+;; and scheduling. It dynamically compiles entries into an agenda that
+;; utilizes and smoothly integrates much of the Emacs calendar and diary.
+;; Plain text URL-like links connect to websites, emails, Usenet
+;; messages, BBDB entries, and any files related to the projects. For
+;; printing and sharing of notes, an Org-mode file can be exported as a
+;; structured ASCII file, as HTML, or (todo and agenda items only) as an
+;; iCalendar file. It can also serve as a publishing tool for a set of
+;; linked webpages.
+;;
+;; Installation and Activation
+;; ---------------------------
+;; See the corresponding sections in the manual at
+;;
+;; http://orgmode.org/org.html#Installation
+;;
+;; Documentation
+;; -------------
+;; The documentation of Org-mode can be found in the TeXInfo file. The
+;; distribution also contains a PDF version of it. At the homepage of
+;; Org-mode, you can read the same text online as HTML. There is also an
+;; excellent reference card made by Philip Rooke. This card can be found
+;; in the etc/ directory of Emacs 22.
+;;
+;; A list of recent changes can be found at
+;; http://orgmode.org/Changes.html
+;;
+;;; Code:
+
+;;;; Require other packages
+
+(eval-when-compile
+ (require 'cl)
+ (require 'gnus-sum)
+ (require 'calendar))
+;; For XEmacs, noutline is not yet provided by outline.el, so arrange for
+;; the file noutline.el being loaded.
+(if (featurep 'xemacs) (condition-case nil (require 'noutline)))
+;; We require noutline, which might be provided in outline.el
+(require 'outline) (require 'noutline)
+;; Other stuff we need.
+(require 'time-date)
+(unless (fboundp 'time-subtract) (defalias 'time-subtract 'subtract-time))
+(require 'easymenu)
+
+;;;; Customization variables
+
+;;; Version
+
+(defconst org-version "5.17a"
+ "The version number of the file org.el.")
+(defun org-version ()
+ (interactive)
+ (message "Org-mode version %s" org-version))
+
+;;; Compatibility constants
+(defconst org-xemacs-p (featurep 'xemacs)) ; not used by org.el itself
+(defconst org-format-transports-properties-p
+ (let ((x "a"))
+ (add-text-properties 0 1 '(test t) x)
+ (get-text-property 0 'test (format "%s" x)))
+ "Does format transport text properties?")
+
+(defmacro org-bound-and-true-p (var)
+ "Return the value of symbol VAR if it is bound, else nil."
+ `(and (boundp (quote ,var)) ,var))
+
+(defmacro org-unmodified (&rest body)
+ "Execute body without changing buffer-modified-p."
+ `(set-buffer-modified-p
+ (prog1 (buffer-modified-p) ,@body)))
+
+(defmacro org-re (s)
+ "Replace posix classes in regular expression."
+ (if (featurep 'xemacs)
+ (let ((ss s))
+ (save-match-data
+ (while (string-match "\\[:alnum:\\]" ss)
+ (setq ss (replace-match "a-zA-Z0-9" t t ss)))
+ (while (string-match "\\[:alpha:\\]" ss)
+ (setq ss (replace-match "a-zA-Z" t t ss)))
+ ss))
+ s))
+
+(defmacro org-preserve-lc (&rest body)
+ `(let ((_line (org-current-line))
+ (_col (current-column)))
+ (unwind-protect
+ (progn ,@body)
+ (goto-line _line)
+ (move-to-column _col))))
+
+(defmacro org-without-partial-completion (&rest body)
+ `(let ((pc-mode (and (boundp 'partial-completion-mode)
+ partial-completion-mode)))
+ (unwind-protect
+ (progn
+ (if pc-mode (partial-completion-mode -1))
+ ,@body)
+ (if pc-mode (partial-completion-mode 1)))))
+
+;;; The custom variables
+
+(defgroup org nil
+ "Outline-based notes management and organizer."
+ :tag "Org"
+ :group 'outlines
+ :group 'hypermedia
+ :group 'calendar)
+
+;; FIXME: Needs a separate group...
+(defcustom org-completion-fallback-command 'hippie-expand
+ "The expansion command called by \\[org-complete] in normal context.
+Normal means, no org-mode-specific context."
+ :group 'org
+ :type 'function)
+
+(defgroup org-startup nil
+ "Options concerning startup of Org-mode."
+ :tag "Org Startup"
+ :group 'org)
+
+(defcustom org-startup-folded t
+ "Non-nil means, entering Org-mode will switch to OVERVIEW.
+This can also be configured on a per-file basis by adding one of
+the following lines anywhere in the buffer:
+
+ #+STARTUP: fold
+ #+STARTUP: nofold
+ #+STARTUP: content"
+ :group 'org-startup
+ :type '(choice
+ (const :tag "nofold: show all" nil)
+ (const :tag "fold: overview" t)
+ (const :tag "content: all headlines" content)))
+
+(defcustom org-startup-truncated t
+ "Non-nil means, entering Org-mode will set `truncate-lines'.
+This is useful since some lines containing links can be very long and
+uninteresting. Also tables look terrible when wrapped."
+ :group 'org-startup
+ :type 'boolean)
+
+(defcustom org-startup-align-all-tables nil
+ "Non-nil means, align all tables when visiting a file.
+This is useful when the column width in tables is forced with <N> cookies
+in table fields. Such tables will look correct only after the first re-align.
+This can also be configured on a per-file basis by adding one of
+the following lines anywhere in the buffer:
+ #+STARTUP: align
+ #+STARTUP: noalign"
+ :group 'org-startup
+ :type 'boolean)
+
+(defcustom org-insert-mode-line-in-empty-file nil
+ "Non-nil means insert the first line setting Org-mode in empty files.
+When the function `org-mode' is called interactively in an empty file, this
+normally means that the file name does not automatically trigger Org-mode.
+To ensure that the file will always be in Org-mode in the future, a
+line enforcing Org-mode will be inserted into the buffer, if this option
+has been set."
+ :group 'org-startup
+ :type 'boolean)
+
+(defcustom org-replace-disputed-keys nil
+ "Non-nil means use alternative key bindings for some keys.
+Org-mode uses S-<cursor> keys for changing timestamps and priorities.
+These keys are also used by other packages like `CUA-mode' or `windmove.el'.
+If you want to use Org-mode together with one of these other modes,
+or more generally if you would like to move some Org-mode commands to
+other keys, set this variable and configure the keys with the variable
+`org-disputed-keys'.
+
+This option is only relevant at load-time of Org-mode, and must be set
+*before* org.el is loaded. Changing it requires a restart of Emacs to
+become effective."
+ :group 'org-startup
+ :type 'boolean)
+
+(if (fboundp 'defvaralias)
+ (defvaralias 'org-CUA-compatible 'org-replace-disputed-keys))
+
+(defcustom org-disputed-keys
+ '(([(shift up)] . [(meta p)])
+ ([(shift down)] . [(meta n)])
+ ([(shift left)] . [(meta -)])
+ ([(shift right)] . [(meta +)])
+ ([(control shift right)] . [(meta shift +)])
+ ([(control shift left)] . [(meta shift -)]))
+ "Keys for which Org-mode and other modes compete.
+This is an alist, cars are the default keys, second element specifies
+the alternative to use when `org-replace-disputed-keys' is t.
+
+Keys can be specified in any syntax supported by `define-key'.
+The value of this option takes effect only at Org-mode's startup,
+therefore you'll have to restart Emacs to apply it after changing."
+ :group 'org-startup
+ :type 'alist)
+
+(defun org-key (key)
+ "Select key according to `org-replace-disputed-keys' and `org-disputed-keys'.
+Or return the original if not disputed."
+ (if org-replace-disputed-keys
+ (let* ((nkey (key-description key))
+ (x (org-find-if (lambda (x)
+ (equal (key-description (car x)) nkey))
+ org-disputed-keys)))
+ (if x (cdr x) key))
+ key))
+
+(defun org-find-if (predicate seq)
+ (catch 'exit
+ (while seq
+ (if (funcall predicate (car seq))
+ (throw 'exit (car seq))
+ (pop seq)))))
+
+(defun org-defkey (keymap key def)
+ "Define a key, possibly translated, as returned by `org-key'."
+ (define-key keymap (org-key key) def))
+
+(defcustom org-ellipsis nil
+ "The ellipsis to use in the Org-mode outline.
+When nil, just use the standard three dots. When a string, use that instead,
+When a face, use the standart 3 dots, but with the specified face.
+The change affects only Org-mode (which will then use its own display table).
+Changing this requires executing `M-x org-mode' in a buffer to become
+effective."
+ :group 'org-startup
+ :type '(choice (const :tag "Default" nil)
+ (face :tag "Face" :value org-warning)
+ (string :tag "String" :value "...#")))
+
+(defvar org-display-table nil
+ "The display table for org-mode, in case `org-ellipsis' is non-nil.")
+
+(defgroup org-keywords nil
+ "Keywords in Org-mode."
+ :tag "Org Keywords"
+ :group 'org)
+
+(defcustom org-deadline-string "DEADLINE:"
+ "String to mark deadline entries.
+A deadline is this string, followed by a time stamp. Should be a word,
+terminated by a colon. You can insert a schedule keyword and
+a timestamp with \\[org-deadline].
+Changes become only effective after restarting Emacs."
+ :group 'org-keywords
+ :type 'string)
+
+(defcustom org-scheduled-string "SCHEDULED:"
+ "String to mark scheduled TODO entries.
+A schedule is this string, followed by a time stamp. Should be a word,
+terminated by a colon. You can insert a schedule keyword and
+a timestamp with \\[org-schedule].
+Changes become only effective after restarting Emacs."
+ :group 'org-keywords
+ :type 'string)
+
+(defcustom org-closed-string "CLOSED:"
+ "String used as the prefix for timestamps logging closing a TODO entry."
+ :group 'org-keywords
+ :type 'string)
+
+(defcustom org-clock-string "CLOCK:"
+ "String used as prefix for timestamps clocking work hours on an item."
+ :group 'org-keywords
+ :type 'string)
+
+(defcustom org-comment-string "COMMENT"
+ "Entries starting with this keyword will never be exported.
+An entry can be toggled between COMMENT and normal with
+\\[org-toggle-comment].
+Changes become only effective after restarting Emacs."
+ :group 'org-keywords
+ :type 'string)
+
+(defcustom org-quote-string "QUOTE"
+ "Entries starting with this keyword will be exported in fixed-width font.
+Quoting applies only to the text in the entry following the headline, and does
+not extend beyond the next headline, even if that is lower level.
+An entry can be toggled between QUOTE and normal with
+\\[org-toggle-fixed-width-section]."
+ :group 'org-keywords
+ :type 'string)
+
+(defconst org-repeat-re
+ (concat "\\(?:\\<\\(?:" org-scheduled-string "\\|" org-deadline-string "\\)"
+ " +<[0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9] [^>\n]*\\)\\(\\+[0-9]+[dwmy]\\)")
+ "Regular expression for specifying repeated events.
+After a match, group 1 contains the repeat expression.")
+
+(defgroup org-structure nil
+ "Options concerning the general structure of Org-mode files."
+ :tag "Org Structure"
+ :group 'org)
+
+(defgroup org-reveal-location nil
+ "Options about how to make context of a location visible."
+ :tag "Org Reveal Location"
+ :group 'org-structure)
+
+(defconst org-context-choice
+ '(choice
+ (const :tag "Always" t)
+ (const :tag "Never" nil)
+ (repeat :greedy t :tag "Individual contexts"
+ (cons
+ (choice :tag "Context"
+ (const agenda)
+ (const org-goto)
+ (const occur-tree)
+ (const tags-tree)
+ (const link-search)
+ (const mark-goto)
+ (const bookmark-jump)
+ (const isearch)
+ (const default))
+ (boolean))))
+ "Contexts for the reveal options.")
+
+(defcustom org-show-hierarchy-above '((default . t))
+ "Non-nil means, show full hierarchy when revealing a location.
+Org-mode often shows locations in an org-mode file which might have
+been invisible before. When this is set, the hierarchy of headings
+above the exposed location is shown.
+Turning this off for example for sparse trees makes them very compact.
+Instead of t, this can also be an alist specifying this option for different
+contexts. Valid contexts are
+ agenda when exposing an entry from the agenda
+ org-goto when using the command `org-goto' on key C-c C-j
+ occur-tree when using the command `org-occur' on key C-c /
+ tags-tree when constructing a sparse tree based on tags matches
+ link-search when exposing search matches associated with a link
+ mark-goto when exposing the jump goal of a mark
+ bookmark-jump when exposing a bookmark location
+ isearch when exiting from an incremental search
+ default default for all contexts not set explicitly"
+ :group 'org-reveal-location
+ :type org-context-choice)
+
+(defcustom org-show-following-heading '((default . nil))
+ "Non-nil means, show following heading when revealing a location.
+Org-mode often shows locations in an org-mode file which might have
+been invisible before. When this is set, the heading following the
+match is shown.
+Turning this off for example for sparse trees makes them very compact,
+but makes it harder to edit the location of the match. In such a case,
+use the command \\[org-reveal] to show more context.
+Instead of t, this can also be an alist specifying this option for different
+contexts. See `org-show-hierarchy-above' for valid contexts."
+ :group 'org-reveal-location
+ :type org-context-choice)
+
+(defcustom org-show-siblings '((default . nil) (isearch t))
+ "Non-nil means, show all sibling heading when revealing a location.
+Org-mode often shows locations in an org-mode file which might have
+been invisible before. When this is set, the sibling of the current entry
+heading are all made visible. If `org-show-hierarchy-above' is t,
+the same happens on each level of the hierarchy above the current entry.
+
+By default this is on for the isearch context, off for all other contexts.
+Turning this off for example for sparse trees makes them very compact,
+but makes it harder to edit the location of the match. In such a case,
+use the command \\[org-reveal] to show more context.
+Instead of t, this can also be an alist specifying this option for different
+contexts. See `org-show-hierarchy-above' for valid contexts."
+ :group 'org-reveal-location
+ :type org-context-choice)
+
+(defcustom org-show-entry-below '((default . nil))
+ "Non-nil means, show the entry below a headline when revealing a location.
+Org-mode often shows locations in an org-mode file which might have
+been invisible before. When this is set, the text below the headline that is
+exposed is also shown.
+
+By default this is off for all contexts.
+Instead of t, this can also be an alist specifying this option for different
+contexts. See `org-show-hierarchy-above' for valid contexts."
+ :group 'org-reveal-location
+ :type org-context-choice)
+
+(defgroup org-cycle nil
+ "Options concerning visibility cycling in Org-mode."
+ :tag "Org Cycle"
+ :group 'org-structure)
+
+(defcustom org-drawers '("PROPERTIES" "CLOCK")
+ "Names of drawers. Drawers are not opened by cycling on the headline above.
+Drawers only open with a TAB on the drawer line itself. A drawer looks like
+this:
+ :DRAWERNAME:
+ .....
+ :END:
+The drawer \"PROPERTIES\" is special for capturing properties through
+the property API.
+
+Drawers can be defined on the per-file basis with a line like:
+
+#+DRAWERS: HIDDEN STATE PROPERTIES"
+ :group 'org-structure
+ :type '(repeat (string :tag "Drawer Name")))
+
+(defcustom org-cycle-global-at-bob nil
+ "Cycle globally if cursor is at beginning of buffer and not at a headline.
+This makes it possible to do global cycling without having to use S-TAB or
+C-u TAB. For this special case to work, the first line of the buffer
+must not be a headline - it may be empty ot some other text. When used in
+this way, `org-cycle-hook' is disables temporarily, to make sure the
+cursor stays at the beginning of the buffer.
+When this option is nil, don't do anything special at the beginning
+of the buffer."
+ :group 'org-cycle
+ :type 'boolean)
+
+(defcustom org-cycle-emulate-tab t
+ "Where should `org-cycle' emulate TAB.
+nil Never
+white Only in completely white lines
+whitestart Only at the beginning of lines, before the first non-white char.
+t Everywhere except in headlines
+exc-hl-bol Everywhere except at the start of a headline
+If TAB is used in a place where it does not emulate TAB, the current subtree
+visibility is cycled."
+ :group 'org-cycle
+ :type '(choice (const :tag "Never" nil)
+ (const :tag "Only in completely white lines" white)
+ (const :tag "Before first char in a line" whitestart)
+ (const :tag "Everywhere except in headlines" t)
+ (const :tag "Everywhere except at bol in headlines" exc-hl-bol)
+ ))
+
+(defcustom org-cycle-separator-lines 2
+ "Number of empty lines needed to keep an empty line between collapsed trees.
+If you leave an empty line between the end of a subtree and the following
+headline, this empty line is hidden when the subtree is folded.
+Org-mode will leave (exactly) one empty line visible if the number of
+empty lines is equal or larger to the number given in this variable.
+So the default 2 means, at least 2 empty lines after the end of a subtree
+are needed to produce free space between a collapsed subtree and the
+following headline.
+
+Special case: when 0, never leave empty lines in collapsed view."
+ :group 'org-cycle
+ :type 'integer)
+
+(defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees
+ org-cycle-hide-drawers
+ org-cycle-show-empty-lines
+ org-optimize-window-after-visibility-change)
+ "Hook that is run after `org-cycle' has changed the buffer visibility.
+The function(s) in this hook must accept a single argument which indicates
+the new state that was set by the most recent `org-cycle' command. The
+argument is a symbol. After a global state change, it can have the values
+`overview', `content', or `all'. After a local state change, it can have
+the values `folded', `children', or `subtree'."
+ :group 'org-cycle
+ :type 'hook)
+
+(defgroup org-edit-structure nil
+ "Options concerning structure editing in Org-mode."
+ :tag "Org Edit Structure"
+ :group 'org-structure)
+
+(defcustom org-special-ctrl-a/e nil
+ "Non-nil means `C-a' and `C-e' behave specially in headlines and items.
+When t, `C-a' will bring back the cursor to the beginning of the
+headline text, i.e. after the stars and after a possible TODO keyword.
+In an item, this will be the position after the bullet.
+When the cursor is already at that position, another `C-a' will bring
+it to the beginning of the line.
+`C-e' will jump to the end of the headline, ignoring the presence of tags
+in the headline. A second `C-e' will then jump to the true end of the
+line, after any tags.
+When set to the symbol `reversed', the first `C-a' or `C-e' works normally,
+and only a directly following, identical keypress will bring the cursor
+to the special positions."
+ :group 'org-edit-structure
+ :type '(choice
+ (const :tag "off" nil)
+ (const :tag "after bullet first" t)
+ (const :tag "border first" reversed)))
+
+(if (fboundp 'defvaralias)
+ (defvaralias 'org-special-ctrl-a 'org-special-ctrl-a/e))
+
+(defcustom org-odd-levels-only nil
+ "Non-nil means, skip even levels and only use odd levels for the outline.
+This has the effect that two stars are being added/taken away in
+promotion/demotion commands. It also influences how levels are
+handled by the exporters.
+Changing it requires restart of `font-lock-mode' to become effective
+for fontification also in regions already fontified.
+You may also set this on a per-file basis by adding one of the following
+lines to the buffer:
+
+ #+STARTUP: odd
+ #+STARTUP: oddeven"
+ :group 'org-edit-structure
+ :group 'org-font-lock
+ :type 'boolean)
+
+(defcustom org-adapt-indentation t
+ "Non-nil means, adapt indentation when promoting and demoting.
+When this is set and the *entire* text in an entry is indented, the
+indentation is increased by one space in a demotion command, and
+decreased by one in a promotion command. If any line in the entry
+body starts at column 0, indentation is not changed at all."
+ :group 'org-edit-structure
+ :type 'boolean)
+
+(defcustom org-blank-before-new-entry '((heading . nil)
+ (plain-list-item . nil))
+ "Should `org-insert-heading' leave a blank line before new heading/item?
+The value is an alist, with `heading' and `plain-list-item' as car,
+and a boolean flag as cdr."
+ :group 'org-edit-structure
+ :type '(list
+ (cons (const heading) (boolean))
+ (cons (const plain-list-item) (boolean))))
+
+(defcustom org-insert-heading-hook nil
+ "Hook being run after inserting a new heading."
+ :group 'org-edit-structure
+ :type 'hook)
+
+(defcustom org-enable-fixed-width-editor t
+ "Non-nil means, lines starting with \":\" are treated as fixed-width.
+This currently only means, they are never auto-wrapped.
+When nil, such lines will be treated like ordinary lines.
+See also the QUOTE keyword."
+ :group 'org-edit-structure
+ :type 'boolean)
+
+(defgroup org-sparse-trees nil
+ "Options concerning sparse trees in Org-mode."
+ :tag "Org Sparse Trees"
+ :group 'org-structure)
+
+(defcustom org-highlight-sparse-tree-matches t
+ "Non-nil means, highlight all matches that define a sparse tree.
+The highlights will automatically disappear the next time the buffer is
+changed by an edit command."
+ :group 'org-sparse-trees
+ :type 'boolean)
+
+(defcustom org-remove-highlights-with-change t
+ "Non-nil means, any change to the buffer will remove temporary highlights.
+Such highlights are created by `org-occur' and `org-clock-display'.
+When nil, `C-c C-c needs to be used to get rid of the highlights.
+The highlights created by `org-preview-latex-fragment' always need
+`C-c C-c' to be removed."
+ :group 'org-sparse-trees
+ :group 'org-time
+ :type 'boolean)
+
+
+(defcustom org-occur-hook '(org-first-headline-recenter)
+ "Hook that is run after `org-occur' has constructed a sparse tree.
+This can be used to recenter the window to show as much of the structure
+as possible."
+ :group 'org-sparse-trees
+ :type 'hook)
+
+(defgroup org-plain-lists nil
+ "Options concerning plain lists in Org-mode."
+ :tag "Org Plain lists"
+ :group 'org-structure)
+
+(defcustom org-cycle-include-plain-lists nil
+ "Non-nil means, include plain lists into visibility cycling.
+This means that during cycling, plain list items will *temporarily* be
+interpreted as outline headlines with a level given by 1000+i where i is the
+indentation of the bullet. In all other operations, plain list items are
+not seen as headlines. For example, you cannot assign a TODO keyword to
+such an item."
+ :group 'org-plain-lists
+ :type 'boolean)
+
+(defcustom org-plain-list-ordered-item-terminator t
+ "The character that makes a line with leading number an ordered list item.
+Valid values are ?. and ?\). To get both terminators, use t. While
+?. may look nicer, it creates the danger that a line with leading
+number may be incorrectly interpreted as an item. ?\) therefore is
+the safe choice."
+ :group 'org-plain-lists
+ :type '(choice (const :tag "dot like in \"2.\"" ?.)
+ (const :tag "paren like in \"2)\"" ?\))
+ (const :tab "both" t)))
+
+(defcustom org-auto-renumber-ordered-lists t
+ "Non-nil means, automatically renumber ordered plain lists.
+Renumbering happens when the sequence have been changed with
+\\[org-shiftmetaup] or \\[org-shiftmetadown]. After other editing commands,
+use \\[org-ctrl-c-ctrl-c] to trigger renumbering."
+ :group 'org-plain-lists
+ :type 'boolean)
+
+(defcustom org-provide-checkbox-statistics t
+ "Non-nil means, update checkbox statistics after insert and toggle.
+When this is set, checkbox statistics is updated each time you either insert
+a new checkbox with \\[org-insert-todo-heading] or toggle a checkbox
+with \\[org-ctrl-c-ctrl-c\\]."
+ :group 'org-plain-lists
+ :type 'boolean)
+
+(defgroup org-archive nil
+ "Options concerning archiving in Org-mode."
+ :tag "Org Archive"
+ :group 'org-structure)
+
+(defcustom org-archive-tag "ARCHIVE"
+ "The tag that marks a subtree as archived.
+An archived subtree does not open during visibility cycling, and does
+not contribute to the agenda listings.
+After changing this, font-lock must be restarted in the relevant buffers to
+get the proper fontification."
+ :group 'org-archive
+ :group 'org-keywords
+ :type 'string)
+
+(defcustom org-agenda-skip-archived-trees t
+ "Non-nil means, the agenda will skip any items located in archived trees.
+An archived tree is a tree marked with the tag ARCHIVE."
+ :group 'org-archive
+ :group 'org-agenda-skip
+ :type 'boolean)
+
+(defcustom org-cycle-open-archived-trees nil
+ "Non-nil means, `org-cycle' will open archived trees.
+An archived tree is a tree marked with the tag ARCHIVE.
+When nil, archived trees will stay folded. You can still open them with
+normal outline commands like `show-all', but not with the cycling commands."
+ :group 'org-archive
+ :group 'org-cycle
+ :type 'boolean)
+
+(defcustom org-sparse-tree-open-archived-trees nil
+ "Non-nil means sparse tree construction shows matches in archived trees.
+When nil, matches in these trees are highlighted, but the trees are kept in
+collapsed state."
+ :group 'org-archive
+ :group 'org-sparse-trees
+ :type 'boolean)
+
+(defcustom org-archive-location "%s_archive::"
+ "The location where subtrees should be archived.
+This string consists of two parts, separated by a double-colon.
+
+The first part is a file name - when omitted, archiving happens in the same
+file. %s will be replaced by the current file name (without directory part).
+Archiving to a different file is useful to keep archived entries from
+contributing to the Org-mode Agenda.
+
+The part after the double colon is a headline. The archived entries will be
+filed under that headline. When omitted, the subtrees are simply filed away
+at the end of the file, as top-level entries.
+
+Here are a few examples:
+\"%s_archive::\"
+ If the current file is Projects.org, archive in file
+ Projects.org_archive, as top-level trees. This is the default.
+
+\"::* Archived Tasks\"
+ Archive in the current file, under the top-level headline
+ \"* Archived Tasks\".
+
+\"~/org/archive.org::\"
+ Archive in file ~/org/archive.org (absolute path), as top-level trees.
+
+\"basement::** Finished Tasks\"
+ Archive in file ./basement (relative path), as level 3 trees
+ below the level 2 heading \"** Finished Tasks\".
+
+You may set this option on a per-file basis by adding to the buffer a
+line like
+
+#+ARCHIVE: basement::** Finished Tasks"
+ :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 ot remove
+`time' from the variablle `org-archive-save-context-info'."
+ :group 'org-archive
+ :type 'boolean)
+
+(defcustom org-archive-save-context-info '(time file 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 looses 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.
+itags The local tags, in the headline of the subtree.
+ltags 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.
+
+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 "TODO state" priority)
+ (const :tag "Inherited tags" itags)
+ (const :tag "Local tags" ltags)))
+
+(defgroup org-imenu-and-speedbar nil
+ "Options concerning imenu and speedbar in Org-mode."
+ :tag "Org Imenu and Speedbar"
+ :group 'org-structure)
+
+(defcustom org-imenu-depth 2
+ "The maximum level for Imenu access to Org-mode headlines.
+This also applied for speedbar access."
+ :group 'org-imenu-and-speedbar
+ :type 'number)
+
+(defgroup org-table nil
+ "Options concerning tables in Org-mode."
+ :tag "Org Table"
+ :group 'org)
+
+(defcustom org-enable-table-editor 'optimized
+ "Non-nil means, lines starting with \"|\" are handled by the table editor.
+When nil, such lines will be treated like ordinary lines.
+
+When equal to the symbol `optimized', the table editor will be optimized to
+do the following:
+- Automatic overwrite mode in front of whitespace in table fields.
+ This makes the structure of the table stay in tact as long as the edited
+ field does not exceed the column width.
+- Minimize the number of realigns. Normally, the table is aligned each time
+ TAB or RET are pressed to move to another field. With optimization this
+ happens only if changes to a field might have changed the column width.
+Optimization requires replacing the functions `self-insert-command',
+`delete-char', and `backward-delete-char' in Org-mode buffers, with a
+slight (in fact: unnoticeable) speed impact for normal typing. Org-mode is
+very good at guessing when a re-align will be necessary, but you can always
+force one with \\[org-ctrl-c-ctrl-c].
+
+If you would like to use the optimized version in Org-mode, but the
+un-optimized version in OrgTbl-mode, see the variable `orgtbl-optimized'.
+
+This variable can be used to turn on and off the table editor during a session,
+but in order to toggle optimization, a restart is required.
+
+See also the variable `org-table-auto-blank-field'."
+ :group 'org-table
+ :type '(choice
+ (const :tag "off" nil)
+ (const :tag "on" t)
+ (const :tag "on, optimized" optimized)))
+
+(defcustom orgtbl-optimized (eq org-enable-table-editor 'optimized)
+ "Non-nil means, use the optimized table editor version for `orgtbl-mode'.
+In the optimized version, the table editor takes over all simple keys that
+normally just insert a character. In tables, the characters are inserted
+in a way to minimize disturbing the table structure (i.e. in overwrite mode
+for empty fields). Outside tables, the correct binding of the keys is
+restored.
+
+The default for this option is t if the optimized version is also used in
+Org-mode. See the variable `org-enable-table-editor' for details. Changing
+this variable requires a restart of Emacs to become effective."
+ :group 'org-table
+ :type 'boolean)
+
+(defcustom orgtbl-radio-table-templates
+ '((latex-mode "% BEGIN RECEIVE ORGTBL %n
+% END RECEIVE ORGTBL %n
+\\begin{comment}
+#+ORGTBL: SEND %n orgtbl-to-latex :splice nil :skip 0
+| | |
+\\end{comment}\n")
+ (texinfo-mode "@c BEGIN RECEIVE ORGTBL %n
+@c END RECEIVE ORGTBL %n
+@ignore
+#+ORGTBL: SEND %n orgtbl-to-html :splice nil :skip 0
+| | |
+@end ignore\n")
+ (html-mode "<!-- BEGIN RECEIVE ORGTBL %n -->
+<!-- END RECEIVE ORGTBL %n -->
+<!--
+#+ORGTBL: SEND %n orgtbl-to-html :splice nil :skip 0
+| | |
+-->\n"))
+ "Templates for radio tables in different major modes.
+All occurrences of %n in a template will be replaced with the name of the
+table, obtained by prompting the user."
+ :group 'org-table
+ :type '(repeat
+ (list (symbol :tag "Major mode")
+ (string :tag "Format"))))
+
+(defgroup org-table-settings nil
+ "Settings for tables in Org-mode."
+ :tag "Org Table Settings"
+ :group 'org-table)
+
+(defcustom org-table-default-size "5x2"
+ "The default size for newly created tables, Columns x Rows."
+ :group 'org-table-settings
+ :type 'string)
+
+(defcustom org-table-number-regexp
+ "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%:]*\\|\\(0[xX]\\)[0-9a-fA-F]+\\|nan\\)$"
+ "Regular expression for recognizing numbers in table columns.
+If a table column contains mostly numbers, it will be aligned to the
+right. If not, it will be aligned to the left.
+
+The default value of this option is a regular expression which allows
+anything which looks remotely like a number as used in scientific
+context. For example, all of the following will be considered a
+number:
+ 12 12.2 2.4e-08 2x10^12 4.034+-0.02 2.7(10) >3.5
+
+Other options offered by the customize interface are more restrictive."
+ :group 'org-table-settings
+ :type '(choice
+ (const :tag "Positive Integers"
+ "^[0-9]+$")
+ (const :tag "Integers"
+ "^[-+]?[0-9]+$")
+ (const :tag "Floating Point Numbers"
+ "^[-+]?\\([0-9]*\\.[0-9]+\\|[0-9]+\\.[0-9]*\\)$")
+ (const :tag "Floating Point Number or Integer"
+ "^[-+]?\\([0-9]*\\.[0-9]+\\|[0-9]+\\.?[0-9]*\\)$")
+ (const :tag "Exponential, Floating point, Integer"
+ "^[-+]?[0-9.]+\\([eEdD][-+0-9]+\\)?$")
+ (const :tag "Very General Number-Like, including hex"
+ "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%]*\\|\\(0[xX]\\)[0-9a-fA-F]+\\|nan\\)$")
+ (string :tag "Regexp:")))
+
+(defcustom org-table-number-fraction 0.5
+ "Fraction of numbers in a column required to make the column align right.
+In a column all non-white fields are considered. If at least this
+fraction of fields is matched by `org-table-number-fraction',
+alignment to the right border applies."
+ :group 'org-table-settings
+ :type 'number)
+
+(defgroup org-table-editing nil
+ "Behavior of tables during editing in Org-mode."
+ :tag "Org Table Editing"
+ :group 'org-table)
+
+(defcustom org-table-automatic-realign t
+ "Non-nil means, automatically re-align table when pressing TAB or RETURN.
+When nil, aligning is only done with \\[org-table-align], or after column
+removal/insertion."
+ :group 'org-table-editing
+ :type 'boolean)
+
+(defcustom org-table-auto-blank-field t
+ "Non-nil means, automatically blank table field when starting to type into it.
+This only happens when typing immediately after a field motion
+command (TAB, S-TAB or RET).
+Only relevant when `org-enable-table-editor' is equal to `optimized'."
+ :group 'org-table-editing
+ :type 'boolean)
+
+(defcustom org-table-tab-jumps-over-hlines t
+ "Non-nil means, tab in the last column of a table with jump over a hline.
+If a horizontal separator line is following the current line,
+`org-table-next-field' can either create a new row before that line, or jump
+over the line. When this option is nil, a new line will be created before
+this line."
+ :group 'org-table-editing
+ :type 'boolean)
+
+(defcustom org-table-tab-recognizes-table.el t
+ "Non-nil means, TAB will automatically notice a table.el table.
+When it sees such a table, it moves point into it and - if necessary -
+calls `table-recognize-table'."
+ :group 'org-table-editing
+ :type 'boolean)
+
+(defgroup org-table-calculation nil
+ "Options concerning tables in Org-mode."
+ :tag "Org Table Calculation"
+ :group 'org-table)
+
+(defcustom org-table-use-standard-references t
+ "Should org-mode work with table refrences like B3 instead of @3$2?
+Possible values are:
+nil never use them
+from accept as input, do not present for editing
+t: accept as input and present for editing"
+ :group 'org-table-calculation
+ :type '(choice
+ (const :tag "Never, don't even check unser input for them" nil)
+ (const :tag "Always, both as user input, and when editing" t)
+ (const :tag "Convert user input, don't offer during editing" 'from)))
+
+(defcustom org-table-copy-increment t
+ "Non-nil means, increment when copying current field with \\[org-table-copy-down]."
+ :group 'org-table-calculation
+ :type 'boolean)
+
+(defcustom org-calc-default-modes
+ '(calc-internal-prec 12
+ calc-float-format (float 5)
+ calc-angle-mode deg
+ calc-prefer-frac nil
+ calc-symbolic-mode nil
+ calc-date-format (YYYY "-" MM "-" DD " " Www (" " HH ":" mm))
+ calc-display-working-message t
+ )
+ "List with Calc mode settings for use in calc-eval for table formulas.
+The list must contain alternating symbols (Calc modes variables and values).
+Don't remove any of the default settings, just change the values. Org-mode
+relies on the variables to be present in the list."
+ :group 'org-table-calculation
+ :type 'plist)
+
+(defcustom org-table-formula-evaluate-inline t
+ "Non-nil means, TAB and RET evaluate a formula in current table field.
+If the current field starts with an equal sign, it is assumed to be a formula
+which should be evaluated as described in the manual and in the documentation
+string of the command `org-table-eval-formula'. This feature requires the
+Emacs calc package.
+When this variable is nil, formula calculation is only available through
+the command \\[org-table-eval-formula]."
+ :group 'org-table-calculation
+ :type 'boolean)
+
+(defcustom org-table-formula-use-constants t
+ "Non-nil means, interpret constants in formulas in tables.
+A constant looks like `$c' or `$Grav' and will be replaced before evaluation
+by the value given in `org-table-formula-constants', or by a value obtained
+from the `constants.el' package."
+ :group 'org-table-calculation
+ :type 'boolean)
+
+(defcustom org-table-formula-constants nil
+ "Alist with constant names and values, for use in table formulas.
+The car of each element is a name of a constant, without the `$' before it.
+The cdr is the value as a string. For example, if you'd like to use the
+speed of light in a formula, you would configure
+
+ (setq org-table-formula-constants '((\"c\" . \"299792458.\")))
+
+and then use it in an equation like `$1*$c'.
+
+Constants can also be defined on a per-file basis using a line like
+
+#+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6"
+ :group 'org-table-calculation
+ :type '(repeat
+ (cons (string :tag "name")
+ (string :tag "value"))))
+
+(defvar org-table-formula-constants-local nil
+ "Local version of `org-table-formula-constants'.")
+(make-variable-buffer-local 'org-table-formula-constants-local)
+
+(defcustom org-table-allow-automatic-line-recalculation t
+ "Non-nil means, lines marked with |#| or |*| will be recomputed automatically.
+Automatically means, when TAB or RET or C-c C-c are pressed in the line."
+ :group 'org-table-calculation
+ :type 'boolean)
+
+(defgroup org-link nil
+ "Options concerning links in Org-mode."
+ :tag "Org Link"
+ :group 'org)
+
+(defvar org-link-abbrev-alist-local nil
+ "Buffer-local version of `org-link-abbrev-alist', which see.
+The value of this is taken from the #+LINK lines.")
+(make-variable-buffer-local 'org-link-abbrev-alist-local)
+
+(defcustom org-link-abbrev-alist nil
+ "Alist of link abbreviations.
+The car of each element is a string, to be replaced at the start of a link.
+The cdrs are replacement values, like (\"linkkey\" . REPLACE). Abbreviated
+links in Org-mode buffers can have an optional tag after a double colon, e.g.
+
+ [[linkkey:tag][description]]
+
+If REPLACE is a string, the tag will simply be appended to create the link.
+If the string contains \"%s\", the tag will be inserted there.
+
+REPLACE may also be a function that will be called with the tag as the
+only argument to create the link, which should be returned as a string.
+
+See the manual for examples."
+ :group 'org-link
+ :type 'alist)
+
+(defcustom org-descriptive-links t
+ "Non-nil means, hide link part and only show description of bracket links.
+Bracket links are like [[link][descritpion]]. This variable sets the initial
+state in new org-mode buffers. The setting can then be toggled on a
+per-buffer basis from the Org->Hyperlinks menu."
+ :group 'org-link
+ :type 'boolean)
+
+(defcustom org-link-file-path-type 'adaptive
+ "How the path name in file links should be stored.
+Valid values are:
+
+relative relative to the current directory, i.e. the directory of the file
+ into which the link is being inserted.
+absolute absolute path, if possible with ~ for home directory.
+noabbrev absolute path, no abbreviation of home directory.
+adaptive Use relative path for files in the current directory and sub-
+ directories of it. For other files, use an absolute path."
+ :group 'org-link
+ :type '(choice
+ (const relative)
+ (const absolute)
+ (const noabbrev)
+ (const adaptive)))
+
+(defcustom org-activate-links '(bracket angle plain radio tag date)
+ "Types of links that should be activated in Org-mode files.
+This is a list of symbols, each leading to the activation of a certain link
+type. In principle, it does not hurt to turn on most link types - there may
+be a small gain when turning off unused link types. The types are:
+
+bracket The recommended [[link][description]] or [[link]] links with hiding.
+angular Links in angular brackes that may contain whitespace like
+ <bbdb:Carsten Dominik>.
+plain Plain links in normal text, no whitespace, like http://google.com.
+radio Text that is matched by a radio target, see manual for details.
+tag Tag settings in a headline (link to tag search).
+date Time stamps (link to calendar).
+
+Changing this variable requires a restart of Emacs to become effective."
+ :group 'org-link
+ :type '(set (const :tag "Double bracket links (new style)" bracket)
+ (const :tag "Angular bracket links (old style)" angular)
+ (const :tag "plain text links" plain)
+ (const :tag "Radio target matches" radio)
+ (const :tag "Tags" tag)
+ (const :tag "Tags" target)
+ (const :tag "Timestamps" date)))
+
+(defgroup org-link-store nil
+ "Options concerning storing links in Org-mode"
+ :tag "Org Store Link"
+ :group 'org-link)
+
+(defcustom org-email-link-description-format "Email %c: %.30s"
+ "Format of the description part of a link to an email or usenet message.
+The following %-excapes will be replaced by corresponding information:
+
+%F full \"From\" field
+%f name, taken from \"From\" field, address if no name
+%T full \"To\" field
+%t first name in \"To\" field, address if no name
+%c correspondent. Unually \"from NAME\", but if you sent it yourself, it
+ will be \"to NAME\". See also the variable `org-from-is-user-regexp'.
+%s subject
+%m message-id.
+
+You may use normal field width specification between the % and the letter.
+This is for example useful to limit the length of the subject.
+
+Examples: \"%f on: %.30s\", \"Email from %f\", \"Email %c\""
+ :group 'org-link-store
+ :type 'string)
+
+(defcustom org-from-is-user-regexp
+ (let (r1 r2)
+ (when (and user-mail-address (not (string= user-mail-address "")))
+ (setq r1 (concat "\\<" (regexp-quote user-mail-address) "\\>")))
+ (when (and user-full-name (not (string= user-full-name "")))
+ (setq r2 (concat "\\<" (regexp-quote user-full-name) "\\>")))
+ (if (and r1 r2) (concat r1 "\\|" r2) (or r1 r2)))
+ "Regexp mached against the \"From:\" header of an email or usenet message.
+It should match if the message is from the user him/herself."
+ :group 'org-link-store
+ :type 'regexp)
+
+(defcustom org-context-in-file-links t
+ "Non-nil means, file links from `org-store-link' contain context.
+A search string will be added to the file name with :: as separator and
+used to find the context when the link is activated by the command
+`org-open-at-point'.
+Using a prefix arg to the command \\[org-store-link] (`org-store-link')
+negates this setting for the duration of the command."
+ :group 'org-link-store
+ :type 'boolean)
+
+(defcustom org-keep-stored-link-after-insertion nil
+ "Non-nil means, keep link in list for entire session.
+
+The command `org-store-link' adds a link pointing to the current
+location to an internal list. These links accumulate during a session.
+The command `org-insert-link' can be used to insert links into any
+Org-mode file (offering completion for all stored links). When this
+option is nil, every link which has been inserted once using \\[org-insert-link]
+will be removed from the list, to make completing the unused links
+more efficient."
+ :group 'org-link-store
+ :type 'boolean)
+
+(defcustom org-usenet-links-prefer-google nil
+ "Non-nil means, `org-store-link' will create web links to Google groups.
+When nil, Gnus will be used for such links.
+Using a prefix arg to the command \\[org-store-link] (`org-store-link')
+negates this setting for the duration of the command."
+ :group 'org-link-store
+ :type 'boolean)
+
+(defgroup org-link-follow nil
+ "Options concerning following links in Org-mode"
+ :tag "Org Follow Link"
+ :group 'org-link)
+
+(defcustom org-tab-follows-link nil
+ "Non-nil means, on links TAB will follow the link.
+Needs to be set before org.el is loaded."
+ :group 'org-link-follow
+ :type 'boolean)
+
+(defcustom org-return-follows-link nil
+ "Non-nil means, on links RET will follow the link.
+Needs to be set before org.el is loaded."
+ :group 'org-link-follow
+ :type 'boolean)
+
+(defcustom org-mouse-1-follows-link t
+ "Non-nil means, mouse-1 on a link will follow the link.
+A longer mouse click will still set point. Does not wortk on XEmacs.
+Needs to be set before org.el is loaded."
+ :group 'org-link-follow
+ :type 'boolean)
+
+(defcustom org-mark-ring-length 4
+ "Number of different positions to be recorded in the ring
+Changing this requires a restart of Emacs to work correctly."
+ :group 'org-link-follow
+ :type 'interger)
+
+(defcustom org-link-frame-setup
+ '((vm . vm-visit-folder-other-frame)
+ (gnus . gnus-other-frame)
+ (file . find-file-other-window))
+ "Setup the frame configuration for following links.
+When following a link with Emacs, it may often be useful to display
+this link in another window or frame. This variable can be used to
+set this up for the different types of links.
+For VM, use any of
+ `vm-visit-folder'
+ `vm-visit-folder-other-frame'
+For Gnus, use any of
+ `gnus'
+ `gnus-other-frame'
+For FILE, use any of
+ `find-file'
+ `find-file-other-window'
+ `find-file-other-frame'
+For the calendar, use the variable `calendar-setup'.
+For BBDB, it is currently only possible to display the matches in
+another window."
+ :group 'org-link-follow
+ :type '(list
+ (cons (const vm)
+ (choice
+ (const vm-visit-folder)
+ (const vm-visit-folder-other-window)
+ (const vm-visit-folder-other-frame)))
+ (cons (const gnus)
+ (choice
+ (const gnus)
+ (const gnus-other-frame)))
+ (cons (const file)
+ (choice
+ (const find-file)
+ (const find-file-other-window)
+ (const find-file-other-frame)))))
+
+(defcustom org-display-internal-link-with-indirect-buffer nil
+ "Non-nil means, use indirect buffer to display infile links.
+Activating internal links (from one location in a file to another location
+in the same file) normally just jumps to the location. When the link is
+activated with a C-u prefix (or with mouse-3), the link is displayed in
+another window. When this option is set, the other window actually displays
+an indirect buffer clone of the current buffer, to avoid any visibility
+changes to the current buffer."
+ :group 'org-link-follow
+ :type 'boolean)
+
+(defcustom org-open-non-existing-files nil
+ "Non-nil means, `org-open-file' will open non-existing files.
+When nil, an error will be generated."
+ :group 'org-link-follow
+ :type 'boolean)
+
+(defcustom org-link-mailto-program '(browse-url "mailto:%a?subject=%s")
+ "Function and arguments to call for following mailto links.
+This is a list with the first element being a lisp function, and the
+remaining elements being arguments to the function. In string arguments,
+%a will be replaced by the address, and %s will be replaced by the subject
+if one was given like in <mailto:arthur@galaxy.org::this subject>."
+ :group 'org-link-follow
+ :type '(choice
+ (const :tag "browse-url" (browse-url-mail "mailto:%a?subject=%s"))
+ (const :tag "compose-mail" (compose-mail "%a" "%s"))
+ (const :tag "message-mail" (message-mail "%a" "%s"))
+ (cons :tag "other" (function) (repeat :tag "argument" sexp))))
+
+(defcustom org-confirm-shell-link-function 'yes-or-no-p
+ "Non-nil means, ask for confirmation before executing shell links.
+Shell links can be dangerous: just think about a link
+
+ [[shell:rm -rf ~/*][Google Search]]
+
+This link would show up in your Org-mode document as \"Google Search\",
+but really it would remove your entire home directory.
+Therefore we advise against setting this variable to nil.
+Just change it to `y-or-n-p' of you want to confirm with a
+single keystroke rather than having to type \"yes\"."
+ :group 'org-link-follow
+ :type '(choice
+ (const :tag "with yes-or-no (safer)" yes-or-no-p)
+ (const :tag "with y-or-n (faster)" y-or-n-p)
+ (const :tag "no confirmation (dangerous)" nil)))
+
+(defcustom org-confirm-elisp-link-function 'yes-or-no-p
+ "Non-nil means, ask for confirmation before executing Emacs Lisp links.
+Elisp links can be dangerous: just think about a link
+
+ [[elisp:(shell-command \"rm -rf ~/*\")][Google Search]]
+
+This link would show up in your Org-mode document as \"Google Search\",
+but really it would remove your entire home directory.
+Therefore we advise against setting this variable to nil.
+Just change it to `y-or-n-p' of you want to confirm with a
+single keystroke rather than having to type \"yes\"."
+ :group 'org-link-follow
+ :type '(choice
+ (const :tag "with yes-or-no (safer)" yes-or-no-p)
+ (const :tag "with y-or-n (faster)" y-or-n-p)
+ (const :tag "no confirmation (dangerous)" nil)))
+
+(defconst org-file-apps-defaults-gnu
+ '((remote . emacs)
+ (t . mailcap))
+ "Default file applications on a UNIX or GNU/Linux system.
+See `org-file-apps'.")
+
+(defconst org-file-apps-defaults-macosx
+ '((remote . emacs)
+ (t . "open %s")
+ ("ps" . "gv %s")
+ ("ps.gz" . "gv %s")
+ ("eps" . "gv %s")
+ ("eps.gz" . "gv %s")
+ ("dvi" . "xdvi %s")
+ ("fig" . "xfig %s"))
+ "Default file applications on a MacOS X system.
+The system \"open\" is known as a default, but we use X11 applications
+for some files for which the OS does not have a good default.
+See `org-file-apps'.")
+
+(defconst org-file-apps-defaults-windowsnt
+ (list
+ '(remote . emacs)
+ (cons t
+ (list (if (featurep 'xemacs)
+ 'mswindows-shell-execute
+ 'w32-shell-execute)
+ "open" 'file)))
+ "Default file applications on a Windows NT system.
+The system \"open\" is used for most files.
+See `org-file-apps'.")
+
+(defcustom org-file-apps
+ '(
+ ("txt" . emacs)
+ ("tex" . emacs)
+ ("ltx" . emacs)
+ ("org" . emacs)
+ ("el" . emacs)
+ ("bib" . emacs)
+ )
+ "External applications for opening `file:path' items in a document.
+Org-mode uses system defaults for different file types, but
+you can use this variable to set the application for a given file
+extension. The entries in this list are cons cells where the car identifies
+files and the cdr the corresponding command. Possible values for the
+file identifier are
+ \"ext\" A string identifying an extension
+ `directory' Matches a directory
+ `remote' Matches a remote file, accessible through tramp or efs.
+ Remote files most likely should be visited through Emacs
+ because external applications cannot handle such paths.
+ t Default for all remaining files
+
+Possible values for the command are:
+ `emacs' The file will be visited by the current Emacs process.
+ `default' Use the default application for this file type.
+ string A command to be executed by a shell; %s will be replaced
+ by the path to the file.
+ sexp A Lisp form which will be evaluated. The file path will
+ be available in the Lisp variable `file'.
+For more examples, see the system specific constants
+`org-file-apps-defaults-macosx'
+`org-file-apps-defaults-windowsnt'
+`org-file-apps-defaults-gnu'."
+ :group 'org-link-follow
+ :type '(repeat
+ (cons (choice :value ""
+ (string :tag "Extension")
+ (const :tag "Default for unrecognized files" t)
+ (const :tag "Remote file" remote)
+ (const :tag "Links to a directory" directory))
+ (choice :value ""
+ (const :tag "Visit with Emacs" emacs)
+ (const :tag "Use system default" default)
+ (string :tag "Command")
+ (sexp :tag "Lisp form")))))
+
+(defcustom org-mhe-search-all-folders nil
+ "Non-nil means, that the search for the mh-message will be extended to
+all folders if the message cannot be found in the folder given in the link.
+Searching all folders is very efficient with one of the search engines
+supported by MH-E, but will be slow with pick."
+ :group 'org-link-follow
+ :type 'boolean)
+
+(defgroup org-remember nil
+ "Options concerning interaction with remember.el."
+ :tag "Org Remember"
+ :group 'org)
+
+(defcustom org-directory "~/org"
+ "Directory with org files.
+This directory will be used as default to prompt for org files.
+Used by the hooks for remember.el."
+ :group 'org-remember
+ :type 'directory)
+
+(defcustom org-default-notes-file "~/.notes"
+ "Default target for storing notes.
+Used by the hooks for remember.el. This can be a string, or nil to mean
+the value of `remember-data-file'.
+You can set this on a per-template basis with the variable
+`org-remember-templates'."
+ :group 'org-remember
+ :type '(choice
+ (const :tag "Default from remember-data-file" nil)
+ file))
+
+(defcustom org-remember-store-without-prompt t
+ "Non-nil means, `C-c C-c' stores remember note without further promts.
+In this case, you need `C-u C-c C-c' to get the prompts for
+note file and headline.
+When this variable is nil, `C-c C-c' give you the prompts, and
+`C-u C-c C-c' trigger the fasttrack."
+ :group 'org-remember
+ :type 'boolean)
+
+(defcustom org-remember-default-headline ""
+ "The headline that should be the default location in the notes file.
+When filing remember notes, the cursor will start at that position.
+You can set this on a per-template basis with the variable
+`org-remember-templates'."
+ :group 'org-remember
+ :type 'string)
+
+(defcustom org-remember-templates nil
+ "Templates for the creation of remember buffers.
+When nil, just let remember make the buffer.
+When not nil, this is a list of 5-element lists. In each entry, the first
+element is a the name of the template, It should be a single short word.
+The second element is a character, a unique key to select this template.
+The third element is the template. The forth element is optional and can
+specify a destination file for remember items created with this template.
+The default file is given by `org-default-notes-file'. An optional fifth
+element can specify the headline in that file that should be offered
+first when the user is asked to file the entry. The default headline is
+given in the variable `org-remember-default-headline'.
+
+The template specifies the structure of the remember buffer. It should have
+a first line starting with a star, to act as the org-mode headline.
+Furthermore, the following %-escapes will be replaced with content:
+
+ %^{prompt} Prompt the user for a string and replace this sequence with it.
+ A default value and a completion table ca be specified like this:
+ %^{prompt|default|completion2|completion3|...}
+ %t time stamp, date only
+ %T time stamp with date and time
+ %u, %U like the above, but inactive time stamps
+ %^t like %t, but prompt for date. Similarly %^T, %^u, %^U
+ You may define a prompt like %^{Please specify birthday}t
+ %n user name (taken from `user-full-name')
+ %a annotation, normally the link created with org-store-link
+ %i initial content, the region when remember is called with C-u.
+ If %i is indented, the entire inserted text will be indented
+ as well.
+ %c content of the clipboard, or current kill ring head
+ %^g prompt for tags, with completion on tags in target file
+ %^G prompt for tags, with completion all tags in all agenda files
+ %:keyword specific information for certain link types, see below
+ %[pathname] insert the contents of the file given by `pathname'
+ %(sexp) evaluate elisp `(sexp)' and replace with the result
+ %! Store this note immediately after filling the template
+
+ %? After completing the template, position cursor here.
+
+Apart from these general escapes, you can access information specific to the
+link type that is created. For example, calling `remember' in emails or gnus
+will record the author and the subject of the message, which you can access
+with %:author and %:subject, respectively. Here is a complete list of what
+is recorded for each link type.
+
+Link type | Available information
+-------------------+------------------------------------------------------
+bbdb | %:type %:name %:company
+vm, wl, mh, rmail | %:type %:subject %:message-id
+ | %:from %:fromname %:fromaddress
+ | %:to %:toname %:toaddress
+ | %:fromto (either \"to NAME\" or \"from NAME\")
+gnus | %:group, for messages also all email fields
+w3, w3m | %:type %:url
+info | %:type %:file %:node
+calendar | %:type %:date"
+ :group 'org-remember
+ :get (lambda (var) ; Make sure all entries have 5 elements
+ (mapcar (lambda (x)
+ (if (not (stringp (car x))) (setq x (cons "" x)))
+ (cond ((= (length x) 4) (append x '("")))
+ ((= (length x) 3) (append x '("" "")))
+ (t x)))
+ (default-value var)))
+ :type '(repeat
+ :tag "enabled"
+ (list :value ("" ?a "\n" nil nil)
+ (string :tag "Name")
+ (character :tag "Selection Key")
+ (string :tag "Template")
+ (choice
+ (file :tag "Destination file")
+ (const :tag "Prompt for file" nil))
+ (choice
+ (string :tag "Destination headline")
+ (const :tag "Selection interface for heading")))))
+
+(defcustom org-reverse-note-order nil
+ "Non-nil means, store new notes at the beginning of a file or entry.
+When nil, new notes will be filed to the end of a file or entry.
+This can also be a list with cons cells of regular expressions that
+are matched against file names, and values."
+ :group 'org-remember
+ :type '(choice
+ (const :tag "Reverse always" t)
+ (const :tag "Reverse never" nil)
+ (repeat :tag "By file name regexp"
+ (cons regexp boolean))))
+
+(defcustom org-refile-targets '((nil . (:level . 1)))
+ "Targets for refiling entries with \\[org-refile].
+This is list of cons cells. Each cell contains:
+- a specification of the files to be considered, either a list of files,
+ or a symbol whose function or value fields will be used to retrieve
+ a file name or a list of file names. Nil means, refile to a different
+ heading in the current buffer.
+- A specification of how to find candidate refile targets. This may be
+ any of
+ - a cons cell (:tag . \"TAG\") to identify refile targes by a tag.
+ This tag has to be present in all target headlines, inheritance will
+ not be considered.
+ - a cons cell (:todo . \"KEYWORD\" to identify refile targets by
+ todo keyword.
+ - a cons cell (:regexp . \"REGEXP\") with a regular expression matching
+ headlines that are refiling targets.
+ - a cons cell (:level . N). Any headline of level N is considered a target.
+ - a cons cell (:maxlevel . N). Any headline with level <= N is a target."
+;; FIXME: what if there are a var and func with same name???
+ :group 'org-remember
+ :type '(repeat
+ (cons
+ (choice :value org-agenda-files
+ (const :tag "All agenda files" org-agenda-files)
+ (const :tag "Current buffer" nil)
+ (function) (variable) (file))
+ (choice :tag "Identify target headline by"
+ (cons :tag "Specific tag" (const :tag) (string))
+ (cons :tag "TODO keyword" (const :todo) (string))
+ (cons :tag "Regular expression" (const :regexp) (regexp))
+ (cons :tag "Level number" (const :level) (integer))
+ (cons :tag "Max Level number" (const :maxlevel) (integer))))))
+
+(defcustom org-refile-use-outline-path nil
+ "Non-nil means, provide refile targets as paths.
+So a level 3 headline will be available as level1/level2/level3.
+When the value is `file', also include the file name (without directory)
+into the path. When `full-file-path', include the full file path."
+ :group 'org-remember
+ :type '(choice
+ (const :tag "Not" nil)
+ (const :tag "Yes" t)
+ (const :tag "Start with file name" file)
+ (const :tag "Start with full file path" full-file-path)))
+
+(defgroup org-todo nil
+ "Options concerning TODO items in Org-mode."
+ :tag "Org TODO"
+ :group 'org)
+
+(defgroup org-progress nil
+ "Options concerning Progress logging in Org-mode."
+ :tag "Org Progress"
+ :group 'org-time)
+
+(defcustom org-todo-keywords '((sequence "TODO" "DONE"))
+ "List of TODO entry keyword sequences and their interpretation.
+\\<org-mode-map>This is a list of sequences.
+
+Each sequence starts with a symbol, either `sequence' or `type',
+indicating if the keywords should be interpreted as a sequence of
+action steps, or as different types of TODO items. The first
+keywords are states requiring action - these states will select a headline
+for inclusion into the global TODO list Org-mode produces. If one of
+the \"keywords\" is the vertical bat \"|\" the remaining keywords
+signify that no further action is necessary. If \"|\" is not found,
+the last keyword is treated as the only DONE state of the sequence.
+
+The command \\[org-todo] cycles an entry through these states, and one
+additional state where no keyword is present. For details about this
+cycling, see the manual.
+
+TODO keywords and interpretation can also be set on a per-file basis with
+the special #+SEQ_TODO and #+TYP_TODO lines.
+
+For backward compatibility, this variable may also be just a list
+of keywords - in this case the interptetation (sequence or type) will be
+taken from the (otherwise obsolete) variable `org-todo-interpretation'."
+ :group 'org-todo
+ :group 'org-keywords
+ :type '(choice
+ (repeat :tag "Old syntax, just keywords"
+ (string :tag "Keyword"))
+ (repeat :tag "New syntax"
+ (cons
+ (choice
+ :tag "Interpretation"
+ (const :tag "Sequence (cycling hits every state)" sequence)
+ (const :tag "Type (cycling directly to DONE)" type))
+ (repeat
+ (string :tag "Keyword"))))))
+
+(defvar org-todo-keywords-1 nil)
+(make-variable-buffer-local 'org-todo-keywords-1)
+(defvar org-todo-keywords-for-agenda nil)
+(defvar org-done-keywords-for-agenda nil)
+(defvar org-not-done-keywords nil)
+(make-variable-buffer-local 'org-not-done-keywords)
+(defvar org-done-keywords nil)
+(make-variable-buffer-local 'org-done-keywords)
+(defvar org-todo-heads nil)
+(make-variable-buffer-local 'org-todo-heads)
+(defvar org-todo-sets nil)
+(make-variable-buffer-local 'org-todo-sets)
+(defvar org-todo-log-states nil)
+(make-variable-buffer-local 'org-todo-log-states)
+(defvar org-todo-kwd-alist nil)
+(make-variable-buffer-local 'org-todo-kwd-alist)
+(defvar org-todo-key-alist nil)
+(make-variable-buffer-local 'org-todo-key-alist)
+(defvar org-todo-key-trigger nil)
+(make-variable-buffer-local 'org-todo-key-trigger)
+
+(defcustom org-todo-interpretation 'sequence
+ "Controls how TODO keywords are interpreted.
+This variable is in principle obsolete and is only used for
+backward compatibility, if the interpretation of todo keywords is
+not given already in `org-todo-keywords'. See that variable for
+more information."
+ :group 'org-todo
+ :group 'org-keywords
+ :type '(choice (const sequence)
+ (const type)))
+
+(defcustom org-use-fast-todo-selection 'prefix
+ "Non-nil means, use the fast todo selection scheme with C-c C-t.
+This variable describes if and under what circumstances the cycling
+mechanism for TODO keywords will be replaced by a single-key, direct
+selection scheme.
+
+When nil, fast selection is never used.
+
+When the symbol `prefix', it will be used when `org-todo' is called with
+a prefix argument, i.e. `C-u C-c C-t' in an Org-mode buffer, and `C-u t'
+in an agenda buffer.
+
+When t, fast selection is used by default. In this case, the prefix
+argument forces cycling instead.
+
+In all cases, the special interface is only used if access keys have actually
+been assigned by the user, i.e. if keywords in the configuration are followed
+by a letter in parenthesis, like TODO(t)."
+ :group 'org-todo
+ :type '(choice
+ (const :tag "Never" nil)
+ (const :tag "By default" t)
+ (const :tag "Only with C-u C-c C-t" prefix)))
+
+(defcustom org-after-todo-state-change-hook nil
+ "Hook which is run after the state of a TODO item was changed.
+The new state (a string with a TODO keyword, or nil) is available in the
+Lisp variable `state'."
+ :group 'org-todo
+ :type 'hook)
+
+(defcustom org-log-done nil
+ "When set, insert a (non-active) time stamp when TODO entry is marked DONE.
+When the state of an entry is changed from nothing or a DONE state to
+a not-done TODO state, remove a previous closing date.
+
+This can also be a list of symbols indicating under which conditions
+the time stamp recording the action should be annotated with a short note.
+Valid members of this list are
+
+ done Offer to record a note when marking entries done
+ state Offer to record a note whenever changing the TODO state
+ of an item. This is only relevant if TODO keywords are
+ interpreted as sequence, see variable `org-todo-interpretation'.
+ When `state' is set, this includes tracking `done'.
+ clock-out Offer to record a note when clocking out of an item.
+
+A separate window will then pop up and allow you to type a note.
+After finishing with C-c C-c, the note will be added directly after the
+timestamp, as a plain list item. See also the variable
+`org-log-note-headings'.
+
+Logging can also be configured on a per-file basis by adding one of
+the following lines anywhere in the buffer:
+
+ #+STARTUP: logdone
+ #+STARTUP: nologging
+ #+STARTUP: lognotedone
+ #+STARTUP: lognotestate
+ #+STARTUP: lognoteclock-out
+
+You can have local logging settings for a subtree by setting the LOGGING
+property to one or more of these keywords."
+ :group 'org-todo
+ :group 'org-progress
+ :type '(choice
+ (const :tag "off" nil)
+ (const :tag "on" t)
+ (set :tag "on, with notes, detailed control" :greedy t :value (done)
+ (const :tag "when item is marked DONE" done)
+ (const :tag "when TODO state changes" state)
+ (const :tag "when clocking out" clock-out))))
+
+(defcustom org-log-done-with-time t
+ "Non-nil means, the CLOSED time stamp will contain date and time.
+When nil, only the date will be recorded."
+ :group 'org-progress
+ :type 'boolean)
+
+(defcustom org-log-note-headings
+ '((done . "CLOSING NOTE %t")
+ (state . "State %-12s %t")
+ (clock-out . ""))
+ "Headings for notes added when clocking out or closing TODO items.
+The value is an alist, with the car being a symbol indicating the note
+context, and the cdr is the heading to be used. The heading may also be the
+empty string.
+%t in the heading will be replaced by a time stamp.
+%s will be replaced by the new TODO state, in double quotes.
+%u will be replaced by the user name.
+%U will be replaced by the full user name."
+ :group 'org-todo
+ :group 'org-progress
+ :type '(list :greedy t
+ (cons (const :tag "Heading when closing an item" done) string)
+ (cons (const :tag
+ "Heading when changing todo state (todo sequence only)"
+ state) string)
+ (cons (const :tag "Heading when clocking out" clock-out) string)))
+
+(defcustom org-log-states-order-reversed t
+ "Non-nil means, the latest state change note will be directly after heading.
+When nil, the notes will be orderer according to time."
+ :group 'org-todo
+ :group 'org-progress
+ :type 'boolean)
+
+(defcustom org-log-repeat t
+ "Non-nil means, prompt for a note when REPEAT is resetting a TODO entry.
+When nil, no note will be taken.
+This option can also be set with on a per-file-basis with
+
+ #+STARTUP: logrepeat
+ #+STARTUP: nologrepeat
+
+You can have local logging settings for a subtree by setting the LOGGING
+property to one or more of these keywords."
+ :group 'org-todo
+ :group 'org-progress
+ :type 'boolean)
+
+(defcustom org-clock-into-drawer 2
+ "Should clocking info be wrapped into a drawer?
+When t, clocking info will always be inserted into a :CLOCK: drawer.
+If necessary, the drawer will be created.
+When nil, the drawer will not be created, but used when present.
+When an integer and the number of clocking entries in an item
+reaches or exceeds this number, a drawer will be created."
+ :group 'org-todo
+ :group 'org-progress
+ :type '(choice
+ (const :tag "Always" t)
+ (const :tag "Only when drawer exists" nil)
+ (integer :tag "When at least N clock entries")))
+
+(defcustom org-clock-out-when-done t
+ "When t, the clock will be stopped when the relevant entry is marked DONE.
+Nil means, clock will keep running until stopped explicitly with
+`C-c C-x C-o', or until the clock is started in a different item."
+ :group 'org-progress
+ :type 'boolean)
+
+(defcustom org-clock-in-switch-to-state nil
+ "Set task to a special todo state while clocking it.
+The value should be the state to which the entry should be switched."
+ :group 'org-progress
+ :group 'org-todo
+ :type '(choice
+ (const :tag "Don't force a state" nil)
+ (string :tag "State")))
+
+(defgroup org-priorities nil
+ "Priorities in Org-mode."
+ :tag "Org Priorities"
+ :group 'org-todo)
+
+(defcustom org-highest-priority ?A
+ "The highest priority of TODO items. A character like ?A, ?B etc.
+Must have a smaller ASCII number than `org-lowest-priority'."
+ :group 'org-priorities
+ :type 'character)
+
+(defcustom org-lowest-priority ?C
+ "The lowest priority of TODO items. A character like ?A, ?B etc.
+Must have a larger ASCII number than `org-highest-priority'."
+ :group 'org-priorities
+ :type 'character)
+
+(defcustom org-default-priority ?B
+ "The default priority of TODO items.
+This is the priority an item get if no explicit priority is given."
+ :group 'org-priorities
+ :type 'character)
+
+(defcustom org-priority-start-cycle-with-default t
+ "Non-nil means, start with default priority when starting to cycle.
+When this is nil, the first step in the cycle will be (depending on the
+command used) one higher or lower that the default priority."
+ :group 'org-priorities
+ :type 'boolean)
+
+(defgroup org-time nil
+ "Options concerning time stamps and deadlines in Org-mode."
+ :tag "Org Time"
+ :group 'org)
+
+(defcustom org-insert-labeled-timestamps-at-point nil
+ "Non-nil means, SCHEDULED and DEADLINE timestamps are inserted at point.
+When nil, these labeled time stamps are forces into the second line of an
+entry, just after the headline. When scheduling from the global TODO list,
+the time stamp will always be forced into the second line."
+ :group 'org-time
+ :type 'boolean)
+
+(defconst org-time-stamp-formats '("<%Y-%m-%d %a>" . "<%Y-%m-%d %a %H:%M>")
+ "Formats for `format-time-string' which are used for time stamps.
+It is not recommended to change this constant.")
+
+(defcustom org-time-stamp-rounding-minutes 0
+ "Number of minutes to round time stamps to upon insertion.
+When zero, insert the time unmodified. Useful rounding numbers
+should be factors of 60, so for example 5, 10, 15.
+When this is not zero, you can still force an exact time-stamp by using
+a double prefix argument to a time-stamp command like `C-c .' or `C-c !'."
+ :group 'org-time
+ :type 'integer)
+
+(defcustom org-display-custom-times nil
+ "Non-nil means, overlay custom formats over all time stamps.
+The formats are defined through the variable `org-time-stamp-custom-formats'.
+To turn this on on a per-file basis, insert anywhere in the file:
+ #+STARTUP: customtime"
+ :group 'org-time
+ :set 'set-default
+ :type 'sexp)
+(make-variable-buffer-local 'org-display-custom-times)
+
+(defcustom org-time-stamp-custom-formats
+ '("<%m/%d/%y %a>" . "<%m/%d/%y %a %H:%M>") ; american
+ "Custom formats for time stamps. See `format-time-string' for the syntax.
+These are overlayed over the default ISO format if the variable
+`org-display-custom-times' is set. Time like %H:%M should be at the
+end of the second format."
+ :group 'org-time
+ :type 'sexp)
+
+(defun org-time-stamp-format (&optional long inactive)
+ "Get the right format for a time string."
+ (let ((f (if long (cdr org-time-stamp-formats)
+ (car org-time-stamp-formats))))
+ (if inactive
+ (concat "[" (substring f 1 -1) "]")
+ f)))
+
+(defcustom org-read-date-prefer-future t
+ "Non-nil means, assume future for incomplete date input from user.
+This affects the following situations:
+1. The user gives a day, but no month.
+ For example, if today is the 15th, and you enter \"3\", Org-mode will
+ read this as the third of *next* month. However, if you enter \"17\",
+ it will be considered as *this* month.
+2. The user gives a month but not a year.
+ For example, if it is april and you enter \"feb 2\", this will be read
+ as feb 2, *next* year. \"May 5\", however, will be this year.
+
+When this option is nil, the current month and year will always be used
+as defaults."
+ :group 'org-time
+ :type 'boolean)
+
+(defcustom org-read-date-display-live t
+ "Non-nil means, display current interpretation of date prompt live.
+This display will be in an overlay, in the minibuffer."
+ :group 'org-time
+ :type 'boolean)
+
+(defcustom org-read-date-popup-calendar t
+ "Non-nil means, pop up a calendar when prompting for a date.
+In the calendar, the date can be selected with mouse-1. However, the
+minibuffer will also be active, and you can simply enter the date as well.
+When nil, only the minibuffer will be available."
+ :group 'org-time
+ :type 'boolean)
+(if (fboundp 'defvaralias)
+ (defvaralias 'org-popup-calendar-for-date-prompt
+ 'org-read-date-popup-calendar))
+
+(defcustom org-extend-today-until 0
+ "The hour when your day really ends.
+This has influence for the following applications:
+- When switching the agenda to \"today\". It it is still earlier than
+ the time given here, the day recognized as TODAY is actually yesterday.
+- When a date is read from the user and it is still before the time given
+ here, the current date and time will be assumed to be yesterday, 23:59.
+
+FIXME:
+IMPORTANT: This is still a very experimental feature, it may disappear
+again or it may be extended to mean more things."
+ :group 'org-time
+ :type 'number)
+
+(defcustom org-edit-timestamp-down-means-later nil
+ "Non-nil means, S-down will increase the time in a time stamp.
+When nil, S-up will increase."
+ :group 'org-time
+ :type 'boolean)
+
+(defcustom org-calendar-follow-timestamp-change t
+ "Non-nil means, make the calendar window follow timestamp changes.
+When a timestamp is modified and the calendar window is visible, it will be
+moved to the new date."
+ :group 'org-time
+ :type 'boolean)
+
+(defcustom org-clock-heading-function nil
+ "When non-nil, should be a function to create `org-clock-heading'.
+This is the string shown in the mode line when a clock is running.
+The function is called with point at the beginning of the headline."
+ :group 'org-time ; FIXME: Should we have a separate group????
+ :type 'function)
+
+(defgroup org-tags nil
+ "Options concerning tags in Org-mode."
+ :tag "Org Tags"
+ :group 'org)
+
+(defcustom org-tag-alist nil
+ "List of tags allowed in Org-mode files.
+When this list is nil, Org-mode will base TAG input on what is already in the
+buffer.
+The value of this variable is an alist, the car of each entry must be a
+keyword as a string, the cdr may be a character that is used to select
+that tag through the fast-tag-selection interface.
+See the manual for details."
+ :group 'org-tags
+ :type '(repeat
+ (choice
+ (cons (string :tag "Tag name")
+ (character :tag "Access char"))
+ (const :tag "Start radio group" (:startgroup))
+ (const :tag "End radio group" (:endgroup)))))
+
+(defcustom org-use-fast-tag-selection 'auto
+ "Non-nil means, use fast tag selection scheme.
+This is a special interface to select and deselect tags with single keys.
+When nil, fast selection is never used.
+When the symbol `auto', fast selection is used if and only if selection
+characters for tags have been configured, either through the variable
+`org-tag-alist' or through a #+TAGS line in the buffer.
+When t, fast selection is always used and selection keys are assigned
+automatically if necessary."
+ :group 'org-tags
+ :type '(choice
+ (const :tag "Always" t)
+ (const :tag "Never" nil)
+ (const :tag "When selection characters are configured" 'auto)))
+
+(defcustom org-fast-tag-selection-single-key nil
+ "Non-nil means, fast tag selection exits after first change.
+When nil, you have to press RET to exit it.
+During fast tag selection, you can toggle this flag with `C-c'.
+This variable can also have the value `expert'. In this case, the window
+displaying the tags menu is not even shown, until you press C-c again."
+ :group 'org-tags
+ :type '(choice
+ (const :tag "No" nil)
+ (const :tag "Yes" t)
+ (const :tag "Expert" expert)))
+
+(defvar org-fast-tag-selection-include-todo nil
+ "Non-nil means, fast tags selection interface will also offer TODO states.
+This is an undocumented feature, you should not rely on it.")
+
+(defcustom org-tags-column -80
+ "The column to which tags should be indented in a headline.
+If this number is positive, it specifies the column. If it is negative,
+it means that the tags should be flushright to that column. For example,
+-80 works well for a normal 80 character screen."
+ :group 'org-tags
+ :type 'integer)
+
+(defcustom org-auto-align-tags t
+ "Non-nil means, realign tags after pro/demotion of TODO state change.
+These operations change the length of a headline and therefore shift
+the tags around. With this options turned on, after each such operation
+the tags are again aligned to `org-tags-column'."
+ :group 'org-tags
+ :type 'boolean)
+
+(defcustom org-use-tag-inheritance t
+ "Non-nil means, tags in levels apply also for sublevels.
+When nil, only the tags directly given in a specific line apply there.
+If you turn off this option, you very likely want to turn on the
+companion option `org-tags-match-list-sublevels'."
+ :group 'org-tags
+ :type 'boolean)
+
+(defcustom org-tags-match-list-sublevels nil
+ "Non-nil means list also sublevels of headlines matching tag search.
+Because of tag inheritance (see variable `org-use-tag-inheritance'),
+the sublevels of a headline matching a tag search often also match
+the same search. Listing all of them can create very long lists.
+Setting this variable to nil causes subtrees of a match to be skipped.
+This option is off by default, because inheritance in on. If you turn
+inheritance off, you very likely want to turn this option on.
+
+As a special case, if the tag search is restricted to TODO items, the
+value of this variable is ignored and sublevels are always checked, to
+make sure all corresponding TODO items find their way into the list."
+ :group 'org-tags
+ :type 'boolean)
+
+(defvar org-tags-history nil
+ "History of minibuffer reads for tags.")
+(defvar org-last-tags-completion-table nil
+ "The last used completion table for tags.")
+(defvar org-after-tags-change-hook nil
+ "Hook that is run after the tags in a line have changed.")
+
+(defgroup org-properties nil
+ "Options concerning properties in Org-mode."
+ :tag "Org Properties"
+ :group 'org)
+
+(defcustom org-property-format "%-10s %s"
+ "How property key/value pairs should be formatted by `indent-line'.
+When `indent-line' hits a property definition, it will format the line
+according to this format, mainly to make sure that the values are
+lined-up with respect to each other."
+ :group 'org-properties
+ :type 'string)
+
+(defcustom org-use-property-inheritance nil
+ "Non-nil means, properties apply also for sublevels.
+This setting is only relevant during property searches, not when querying
+an entry with `org-entry-get'. To retrieve a property with inheritance,
+you need to call `org-entry-get' with the inheritance flag.
+Turning this on can cause significant overhead when doing a search, so
+this is turned off by default.
+When nil, only the properties directly given in the current entry count.
+The value may also be a list of properties that shouldhave inheritance.
+
+However, note that some special properties use inheritance under special
+circumstances (not in searches). Examples are CATEGORY, ARCHIVE, COLUMNS,
+and the properties ending in \"_ALL\" when they are used as descriptor
+for valid values of a property."
+ :group 'org-properties
+ :type '(choice
+ (const :tag "Not" nil)
+ (const :tag "Always" nil)
+ (repeat :tag "Specific properties" (string :tag "Property"))))
+
+(defcustom org-columns-default-format "%25ITEM %TODO %3PRIORITY %TAGS"
+ "The default column format, if no other format has been defined.
+This variable can be set on the per-file basis by inserting a line
+
+#+COLUMNS: %25ITEM ....."
+ :group 'org-properties
+ :type 'string)
+
+(defcustom org-global-properties nil
+ "List of property/value pairs that can be inherited by any entry.
+You can set buffer-local values for this by adding lines like
+
+#+PROPERTY: NAME VALUE"
+ :group 'org-properties
+ :type '(repeat
+ (cons (string :tag "Property")
+ (string :tag "Value"))))
+
+(defvar org-local-properties nil
+ "List of property/value pairs that can be inherited by any entry.
+Valid for the current buffer.
+This variable is populated from #+PROPERTY lines.")
+
+(defgroup org-agenda nil
+ "Options concerning agenda views in Org-mode."
+ :tag "Org Agenda"
+ :group 'org)
+
+(defvar org-category nil
+ "Variable used by org files to set a category for agenda display.
+Such files should use a file variable to set it, for example
+
+# -*- mode: org; org-category: \"ELisp\"
+
+or contain a special line
+
+#+CATEGORY: ELisp
+
+If the file does not specify a category, then file's base name
+is used instead.")
+(make-variable-buffer-local 'org-category)
+
+(defcustom org-agenda-files nil
+ "The files to be used for agenda display.
+Entries may be added to this list with \\[org-agenda-file-to-front] and removed with
+\\[org-remove-file]. You can also use customize to edit the list.
+
+If an entry is a directory, all files in that directory that are matched by
+`org-agenda-file-regexp' will be part of the file list.
+
+If the value of the variable is not a list but a single file name, then
+the list of agenda files is actually stored and maintained in that file, one
+agenda file per line."
+ :group 'org-agenda
+ :type '(choice
+ (repeat :tag "List of files and directories" file)
+ (file :tag "Store list in a file\n" :value "~/.agenda_files")))
+
+(defcustom org-agenda-file-regexp "\\`[^.].*\\.org\\'"
+ "Regular expression to match files for `org-agenda-files'.
+If any element in the list in that variable contains a directory instead
+of a normal file, all files in that directory that are matched by this
+regular expression will be included."
+ :group 'org-agenda
+ :type 'regexp)
+
+(defcustom org-agenda-skip-unavailable-files nil
+ "t means to just skip non-reachable files in `org-agenda-files'.
+Nil means to remove them, after a query, from the list."
+ :group 'org-agenda
+ :type 'boolean)
+
+(defcustom org-agenda-multi-occur-extra-files nil
+ "List of extra files to be searched by `org-occur-in-agenda-files'.
+The files in `org-agenda-files' are always searched."
+ :group 'org-agenda
+ :type '(repeat file))
+
+(defcustom org-agenda-confirm-kill 1
+ "When set, remote killing from the agenda buffer needs confirmation.
+When t, a confirmation is always needed. When a number N, confirmation is
+only needed when the text to be killed contains more than N non-white lines."
+ :group 'org-agenda
+ :type '(choice
+ (const :tag "Never" nil)
+ (const :tag "Always" t)
+ (number :tag "When more than N lines")))
+
+(defcustom org-calendar-to-agenda-key [?c]
+ "The key to be installed in `calendar-mode-map' for switching to the agenda.
+The command `org-calendar-goto-agenda' will be bound to this key. The
+default is the character `c' because then `c' can be used to switch back and
+forth between agenda and calendar."
+ :group 'org-agenda
+ :type 'sexp)
+
+(defcustom org-agenda-compact-blocks nil
+ "Non-nil means, make the block agenda more compact.
+This is done by leaving out unnecessary lines."
+ :group 'org-agenda
+ :type nil)
+
+(defgroup org-agenda-export nil
+ "Options concerning exporting agenda views in Org-mode."
+ :tag "Org Agenda Export"
+ :group 'org-agenda)
+
+(defcustom org-agenda-with-colors t
+ "Non-nil means, use colors in agenda views."
+ :group 'org-agenda-export
+ :type 'boolean)
+
+(defcustom org-agenda-exporter-settings nil
+ "Alist of variable/value pairs that should be active during agenda export.
+This is a good place to set uptions for ps-print and for htmlize."
+ :group 'org-agenda-export
+ :type '(repeat
+ (list
+ (variable)
+ (sexp :tag "Value"))))
+
+(defcustom org-agenda-export-html-style ""
+ "The style specification for exported HTML Agenda files.
+If this variable contains a string, it will replace the default <style>
+section as produced by `htmlize'.
+Since there are different ways of setting style information, this variable
+needs to contain the full HTML structure to provide a style, including the
+surrounding HTML tags. The style specifications should include definitions
+the fonts used by the agenda, here is an example:
+
+ <style type=\"text/css\">
+ p { font-weight: normal; color: gray; }
+ .org-agenda-structure {
+ font-size: 110%;
+ color: #003399;
+ font-weight: 600;
+ }
+ .org-todo {
+ color: #cc6666;Week-agenda:
+ font-weight: bold;
+ }
+ .org-done {
+ color: #339933;
+ }
+ .title { text-align: center; }
+ .todo, .deadline { color: red; }
+ .done { color: green; }
+ </style>
+
+or, if you want to keep the style in a file,
+
+ <link rel=\"stylesheet\" type=\"text/css\" href=\"mystyles.css\">
+
+As the value of this option simply gets inserted into the HTML <head> header,
+you can \"misuse\" it to also add other text to the header. However,
+<style>...</style> is required, if not present the variable will be ignored."
+ :group 'org-agenda-export
+ :group 'org-export-html
+ :type 'string)
+
+(defgroup org-agenda-custom-commands nil
+ "Options concerning agenda views in Org-mode."
+ :tag "Org Agenda Custom Commands"
+ :group 'org-agenda)
+
+(defcustom org-agenda-custom-commands nil
+ "Custom commands for the agenda.
+These commands will be offered on the splash screen displayed by the
+agenda dispatcher \\[org-agenda]. Each entry is a list like this:
+
+ (key desc type match options files)
+
+key The key (one or more characters as a string) to be associated
+ with the command.
+desc A description of the commend, when omitted or nil, a default
+ description is built using MATCH.
+type The command type, any of the following symbols:
+ todo Entries with a specific TODO keyword, in all agenda files.
+ tags Tags match in all agenda files.
+ tags-todo Tags match in all agenda files, TODO entries only.
+ todo-tree Sparse tree of specific TODO keyword in *current* file.
+ tags-tree Sparse tree with all tags matches in *current* file.
+ occur-tree Occur sparse tree for *current* file.
+ ... A user-defined function.
+match What to search for:
+ - a single keyword for TODO keyword searches
+ - a tags match expression for tags searches
+ - a regular expression for occur searches
+options A list of option settings, similar to that in a let form, so like
+ this: ((opt1 val1) (opt2 val2) ...)
+files A list of files file to write the produced agenda buffer to
+ with the command `org-store-agenda-views'.
+ If a file name ends in \".html\", an HTML version of the buffer
+ is written out. If it ends in \".ps\", a postscript version is
+ produced. Otherwide, only the plain text is written to the file.
+
+You can also define a set of commands, to create a composite agenda buffer.
+In this case, an entry looks like this:
+
+ (key desc (cmd1 cmd2 ...) general-options file)
+
+where
+
+desc A description string to be displayed in the dispatcher menu.
+cmd An agenda command, similar to the above. However, tree commands
+ are no allowed, but instead you can get agenda and global todo list.
+ So valid commands for a set are:
+ (agenda)
+ (alltodo)
+ (stuck)
+ (todo \"match\" options files)
+ (tags \"match\" options files)
+ (tags-todo \"match\" options files)
+
+Each command can carry a list of options, and another set of options can be
+given for the whole set of commands. Individual command options take
+precedence over the general options.
+
+When using several characters as key to a command, the first characters
+are prefix commands. For the dispatcher to display useful information, you
+should provide a description for the prefix, like
+
+ (setq org-agenda-custom-commands
+ '((\"h\" . \"HOME + Name tag searches\") ; describe prefix \"h\"
+ (\"hl\" tags \"+HOME+Lisa\")
+ (\"hp\" tags \"+HOME+Peter\")
+ (\"hk\" tags \"+HOME+Kim\")))"
+ :group 'org-agenda-custom-commands
+ :type '(repeat
+ (choice :value ("a" "" tags "" nil)
+ (list :tag "Single command"
+ (string :tag "Access Key(s) ")
+ (option (string :tag "Description"))
+ (choice
+ (const :tag "Agenda" agenda)
+ (const :tag "TODO list" alltodo)
+ (const :tag "Stuck projects" stuck)
+ (const :tag "Tags search (all agenda files)" tags)
+ (const :tag "Tags search of TODO entries (all agenda files)" tags-todo)
+ (const :tag "TODO keyword search (all agenda files)" todo)
+ (const :tag "Tags sparse tree (current buffer)" tags-tree)
+ (const :tag "TODO keyword tree (current buffer)" todo-tree)
+ (const :tag "Occur tree (current buffer)" occur-tree)
+ (sexp :tag "Other, user-defined function"))
+ (string :tag "Match")
+ (repeat :tag "Local options"
+ (list (variable :tag "Option") (sexp :tag "Value")))
+ (option (repeat :tag "Export" (file :tag "Export to"))))
+ (list :tag "Command series, all agenda files"
+ (string :tag "Access Key(s)")
+ (string :tag "Description ")
+ (repeat
+ (choice
+ (const :tag "Agenda" (agenda))
+ (const :tag "TODO list" (alltodo))
+ (const :tag "Stuck projects" (stuck))
+ (list :tag "Tags search"
+ (const :format "" tags)
+ (string :tag "Match")
+ (repeat :tag "Local options"
+ (list (variable :tag "Option")
+ (sexp :tag "Value"))))
+
+ (list :tag "Tags search, TODO entries only"
+ (const :format "" tags-todo)
+ (string :tag "Match")
+ (repeat :tag "Local options"
+ (list (variable :tag "Option")
+ (sexp :tag "Value"))))
+
+ (list :tag "TODO keyword search"
+ (const :format "" todo)
+ (string :tag "Match")
+ (repeat :tag "Local options"
+ (list (variable :tag "Option")
+ (sexp :tag "Value"))))
+
+ (list :tag "Other, user-defined function"
+ (symbol :tag "function")
+ (string :tag "Match")
+ (repeat :tag "Local options"
+ (list (variable :tag "Option")
+ (sexp :tag "Value"))))))
+
+ (repeat :tag "General options"
+ (list (variable :tag "Option")
+ (sexp :tag "Value")))
+ (option (repeat :tag "Export" (file :tag "Export to"))))
+ (cons :tag "Prefix key documentation"
+ (string :tag "Access Key(s)")
+ (string :tag "Description ")))))
+
+(defcustom org-stuck-projects
+ '("+LEVEL=2/-DONE" ("TODO" "NEXT" "NEXTACTION") nil "")
+ "How to identify stuck projects.
+This is a list of four items:
+1. A tags/todo matcher string that is used to identify a project.
+ The entire tree below a headline matched by this is considered one project.
+2. A list of TODO keywords identifying non-stuck projects.
+ If the project subtree contains any headline with one of these todo
+ keywords, the project is considered to be not stuck. If you specify
+ \"*\" as a keyword, any TODO keyword will mark the project unstuck.
+3. A list of tags identifying non-stuck projects.
+ If the project subtree contains any headline with one of these tags,
+ the project is considered to be not stuck. If you specify \"*\" as
+ a tag, any tag will mark the project unstuck.
+4. An arbitrary regular expression matching non-stuck projects.
+
+After defining this variable, you may use \\[org-agenda-list-stuck-projects]
+or `C-c a #' to produce the list."
+ :group 'org-agenda-custom-commands
+ :type '(list
+ (string :tag "Tags/TODO match to identify a project")
+ (repeat :tag "Projects are *not* stuck if they have an entry with TODO keyword any of" (string))
+ (repeat :tag "Projects are *not* stuck if they have an entry with TAG being any of" (string))
+ (regexp :tag "Projects are *not* stuck if this regexp matches\ninside the subtree")))
+
+
+(defgroup org-agenda-skip nil
+ "Options concerning skipping parts of agenda files."
+ :tag "Org Agenda Skip"
+ :group 'org-agenda)
+
+(defcustom org-agenda-todo-list-sublevels t
+ "Non-nil means, check also the sublevels of a TODO entry for TODO entries.
+When nil, the sublevels of a TODO entry are not checked, resulting in
+potentially much shorter TODO lists."
+ :group 'org-agenda-skip
+ :group 'org-todo
+ :type 'boolean)
+
+(defcustom org-agenda-todo-ignore-with-date nil
+ "Non-nil means, don't show entries with a date in the global todo list.
+You can use this if you prefer to mark mere appointments with a TODO keyword,
+but don't want them to show up in the TODO list.
+When this is set, it also covers deadlines and scheduled items, the settings
+of `org-agenda-todo-ignore-scheduled' and `org-agenda-todo-ignore-deadlines'
+will be ignored."
+ :group 'org-agenda-skip
+ :group 'org-todo
+ :type 'boolean)
+
+(defcustom org-agenda-todo-ignore-scheduled nil
+ "Non-nil means, don't show scheduled entries in the global todo list.
+The idea behind this is that by scheduling it, you have already taken care
+of this item.
+See also `org-agenda-todo-ignore-with-date'."
+ :group 'org-agenda-skip
+ :group 'org-todo
+ :type 'boolean)
+
+(defcustom org-agenda-todo-ignore-deadlines nil
+ "Non-nil means, don't show near deadline entries in the global todo list.
+Near means closer than `org-deadline-warning-days' days.
+The idea behind this is that such items will appear in the agenda anyway.
+See also `org-agenda-todo-ignore-with-date'."
+ :group 'org-agenda-skip
+ :group 'org-todo
+ :type 'boolean)
+
+(defcustom org-agenda-skip-scheduled-if-done nil
+ "Non-nil means don't show scheduled items in agenda when they are done.
+This is relevant for the daily/weekly agenda, not for the TODO list. And
+it applies only to the actual date of the scheduling. Warnings about
+an item with a past scheduling dates are always turned off when the item
+is DONE."
+ :group 'org-agenda-skip
+ :type 'boolean)
+
+(defcustom org-agenda-skip-deadline-if-done nil
+ "Non-nil means don't show deadines when the corresponding item is done.
+When nil, the deadline is still shown and should give you a happy feeling.
+This is relevant for the daily/weekly agenda. And it applied only to the
+actualy date of the deadline. Warnings about approching and past-due
+deadlines are always turned off when the item is DONE."
+ :group 'org-agenda-skip
+ :type 'boolean)
+
+(defcustom org-agenda-skip-timestamp-if-done nil
+ "Non-nil means don't don't select item by timestamp or -range if it is DONE."
+ :group 'org-agenda-skip
+ :type 'boolean)
+
+(defcustom org-timeline-show-empty-dates 3
+ "Non-nil means, `org-timeline' also shows dates without an entry.
+When nil, only the days which actually have entries are shown.
+When t, all days between the first and the last date are shown.
+When an integer, show also empty dates, but if there is a gap of more than
+N days, just insert a special line indicating the size of the gap."
+ :group 'org-agenda-skip
+ :type '(choice
+ (const :tag "None" nil)
+ (const :tag "All" t)
+ (number :tag "at most")))
+
+
+(defgroup org-agenda-startup nil
+ "Options concerning initial settings in the Agenda in Org Mode."
+ :tag "Org Agenda Startup"
+ :group 'org-agenda)
+
+(defcustom org-finalize-agenda-hook nil
+ "Hook run just before displaying an agenda buffer."
+ :group 'org-agenda-startup
+ :type 'hook)
+
+(defcustom org-agenda-mouse-1-follows-link nil
+ "Non-nil means, mouse-1 on a link will follow the link in the agenda.
+A longer mouse click will still set point. Does not wortk on XEmacs.
+Needs to be set before org.el is loaded."
+ :group 'org-agenda-startup
+ :type 'boolean)
+
+(defcustom org-agenda-start-with-follow-mode nil
+ "The initial value of follow-mode in a newly created agenda window."
+ :group 'org-agenda-startup
+ :type 'boolean)
+
+(defgroup org-agenda-windows nil
+ "Options concerning the windows used by the Agenda in Org Mode."
+ :tag "Org Agenda Windows"
+ :group 'org-agenda)
+
+(defcustom org-agenda-window-setup 'reorganize-frame
+ "How the agenda buffer should be displayed.
+Possible values for this option are:
+
+current-window Show agenda in the current window, keeping all other windows.
+other-frame Use `switch-to-buffer-other-frame' to display agenda.
+other-window Use `switch-to-buffer-other-window' to display agenda.
+reorganize-frame Show only two windows on the current frame, the current
+ window and the agenda.
+See also the variable `org-agenda-restore-windows-after-quit'."
+ :group 'org-agenda-windows
+ :type '(choice
+ (const current-window)
+ (const other-frame)
+ (const other-window)
+ (const reorganize-frame)))
+
+(defcustom org-agenda-window-frame-fractions '(0.5 . 0.75)
+ "The min and max height of the agenda window as a fraction of frame height.
+The value of the variable is a cons cell with two numbers between 0 and 1.
+It only matters if `org-agenda-window-setup' is `reorganize-frame'."
+ :group 'org-agenda-windows
+ :type '(cons (number :tag "Minimum") (number :tag "Maximum")))
+
+(defcustom org-agenda-restore-windows-after-quit nil
+ "Non-nil means, restore window configuration open exiting agenda.
+Before the window configuration is changed for displaying the agenda,
+the current status is recorded. When the agenda is exited with
+`q' or `x' and this option is set, the old state is restored. If
+`org-agenda-window-setup' is `other-frame', the value of this
+option will be ignored.."
+ :group 'org-agenda-windows
+ :type 'boolean)
+
+(defcustom org-indirect-buffer-display 'other-window
+ "How should indirect tree buffers be displayed?
+This applies to indirect buffers created with the commands
+\\[org-tree-to-indirect-buffer] and \\[org-agenda-tree-to-indirect-buffer].
+Valid values are:
+current-window Display in the current window
+other-window Just display in another window.
+dedicated-frame Create one new frame, and re-use it each time.
+new-frame Make a new frame each time. Note that in this case
+ previously-made indirect buffers are kept, and you need to
+ kill these buffers yourself."
+ :group 'org-structure
+ :group 'org-agenda-windows
+ :type '(choice
+ (const :tag "In current window" current-window)
+ (const :tag "In current frame, other window" other-window)
+ (const :tag "Each time a new frame" new-frame)
+ (const :tag "One dedicated frame" dedicated-frame)))
+
+(defgroup org-agenda-daily/weekly nil
+ "Options concerning the daily/weekly agenda."
+ :tag "Org Agenda Daily/Weekly"
+ :group 'org-agenda)
+
+(defcustom org-agenda-ndays 7
+ "Number of days to include in overview display.
+Should be 1 or 7."
+ :group 'org-agenda-daily/weekly
+ :type 'number)
+
+(defcustom org-agenda-start-on-weekday 1
+ "Non-nil means, start the overview always on the specified weekday.
+0 denotes Sunday, 1 denotes Monday etc.
+When nil, always start on the current day."
+ :group 'org-agenda-daily/weekly
+ :type '(choice (const :tag "Today" nil)
+ (number :tag "Weekday No.")))
+
+(defcustom org-agenda-show-all-dates t
+ "Non-nil means, `org-agenda' shows every day in the selected range.
+When nil, only the days which actually have entries are shown."
+ :group 'org-agenda-daily/weekly
+ :type 'boolean)
+
+(defcustom org-agenda-format-date 'org-agenda-format-date-aligned
+ "Format string for displaying dates in the agenda.
+Used by the daily/weekly agenda and by the timeline. This should be
+a format string understood by `format-time-string', or a function returning
+the formatted date as a string. The function must take a single argument,
+a calendar-style date list like (month day year)."
+ :group 'org-agenda-daily/weekly
+ :type '(choice
+ (string :tag "Format string")
+ (function :tag "Function")))
+
+(defun org-agenda-format-date-aligned (date)
+ "Format a date string for display in the daily/weekly agenda, or timeline.
+This function makes sure that dates are aligned for easy reading."
+ (format "%-9s %2d %s %4d"
+ (calendar-day-name date)
+ (extract-calendar-day date)
+ (calendar-month-name (extract-calendar-month date))
+ (extract-calendar-year date)))
+
+(defcustom org-agenda-include-diary nil
+ "If non-nil, include in the agenda entries from the Emacs Calendar's diary."
+ :group 'org-agenda-daily/weekly
+ :type 'boolean)
+
+(defcustom org-agenda-include-all-todo nil
+ "Set means weekly/daily agenda will always contain all TODO entries.
+The TODO entries will be listed at the top of the agenda, before
+the entries for specific days."
+ :group 'org-agenda-daily/weekly
+ :type 'boolean)
+
+(defcustom org-agenda-repeating-timestamp-show-all t
+ "Non-nil means, show all occurences of a repeating stamp in the agenda.
+When nil, only one occurence is shown, either today or the
+nearest into the future."
+ :group 'org-agenda-daily/weekly
+ :type 'boolean)
+
+(defcustom org-deadline-warning-days 14
+ "No. of days before expiration during which a deadline becomes active.
+This variable governs the display in sparse trees and in the agenda.
+When negative, it means use this number (the absolute value of it)
+even if a deadline has a different individual lead time specified."
+ :group 'org-time
+ :group 'org-agenda-daily/weekly
+ :type 'number)
+
+(defcustom org-scheduled-past-days 10000
+ "No. of days to continue listing scheduled items that are not marked DONE.
+When an item is scheduled on a date, it shows up in the agenda on this
+day and will be listed until it is marked done for the number of days
+given here."
+ :group 'org-agenda-daily/weekly
+ :type 'number)
+
+(defgroup org-agenda-time-grid nil
+ "Options concerning the time grid in the Org-mode Agenda."
+ :tag "Org Agenda Time Grid"
+ :group 'org-agenda)
+
+(defcustom org-agenda-use-time-grid t
+ "Non-nil means, show a time grid in the agenda schedule.
+A time grid is a set of lines for specific times (like every two hours between
+8:00 and 20:00). The items scheduled for a day at specific times are
+sorted in between these lines.
+For details about when the grid will be shown, and what it will look like, see
+the variable `org-agenda-time-grid'."
+ :group 'org-agenda-time-grid
+ :type 'boolean)
+
+(defcustom org-agenda-time-grid
+ '((daily today require-timed)
+ "----------------"
+ (800 1000 1200 1400 1600 1800 2000))
+
+ "The settings for time grid for agenda display.
+This is a list of three items. The first item is again a list. It contains
+symbols specifying conditions when the grid should be displayed:
+
+ daily if the agenda shows a single day
+ weekly if the agenda shows an entire week
+ today show grid on current date, independent of daily/weekly display
+ require-timed show grid only if at least one item has a time specification
+
+The second item is a string which will be places behing the grid time.
+
+The third item is a list of integers, indicating the times that should have
+a grid line."
+ :group 'org-agenda-time-grid
+ :type
+ '(list
+ (set :greedy t :tag "Grid Display Options"
+ (const :tag "Show grid in single day agenda display" daily)
+ (const :tag "Show grid in weekly agenda display" weekly)
+ (const :tag "Always show grid for today" today)
+ (const :tag "Show grid only if any timed entries are present"
+ require-timed)
+ (const :tag "Skip grid times already present in an entry"
+ remove-match))
+ (string :tag "Grid String")
+ (repeat :tag "Grid Times" (integer :tag "Time"))))
+
+(defgroup org-agenda-sorting nil
+ "Options concerning sorting in the Org-mode Agenda."
+ :tag "Org Agenda Sorting"
+ :group 'org-agenda)
+
+(defconst org-sorting-choice
+ '(choice
+ (const time-up) (const time-down)
+ (const category-keep) (const category-up) (const category-down)
+ (const tag-down) (const tag-up)
+ (const priority-up) (const priority-down))
+ "Sorting choices.")
+
+(defcustom org-agenda-sorting-strategy
+ '((agenda time-up category-keep priority-down)
+ (todo category-keep priority-down)
+ (tags category-keep priority-down))
+ "Sorting structure for the agenda items of a single day.
+This is a list of symbols which will be used in sequence to determine
+if an entry should be listed before another entry. The following
+symbols are recognized:
+
+time-up Put entries with time-of-day indications first, early first
+time-down Put entries with time-of-day indications first, late first
+category-keep Keep the default order of categories, corresponding to the
+ sequence in `org-agenda-files'.
+category-up Sort alphabetically by category, A-Z.
+category-down Sort alphabetically by category, Z-A.
+tag-up Sort alphabetically by last tag, A-Z.
+tag-down Sort alphabetically by last tag, Z-A.
+priority-up Sort numerically by priority, high priority last.
+priority-down Sort numerically by priority, high priority first.
+
+The different possibilities will be tried in sequence, and testing stops
+if one comparison returns a \"not-equal\". For example, the default
+ '(time-up category-keep priority-down)
+means: Pull out all entries having a specified time of day and sort them,
+in order to make a time schedule for the current day the first thing in the
+agenda listing for the day. Of the entries without a time indication, keep
+the grouped in categories, don't sort the categories, but keep them in
+the sequence given in `org-agenda-files'. Within each category sort by
+priority.
+
+Leaving out `category-keep' would mean that items will be sorted across
+categories by priority.
+
+Instead of a single list, this can also be a set of list for specific
+contents, with a context symbol in the car of the list, any of
+`agenda', `todo', `tags' for the corresponding agenda views."
+ :group 'org-agenda-sorting
+ :type `(choice
+ (repeat :tag "General" ,org-sorting-choice)
+ (list :tag "Individually"
+ (cons (const :tag "Strategy for Weekly/Daily agenda" agenda)
+ (repeat ,org-sorting-choice))
+ (cons (const :tag "Strategy for TODO lists" todo)
+ (repeat ,org-sorting-choice))
+ (cons (const :tag "Strategy for Tags matches" tags)
+ (repeat ,org-sorting-choice)))))
+
+(defcustom org-sort-agenda-notime-is-late t
+ "Non-nil means, items without time are considered late.
+This is only relevant for sorting. When t, items which have no explicit
+time like 15:30 will be considered as 99:01, i.e. later than any items which
+do have a time. When nil, the default time is before 0:00. You can use this
+option to decide if the schedule for today should come before or after timeless
+agenda entries."
+ :group 'org-agenda-sorting
+ :type 'boolean)
+
+(defgroup org-agenda-line-format nil
+ "Options concerning the entry prefix in the Org-mode agenda display."
+ :tag "Org Agenda Line Format"
+ :group 'org-agenda)
+
+(defcustom org-agenda-prefix-format
+ '((agenda . " %-12:c%?-12t% s")
+ (timeline . " % s")
+ (todo . " %-12:c")
+ (tags . " %-12:c"))
+ "Format specifications for the prefix of items in the agenda views.
+An alist with four entries, for the different agenda types. The keys to the
+sublists are `agenda', `timeline', `todo', and `tags'. The values
+are format strings.
+This format works similar to a printf format, with the following meaning:
+
+ %c the category of the item, \"Diary\" for entries from the diary, or
+ as given by the CATEGORY keyword or derived from the file name.
+ %T the *last* tag of the item. Last because inherited tags come
+ first in the list.
+ %t the time-of-day specification if one applies to the entry, in the
+ format HH:MM
+ %s Scheduling/Deadline information, a short string
+
+All specifiers work basically like the standard `%s' of printf, but may
+contain two additional characters: A question mark just after the `%' and
+a whitespace/punctuation character just before the final letter.
+
+If the first character after `%' is a question mark, the entire field
+will only be included if the corresponding value applies to the
+current entry. This is useful for fields which should have fixed
+width when present, but zero width when absent. For example,
+\"%?-12t\" will result in a 12 character time field if a time of the
+day is specified, but will completely disappear in entries which do
+not contain a time.
+
+If there is punctuation or whitespace character just before the final
+format letter, this character will be appended to the field value if
+the value is not empty. For example, the format \"%-12:c\" leads to
+\"Diary: \" if the category is \"Diary\". If the category were be
+empty, no additional colon would be interted.
+
+The default value of this option is \" %-12:c%?-12t% s\", meaning:
+- Indent the line with two space characters
+- Give the category in a 12 chars wide field, padded with whitespace on
+ the right (because of `-'). Append a colon if there is a category
+ (because of `:').
+- If there is a time-of-day, put it into a 12 chars wide field. If no
+ time, don't put in an empty field, just skip it (because of '?').
+- Finally, put the scheduling information and append a whitespace.
+
+As another example, if you don't want the time-of-day of entries in
+the prefix, you could use:
+
+ (setq org-agenda-prefix-format \" %-11:c% s\")
+
+See also the variables `org-agenda-remove-times-when-in-prefix' and
+`org-agenda-remove-tags'."
+ :type '(choice
+ (string :tag "General format")
+ (list :greedy t :tag "View dependent"
+ (cons (const agenda) (string :tag "Format"))
+ (cons (const timeline) (string :tag "Format"))
+ (cons (const todo) (string :tag "Format"))
+ (cons (const tags) (string :tag "Format"))))
+ :group 'org-agenda-line-format)
+
+(defvar org-prefix-format-compiled nil
+ "The compiled version of the most recently used prefix format.
+See the variable `org-agenda-prefix-format'.")
+
+(defcustom org-agenda-scheduled-leaders '("Scheduled: " "Sched.%2dx: ")
+ "Text preceeding scheduled items in the agenda view.
+THis is a list with two strings. The first applies when the item is
+scheduled on the current day. The second applies when it has been scheduled
+previously, it may contain a %d to capture how many days ago the item was
+scheduled."
+ :group 'org-agenda-line-format
+ :type '(list
+ (string :tag "Scheduled today ")
+ (string :tag "Scheduled previously")))
+
+(defcustom org-agenda-deadline-leaders '("Deadline: " "In %3d d.: ")
+ "Text preceeding deadline items in the agenda view.
+This is a list with two strings. The first applies when the item has its
+deadline on the current day. The second applies when it is in the past or
+in the future, it may contain %d to capture how many days away the deadline
+is (was)."
+ :group 'org-agenda-line-format
+ :type '(list
+ (string :tag "Deadline today ")
+ (string :tag "Deadline relative")))
+
+(defcustom org-agenda-remove-times-when-in-prefix t
+ "Non-nil means, remove duplicate time specifications in agenda items.
+When the format `org-agenda-prefix-format' contains a `%t' specifier, a
+time-of-day specification in a headline or diary entry is extracted and
+placed into the prefix. If this option is non-nil, the original specification
+\(a timestamp or -range, or just a plain time(range) specification like
+11:30-4pm) will be removed for agenda display. This makes the agenda less
+cluttered.
+The option can be t or nil. It may also be the symbol `beg', indicating
+that the time should only be removed what it is located at the beginning of
+the headline/diary entry."
+ :group 'org-agenda-line-format
+ :type '(choice
+ (const :tag "Always" t)
+ (const :tag "Never" nil)
+ (const :tag "When at beginning of entry" beg)))
+
+
+(defcustom org-agenda-default-appointment-duration nil
+ "Default duration for appointments that only have a starting time.
+When nil, no duration is specified in such cases.
+When non-nil, this must be the number of minutes, e.g. 60 for one hour."
+ :group 'org-agenda-line-format
+ :type '(choice
+ (integer :tag "Minutes")
+ (const :tag "No default duration")))
+
+
+(defcustom org-agenda-remove-tags nil
+ "Non-nil means, remove the tags from the headline copy in the agenda.
+When this is the symbol `prefix', only remove tags when
+`org-agenda-prefix-format' contains a `%T' specifier."
+ :group 'org-agenda-line-format
+ :type '(choice
+ (const :tag "Always" t)
+ (const :tag "Never" nil)
+ (const :tag "When prefix format contains %T" prefix)))
+
+(if (fboundp 'defvaralias)
+ (defvaralias 'org-agenda-remove-tags-when-in-prefix
+ 'org-agenda-remove-tags))
+
+(defcustom org-agenda-tags-column -80
+ "Shift tags in agenda items to this column.
+If this number is positive, it specifies the column. If it is negative,
+it means that the tags should be flushright to that column. For example,
+-80 works well for a normal 80 character screen."
+ :group 'org-agenda-line-format
+ :type 'integer)
+
+(if (fboundp 'defvaralias)
+ (defvaralias 'org-agenda-align-tags-to-column 'org-agenda-tags-column))
+
+(defcustom org-agenda-fontify-priorities t
+ "Non-nil means, highlight low and high priorities in agenda.
+When t, the highest priority entries are bold, lowest priority italic.
+This may also be an association list of priority faces. The face may be
+a names face, or a list like `(:background \"Red\")'."
+ :group 'org-agenda-line-format
+ :type '(choice
+ (const :tag "Never" nil)
+ (const :tag "Defaults" t)
+ (repeat :tag "Specify"
+ (list (character :tag "Priority" :value ?A)
+ (sexp :tag "face")))))
+
+(defgroup org-latex nil
+ "Options for embedding LaTeX code into Org-mode"
+ :tag "Org LaTeX"
+ :group 'org)
+
+(defcustom org-format-latex-options
+ '(:foreground default :background default :scale 1.0
+ :html-foreground "Black" :html-background "Transparent" :html-scale 1.0
+ :matchers ("begin" "$" "$$" "\\(" "\\["))
+ "Options for creating images from LaTeX fragments.
+This is a property list with the following properties:
+:foreground the foreground color for images embedded in emacs, e.g. \"Black\".
+ `default' means use the forground of the default face.
+:background the background color, or \"Transparent\".
+ `default' means use the background of the default face.
+:scale a scaling factor for the size of the images
+:html-foreground, :html-background, :html-scale
+ The same numbers for HTML export.
+:matchers a list indicating which matchers should be used to
+ find LaTeX fragments. Valid members of this list are:
+ \"begin\" find environments
+ \"$\" find math expressions surrounded by $...$
+ \"$$\" find math expressions surrounded by $$....$$
+ \"\\(\" find math expressions surrounded by \\(...\\)
+ \"\\ [\" find math expressions surrounded by \\ [...\\]"
+ :group 'org-latex
+ :type 'plist)
+
+(defcustom org-format-latex-header "\\documentclass{article}
+\\usepackage{fullpage} % do not remove
+\\usepackage{amssymb}
+\\usepackage[usenames]{color}
+\\usepackage{amsmath}
+\\usepackage{latexsym}
+\\usepackage[mathscr]{eucal}
+\\pagestyle{empty} % do not remove"
+ "The document header used for processing LaTeX fragments."
+ :group 'org-latex
+ :type 'string)
+
+(defgroup org-export nil
+ "Options for exporting org-listings."
+ :tag "Org Export"
+ :group 'org)
+
+(defgroup org-export-general nil
+ "General options for exporting Org-mode files."
+ :tag "Org Export General"
+ :group 'org-export)
+
+;; FIXME
+(defvar org-export-publishing-directory nil)
+
+(defcustom org-export-with-special-strings t
+ "Non-nil means, interpret \"\-\", \"--\" and \"---\" for export.
+When this option is turned on, these strings will be exported as:
+
+ Org HTML LaTeX
+ -----+----------+--------
+ \\- &shy; \\-
+ -- &ndash; --
+ --- &mdash; ---
+ ... &hellip; \ldots
+
+This option can also be set with the +OPTIONS line, e.g. \"-:nil\"."
+ :group 'org-export-translation
+ :type 'boolean)
+
+(defcustom org-export-language-setup
+ '(("en" "Author" "Date" "Table of Contents")
+ ("cs" "Autor" "Datum" "Obsah")
+ ("da" "Ophavsmand" "Dato" "Indhold")
+ ("de" "Autor" "Datum" "Inhaltsverzeichnis")
+ ("es" "Autor" "Fecha" "\xcdndice")
+ ("fr" "Auteur" "Date" "Table des mati\xe8res")
+ ("it" "Autore" "Data" "Indice")
+ ("nl" "Auteur" "Datum" "Inhoudsopgave")
+ ("nn" "Forfattar" "Dato" "Innhold") ;; nn = Norsk (nynorsk)
+ ("sv" "F\xf6rfattarens" "Datum" "Inneh\xe5ll"))
+ "Terms used in export text, translated to different languages.
+Use the variable `org-export-default-language' to set the language,
+or use the +OPTION lines for a per-file setting."
+ :group 'org-export-general
+ :type '(repeat
+ (list
+ (string :tag "HTML language tag")
+ (string :tag "Author")
+ (string :tag "Date")
+ (string :tag "Table of Contents"))))
+
+(defcustom org-export-default-language "en"
+ "The default language of HTML export, as a string.
+This should have an association in `org-export-language-setup'."
+ :group 'org-export-general
+ :type 'string)
+
+(defcustom org-export-skip-text-before-1st-heading t
+ "Non-nil means, skip all text before the first headline when exporting.
+When nil, that text is exported as well."
+ :group 'org-export-general
+ :type 'boolean)
+
+(defcustom org-export-headline-levels 3
+ "The last level which is still exported as a headline.
+Inferior levels will produce itemize lists when exported.
+Note that a numeric prefix argument to an exporter function overrides
+this setting.
+
+This option can also be set with the +OPTIONS line, e.g. \"H:2\"."
+ :group 'org-export-general
+ :type 'number)
+
+(defcustom org-export-with-section-numbers t
+ "Non-nil means, add section numbers to headlines when exporting.
+
+This option can also be set with the +OPTIONS line, e.g. \"num:t\"."
+ :group 'org-export-general
+ :type 'boolean)
+
+(defcustom org-export-with-toc t
+ "Non-nil means, create a table of contents in exported files.
+The TOC contains headlines with levels up to`org-export-headline-levels'.
+When an integer, include levels up to N in the toc, this may then be
+different from `org-export-headline-levels', but it will not be allowed
+to be larger than the number of headline levels.
+When nil, no table of contents is made.
+
+Headlines which contain any TODO items will be marked with \"(*)\" in
+ASCII export, and with red color in HTML output, if the option
+`org-export-mark-todo-in-toc' is set.
+
+In HTML output, the TOC will be clickable.
+
+This option can also be set with the +OPTIONS line, e.g. \"toc:nil\"
+or \"toc:3\"."
+ :group 'org-export-general
+ :type '(choice
+ (const :tag "No Table of Contents" nil)
+ (const :tag "Full Table of Contents" t)
+ (integer :tag "TOC to level")))
+
+(defcustom org-export-mark-todo-in-toc nil
+ "Non-nil means, mark TOC lines that contain any open TODO items."
+ :group 'org-export-general
+ :type 'boolean)
+
+(defcustom org-export-preserve-breaks nil
+ "Non-nil means, preserve all line breaks when exporting.
+Normally, in HTML output paragraphs will be reformatted. In ASCII
+export, line breaks will always be preserved, regardless of this variable.
+
+This option can also be set with the +OPTIONS line, e.g. \"\\n:t\"."
+ :group 'org-export-general
+ :type 'boolean)
+
+(defcustom org-export-with-archived-trees 'headline
+ "Whether subtrees with the ARCHIVE tag should be exported.
+This can have three different values
+nil Do not export, pretend this tree is not present
+t Do export the entire tree
+headline Only export the headline, but skip the tree below it."
+ :group 'org-export-general
+ :group 'org-archive
+ :type '(choice
+ (const :tag "not at all" nil)
+ (const :tag "headline only" 'headline)
+ (const :tag "entirely" t)))
+
+(defcustom org-export-author-info t
+ "Non-nil means, insert author name and email into the exported file.
+
+This option can also be set with the +OPTIONS line,
+e.g. \"author-info:nil\"."
+ :group 'org-export-general
+ :type 'boolean)
+
+(defcustom org-export-time-stamp-file t
+ "Non-nil means, insert a time stamp into the exported file.
+The time stamp shows when the file was created.
+
+This option can also be set with the +OPTIONS line,
+e.g. \"timestamp:nil\"."
+ :group 'org-export-general
+ :type 'boolean)
+
+(defcustom org-export-with-timestamps t
+ "If nil, do not export time stamps and associated keywords."
+ :group 'org-export-general
+ :type 'boolean)
+
+(defcustom org-export-remove-timestamps-from-toc t
+ "If nil, remove timestamps from the table of contents entries."
+ :group 'org-export-general
+ :type 'boolean)
+
+(defcustom org-export-with-tags 'not-in-toc
+ "If nil, do not export tags, just remove them from headlines.
+If this is the symbol `not-in-toc', tags will be removed from table of
+contents entries, but still be shown in the headlines of the document.
+
+This option can also be set with the +OPTIONS line, e.g. \"tags:nil\"."
+ :group 'org-export-general
+ :type '(choice
+ (const :tag "Off" nil)
+ (const :tag "Not in TOC" not-in-toc)
+ (const :tag "On" t)))
+
+(defcustom org-export-with-drawers nil
+ "Non-nil means, export with drawers like the property drawer.
+When t, all drawers are exported. This may also be a list of
+drawer names to export."
+ :group 'org-export-general
+ :type '(choice
+ (const :tag "All drawers" t)
+ (const :tag "None" nil)
+ (repeat :tag "Selected drawers"
+ (string :tag "Drawer name"))))
+
+(defgroup org-export-translation nil
+ "Options for translating special ascii sequences for the export backends."
+ :tag "Org Export Translation"
+ :group 'org-export)
+
+(defcustom org-export-with-emphasize t
+ "Non-nil means, interpret *word*, /word/, and _word_ as emphasized text.
+If the export target supports emphasizing text, the word will be
+typeset in bold, italic, or underlined, respectively. Works only for
+single words, but you can say: I *really* *mean* *this*.
+Not all export backends support this.
+
+This option can also be set with the +OPTIONS line, e.g. \"*:nil\"."
+ :group 'org-export-translation
+ :type 'boolean)
+
+(defcustom org-export-with-footnotes t
+ "If nil, export [1] as a footnote marker.
+Lines starting with [1] will be formatted as footnotes.
+
+This option can also be set with the +OPTIONS line, e.g. \"f:nil\"."
+ :group 'org-export-translation
+ :type 'boolean)
+
+(defcustom org-export-with-sub-superscripts t
+ "Non-nil means, interpret \"_\" and \"^\" for export.
+When this option is turned on, you can use TeX-like syntax for sub- and
+superscripts. Several characters after \"_\" or \"^\" will be
+considered as a single item - so grouping with {} is normally not
+needed. For example, the following things will be parsed as single
+sub- or superscripts.
+
+ 10^24 or 10^tau several digits will be considered 1 item.
+ 10^-12 or 10^-tau a leading sign with digits or a word
+ x^2-y^3 will be read as x^2 - y^3, because items are
+ terminated by almost any nonword/nondigit char.
+ x_{i^2} or x^(2-i) braces or parenthesis do grouping.
+
+Still, ambiguity is possible - so when in doubt use {} to enclose the
+sub/superscript. If you set this variable to the symbol `{}',
+the braces are *required* in order to trigger interpretations as
+sub/superscript. This can be helpful in documents that need \"_\"
+frequently in plain text.
+
+Not all export backends support this, but HTML does.
+
+This option can also be set with the +OPTIONS line, e.g. \"^:nil\"."
+ :group 'org-export-translation
+ :type '(choice
+ (const :tag "Always interpret" t)
+ (const :tag "Only with braces" {})
+ (const :tag "Never interpret" nil)))
+
+(defcustom org-export-with-special-strings t
+ "Non-nil means, interpret \"\-\", \"--\" and \"---\" for export.
+When this option is turned on, these strings will be exported as:
+
+\\- : &shy;
+-- : &ndash;
+--- : &mdash;
+
+Not all export backends support this, but HTML does.
+
+This option can also be set with the +OPTIONS line, e.g. \"-:nil\"."
+ :group 'org-export-translation
+ :type 'boolean)
+
+(defcustom org-export-with-TeX-macros t
+ "Non-nil means, interpret simple TeX-like macros when exporting.
+For example, HTML export converts \\alpha to &alpha; and \\AA to &Aring;.
+No only real TeX macros will work here, but the standard HTML entities
+for math can be used as macro names as well. For a list of supported
+names in HTML export, see the constant `org-html-entities'.
+Not all export backends support this.
+
+This option can also be set with the +OPTIONS line, e.g. \"TeX:nil\"."
+ :group 'org-export-translation
+ :group 'org-export-latex
+ :type 'boolean)
+
+(defcustom org-export-with-LaTeX-fragments nil
+ "Non-nil means, convert LaTeX fragments to images when exporting to HTML.
+When set, the exporter will find LaTeX environments if the \\begin line is
+the first non-white thing on a line. It will also find the math delimiters
+like $a=b$ and \\( a=b \\) for inline math, $$a=b$$ and \\[ a=b \\] for
+display math.
+
+This option can also be set with the +OPTIONS line, e.g. \"LaTeX:t\"."
+ :group 'org-export-translation
+ :group 'org-export-latex
+ :type 'boolean)
+
+(defcustom org-export-with-fixed-width t
+ "Non-nil means, lines starting with \":\" will be in fixed width font.
+This can be used to have pre-formatted text, fragments of code etc. For
+example:
+ : ;; Some Lisp examples
+ : (while (defc cnt)
+ : (ding))
+will be looking just like this in also HTML. See also the QUOTE keyword.
+Not all export backends support this.
+
+This option can also be set with the +OPTIONS line, e.g. \"::nil\"."
+ :group 'org-export-translation
+ :type 'boolean)
+
+(defcustom org-match-sexp-depth 3
+ "Number of stacked braces for sub/superscript matching.
+This has to be set before loading org.el to be effective."
+ :group 'org-export-translation
+ :type 'integer)
+
+(defgroup org-export-tables nil
+ "Options for exporting tables in Org-mode."
+ :tag "Org Export Tables"
+ :group 'org-export)
+
+(defcustom org-export-with-tables t
+ "If non-nil, lines starting with \"|\" define a table.
+For example:
+
+ | Name | Address | Birthday |
+ |-------------+----------+-----------|
+ | Arthur Dent | England | 29.2.2100 |
+
+Not all export backends support this.
+
+This option can also be set with the +OPTIONS line, e.g. \"|:nil\"."
+ :group 'org-export-tables
+ :type 'boolean)
+
+(defcustom org-export-highlight-first-table-line t
+ "Non-nil means, highlight the first table line.
+In HTML export, this means use <th> instead of <td>.
+In tables created with table.el, this applies to the first table line.
+In Org-mode tables, all lines before the first horizontal separator
+line will be formatted with <th> tags."
+ :group 'org-export-tables
+ :type 'boolean)
+
+(defcustom org-export-table-remove-special-lines t
+ "Remove special lines and marking characters in calculating tables.
+This removes the special marking character column from tables that are set
+up for spreadsheet calculations. It also removes the entire lines
+marked with `!', `_', or `^'. The lines with `$' are kept, because
+the values of constants may be useful to have."
+ :group 'org-export-tables
+ :type 'boolean)
+
+(defcustom org-export-prefer-native-exporter-for-tables nil
+ "Non-nil means, always export tables created with table.el natively.
+Natively means, use the HTML code generator in table.el.
+When nil, Org-mode's own HTML generator is used when possible (i.e. if
+the table does not use row- or column-spanning). This has the
+advantage, that the automatic HTML conversions for math symbols and
+sub/superscripts can be applied. Org-mode's HTML generator is also
+much faster."
+ :group 'org-export-tables
+ :type 'boolean)
+
+(defgroup org-export-ascii nil
+ "Options specific for ASCII export of Org-mode files."
+ :tag "Org Export ASCII"
+ :group 'org-export)
+
+(defcustom org-export-ascii-underline '(?\$ ?\# ?^ ?\~ ?\= ?\-)
+ "Characters for underlining headings in ASCII export.
+In the given sequence, these characters will be used for level 1, 2, ..."
+ :group 'org-export-ascii
+ :type '(repeat character))
+
+(defcustom org-export-ascii-bullets '(?* ?+ ?-)
+ "Bullet characters for headlines converted to lists in ASCII export.
+The first character is is used for the first lest level generated in this
+way, and so on. If there are more levels than characters given here,
+the list will be repeated.
+Note that plain lists will keep the same bullets as the have in the
+Org-mode file."
+ :group 'org-export-ascii
+ :type '(repeat character))
+
+(defgroup org-export-xml nil
+ "Options specific for XML export of Org-mode files."
+ :tag "Org Export XML"
+ :group 'org-export)
+
+(defgroup org-export-html nil
+ "Options specific for HTML export of Org-mode files."
+ :tag "Org Export HTML"
+ :group 'org-export)
+
+(defcustom org-export-html-coding-system nil
+ ""
+ :group 'org-export-html
+ :type 'coding-system)
+
+(defcustom org-export-html-extension "html"
+ "The extension for exported HTML files."
+ :group 'org-export-html
+ :type 'string)
+
+(defcustom org-export-html-style
+"<style type=\"text/css\">
+ html {
+ font-family: Times, serif;
+ font-size: 12pt;
+ }
+ .title { text-align: center; }
+ .todo { color: red; }
+ .done { color: green; }
+ .timestamp { color: grey }
+ .timestamp-kwd { color: CadetBlue }
+ .tag { background-color:lightblue; font-weight:normal }
+ .target { background-color: lavender; }
+ pre {
+ border: 1pt solid #AEBDCC;
+ background-color: #F3F5F7;
+ padding: 5pt;
+ font-family: courier, monospace;
+ }
+ table { border-collapse: collapse; }
+ td, th {
+ vertical-align: top;
+ <!--border: 1pt solid #ADB9CC;-->
+ }
+</style>"
+ "The default style specification for exported HTML files.
+Since there are different ways of setting style information, this variable
+needs to contain the full HTML structure to provide a style, including the
+surrounding HTML tags. The style specifications should include definitions
+for new classes todo, done, title, and deadline. For example, legal values
+would be:
+
+ <style type=\"text/css\">
+ p { font-weight: normal; color: gray; }
+ h1 { color: black; }
+ .title { text-align: center; }
+ .todo, .deadline { color: red; }
+ .done { color: green; }
+ </style>
+
+or, if you want to keep the style in a file,
+
+ <link rel=\"stylesheet\" type=\"text/css\" href=\"mystyles.css\">
+
+As the value of this option simply gets inserted into the HTML <head> header,
+you can \"misuse\" it to add arbitrary text to the header."
+ :group 'org-export-html
+ :type 'string)
+
+
+(defcustom org-export-html-title-format "<h1 class=\"title\">%s</h1>\n"
+ "Format for typesetting the document title in HTML export."
+ :group 'org-export-html
+ :type 'string)
+
+(defcustom org-export-html-toplevel-hlevel 2
+ "The <H> level for level 1 headings in HTML export."
+ :group 'org-export-html
+ :type 'string)
+
+(defcustom org-export-html-link-org-files-as-html t
+ "Non-nil means, make file links to `file.org' point to `file.html'.
+When org-mode is exporting an org-mode file to HTML, links to
+non-html files are directly put into a href tag in HTML.
+However, links to other Org-mode files (recognized by the
+extension `.org.) should become links to the corresponding html
+file, assuming that the linked org-mode file will also be
+converted to HTML.
+When nil, the links still point to the plain `.org' file."
+ :group 'org-export-html
+ :type 'boolean)
+
+(defcustom org-export-html-inline-images 'maybe
+ "Non-nil means, inline images into exported HTML pages.
+This is done using an <img> tag. When nil, an anchor with href is used to
+link to the image. If this option is `maybe', then images in links with
+an empty description will be inlined, while images with a description will
+be linked only."
+ :group 'org-export-html
+ :type '(choice (const :tag "Never" nil)
+ (const :tag "Always" t)
+ (const :tag "When there is no description" maybe)))
+
+;; FIXME: rename
+(defcustom org-export-html-expand t
+ "Non-nil means, for HTML export, treat @<...> as HTML tag.
+When nil, these tags will be exported as plain text and therefore
+not be interpreted by a browser.
+
+This option can also be set with the +OPTIONS line, e.g. \"@:nil\"."
+ :group 'org-export-html
+ :type 'boolean)
+
+(defcustom org-export-html-table-tag
+ "<table border=\"2\" cellspacing=\"0\" cellpadding=\"6\" rules=\"groups\" frame=\"hsides\">"
+ "The HTML tag that is used to start a table.
+This must be a <table> tag, but you may change the options like
+borders and spacing."
+ :group 'org-export-html
+ :type 'string)
+
+(defcustom org-export-table-header-tags '("<th>" . "</th>")
+ "The opening tag for table header fields.
+This is customizable so that alignment options can be specified."
+ :group 'org-export-tables
+ :type '(cons (string :tag "Opening tag") (string :tag "Closing tag")))
+
+(defcustom org-export-table-data-tags '("<td>" . "</td>")
+ "The opening tag for table data fields.
+This is customizable so that alignment options can be specified."
+ :group 'org-export-tables
+ :type '(cons (string :tag "Opening tag") (string :tag "Closing tag")))
+
+(defcustom org-export-html-with-timestamp nil
+ "If non-nil, write `org-export-html-html-helper-timestamp'
+into the exported HTML text. Otherwise, the buffer will just be saved
+to a file."
+ :group 'org-export-html
+ :type 'boolean)
+
+(defcustom org-export-html-html-helper-timestamp
+ "<br/><br/><hr><p><!-- hhmts start --> <!-- hhmts end --></p>\n"
+ "The HTML tag used as timestamp delimiter for HTML-helper-mode."
+ :group 'org-export-html
+ :type 'string)
+
+(defgroup org-export-icalendar nil
+ "Options specific for iCalendar export of Org-mode files."
+ :tag "Org Export iCalendar"
+ :group 'org-export)
+
+(defcustom org-combined-agenda-icalendar-file "~/org.ics"
+ "The file name for the iCalendar file covering all agenda files.
+This file is created with the command \\[org-export-icalendar-all-agenda-files].
+The file name should be absolute, the file will be overwritten without warning."
+ :group 'org-export-icalendar
+ :type 'file)
+
+(defcustom org-icalendar-include-todo nil
+ "Non-nil means, export to iCalendar files should also cover TODO items."
+ :group 'org-export-icalendar
+ :type '(choice
+ (const :tag "None" nil)
+ (const :tag "Unfinished" t)
+ (const :tag "All" all)))
+
+(defcustom org-icalendar-include-sexps t
+ "Non-nil means, export to iCalendar files should also cover sexp entries.
+These are entries like in the diary, but directly in an Org-mode file."
+ :group 'org-export-icalendar
+ :type 'boolean)
+
+(defcustom org-icalendar-include-body 100
+ "Amount of text below headline to be included in iCalendar export.
+This is a number of characters that should maximally be included.
+Properties, scheduling and clocking lines will always be removed.
+The text will be inserted into the DESCRIPTION field."
+ :group 'org-export-icalendar
+ :type '(choice
+ (const :tag "Nothing" nil)
+ (const :tag "Everything" t)
+ (integer :tag "Max characters")))
+
+(defcustom org-icalendar-combined-name "OrgMode"
+ "Calendar name for the combined iCalendar representing all agenda files."
+ :group 'org-export-icalendar
+ :type 'string)
+
+(defgroup org-font-lock nil
+ "Font-lock settings for highlighting in Org-mode."
+ :tag "Org Font Lock"
+ :group 'org)
+
+(defcustom org-level-color-stars-only nil
+ "Non-nil means fontify only the stars in each headline.
+When nil, the entire headline is fontified.
+Changing it requires restart of `font-lock-mode' to become effective
+also in regions already fontified."
+ :group 'org-font-lock
+ :type 'boolean)
+
+(defcustom org-hide-leading-stars nil
+ "Non-nil means, hide the first N-1 stars in a headline.
+This works by using the face `org-hide' for these stars. This
+face is white for a light background, and black for a dark
+background. You may have to customize the face `org-hide' to
+make this work.
+Changing it requires restart of `font-lock-mode' to become effective
+also in regions already fontified.
+You may also set this on a per-file basis by adding one of the following
+lines to the buffer:
+
+ #+STARTUP: hidestars
+ #+STARTUP: showstars"
+ :group 'org-font-lock
+ :type 'boolean)
+
+(defcustom org-fontify-done-headline nil
+ "Non-nil means, change the face of a headline if it is marked DONE.
+Normally, only the TODO/DONE keyword indicates the state of a headline.
+When this is non-nil, the headline after the keyword is set to the
+`org-headline-done' as an additional indication."
+ :group 'org-font-lock
+ :type 'boolean)
+
+(defcustom org-fontify-emphasized-text t
+ "Non-nil means fontify *bold*, /italic/ and _underlined_ text.
+Changing this variable requires a restart of Emacs to take effect."
+ :group 'org-font-lock
+ :type 'boolean)
+
+(defcustom org-highlight-latex-fragments-and-specials nil
+ "Non-nil means, fontify what is treated specially by the exporters."
+ :group 'org-font-lock
+ :type 'boolean)
+
+(defcustom org-hide-emphasis-markers nil
+ "Non-nil mean font-lock should hide the emphasis marker characters."
+ :group 'org-font-lock
+ :type 'boolean)
+
+(defvar org-emph-re nil
+ "Regular expression for matching emphasis.")
+(defvar org-verbatim-re nil
+ "Regular expression for matching verbatim text.")
+(defvar org-emphasis-regexp-components) ; defined just below
+(defvar org-emphasis-alist) ; defined just below
+(defun org-set-emph-re (var val)
+ "Set variable and compute the emphasis regular expression."
+ (set var val)
+ (when (and (boundp 'org-emphasis-alist)
+ (boundp 'org-emphasis-regexp-components)
+ org-emphasis-alist org-emphasis-regexp-components)
+ (let* ((e org-emphasis-regexp-components)
+ (pre (car e))
+ (post (nth 1 e))
+ (border (nth 2 e))
+ (body (nth 3 e))
+ (nl (nth 4 e))
+ (stacked (and nil (nth 5 e))) ; stacked is no longer allowed, forced to nil
+ (body1 (concat body "*?"))
+ (markers (mapconcat 'car org-emphasis-alist ""))
+ (vmarkers (mapconcat
+ (lambda (x) (if (eq (nth 4 x) 'verbatim) (car x) ""))
+ org-emphasis-alist "")))
+ ;; make sure special characters appear at the right position in the class
+ (if (string-match "\\^" markers)
+ (setq markers (concat (replace-match "" t t markers) "^")))
+ (if (string-match "-" markers)
+ (setq markers (concat (replace-match "" t t markers) "-")))
+ (if (string-match "\\^" vmarkers)
+ (setq vmarkers (concat (replace-match "" t t vmarkers) "^")))
+ (if (string-match "-" vmarkers)
+ (setq vmarkers (concat (replace-match "" t t vmarkers) "-")))
+ (if (> nl 0)
+ (setq body1 (concat body1 "\\(?:\n" body "*?\\)\\{0,"
+ (int-to-string nl) "\\}")))
+ ;; Make the regexp
+ (setq org-emph-re
+ (concat "\\([" pre (if (and nil stacked) markers) "]\\|^\\)"
+ "\\("
+ "\\([" markers "]\\)"
+ "\\("
+ "[^" border "]\\|"
+ "[^" border (if (and nil stacked) markers) "]"
+ body1
+ "[^" border (if (and nil stacked) markers) "]"
+ "\\)"
+ "\\3\\)"
+ "\\([" post (if (and nil stacked) markers) "]\\|$\\)"))
+ (setq org-verbatim-re
+ (concat "\\([" pre "]\\|^\\)"
+ "\\("
+ "\\([" vmarkers "]\\)"
+ "\\("
+ "[^" border "]\\|"
+ "[^" border "]"
+ body1
+ "[^" border "]"
+ "\\)"
+ "\\3\\)"
+ "\\([" post "]\\|$\\)")))))
+
+(defcustom org-emphasis-regexp-components
+ '(" \t('\"" "- \t.,:?;'\")" " \t\r\n,\"'" "." 1)
+ "Components used to build the regular expression for emphasis.
+This is a list with 6 entries. Terminology: In an emphasis string
+like \" *strong word* \", we call the initial space PREMATCH, the final
+space POSTMATCH, the stars MARKERS, \"s\" and \"d\" are BORDER characters
+and \"trong wor\" is the body. The different components in this variable
+specify what is allowed/forbidden in each part:
+
+pre Chars allowed as prematch. Beginning of line will be allowed too.
+post Chars allowed as postmatch. End of line will be allowed too.
+border The chars *forbidden* as border characters.
+body-regexp A regexp like \".\" to match a body character. Don't use
+ non-shy groups here, and don't allow newline here.
+newline The maximum number of newlines allowed in an emphasis exp.
+
+Use customize to modify this, or restart Emacs after changing it."
+ :group 'org-font-lock
+ :set 'org-set-emph-re
+ :type '(list
+ (sexp :tag "Allowed chars in pre ")
+ (sexp :tag "Allowed chars in post ")
+ (sexp :tag "Forbidden chars in border ")
+ (sexp :tag "Regexp for body ")
+ (integer :tag "number of newlines allowed")
+ (option (boolean :tag "Stacking (DISABLED) "))))
+
+(defcustom org-emphasis-alist
+ '(("*" bold "<b>" "</b>")
+ ("/" italic "<i>" "</i>")
+ ("_" underline "<u>" "</u>")
+ ("=" org-code "<code>" "</code>" verbatim)
+ ("~" org-verbatim "" "" verbatim)
+ ("+" (:strike-through t) "<del>" "</del>")
+ )
+ "Special syntax for emphasized text.
+Text starting and ending with a special character will be emphasized, for
+example *bold*, _underlined_ and /italic/. This variable sets the marker
+characters, the face to be used by font-lock for highlighting in Org-mode
+Emacs buffers, and the HTML tags to be used for this.
+Use customize to modify this, or restart Emacs after changing it."
+ :group 'org-font-lock
+ :set 'org-set-emph-re
+ :type '(repeat
+ (list
+ (string :tag "Marker character")
+ (choice
+ (face :tag "Font-lock-face")
+ (plist :tag "Face property list"))
+ (string :tag "HTML start tag")
+ (string :tag "HTML end tag")
+ (option (const verbatim)))))
+
+;;; The faces
+
+(defgroup org-faces nil
+ "Faces in Org-mode."
+ :tag "Org Faces"
+ :group 'org-font-lock)
+
+(defun org-compatible-face (inherits specs)
+ "Make a compatible face specification.
+If INHERITS is an existing face and if the Emacs version supports it,
+just inherit the face. If not, use SPECS to define the face.
+XEmacs and Emacs 21 do not know about the `min-colors' attribute.
+For them we convert a (min-colors 8) entry to a `tty' entry and move it
+to the top of the list. The `min-colors' attribute will be removed from
+any other entries, and any resulting duplicates will be removed entirely."
+ (cond
+ ((and inherits (facep inherits)
+ (not (featurep 'xemacs)) (> emacs-major-version 22))
+ ;; In Emacs 23, we use inheritance where possible.
+ ;; We only do this in Emacs 23, because only there the outline
+ ;; faces have been changed to the original org-mode-level-faces.
+ (list (list t :inherit inherits)))
+ ((or (featurep 'xemacs) (< emacs-major-version 22))
+ ;; These do not understand the `min-colors' attribute.
+ (let (r e a)
+ (while (setq e (pop specs))
+ (cond
+ ((memq (car e) '(t default)) (push e r))
+ ((setq a (member '(min-colors 8) (car e)))
+ (nconc r (list (cons (cons '(type tty) (delq (car a) (car e)))
+ (cdr e)))))
+ ((setq a (assq 'min-colors (car e)))
+ (setq e (cons (delq a (car e)) (cdr e)))
+ (or (assoc (car e) r) (push e r)))
+ (t (or (assoc (car e) r) (push e r)))))
+ (nreverse r)))
+ (t specs)))
+(put 'org-compatible-face 'lisp-indent-function 1)
+
+(defface org-hide
+ '((((background light)) (:foreground "white"))
+ (((background dark)) (:foreground "black")))
+ "Face used to hide leading stars in headlines.
+The forground color of this face should be equal to the background
+color of the frame."
+ :group 'org-faces)
+
+(defface org-level-1 ;; font-lock-function-name-face
+ (org-compatible-face 'outline-1
+ '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 8)) (:foreground "blue" :bold t))
+ (t (:bold t))))
+ "Face used for level 1 headlines."
+ :group 'org-faces)
+
+(defface org-level-2 ;; font-lock-variable-name-face
+ (org-compatible-face 'outline-2
+ '((((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightGoldenrod"))
+ (((class color) (min-colors 8) (background light)) (:foreground "yellow"))
+ (((class color) (min-colors 8) (background dark)) (:foreground "yellow" :bold t))
+ (t (:bold t))))
+ "Face used for level 2 headlines."
+ :group 'org-faces)
+
+(defface org-level-3 ;; font-lock-keyword-face
+ (org-compatible-face 'outline-3
+ '((((class color) (min-colors 88) (background light)) (:foreground "Purple"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "Cyan1"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Purple"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "Cyan"))
+ (((class color) (min-colors 8) (background light)) (:foreground "purple" :bold t))
+ (((class color) (min-colors 8) (background dark)) (:foreground "cyan" :bold t))
+ (t (:bold t))))
+ "Face used for level 3 headlines."
+ :group 'org-faces)
+
+(defface org-level-4 ;; font-lock-comment-face
+ (org-compatible-face 'outline-4
+ '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
+ (((class color) (min-colors 16) (background light)) (:foreground "red"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "red1"))
+ (((class color) (min-colors 8) (background light)) (:foreground "red" :bold t))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:bold t))))
+ "Face used for level 4 headlines."
+ :group 'org-faces)
+
+(defface org-level-5 ;; font-lock-type-face
+ (org-compatible-face 'outline-5
+ '((((class color) (min-colors 16) (background light)) (:foreground "ForestGreen"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "PaleGreen"))
+ (((class color) (min-colors 8)) (:foreground "green"))))
+ "Face used for level 5 headlines."
+ :group 'org-faces)
+
+(defface org-level-6 ;; font-lock-constant-face
+ (org-compatible-face 'outline-6
+ '((((class color) (min-colors 16) (background light)) (:foreground "CadetBlue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "Aquamarine"))
+ (((class color) (min-colors 8)) (:foreground "magenta"))))
+ "Face used for level 6 headlines."
+ :group 'org-faces)
+
+(defface org-level-7 ;; font-lock-builtin-face
+ (org-compatible-face 'outline-7
+ '((((class color) (min-colors 16) (background light)) (:foreground "Orchid"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSteelBlue"))
+ (((class color) (min-colors 8)) (:foreground "blue"))))
+ "Face used for level 7 headlines."
+ :group 'org-faces)
+
+(defface org-level-8 ;; font-lock-string-face
+ (org-compatible-face 'outline-8
+ '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
+ (((class color) (min-colors 8)) (:foreground "green"))))
+ "Face used for level 8 headlines."
+ :group 'org-faces)
+
+(defface org-special-keyword ;; font-lock-string-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
+ (t (:italic t))))
+ "Face used for special keywords."
+ :group 'org-faces)
+
+(defface org-drawer ;; font-lock-function-name-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 8)) (:foreground "blue" :bold t))
+ (t (:bold t))))
+ "Face used for drawers."
+ :group 'org-faces)
+
+(defface org-property-value nil
+ "Face used for the value of a property."
+ :group 'org-faces)
+
+(defface org-column
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light))
+ (:background "grey90"))
+ (((class color) (min-colors 16) (background dark))
+ (:background "grey30"))
+ (((class color) (min-colors 8))
+ (:background "cyan" :foreground "black"))
+ (t (:inverse-video t))))
+ "Face for column display of entry properties."
+ :group 'org-faces)
+
+(when (fboundp 'set-face-attribute)
+ ;; Make sure that a fixed-width face is used when we have a column table.
+ (set-face-attribute 'org-column nil
+ :height (face-attribute 'default :height)
+ :family (face-attribute 'default :family)))
+
+(defface org-warning
+ (org-compatible-face 'font-lock-warning-face
+ '((((class color) (min-colors 16) (background light)) (:foreground "Red1" :bold t))
+ (((class color) (min-colors 16) (background dark)) (:foreground "Pink" :bold t))
+ (((class color) (min-colors 8) (background light)) (:foreground "red" :bold t))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:bold t))))
+ "Face for deadlines and TODO keywords."
+ :group 'org-faces)
+
+(defface org-archived ; similar to shadow
+ (org-compatible-face 'shadow
+ '((((class color grayscale) (min-colors 88) (background light))
+ (:foreground "grey50"))
+ (((class color grayscale) (min-colors 88) (background dark))
+ (:foreground "grey70"))
+ (((class color) (min-colors 8) (background light))
+ (:foreground "green"))
+ (((class color) (min-colors 8) (background dark))
+ (:foreground "yellow"))))
+ "Face for headline with the ARCHIVE tag."
+ :group 'org-faces)
+
+(defface org-link
+ '((((class color) (background light)) (:foreground "Purple" :underline t))
+ (((class color) (background dark)) (:foreground "Cyan" :underline t))
+ (t (:underline t)))
+ "Face for links."
+ :group 'org-faces)
+
+(defface org-ellipsis
+ '((((class color) (background light)) (:foreground "DarkGoldenrod" :underline t))
+ (((class color) (background dark)) (:foreground "LightGoldenrod" :underline t))
+ (t (:strike-through t)))
+ "Face for the ellipsis in folded text."
+ :group 'org-faces)
+
+(defface org-target
+ '((((class color) (background light)) (:underline t))
+ (((class color) (background dark)) (:underline t))
+ (t (:underline t)))
+ "Face for links."
+ :group 'org-faces)
+
+(defface org-date
+ '((((class color) (background light)) (:foreground "Purple" :underline t))
+ (((class color) (background dark)) (:foreground "Cyan" :underline t))
+ (t (:underline t)))
+ "Face for links."
+ :group 'org-faces)
+
+(defface org-sexp-date
+ '((((class color) (background light)) (:foreground "Purple"))
+ (((class color) (background dark)) (:foreground "Cyan"))
+ (t (:underline t)))
+ "Face for links."
+ :group 'org-faces)
+
+(defface org-tag
+ '((t (:bold t)))
+ "Face for tags."
+ :group 'org-faces)
+
+(defface org-todo ; font-lock-warning-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "Red1" :bold t))
+ (((class color) (min-colors 16) (background dark)) (:foreground "Pink" :bold t))
+ (((class color) (min-colors 8) (background light)) (:foreground "red" :bold t))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:inverse-video t :bold t))))
+ "Face for TODO keywords."
+ :group 'org-faces)
+
+(defface org-done ;; font-lock-type-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "ForestGreen" :bold t))
+ (((class color) (min-colors 16) (background dark)) (:foreground "PaleGreen" :bold t))
+ (((class color) (min-colors 8)) (:foreground "green"))
+ (t (:bold t))))
+ "Face used for todo keywords that indicate DONE items."
+ :group 'org-faces)
+
+(defface org-headline-done ;; font-lock-string-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
+ (((class color) (min-colors 8) (background light)) (:bold nil))))
+ "Face used to indicate that a headline is DONE.
+This face is only used if `org-fontify-done-headline' is set. If applies
+to the part of the headline after the DONE keyword."
+ :group 'org-faces)
+
+(defcustom org-todo-keyword-faces nil
+ "Faces for specific TODO keywords.
+This is a list of cons cells, with TODO keywords in the car
+and faces in the cdr. The face can be a symbol, or a property
+list of attributes, like (:foreground \"blue\" :weight bold :underline t)."
+ :group 'org-faces
+ :group 'org-todo
+ :type '(repeat
+ (cons
+ (string :tag "keyword")
+ (sexp :tag "face"))))
+
+(defface org-table ;; font-lock-function-name-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 8) (background light)) (:foreground "blue"))
+ (((class color) (min-colors 8) (background dark)))))
+ "Face used for tables."
+ :group 'org-faces)
+
+(defface org-formula
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
+ (((class color) (min-colors 8) (background light)) (:foreground "red"))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red"))
+ (t (:bold t :italic t))))
+ "Face for formulas."
+ :group 'org-faces)
+
+(defface org-code
+ (org-compatible-face nil
+ '((((class color grayscale) (min-colors 88) (background light))
+ (:foreground "grey50"))
+ (((class color grayscale) (min-colors 88) (background dark))
+ (:foreground "grey70"))
+ (((class color) (min-colors 8) (background light))
+ (:foreground "green"))
+ (((class color) (min-colors 8) (background dark))
+ (:foreground "yellow"))))
+ "Face for fixed-with text like code snippets."
+ :group 'org-faces
+ :version "22.1")
+
+(defface org-verbatim
+ (org-compatible-face nil
+ '((((class color grayscale) (min-colors 88) (background light))
+ (:foreground "grey50" :underline t))
+ (((class color grayscale) (min-colors 88) (background dark))
+ (:foreground "grey70" :underline t))
+ (((class color) (min-colors 8) (background light))
+ (:foreground "green" :underline t))
+ (((class color) (min-colors 8) (background dark))
+ (:foreground "yellow" :underline t))))
+ "Face for fixed-with text like code snippets."
+ :group 'org-faces
+ :version "22.1")
+
+(defface org-agenda-structure ;; font-lock-function-name-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 8)) (:foreground "blue" :bold t))
+ (t (:bold t))))
+ "Face used in agenda for captions and dates."
+ :group 'org-faces)
+
+(defface org-scheduled-today
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "DarkGreen"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "PaleGreen"))
+ (((class color) (min-colors 8)) (:foreground "green"))
+ (t (:bold t :italic t))))
+ "Face for items scheduled for a certain day."
+ :group 'org-faces)
+
+(defface org-scheduled-previously
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
+ (((class color) (min-colors 8) (background light)) (:foreground "red"))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:bold t))))
+ "Face for items scheduled previously, and not yet done."
+ :group 'org-faces)
+
+(defface org-upcoming-deadline
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
+ (((class color) (min-colors 8) (background light)) (:foreground "red"))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:bold t))))
+ "Face for items scheduled previously, and not yet done."
+ :group 'org-faces)
+
+(defcustom org-agenda-deadline-faces
+ '((1.0 . org-warning)
+ (0.5 . org-upcoming-deadline)
+ (0.0 . default))
+ "Faces for showing deadlines in the agenda.
+This is a list of cons cells. The cdr of each cess is a face to be used,
+and it can also just be a like like '(:foreground \"yellow\").
+Each car is a fraction of the head-warning time that must have passed for
+this the face in the cdr to be used for display. The numbers must be
+given in descending order. The head-warning time is normally taken
+from `org-deadline-warning-days', but can also be specified in the deadline
+timestamp itself, like this:
+
+ DEADLINE: <2007-08-13 Mon -8d>
+
+You may use d for days, w for weeks, m for months and y for years. Months
+and years will only be treated in an approximate fashion (30.4 days for a
+month and 365.24 days for a year)."
+ :group 'org-faces
+ :group 'org-agenda-daily/weekly
+ :type '(repeat
+ (cons
+ (number :tag "Fraction of head-warning time passed")
+ (sexp :tag "Face"))))
+
+;; FIXME: this is not a good face yet.
+(defface org-agenda-restriction-lock
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:background "yellow1"))
+ (((class color) (min-colors 88) (background dark)) (:background "skyblue4"))
+ (((class color) (min-colors 16) (background light)) (:background "yellow1"))
+ (((class color) (min-colors 16) (background dark)) (:background "skyblue4"))
+ (((class color) (min-colors 8)) (:background "cyan" :foreground "black"))
+ (t (:inverse-video t))))
+ "Face for showing the agenda restriction lock."
+ :group 'org-faces)
+
+(defface org-time-grid ;; font-lock-variable-name-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightGoldenrod"))
+ (((class color) (min-colors 8)) (:foreground "yellow" :weight light))))
+ "Face used for time grids."
+ :group 'org-faces)
+
+(defconst org-level-faces
+ '(org-level-1 org-level-2 org-level-3 org-level-4
+ org-level-5 org-level-6 org-level-7 org-level-8
+ ))
+
+(defcustom org-n-level-faces (length org-level-faces)
+ "The number different faces to be used for headlines.
+Org-mode defines 8 different headline faces, so this can be at most 8.
+If it is less than 8, the level-1 face gets re-used for level N+1 etc."
+ :type 'number
+ :group 'org-faces)
+
+;;; Functions and variables from ther packages
+;; Declared here to avoid compiler warnings
+
+(eval-and-compile
+ (unless (fboundp 'declare-function)
+ (defmacro declare-function (fn file &optional arglist fileonly))))
+
+;; XEmacs only
+(defvar outline-mode-menu-heading)
+(defvar outline-mode-menu-show)
+(defvar outline-mode-menu-hide)
+(defvar zmacs-regions) ; XEmacs regions
+
+;; Emacs only
+(defvar mark-active)
+
+;; Various packages
+;; FIXME: get the argument lists for the UNKNOWN stuff
+(declare-function add-to-diary-list "diary-lib"
+ (date string specifier &optional marker globcolor literal))
+(declare-function table--at-cell-p "table" (position &optional object at-column))
+(declare-function Info-find-node "info" (filename nodename &optional no-going-back))
+(declare-function Info-goto-node "info" (nodename &optional fork))
+(declare-function bbdb "ext:bbdb-com" (string elidep))
+(declare-function bbdb-company "ext:bbdb-com" (string elidep))
+(declare-function bbdb-current-record "ext:bbdb-com" (&optional planning-on-modifying))
+(declare-function bbdb-name "ext:bbdb-com" (string elidep))
+(declare-function bbdb-record-getprop "ext:bbdb" (record property))
+(declare-function bbdb-record-name "ext:bbdb" (record))
+(declare-function bibtex-beginning-of-entry "bibtex" ())
+(declare-function bibtex-generate-autokey "bibtex" ())
+(declare-function bibtex-parse-entry "bibtex" (&optional content))
+(declare-function bibtex-url "bibtex" (&optional pos no-browse))
+(defvar calc-embedded-close-formula)
+(defvar calc-embedded-open-formula)
+(declare-function calendar-astro-date-string "cal-julian" (&optional date))
+(declare-function calendar-bahai-date-string "cal-bahai" (&optional date))
+(declare-function calendar-check-holidays "holidays" (date))
+(declare-function calendar-chinese-date-string "cal-china" (&optional date))
+(declare-function calendar-coptic-date-string "cal-coptic" (&optional date))
+(declare-function calendar-ethiopic-date-string "cal-coptic" (&optional date))
+(declare-function calendar-forward-day "cal-move" (arg))
+(declare-function calendar-french-date-string "cal-french" (&optional date))
+(declare-function calendar-goto-date "cal-move" (date))
+(declare-function calendar-goto-today "cal-move" ())
+(declare-function calendar-hebrew-date-string "cal-hebrew" (&optional date))
+(declare-function calendar-islamic-date-string "cal-islam" (&optional date))
+(declare-function calendar-iso-date-string "cal-iso" (&optional date))
+(declare-function calendar-julian-date-string "cal-julian" (&optional date))
+(declare-function calendar-mayan-date-string "cal-mayan" (&optional date))
+(declare-function calendar-persian-date-string "cal-persia" (&optional date))
+(defvar calendar-mode-map)
+(defvar original-date) ; dynamically scoped in calendar.el does scope this
+(declare-function cdlatex-tab "ext:cdlatex" ())
+(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep))
+(declare-function elmo-folder-exists-p "ext:elmo" (folder) t)
+(declare-function elmo-message-entity-field "ext:elmo-msgdb" (entity field &optional type))
+(declare-function elmo-message-field "ext:elmo" (folder number field &optional type) t)
+(declare-function elmo-msgdb-overview-get-entity "ext:elmo" (&rest unknown) t)
+(defvar font-lock-unfontify-region-function)
+(declare-function gnus-article-show-summary "gnus-art" ())
+(declare-function gnus-summary-last-subject "gnus-sum" ())
+(defvar gnus-other-frame-object)
+(defvar gnus-group-name)
+(defvar gnus-article-current)
+(defvar Info-current-file)
+(defvar Info-current-node)
+(declare-function mh-display-msg "mh-show" (msg-num folder-name))
+(declare-function mh-find-path "mh-utils" ())
+(declare-function mh-get-header-field "mh-utils" (field))
+(declare-function mh-get-msg-num "mh-utils" (error-if-no-message))
+(declare-function mh-header-display "mh-show" ())
+(declare-function mh-index-previous-folder "mh-search" ())
+(declare-function mh-normalize-folder-name "mh-utils" (folder &optional empty-string-okay dont-remove-trailing-slash return-nil-if-folder-empty))
+(declare-function mh-search "mh-search" (folder search-regexp &optional redo-search-flag window-config))
+(declare-function mh-search-choose "mh-search" (&optional searcher))
+(declare-function mh-show "mh-show" (&optional message redisplay-flag))
+(declare-function mh-show-buffer-message-number "mh-comp" (&optional buffer))
+(declare-function mh-show-header-display "mh-show" t t)
+(declare-function mh-show-msg "mh-show" (msg))
+(declare-function mh-show-show "mh-show" t t)
+(declare-function mh-visit-folder "mh-folder" (folder &optional range index-data))
+(defvar mh-progs)
+(defvar mh-current-folder)
+(defvar mh-show-folder-buffer)
+(defvar mh-index-folder)
+(defvar mh-searcher)
+(declare-function org-export-latex-cleaned-string "org-export-latex" (&optional commentsp))
+(declare-function parse-time-string "parse-time" (string))
+(declare-function remember "remember" (&optional initial))
+(declare-function remember-buffer-desc "remember" ())
+(defvar remember-save-after-remembering)
+(defvar remember-data-file)
+(defvar remember-register)
+(defvar remember-buffer)
+(defvar remember-handler-functions)
+(defvar remember-annotation-functions)
+(declare-function rmail-narrow-to-non-pruned-header "rmail" ())
+(declare-function rmail-show-message "rmail" (&optional n no-summary))
+(declare-function rmail-what-message "rmail" ())
+(defvar texmathp-why)
+(declare-function vm-beginning-of-message "ext:vm-page" ())
+(declare-function vm-follow-summary-cursor "ext:vm-motion" ())
+(declare-function vm-get-header-contents "ext:vm-summary" (message header-name-regexp &optional clump-sep))
+(declare-function vm-isearch-narrow "ext:vm-search" ())
+(declare-function vm-isearch-update "ext:vm-search" ())
+(declare-function vm-select-folder-buffer "ext:vm-macro" ())
+(declare-function vm-su-message-id "ext:vm-summary" (m))
+(declare-function vm-su-subject "ext:vm-summary" (m))
+(declare-function vm-summarize "ext:vm-summary" (&optional display raise))
+(defvar vm-message-pointer)
+(defvar vm-folder-directory)
+(defvar w3m-current-url)
+(defvar w3m-current-title)
+;; backward compatibility to old version of wl
+(declare-function wl-summary-buffer-msgdb "ext:wl-folder" (&rest unknown) t)
+(declare-function wl-folder-get-elmo-folder "ext:wl-folder" (entity &optional no-cache))
+(declare-function wl-summary-goto-folder-subr "ext:wl-summary" (&optional name scan-type other-window sticky interactive scoring force-exit))
+(declare-function wl-summary-jump-to-msg-by-message-id "ext:wl-summary" (&optional id))
+(declare-function wl-summary-line-from "ext:wl-summary" ())
+(declare-function wl-summary-line-subject "ext:wl-summary" ())
+(declare-function wl-summary-message-number "ext:wl-summary" ())
+(declare-function wl-summary-redisplay "ext:wl-summary" (&optional arg))
+(defvar wl-summary-buffer-elmo-folder)
+(defvar wl-summary-buffer-folder-name)
+(declare-function speedbar-line-directory "speedbar" (&optional depth))
+
+(defvar org-latex-regexps)
+(defvar constants-unit-system)
+
+;;; Variables for pre-computed regular expressions, all buffer local
+
+(defvar org-drawer-regexp nil
+ "Matches first line of a hidden block.")
+(make-variable-buffer-local 'org-drawer-regexp)
+(defvar org-todo-regexp nil
+ "Matches any of the TODO state keywords.")
+(make-variable-buffer-local 'org-todo-regexp)
+(defvar org-not-done-regexp nil
+ "Matches any of the TODO state keywords except the last one.")
+(make-variable-buffer-local 'org-not-done-regexp)
+(defvar org-todo-line-regexp nil
+ "Matches a headline and puts TODO state into group 2 if present.")
+(make-variable-buffer-local 'org-todo-line-regexp)
+(defvar org-complex-heading-regexp nil
+ "Matches a headline and puts everything into groups:
+group 1: the stars
+group 2: The todo keyword, maybe
+group 3: Priority cookie
+group 4: True headline
+group 5: Tags")
+(make-variable-buffer-local 'org-complex-heading-regexp)
+(defvar org-todo-line-tags-regexp nil
+ "Matches a headline and puts TODO state into group 2 if present.
+Also put tags into group 4 if tags are present.")
+(make-variable-buffer-local 'org-todo-line-tags-regexp)
+(defvar org-nl-done-regexp nil
+ "Matches newline followed by a headline with the DONE keyword.")
+(make-variable-buffer-local 'org-nl-done-regexp)
+(defvar org-looking-at-done-regexp nil
+ "Matches the DONE keyword a point.")
+(make-variable-buffer-local 'org-looking-at-done-regexp)
+(defvar org-ds-keyword-length 12
+ "Maximum length of the Deadline and SCHEDULED keywords.")
+(make-variable-buffer-local 'org-ds-keyword-length)
+(defvar org-deadline-regexp nil
+ "Matches the DEADLINE keyword.")
+(make-variable-buffer-local 'org-deadline-regexp)
+(defvar org-deadline-time-regexp nil
+ "Matches the DEADLINE keyword together with a time stamp.")
+(make-variable-buffer-local 'org-deadline-time-regexp)
+(defvar org-deadline-line-regexp nil
+ "Matches the DEADLINE keyword and the rest of the line.")
+(make-variable-buffer-local 'org-deadline-line-regexp)
+(defvar org-scheduled-regexp nil
+ "Matches the SCHEDULED keyword.")
+(make-variable-buffer-local 'org-scheduled-regexp)
+(defvar org-scheduled-time-regexp nil
+ "Matches the SCHEDULED keyword together with a time stamp.")
+(make-variable-buffer-local 'org-scheduled-time-regexp)
+(defvar org-closed-time-regexp nil
+ "Matches the CLOSED keyword together with a time stamp.")
+(make-variable-buffer-local 'org-closed-time-regexp)
+
+(defvar org-keyword-time-regexp nil
+ "Matches any of the 4 keywords, together with the time stamp.")
+(make-variable-buffer-local 'org-keyword-time-regexp)
+(defvar org-keyword-time-not-clock-regexp nil
+ "Matches any of the 3 keywords, together with the time stamp.")
+(make-variable-buffer-local 'org-keyword-time-not-clock-regexp)
+(defvar org-maybe-keyword-time-regexp nil
+ "Matches a timestamp, possibly preceeded by a keyword.")
+(make-variable-buffer-local 'org-maybe-keyword-time-regexp)
+(defvar org-planning-or-clock-line-re nil
+ "Matches a line with planning or clock info.")
+(make-variable-buffer-local 'org-planning-or-clock-line-re)
+
+(defconst org-rm-props '(invisible t face t keymap t intangible t mouse-face t
+ rear-nonsticky t mouse-map t fontified t)
+ "Properties to remove when a string without properties is wanted.")
+
+(defsubst org-match-string-no-properties (num &optional string)
+ (if (featurep 'xemacs)
+ (let ((s (match-string num string)))
+ (remove-text-properties 0 (length s) org-rm-props s)
+ s)
+ (match-string-no-properties num string)))
+
+(defsubst org-no-properties (s)
+ (if (fboundp 'set-text-properties)
+ (set-text-properties 0 (length s) nil s)
+ (remove-text-properties 0 (length s) org-rm-props s))
+ s)
+
+(defsubst org-get-alist-option (option key)
+ (cond ((eq key t) t)
+ ((eq option t) t)
+ ((assoc key option) (cdr (assoc key option)))
+ (t (cdr (assq 'default option)))))
+
+(defsubst org-inhibit-invisibility ()
+ "Modified `buffer-invisibility-spec' for Emacs 21.
+Some ops with invisible text do not work correctly on Emacs 21. For these
+we turn off invisibility temporarily. Use this in a `let' form."
+ (if (< emacs-major-version 22) nil buffer-invisibility-spec))
+
+(defsubst org-set-local (var value)
+ "Make VAR local in current buffer and set it to VALUE."
+ (set (make-variable-buffer-local var) value))
+
+(defsubst org-mode-p ()
+ "Check if the current buffer is in Org-mode."
+ (eq major-mode 'org-mode))
+
+(defsubst org-last (list)
+ "Return the last element of LIST."
+ (car (last list)))
+
+(defun org-let (list &rest body)
+ (eval (cons 'let (cons list body))))
+(put 'org-let 'lisp-indent-function 1)
+
+(defun org-let2 (list1 list2 &rest body)
+ (eval (cons 'let (cons list1 (list (cons 'let (cons list2 body)))))))
+(put 'org-let2 'lisp-indent-function 2)
+(defconst org-startup-options
+ '(("fold" org-startup-folded t)
+ ("overview" org-startup-folded t)
+ ("nofold" org-startup-folded nil)
+ ("showall" org-startup-folded nil)
+ ("content" org-startup-folded content)
+ ("hidestars" org-hide-leading-stars t)
+ ("showstars" org-hide-leading-stars nil)
+ ("odd" org-odd-levels-only t)
+ ("oddeven" org-odd-levels-only nil)
+ ("align" org-startup-align-all-tables t)
+ ("noalign" org-startup-align-all-tables nil)
+ ("customtime" org-display-custom-times t)
+ ("logging" org-log-done t)
+ ("logdone" org-log-done t)
+ ("nologging" org-log-done nil)
+ ("lognotedone" org-log-done done push)
+ ("lognotestate" org-log-done state push)
+ ("lognoteclock-out" org-log-done clock-out push)
+ ("logrepeat" org-log-repeat t)
+ ("nologrepeat" org-log-repeat nil)
+ ("constcgs" constants-unit-system cgs)
+ ("constSI" constants-unit-system SI))
+ "Variable associated with STARTUP options for org-mode.
+Each element is a list of three items: The startup options as written
+in the #+STARTUP line, the corresponding variable, and the value to
+set this variable to if the option is found. An optional forth element PUSH
+means to push this value onto the list in the variable.")
+
+(defun org-set-regexps-and-options ()
+ "Precompute regular expressions for current buffer."
+ (when (org-mode-p)
+ (org-set-local 'org-todo-kwd-alist nil)
+ (org-set-local 'org-todo-key-alist nil)
+ (org-set-local 'org-todo-key-trigger nil)
+ (org-set-local 'org-todo-keywords-1 nil)
+ (org-set-local 'org-done-keywords nil)
+ (org-set-local 'org-todo-heads nil)
+ (org-set-local 'org-todo-sets nil)
+ (org-set-local 'org-todo-log-states nil)
+ (let ((re (org-make-options-regexp
+ '("CATEGORY" "SEQ_TODO" "TYP_TODO" "TODO" "COLUMNS"
+ "STARTUP" "ARCHIVE" "TAGS" "LINK" "PRIORITIES"
+ "CONSTANTS" "PROPERTY" "DRAWERS")))
+ (splitre "[ \t]+")
+ kwds kws0 kwsa key value cat arch tags const links hw dws
+ tail sep kws1 prio props drawers
+ ex log)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (while (re-search-forward re nil t)
+ (setq key (match-string 1) value (org-match-string-no-properties 2))
+ (cond
+ ((equal key "CATEGORY")
+ (if (string-match "[ \t]+$" value)
+ (setq value (replace-match "" t t value)))
+ (setq cat value))
+ ((member key '("SEQ_TODO" "TODO"))
+ (push (cons 'sequence (org-split-string value splitre)) kwds))
+ ((equal key "TYP_TODO")
+ (push (cons 'type (org-split-string value splitre)) kwds))
+ ((equal key "TAGS")
+ (setq tags (append tags (org-split-string value splitre))))
+ ((equal key "COLUMNS")
+ (org-set-local 'org-columns-default-format value))
+ ((equal key "LINK")
+ (when (string-match "^\\(\\S-+\\)[ \t]+\\(.+\\)" value)
+ (push (cons (match-string 1 value)
+ (org-trim (match-string 2 value)))
+ links)))
+ ((equal key "PRIORITIES")
+ (setq prio (org-split-string value " +")))
+ ((equal key "PROPERTY")
+ (when (string-match "\\(\\S-+\\)\\s-+\\(.*\\)" value)
+ (push (cons (match-string 1 value) (match-string 2 value))
+ props)))
+ ((equal key "DRAWERS")
+ (setq drawers (org-split-string value splitre)))
+ ((equal key "CONSTANTS")
+ (setq const (append const (org-split-string value splitre))))
+ ((equal key "STARTUP")
+ (let ((opts (org-split-string value splitre))
+ l var val)
+ (while (setq l (pop opts))
+ (when (setq l (assoc l org-startup-options))
+ (setq var (nth 1 l) val (nth 2 l))
+ (if (not (nth 3 l))
+ (set (make-local-variable var) val)
+ (if (not (listp (symbol-value var)))
+ (set (make-local-variable var) nil))
+ (set (make-local-variable var) (symbol-value var))
+ (add-to-list var val))))))
+ ((equal key "ARCHIVE")
+ (string-match " *$" value)
+ (setq arch (replace-match "" t t value))
+ (remove-text-properties 0 (length arch)
+ '(face t fontified t) arch)))
+ )))
+ (when cat
+ (org-set-local 'org-category (intern cat))
+ (push (cons "CATEGORY" cat) props))
+ (when prio
+ (if (< (length prio) 3) (setq prio '("A" "C" "B")))
+ (setq prio (mapcar 'string-to-char prio))
+ (org-set-local 'org-highest-priority (nth 0 prio))
+ (org-set-local 'org-lowest-priority (nth 1 prio))
+ (org-set-local 'org-default-priority (nth 2 prio)))
+ (and props (org-set-local 'org-local-properties (nreverse props)))
+ (and drawers (org-set-local 'org-drawers drawers))
+ (and arch (org-set-local 'org-archive-location arch))
+ (and links (setq org-link-abbrev-alist-local (nreverse links)))
+ ;; Process the TODO keywords
+ (unless kwds
+ ;; Use the global values as if they had been given locally.
+ (setq kwds (default-value 'org-todo-keywords))
+ (if (stringp (car kwds))
+ (setq kwds (list (cons org-todo-interpretation
+ (default-value 'org-todo-keywords)))))
+ (setq kwds (reverse kwds)))
+ (setq kwds (nreverse kwds))
+ (let (inter kws kw)
+ (while (setq kws (pop kwds))
+ (setq inter (pop kws) sep (member "|" kws)
+ kws0 (delete "|" (copy-sequence kws))
+ kwsa nil
+ kws1 (mapcar
+ (lambda (x)
+ (if (string-match "^\\(.*?\\)\\(?:(\\(..?\\))\\)?$" x)
+ (progn
+ (setq kw (match-string 1 x)
+ ex (and (match-end 2) (match-string 2 x))
+ log (and ex (string-match "@" ex))
+ key (and ex (substring ex 0 1)))
+ (if (equal key "@") (setq key nil))
+ (push (cons kw (and key (string-to-char key))) kwsa)
+ (and log (push kw org-todo-log-states))
+ kw)
+ (error "Invalid TODO keyword %s" x)))
+ kws0)
+ kwsa (if kwsa (append '((:startgroup))
+ (nreverse kwsa)
+ '((:endgroup))))
+ hw (car kws1)
+ dws (if sep (org-remove-keyword-keys (cdr sep)) (last kws1))
+ tail (list inter hw (car dws) (org-last dws)))
+ (add-to-list 'org-todo-heads hw 'append)
+ (push kws1 org-todo-sets)
+ (setq org-done-keywords (append org-done-keywords dws nil))
+ (setq org-todo-key-alist (append org-todo-key-alist kwsa))
+ (mapc (lambda (x) (push (cons x tail) org-todo-kwd-alist)) kws1)
+ (setq org-todo-keywords-1 (append org-todo-keywords-1 kws1 nil)))
+ (setq org-todo-sets (nreverse org-todo-sets)
+ org-todo-kwd-alist (nreverse org-todo-kwd-alist)
+ org-todo-key-trigger (delq nil (mapcar 'cdr org-todo-key-alist))
+ org-todo-key-alist (org-assign-fast-keys org-todo-key-alist)))
+ ;; Process the constants
+ (when const
+ (let (e cst)
+ (while (setq e (pop const))
+ (if (string-match "^\\([a-zA-Z0][_a-zA-Z0-9]*\\)=\\(.*\\)" e)
+ (push (cons (match-string 1 e) (match-string 2 e)) cst)))
+ (setq org-table-formula-constants-local cst)))
+
+ ;; Process the tags.
+ (when tags
+ (let (e tgs)
+ (while (setq e (pop tags))
+ (cond
+ ((equal e "{") (push '(:startgroup) tgs))
+ ((equal e "}") (push '(:endgroup) tgs))
+ ((string-match (org-re "^\\([[:alnum:]_@]+\\)(\\(.\\))$") e)
+ (push (cons (match-string 1 e)
+ (string-to-char (match-string 2 e)))
+ tgs))
+ (t (push (list e) tgs))))
+ (org-set-local 'org-tag-alist nil)
+ (while (setq e (pop tgs))
+ (or (and (stringp (car e))
+ (assoc (car e) org-tag-alist))
+ (push e org-tag-alist))))))
+
+ ;; Compute the regular expressions and other local variables
+ (if (not org-done-keywords)
+ (setq org-done-keywords (list (org-last org-todo-keywords-1))))
+ (setq org-ds-keyword-length (+ 2 (max (length org-deadline-string)
+ (length org-scheduled-string)))
+ org-drawer-regexp
+ (concat "^[ \t]*:\\("
+ (mapconcat 'regexp-quote org-drawers "\\|")
+ "\\):[ \t]*$")
+ org-not-done-keywords
+ (org-delete-all org-done-keywords (copy-sequence org-todo-keywords-1))
+ org-todo-regexp
+ (concat "\\<\\(" (mapconcat 'regexp-quote org-todo-keywords-1
+ "\\|") "\\)\\>")
+ org-not-done-regexp
+ (concat "\\<\\("
+ (mapconcat 'regexp-quote org-not-done-keywords "\\|")
+ "\\)\\>")
+ org-todo-line-regexp
+ (concat "^\\(\\*+\\)[ \t]+\\(?:\\("
+ (mapconcat 'regexp-quote org-todo-keywords-1 "\\|")
+ "\\)\\>\\)?[ \t]*\\(.*\\)")
+ org-complex-heading-regexp
+ (concat "^\\(\\*+\\)\\(?:[ \t]+\\("
+ (mapconcat 'regexp-quote org-todo-keywords-1 "\\|")
+ "\\)\\>\\)?\\(?:[ \t]*\\(\\[#.\\]\\)\\)?[ \t]*\\(.*?\\)"
+ "\\(?:[ \t]+\\(:[[:alnum:]_@:]+:\\)\\)?[ \t]*$")
+ org-nl-done-regexp
+ (concat "\n\\*+[ \t]+"
+ "\\(?:" (mapconcat 'regexp-quote org-done-keywords "\\|")
+ "\\)" "\\>")
+ org-todo-line-tags-regexp
+ (concat "^\\(\\*+\\)[ \t]+\\(?:\\("
+ (mapconcat 'regexp-quote org-todo-keywords-1 "\\|")
+ (org-re
+ "\\)\\>\\)? *\\(.*?\\([ \t]:[[:alnum:]:_@]+:[ \t]*\\)?$\\)"))
+ org-looking-at-done-regexp
+ (concat "^" "\\(?:"
+ (mapconcat 'regexp-quote org-done-keywords "\\|") "\\)"
+ "\\>")
+ org-deadline-regexp (concat "\\<" org-deadline-string)
+ org-deadline-time-regexp
+ (concat "\\<" org-deadline-string " *<\\([^>]+\\)>")
+ org-deadline-line-regexp
+ (concat "\\<\\(" org-deadline-string "\\).*")
+ org-scheduled-regexp
+ (concat "\\<" org-scheduled-string)
+ org-scheduled-time-regexp
+ (concat "\\<" org-scheduled-string " *<\\([^>]+\\)>")
+ org-closed-time-regexp
+ (concat "\\<" org-closed-string " *\\[\\([^]]+\\)\\]")
+ org-keyword-time-regexp
+ (concat "\\<\\(" org-scheduled-string
+ "\\|" org-deadline-string
+ "\\|" org-closed-string
+ "\\|" org-clock-string "\\)"
+ " *[[<]\\([^]>]+\\)[]>]")
+ org-keyword-time-not-clock-regexp
+ (concat "\\<\\(" org-scheduled-string
+ "\\|" org-deadline-string
+ "\\|" org-closed-string
+ "\\)"
+ " *[[<]\\([^]>]+\\)[]>]")
+ org-maybe-keyword-time-regexp
+ (concat "\\(\\<\\(" org-scheduled-string
+ "\\|" org-deadline-string
+ "\\|" org-closed-string
+ "\\|" org-clock-string "\\)\\)?"
+ " *\\([[<][0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [^]\r\n>]*?[]>]\\|<%%([^\r\n>]*>\\)")
+ org-planning-or-clock-line-re
+ (concat "\\(?:^[ \t]*\\(" org-scheduled-string
+ "\\|" org-deadline-string
+ "\\|" org-closed-string "\\|" org-clock-string
+ "\\)\\>\\)")
+ )
+ (org-compute-latex-and-specials-regexp)
+ (org-set-font-lock-defaults)))
+
+(defun org-remove-keyword-keys (list)
+ (mapcar (lambda (x)
+ (if (string-match "(..?)$" x)
+ (substring x 0 (match-beginning 0))
+ x))
+ list))
+
+;; FIXME: this could be done much better, using second characters etc.
+(defun org-assign-fast-keys (alist)
+ "Assign fast keys to a keyword-key alist.
+Respect keys that are already there."
+ (let (new e k c c1 c2 (char ?a))
+ (while (setq e (pop alist))
+ (cond
+ ((equal e '(:startgroup)) (push e new))
+ ((equal e '(:endgroup)) (push e new))
+ (t
+ (setq k (car e) c2 nil)
+ (if (cdr e)
+ (setq c (cdr e))
+ ;; automatically assign a character.
+ (setq c1 (string-to-char
+ (downcase (substring
+ k (if (= (string-to-char k) ?@) 1 0)))))
+ (if (or (rassoc c1 new) (rassoc c1 alist))
+ (while (or (rassoc char new) (rassoc char alist))
+ (setq char (1+ char)))
+ (setq c2 c1))
+ (setq c (or c2 char)))
+ (push (cons k c) new))))
+ (nreverse new)))
+
+;;; Some variables ujsed in various places
+
+(defvar org-window-configuration nil
+ "Used in various places to store a window configuration.")
+(defvar org-finish-function nil
+ "Function to be called when `C-c C-c' is used.
+This is for getting out of special buffers like remember.")
+
+
+;; FIXME: Occasionally check by commenting these, to make sure
+;; no other functions uses these, forgetting to let-bind them.
+(defvar entry)
+(defvar state)
+(defvar last-state)
+(defvar date)
+(defvar description)
+
+;; Defined somewhere in this file, but used before definition.
+(defvar orgtbl-mode-menu) ; defined when orgtbl mode get initialized
+(defvar org-agenda-buffer-name)
+(defvar org-agenda-undo-list)
+(defvar org-agenda-pending-undo-list)
+(defvar org-agenda-overriding-header)
+(defvar orgtbl-mode)
+(defvar org-html-entities)
+(defvar org-struct-menu)
+(defvar org-org-menu)
+(defvar org-tbl-menu)
+(defvar org-agenda-keymap)
+
+;;;; Emacs/XEmacs compatibility
+
+;; Overlay compatibility functions
+(defun org-make-overlay (beg end &optional buffer)
+ (if (featurep 'xemacs)
+ (make-extent beg end buffer)
+ (make-overlay beg end buffer)))
+(defun org-delete-overlay (ovl)
+ (if (featurep 'xemacs) (delete-extent ovl) (delete-overlay ovl)))
+(defun org-detach-overlay (ovl)
+ (if (featurep 'xemacs) (detach-extent ovl) (delete-overlay ovl)))
+(defun org-move-overlay (ovl beg end &optional buffer)
+ (if (featurep 'xemacs)
+ (set-extent-endpoints ovl beg end (or buffer (current-buffer)))
+ (move-overlay ovl beg end buffer)))
+(defun org-overlay-put (ovl prop value)
+ (if (featurep 'xemacs)
+ (set-extent-property ovl prop value)
+ (overlay-put ovl prop value)))
+(defun org-overlay-display (ovl text &optional face evap)
+ "Make overlay OVL display TEXT with face FACE."
+ (if (featurep 'xemacs)
+ (let ((gl (make-glyph text)))
+ (and face (set-glyph-face gl face))
+ (set-extent-property ovl 'invisible t)
+ (set-extent-property ovl 'end-glyph gl))
+ (overlay-put ovl 'display text)
+ (if face (overlay-put ovl 'face face))
+ (if evap (overlay-put ovl 'evaporate t))))
+(defun org-overlay-before-string (ovl text &optional face evap)
+ "Make overlay OVL display TEXT with face FACE."
+ (if (featurep 'xemacs)
+ (let ((gl (make-glyph text)))
+ (and face (set-glyph-face gl face))
+ (set-extent-property ovl 'begin-glyph gl))
+ (if face (org-add-props text nil 'face face))
+ (overlay-put ovl 'before-string text)
+ (if evap (overlay-put ovl 'evaporate t))))
+(defun org-overlay-get (ovl prop)
+ (if (featurep 'xemacs)
+ (extent-property ovl prop)
+ (overlay-get ovl prop)))
+(defun org-overlays-at (pos)
+ (if (featurep 'xemacs) (extents-at pos) (overlays-at pos)))
+(defun org-overlays-in (&optional start end)
+ (if (featurep 'xemacs)
+ (extent-list nil start end)
+ (overlays-in start end)))
+(defun org-overlay-start (o)
+ (if (featurep 'xemacs) (extent-start-position o) (overlay-start o)))
+(defun org-overlay-end (o)
+ (if (featurep 'xemacs) (extent-end-position o) (overlay-end o)))
+(defun org-find-overlays (prop &optional pos delete)
+ "Find all overlays specifying PROP at POS or point.
+If DELETE is non-nil, delete all those overlays."
+ (let ((overlays (org-overlays-at (or pos (point))))
+ ov found)
+ (while (setq ov (pop overlays))
+ (if (org-overlay-get ov prop)
+ (if delete (org-delete-overlay ov) (push ov found))))
+ found))
+
+;; Region compatibility
+
+(defun org-add-hook (hook function &optional append local)
+ "Add-hook, compatible with both Emacsen."
+ (if (and local (featurep 'xemacs))
+ (add-local-hook hook function append)
+ (add-hook hook function append local)))
+
+(defvar org-ignore-region nil
+ "To temporarily disable the active region.")
+
+(defun org-region-active-p ()
+ "Is `transient-mark-mode' on and the region active?
+Works on both Emacs and XEmacs."
+ (if org-ignore-region
+ nil
+ (if (featurep 'xemacs)
+ (and zmacs-regions (region-active-p))
+ (if (fboundp 'use-region-p)
+ (use-region-p)
+ (and transient-mark-mode mark-active))))) ; Emacs 22 and before
+
+;; Invisibility compatibility
+
+(defun org-add-to-invisibility-spec (arg)
+ "Add elements to `buffer-invisibility-spec'.
+See documentation for `buffer-invisibility-spec' for the kind of elements
+that can be added."
+ (cond
+ ((fboundp 'add-to-invisibility-spec)
+ (add-to-invisibility-spec arg))
+ ((or (null buffer-invisibility-spec) (eq buffer-invisibility-spec t))
+ (setq buffer-invisibility-spec (list arg)))
+ (t
+ (setq buffer-invisibility-spec
+ (cons arg buffer-invisibility-spec)))))
+
+(defun org-remove-from-invisibility-spec (arg)
+ "Remove elements from `buffer-invisibility-spec'."
+ (if (fboundp 'remove-from-invisibility-spec)
+ (remove-from-invisibility-spec arg)
+ (if (consp buffer-invisibility-spec)
+ (setq buffer-invisibility-spec
+ (delete arg buffer-invisibility-spec)))))
+
+(defun org-in-invisibility-spec-p (arg)
+ "Is ARG a member of `buffer-invisibility-spec'?"
+ (if (consp buffer-invisibility-spec)
+ (member arg buffer-invisibility-spec)
+ nil))
+
+;;;; Define the Org-mode
+
+(if (and (not (keymapp outline-mode-map)) (featurep 'allout))
+ (error "Conflict with outdated version of allout.el. Load org.el before allout.el, or ugrade to newer allout, for example by switching to Emacs 22."))
+
+
+;; We use a before-change function to check if a table might need
+;; an update.
+(defvar org-table-may-need-update t
+ "Indicates that a table might need an update.
+This variable is set by `org-before-change-function'.
+`org-table-align' sets it back to nil.")
+(defvar org-mode-map)
+(defvar org-mode-hook nil)
+(defvar org-inhibit-startup nil) ; Dynamically-scoped param.
+(defvar org-agenda-keep-modes nil) ; Dynamically-scoped param.
+(defvar org-table-buffer-is-an nil)
+(defconst org-outline-regexp "\\*+ ")
+
+;;;###autoload
+(define-derived-mode org-mode outline-mode "Org"
+ "Outline-based notes management and organizer, alias
+\"Carsten's outline-mode for keeping track of everything.\"
+
+Org-mode develops organizational tasks around a NOTES file which
+contains information about projects as plain text. Org-mode is
+implemented on top of outline-mode, which is ideal to keep the content
+of large files well structured. It supports ToDo items, deadlines and
+time stamps, which magically appear in the diary listing of the Emacs
+calendar. Tables are easily created with a built-in table editor.
+Plain text URL-like links connect to websites, emails (VM), Usenet
+messages (Gnus), BBDB entries, and any files related to the project.
+For printing and sharing of notes, an Org-mode file (or a part of it)
+can be exported as a structured ASCII or HTML file.
+
+The following commands are available:
+
+\\{org-mode-map}"
+
+ ;; Get rid of Outline menus, they are not needed
+ ;; Need to do this here because define-derived-mode sets up
+ ;; the keymap so late. Still, it is a waste to call this each time
+ ;; we switch another buffer into org-mode.
+ (if (featurep 'xemacs)
+ (when (boundp 'outline-mode-menu-heading)
+ ;; Assume this is Greg's port, it used easymenu
+ (easy-menu-remove outline-mode-menu-heading)
+ (easy-menu-remove outline-mode-menu-show)
+ (easy-menu-remove outline-mode-menu-hide))
+ (define-key org-mode-map [menu-bar headings] 'undefined)
+ (define-key org-mode-map [menu-bar hide] 'undefined)
+ (define-key org-mode-map [menu-bar show] 'undefined))
+
+ (easy-menu-add org-org-menu)
+ (easy-menu-add org-tbl-menu)
+ (org-install-agenda-files-menu)
+ (if org-descriptive-links (org-add-to-invisibility-spec '(org-link)))
+ (org-add-to-invisibility-spec '(org-cwidth))
+ (when (featurep 'xemacs)
+ (org-set-local 'line-move-ignore-invisible t))
+ (org-set-local 'outline-regexp org-outline-regexp)
+ (org-set-local 'outline-level 'org-outline-level)
+ (when (and org-ellipsis
+ (fboundp 'set-display-table-slot) (boundp 'buffer-display-table)
+ (fboundp 'make-glyph-code))
+ (unless org-display-table
+ (setq org-display-table (make-display-table)))
+ (set-display-table-slot
+ org-display-table 4
+ (vconcat (mapcar
+ (lambda (c) (make-glyph-code c (and (not (stringp org-ellipsis))
+ org-ellipsis)))
+ (if (stringp org-ellipsis) org-ellipsis "..."))))
+ (setq buffer-display-table org-display-table))
+ (org-set-regexps-and-options)
+ ;; Calc embedded
+ (org-set-local 'calc-embedded-open-mode "# ")
+ (modify-syntax-entry ?# "<")
+ (modify-syntax-entry ?@ "w")
+ (if org-startup-truncated (setq truncate-lines t))
+ (org-set-local 'font-lock-unfontify-region-function
+ 'org-unfontify-region)
+ ;; Activate before-change-function
+ (org-set-local 'org-table-may-need-update t)
+ (org-add-hook 'before-change-functions 'org-before-change-function nil
+ 'local)
+ ;; Check for running clock before killing a buffer
+ (org-add-hook 'kill-buffer-hook 'org-check-running-clock nil 'local)
+ ;; Paragraphs and auto-filling
+ (org-set-autofill-regexps)
+ (setq indent-line-function 'org-indent-line-function)
+ (org-update-radio-target-regexp)
+
+ ;; Comment characters
+; (org-set-local 'comment-start "#") ;; FIXME: this breaks wrapping
+ (org-set-local 'comment-padding " ")
+
+ ;; Imenu
+ (org-set-local 'imenu-create-index-function
+ 'org-imenu-get-tree)
+
+ ;; Make isearch reveal context
+ (if (or (featurep 'xemacs)
+ (not (boundp 'outline-isearch-open-invisible-function)))
+ ;; Emacs 21 and XEmacs make use of the hook
+ (org-add-hook 'isearch-mode-end-hook 'org-isearch-end 'append 'local)
+ ;; Emacs 22 deals with this through a special variable
+ (org-set-local 'outline-isearch-open-invisible-function
+ (lambda (&rest ignore) (org-show-context 'isearch))))
+
+ ;; If empty file that did not turn on org-mode automatically, make it to.
+ (if (and org-insert-mode-line-in-empty-file
+ (interactive-p)
+ (= (point-min) (point-max)))
+ (insert "# -*- mode: org -*-\n\n"))
+
+ (unless org-inhibit-startup
+ (when org-startup-align-all-tables
+ (let ((bmp (buffer-modified-p)))
+ (org-table-map-tables 'org-table-align)
+ (set-buffer-modified-p bmp)))
+ (org-cycle-hide-drawers 'all)
+ (cond
+ ((eq org-startup-folded t)
+ (org-cycle '(4)))
+ ((eq org-startup-folded 'content)
+ (let ((this-command 'org-cycle) (last-command 'org-cycle))
+ (org-cycle '(4)) (org-cycle '(4)))))))
+
+(put 'org-mode 'flyspell-mode-predicate 'org-mode-flyspell-verify)
+
+(defsubst org-call-with-arg (command arg)
+ "Call COMMAND interactively, but pretend prefix are was ARG."
+ (let ((current-prefix-arg arg)) (call-interactively command)))
+
+(defsubst org-current-line (&optional pos)
+ (save-excursion
+ (and pos (goto-char pos))
+ ;; works also in narrowed buffer, because we start at 1, not point-min
+ (+ (if (bolp) 1 0) (count-lines 1 (point)))))
+
+(defun org-current-time ()
+ "Current time, possibly rounded to `org-time-stamp-rounding-minutes'."
+ (if (> org-time-stamp-rounding-minutes 0)
+ (let ((r org-time-stamp-rounding-minutes)
+ (time (decode-time)))
+ (apply 'encode-time
+ (append (list 0 (* r (floor (+ .5 (/ (float (nth 1 time)) r)))))
+ (nthcdr 2 time))))
+ (current-time)))
+
+(defun org-add-props (string plist &rest props)
+ "Add text properties to entire string, from beginning to end.
+PLIST may be a list of properties, PROPS are individual properties and values
+that will be added to PLIST. Returns the string that was modified."
+ (add-text-properties
+ 0 (length string) (if props (append plist props) plist) string)
+ string)
+(put 'org-add-props 'lisp-indent-function 2)
+
+
+;;;; Font-Lock stuff, including the activators
+
+(defvar org-mouse-map (make-sparse-keymap))
+(org-defkey org-mouse-map
+ (if (featurep 'xemacs) [button2] [mouse-2]) 'org-open-at-mouse)
+(org-defkey org-mouse-map
+ (if (featurep 'xemacs) [button3] [mouse-3]) 'org-find-file-at-mouse)
+(when org-mouse-1-follows-link
+ (org-defkey org-mouse-map [follow-link] 'mouse-face))
+(when org-tab-follows-link
+ (org-defkey org-mouse-map [(tab)] 'org-open-at-point)
+ (org-defkey org-mouse-map "\C-i" 'org-open-at-point))
+(when org-return-follows-link
+ (org-defkey org-mouse-map [(return)] 'org-open-at-point)
+ (org-defkey org-mouse-map "\C-m" 'org-open-at-point))
+
+(require 'font-lock)
+
+(defconst org-non-link-chars "]\t\n\r<>")
+(defvar org-link-types '("http" "https" "ftp" "mailto" "file" "news" "bbdb" "vm"
+ "wl" "mhe" "rmail" "gnus" "shell" "info" "elisp"))
+(defvar org-link-re-with-space nil
+ "Matches a link with spaces, optional angular brackets around it.")
+(defvar org-link-re-with-space2 nil
+ "Matches a link with spaces, optional angular brackets around it.")
+(defvar org-angle-link-re nil
+ "Matches link with angular brackets, spaces are allowed.")
+(defvar org-plain-link-re nil
+ "Matches plain link, without spaces.")
+(defvar org-bracket-link-regexp nil
+ "Matches a link in double brackets.")
+(defvar org-bracket-link-analytic-regexp nil
+ "Regular expression used to analyze links.
+Here is what the match groups contain after a match:
+1: http:
+2: http
+3: path
+4: [desc]
+5: desc")
+(defvar org-any-link-re nil
+ "Regular expression matching any link.")
+
+(defun org-make-link-regexps ()
+ "Update the link regular expressions.
+This should be called after the variable `org-link-types' has changed."
+ (setq org-link-re-with-space
+ (concat
+ "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^" org-non-link-chars " ]"
+ "[^" org-non-link-chars "]*"
+ "[^" org-non-link-chars " ]\\)>?")
+ org-link-re-with-space2
+ (concat
+ "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^" org-non-link-chars " ]"
+ "[^]\t\n\r]*"
+ "[^" org-non-link-chars " ]\\)>?")
+ org-angle-link-re
+ (concat
+ "<\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^" org-non-link-chars " ]"
+ "[^" org-non-link-chars "]*"
+ "\\)>")
+ org-plain-link-re
+ (concat
+ "\\<\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^]\t\n\r<>,;() ]+\\)")
+ org-bracket-link-regexp
+ "\\[\\[\\([^][]+\\)\\]\\(\\[\\([^][]+\\)\\]\\)?\\]"
+ org-bracket-link-analytic-regexp
+ (concat
+ "\\[\\["
+ "\\(\\(" (mapconcat 'identity org-link-types "\\|") "\\):\\)?"
+ "\\([^]]+\\)"
+ "\\]"
+ "\\(\\[" "\\([^]]+\\)" "\\]\\)?"
+ "\\]")
+ org-any-link-re
+ (concat "\\(" org-bracket-link-regexp "\\)\\|\\("
+ org-angle-link-re "\\)\\|\\("
+ org-plain-link-re "\\)")))
+
+(org-make-link-regexps)
+
+(defconst org-ts-regexp "<\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [^\r\n>]*?\\)>"
+ "Regular expression for fast time stamp matching.")
+(defconst org-ts-regexp-both "[[<]\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [^\r\n>]*?\\)[]>]"
+ "Regular expression for fast time stamp matching.")
+(defconst org-ts-regexp0 "\\(\\([0-9]\\{4\\}\\)-\\([0-9]\\{2\\}\\)-\\([0-9]\\{2\\}\\)\\([^]0-9>\r\n]*\\)\\(\\([0-9]\\{2\\}\\):\\([0-9]\\{2\\}\\)\\)?\\)"
+ "Regular expression matching time strings for analysis.
+This one does not require the space after the date.")
+(defconst org-ts-regexp1 "\\(\\([0-9]\\{4\\}\\)-\\([0-9]\\{2\\}\\)-\\([0-9]\\{2\\}\\) \\([^]0-9>\r\n]*\\)\\(\\([0-9]\\{2\\}\\):\\([0-9]\\{2\\}\\)\\)?\\)"
+ "Regular expression matching time strings for analysis.")
+(defconst org-ts-regexp2 (concat "<" org-ts-regexp1 "[^>\n]\\{0,16\\}>")
+ "Regular expression matching time stamps, with groups.")
+(defconst org-ts-regexp3 (concat "[[<]" org-ts-regexp1 "[^]>\n]\\{0,16\\}[]>]")
+ "Regular expression matching time stamps (also [..]), with groups.")
+(defconst org-tr-regexp (concat org-ts-regexp "--?-?" org-ts-regexp)
+ "Regular expression matching a time stamp range.")
+(defconst org-tr-regexp-both
+ (concat org-ts-regexp-both "--?-?" org-ts-regexp-both)
+ "Regular expression matching a time stamp range.")
+(defconst org-tsr-regexp (concat org-ts-regexp "\\(--?-?"
+ org-ts-regexp "\\)?")
+ "Regular expression matching a time stamp or time stamp range.")
+(defconst org-tsr-regexp-both (concat org-ts-regexp-both "\\(--?-?"
+ org-ts-regexp-both "\\)?")
+ "Regular expression matching a time stamp or time stamp range.
+The time stamps may be either active or inactive.")
+
+(defvar org-emph-face nil)
+
+(defun org-do-emphasis-faces (limit)
+ "Run through the buffer and add overlays to links."
+ (let (rtn)
+ (while (and (not rtn) (re-search-forward org-emph-re limit t))
+ (if (not (= (char-after (match-beginning 3))
+ (char-after (match-beginning 4))))
+ (progn
+ (setq rtn t)
+ (font-lock-prepend-text-property (match-beginning 2) (match-end 2)
+ 'face
+ (nth 1 (assoc (match-string 3)
+ org-emphasis-alist)))
+ (add-text-properties (match-beginning 2) (match-end 2)
+ '(font-lock-multiline t))
+ (when org-hide-emphasis-markers
+ (add-text-properties (match-end 4) (match-beginning 5)
+ '(invisible org-link))
+ (add-text-properties (match-beginning 3) (match-end 3)
+ '(invisible org-link)))))
+ (backward-char 1))
+ rtn))
+
+(defun org-emphasize (&optional char)
+ "Insert or change an emphasis, i.e. a font like bold or italic.
+If there is an active region, change that region to a new emphasis.
+If there is no region, just insert the marker characters and position
+the cursor between them.
+CHAR should be either the marker character, or the first character of the
+HTML tag associated with that emphasis. If CHAR is a space, the means
+to remove the emphasis of the selected region.
+If char is not given (for example in an interactive call) it
+will be prompted for."
+ (interactive)
+ (let ((eal org-emphasis-alist) e det
+ (erc org-emphasis-regexp-components)
+ (prompt "")
+ (string "") beg end move tag c s)
+ (if (org-region-active-p)
+ (setq beg (region-beginning) end (region-end)
+ string (buffer-substring beg end))
+ (setq move t))
+
+ (while (setq e (pop eal))
+ (setq tag (car (org-split-string (nth 2 e) "[ <>/]+"))
+ c (aref tag 0))
+ (push (cons c (string-to-char (car e))) det)
+ (setq prompt (concat prompt (format " [%s%c]%s" (car e) c
+ (substring tag 1)))))
+ (unless char
+ (message "%s" (concat "Emphasis marker or tag:" prompt))
+ (setq char (read-char-exclusive)))
+ (setq char (or (cdr (assoc char det)) char))
+ (if (equal char ?\ )
+ (setq s "" move nil)
+ (unless (assoc (char-to-string char) org-emphasis-alist)
+ (error "No such emphasis marker: \"%c\"" char))
+ (setq s (char-to-string char)))
+ (while (and (> (length string) 1)
+ (equal (substring string 0 1) (substring string -1))
+ (assoc (substring string 0 1) org-emphasis-alist))
+ (setq string (substring string 1 -1)))
+ (setq string (concat s string s))
+ (if beg (delete-region beg end))
+ (unless (or (bolp)
+ (string-match (concat "[" (nth 0 erc) "\n]")
+ (char-to-string (char-before (point)))))
+ (insert " "))
+ (unless (string-match (concat "[" (nth 1 erc) "\n]")
+ (char-to-string (char-after (point))))
+ (insert " ") (backward-char 1))
+ (insert string)
+ (and move (backward-char 1))))
+
+(defconst org-nonsticky-props
+ '(mouse-face highlight keymap invisible intangible help-echo org-linked-text))
+
+
+(defun org-activate-plain-links (limit)
+ "Run through the buffer and add overlays to links."
+ (catch 'exit
+ (let (f)
+ (while (re-search-forward org-plain-link-re limit t)
+ (setq f (get-text-property (match-beginning 0) 'face))
+ (if (or (eq f 'org-tag)
+ (and (listp f) (memq 'org-tag f)))
+ nil
+ (add-text-properties (match-beginning 0) (match-end 0)
+ (list 'mouse-face 'highlight
+ 'rear-nonsticky org-nonsticky-props
+ 'keymap org-mouse-map
+ ))
+ (throw 'exit t))))))
+
+(defun org-activate-code (limit)
+ (if (re-search-forward "^[ \t]*\\(:.*\\)" limit t)
+ (unless (get-text-property (match-beginning 1) 'face)
+ (remove-text-properties (match-beginning 0) (match-end 0)
+ '(display t invisible t intangible t))
+ t)))
+
+(defun org-activate-angle-links (limit)
+ "Run through the buffer and add overlays to links."
+ (if (re-search-forward org-angle-link-re limit t)
+ (progn
+ (add-text-properties (match-beginning 0) (match-end 0)
+ (list 'mouse-face 'highlight
+ 'rear-nonsticky org-nonsticky-props
+ 'keymap org-mouse-map
+ ))
+ t)))
+
+(defmacro org-maybe-intangible (props)
+ "Add '(intangigble t) to PROPS if Emacs version is earlier than Emacs 22.
+In emacs 21, invisible text is not avoided by the command loop, so the
+intangible property is needed to make sure point skips this text.
+In Emacs 22, this is not necessary. The intangible text property has
+led to problems with flyspell. These problems are fixed in flyspell.el,
+but we still avoid setting the property in Emacs 22 and later.
+We use a macro so that the test can happen at compilation time."
+ (if (< emacs-major-version 22)
+ `(append '(intangible t) ,props)
+ props))
+
+(defun org-activate-bracket-links (limit)
+ "Run through the buffer and add overlays to bracketed links."
+ (if (re-search-forward org-bracket-link-regexp limit t)
+ (let* ((help (concat "LINK: "
+ (org-match-string-no-properties 1)))
+ ;; FIXME: above we should remove the escapes.
+ ;; but that requires another match, protecting match data,
+ ;; a lot of overhead for font-lock.
+ (ip (org-maybe-intangible
+ (list 'invisible 'org-link 'rear-nonsticky org-nonsticky-props
+ 'keymap org-mouse-map 'mouse-face 'highlight
+ 'font-lock-multiline t 'help-echo help)))
+ (vp (list 'rear-nonsticky org-nonsticky-props
+ 'keymap org-mouse-map 'mouse-face 'highlight
+ ' font-lock-multiline t 'help-echo help)))
+ ;; We need to remove the invisible property here. Table narrowing
+ ;; may have made some of this invisible.
+ (remove-text-properties (match-beginning 0) (match-end 0)
+ '(invisible nil))
+ (if (match-end 3)
+ (progn
+ (add-text-properties (match-beginning 0) (match-beginning 3) ip)
+ (add-text-properties (match-beginning 3) (match-end 3) vp)
+ (add-text-properties (match-end 3) (match-end 0) ip))
+ (add-text-properties (match-beginning 0) (match-beginning 1) ip)
+ (add-text-properties (match-beginning 1) (match-end 1) vp)
+ (add-text-properties (match-end 1) (match-end 0) ip))
+ t)))
+
+(defun org-activate-dates (limit)
+ "Run through the buffer and add overlays to dates."
+ (if (re-search-forward org-tsr-regexp-both limit t)
+ (progn
+ (add-text-properties (match-beginning 0) (match-end 0)
+ (list 'mouse-face 'highlight
+ 'rear-nonsticky org-nonsticky-props
+ 'keymap org-mouse-map))
+ (when org-display-custom-times
+ (if (match-end 3)
+ (org-display-custom-time (match-beginning 3) (match-end 3)))
+ (org-display-custom-time (match-beginning 1) (match-end 1)))
+ t)))
+
+(defvar org-target-link-regexp nil
+ "Regular expression matching radio targets in plain text.")
+(defvar org-target-regexp "<<\\([^<>\n\r]+\\)>>"
+ "Regular expression matching a link target.")
+(defvar org-radio-target-regexp "<<<\\([^<>\n\r]+\\)>>>"
+ "Regular expression matching a radio target.")
+(defvar org-any-target-regexp "<<<?\\([^<>\n\r]+\\)>>>?" ; FIXME, not exact, would match <<<aaa>> as a radio target.
+ "Regular expression matching any target.")
+
+(defun org-activate-target-links (limit)
+ "Run through the buffer and add overlays to target matches."
+ (when org-target-link-regexp
+ (let ((case-fold-search t))
+ (if (re-search-forward org-target-link-regexp limit t)
+ (progn
+ (add-text-properties (match-beginning 0) (match-end 0)
+ (list 'mouse-face 'highlight
+ 'rear-nonsticky org-nonsticky-props
+ 'keymap org-mouse-map
+ 'help-echo "Radio target link"
+ 'org-linked-text t))
+ t)))))
+
+(defun org-update-radio-target-regexp ()
+ "Find all radio targets in this file and update the regular expression."
+ (interactive)
+ (when (memq 'radio org-activate-links)
+ (setq org-target-link-regexp
+ (org-make-target-link-regexp (org-all-targets 'radio)))
+ (org-restart-font-lock)))
+
+(defun org-hide-wide-columns (limit)
+ (let (s e)
+ (setq s (text-property-any (point) (or limit (point-max))
+ 'org-cwidth t))
+ (when s
+ (setq e (next-single-property-change s 'org-cwidth))
+ (add-text-properties s e (org-maybe-intangible '(invisible org-cwidth)))
+ (goto-char e)
+ t)))
+
+(defvar org-latex-and-specials-regexp nil
+ "Regular expression for highlighting export special stuff.")
+(defvar org-match-substring-regexp)
+(defvar org-match-substring-with-braces-regexp)
+(defvar org-export-html-special-string-regexps)
+
+(defun org-compute-latex-and-specials-regexp ()
+ "Compute regular expression for stuff treated specially by exporters."
+ (if (not org-highlight-latex-fragments-and-specials)
+ (org-set-local 'org-latex-and-specials-regexp nil)
+ (let*
+ ((matchers (plist-get org-format-latex-options :matchers))
+ (latexs (delq nil (mapcar (lambda (x) (if (member (car x) matchers) x))
+ org-latex-regexps)))
+ (options (org-combine-plists (org-default-export-plist)
+ (org-infile-export-plist)))
+ (org-export-with-sub-superscripts (plist-get options :sub-superscript))
+ (org-export-with-LaTeX-fragments (plist-get options :LaTeX-fragments))
+ (org-export-with-TeX-macros (plist-get options :TeX-macros))
+ (org-export-html-expand (plist-get options :expand-quoted-html))
+ (org-export-with-special-strings (plist-get options :special-strings))
+ (re-sub
+ (cond
+ ((equal org-export-with-sub-superscripts '{})
+ (list org-match-substring-with-braces-regexp))
+ (org-export-with-sub-superscripts
+ (list org-match-substring-regexp))
+ (t nil)))
+ (re-latex
+ (if org-export-with-LaTeX-fragments
+ (mapcar (lambda (x) (nth 1 x)) latexs)))
+ (re-macros
+ (if org-export-with-TeX-macros
+ (list (concat "\\\\"
+ (regexp-opt
+ (append (mapcar 'car org-html-entities)
+ (if (boundp 'org-latex-entities)
+ org-latex-entities nil))
+ 'words))) ; FIXME
+ ))
+ ;; (list "\\\\\\(?:[a-zA-Z]+\\)")))
+ (re-special (if org-export-with-special-strings
+ (mapcar (lambda (x) (car x))
+ org-export-html-special-string-regexps)))
+ (re-rest
+ (delq nil
+ (list
+ (if org-export-html-expand "@<[^>\n]+>")
+ ))))
+ (org-set-local
+ 'org-latex-and-specials-regexp
+ (mapconcat 'identity (append re-latex re-sub re-macros re-special
+ re-rest) "\\|")))))
+
+(defface org-latex-and-export-specials
+ (let ((font (cond ((assq :inherit custom-face-attributes)
+ '(:inherit underline))
+ (t '(:underline t)))))
+ `((((class grayscale) (background light))
+ (:foreground "DimGray" ,@font))
+ (((class grayscale) (background dark))
+ (:foreground "LightGray" ,@font))
+ (((class color) (background light))
+ (:foreground "SaddleBrown"))
+ (((class color) (background dark))
+ (:foreground "burlywood"))
+ (t (,@font))))
+ "Face used to highlight math latex and other special exporter stuff."
+ :group 'org-faces)
+
+(defun org-do-latex-and-special-faces (limit)
+ "Run through the buffer and add overlays to links."
+ (when org-latex-and-specials-regexp
+ (let (rtn d)
+ (while (and (not rtn) (re-search-forward org-latex-and-specials-regexp
+ limit t))
+ (if (not (memq (car-safe (get-text-property (1+ (match-beginning 0))
+ 'face))
+ '(org-code org-verbatim underline)))
+ (progn
+ (setq rtn t
+ d (cond ((member (char-after (1+ (match-beginning 0)))
+ '(?_ ?^)) 1)
+ (t 0)))
+ (font-lock-prepend-text-property
+ (+ d (match-beginning 0)) (match-end 0)
+ 'face 'org-latex-and-export-specials)
+ (add-text-properties (+ d (match-beginning 0)) (match-end 0)
+ '(font-lock-multiline t)))))
+ rtn)))
+
+(defun org-restart-font-lock ()
+ "Restart font-lock-mode, to force refontification."
+ (when (and (boundp 'font-lock-mode) font-lock-mode)
+ (font-lock-mode -1)
+ (font-lock-mode 1)))
+
+(defun org-all-targets (&optional radio)
+ "Return a list of all targets in this file.
+With optional argument RADIO, only find radio targets."
+ (let ((re (if radio org-radio-target-regexp org-target-regexp))
+ rtn)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward re nil t)
+ (add-to-list 'rtn (downcase (org-match-string-no-properties 1))))
+ rtn)))
+
+(defun org-make-target-link-regexp (targets)
+ "Make regular expression matching all strings in TARGETS.
+The regular expression finds the targets also if there is a line break
+between words."
+ (and targets
+ (concat
+ "\\<\\("
+ (mapconcat
+ (lambda (x)
+ (while (string-match " +" x)
+ (setq x (replace-match "\\s-+" t t x)))
+ x)
+ targets
+ "\\|")
+ "\\)\\>")))
+
+(defun org-activate-tags (limit)
+ (if (re-search-forward (org-re "^\\*+.*[ \t]\\(:[[:alnum:]_@:]+:\\)[ \r\n]") limit t)
+ (progn
+ (add-text-properties (match-beginning 1) (match-end 1)
+ (list 'mouse-face 'highlight
+ 'rear-nonsticky org-nonsticky-props
+ 'keymap org-mouse-map))
+ t)))
+
+(defun org-outline-level ()
+ (save-excursion
+ (looking-at outline-regexp)
+ (if (match-beginning 1)
+ (+ (org-get-string-indentation (match-string 1)) 1000)
+ (1- (- (match-end 0) (match-beginning 0))))))
+
+(defvar org-font-lock-keywords nil)
+
+(defconst org-property-re (org-re "^[ \t]*\\(:\\([[:alnum:]_]+\\):\\)[ \t]*\\(\\S-.*\\)")
+ "Regular expression matching a property line.")
+
+(defun org-set-font-lock-defaults ()
+ (let* ((em org-fontify-emphasized-text)
+ (lk org-activate-links)
+ (org-font-lock-extra-keywords
+ (list
+ ;; Headlines
+ '("^\\(\\**\\)\\(\\* \\)\\(.*\\)" (1 (org-get-level-face 1))
+ (2 (org-get-level-face 2)) (3 (org-get-level-face 3)))
+ ;; Table lines
+ '("^[ \t]*\\(\\(|\\|\\+-[-+]\\).*\\S-\\)"
+ (1 'org-table t))
+ ;; Table internals
+ '("^[ \t]*|\\(?:.*?|\\)? *\\(:?=[^|\n]*\\)" (1 'org-formula t))
+ '("^[ \t]*| *\\([#*]\\) *|" (1 'org-formula t))
+ '("^[ \t]*|\\( *\\([$!_^/]\\) *|.*\\)|" (1 'org-formula t))
+ ;; Drawers
+ (list org-drawer-regexp '(0 'org-special-keyword t))
+ (list "^[ \t]*:END:" '(0 'org-special-keyword t))
+ ;; Properties
+ (list org-property-re
+ '(1 'org-special-keyword t)
+ '(3 'org-property-value t))
+ (if org-format-transports-properties-p
+ '("| *\\(<[0-9]+>\\) *" (1 'org-formula t)))
+ ;; Links
+ (if (memq 'tag lk) '(org-activate-tags (1 'org-tag prepend)))
+ (if (memq 'angle lk) '(org-activate-angle-links (0 'org-link t)))
+ (if (memq 'plain lk) '(org-activate-plain-links (0 'org-link t)))
+ (if (memq 'bracket lk) '(org-activate-bracket-links (0 'org-link t)))
+ (if (memq 'radio lk) '(org-activate-target-links (0 'org-link t)))
+ (if (memq 'date lk) '(org-activate-dates (0 'org-date t)))
+ '("^&?%%(.*\\|<%%([^>\n]*?>" (0 'org-sexp-date t))
+ '(org-hide-wide-columns (0 nil append))
+ ;; TODO lines
+ (list (concat "^\\*+[ \t]+" org-todo-regexp)
+ '(1 (org-get-todo-face 1) t))
+ ;; DONE
+ (if org-fontify-done-headline
+ (list (concat "^[*]+ +\\<\\("
+ (mapconcat 'regexp-quote org-done-keywords "\\|")
+ "\\)\\(.*\\)")
+ '(2 'org-headline-done t))
+ nil)
+ ;; Priorities
+ (list (concat "\\[#[A-Z0-9]\\]") '(0 'org-special-keyword t))
+ ;; Special keywords
+ (list (concat "\\<" org-deadline-string) '(0 'org-special-keyword t))
+ (list (concat "\\<" org-scheduled-string) '(0 'org-special-keyword t))
+ (list (concat "\\<" org-closed-string) '(0 'org-special-keyword t))
+ (list (concat "\\<" org-clock-string) '(0 'org-special-keyword t))
+ ;; Emphasis
+ (if em
+ (if (featurep 'xemacs)
+ '(org-do-emphasis-faces (0 nil append))
+ '(org-do-emphasis-faces)))
+ ;; Checkboxes
+ '("^[ \t]*\\([-+*]\\|[0-9]+[.)]\\) +\\(\\[[- X]\\]\\)"
+ 2 'bold prepend)
+ (if org-provide-checkbox-statistics
+ '("\\[\\([0-9]*%\\)\\]\\|\\[\\([0-9]*\\)/\\([0-9]*\\)\\]"
+ (0 (org-get-checkbox-statistics-face) t)))
+ (list (concat "^\\*+ \\(.*:" org-archive-tag ":.*\\)")
+ '(1 'org-archived prepend))
+ ;; Specials
+ '(org-do-latex-and-special-faces)
+ ;; Code
+ '(org-activate-code (1 'org-code t))
+ ;; COMMENT
+ (list (concat "^\\*+[ \t]+\\<\\(" org-comment-string
+ "\\|" org-quote-string "\\)\\>")
+ '(1 'org-special-keyword t))
+ '("^#.*" (0 'font-lock-comment-face t))
+ )))
+ (setq org-font-lock-extra-keywords (delq nil org-font-lock-extra-keywords))
+ ;; Now set the full font-lock-keywords
+ (org-set-local 'org-font-lock-keywords org-font-lock-extra-keywords)
+ (org-set-local 'font-lock-defaults
+ '(org-font-lock-keywords t nil nil backward-paragraph))
+ (kill-local-variable 'font-lock-keywords) nil))
+
+(defvar org-m nil)
+(defvar org-l nil)
+(defvar org-f nil)
+(defun org-get-level-face (n)
+ "Get the right face for match N in font-lock matching of healdines."
+ (setq org-l (- (match-end 2) (match-beginning 1) 1))
+ (if org-odd-levels-only (setq org-l (1+ (/ org-l 2))))
+ (setq org-f (nth (% (1- org-l) org-n-level-faces) org-level-faces))
+ (cond
+ ((eq n 1) (if org-hide-leading-stars 'org-hide org-f))
+ ((eq n 2) org-f)
+ (t (if org-level-color-stars-only nil org-f))))
+
+(defun org-get-todo-face (kwd)
+ "Get the right face for a TODO keyword KWD.
+If KWD is a number, get the corresponding match group."
+ (if (numberp kwd) (setq kwd (match-string kwd)))
+ (or (cdr (assoc kwd org-todo-keyword-faces))
+ (and (member kwd org-done-keywords) 'org-done)
+ 'org-todo))
+
+(defun org-unfontify-region (beg end &optional maybe_loudly)
+ "Remove fontification and activation overlays from links."
+ (font-lock-default-unfontify-region beg end)
+ (let* ((buffer-undo-list t)
+ (inhibit-read-only t) (inhibit-point-motion-hooks t)
+ (inhibit-modification-hooks t)
+ deactivate-mark buffer-file-name buffer-file-truename)
+ (remove-text-properties beg end
+ '(mouse-face t keymap t org-linked-text t
+ invisible t intangible t))))
+
+;;;; Visibility cycling, including org-goto and indirect buffer
+
+;;; Cycling
+
+(defvar org-cycle-global-status nil)
+(make-variable-buffer-local 'org-cycle-global-status)
+(defvar org-cycle-subtree-status nil)
+(make-variable-buffer-local 'org-cycle-subtree-status)
+
+;;;###autoload
+(defun org-cycle (&optional arg)
+ "Visibility cycling for Org-mode.
+
+- When this function is called with a prefix argument, rotate the entire
+ buffer through 3 states (global cycling)
+ 1. OVERVIEW: Show only top-level headlines.
+ 2. CONTENTS: Show all headlines of all levels, but no body text.
+ 3. SHOW ALL: Show everything.
+
+- When point is at the beginning of a headline, rotate the subtree started
+ by this line through 3 different states (local cycling)
+ 1. FOLDED: Only the main headline is shown.
+ 2. CHILDREN: The main headline and the direct children are shown.
+ From this state, you can move to one of the children
+ and zoom in further.
+ 3. SUBTREE: Show the entire subtree, including body text.
+
+- When there is a numeric prefix, go up to a heading with level ARG, do
+ a `show-subtree' and return to the previous cursor position. If ARG
+ is negative, go up that many levels.
+
+- When point is not at the beginning of a headline, execute
+ `indent-relative', like TAB normally does. See the option
+ `org-cycle-emulate-tab' for details.
+
+- Special case: if point is at the beginning of the buffer and there is
+ no headline in line 1, this function will act as if called with prefix arg.
+ But only if also the variable `org-cycle-global-at-bob' is t."
+ (interactive "P")
+ (let* ((outline-regexp
+ (if (and (org-mode-p) org-cycle-include-plain-lists)
+ "\\(?:\\*+ \\|\\([ \t]*\\)\\([-+*]\\|[0-9]+[.)]\\) \\)"
+ outline-regexp))
+ (bob-special (and org-cycle-global-at-bob (bobp)
+ (not (looking-at outline-regexp))))
+ (org-cycle-hook
+ (if bob-special
+ (delq 'org-optimize-window-after-visibility-change
+ (copy-sequence org-cycle-hook))
+ org-cycle-hook))
+ (pos (point)))
+
+ (if (or bob-special (equal arg '(4)))
+ ;; special case: use global cycling
+ (setq arg t))
+
+ (cond
+
+ ((org-at-table-p 'any)
+ ;; Enter the table or move to the next field in the table
+ (or (org-table-recognize-table.el)
+ (progn
+ (if arg (org-table-edit-field t)
+ (org-table-justify-field-maybe)
+ (call-interactively 'org-table-next-field)))))
+
+ ((eq arg t) ;; Global cycling
+
+ (cond
+ ((and (eq last-command this-command)
+ (eq org-cycle-global-status 'overview))
+ ;; We just created the overview - now do table of contents
+ ;; This can be slow in very large buffers, so indicate action
+ (message "CONTENTS...")
+ (org-content)
+ (message "CONTENTS...done")
+ (setq org-cycle-global-status 'contents)
+ (run-hook-with-args 'org-cycle-hook 'contents))
+
+ ((and (eq last-command this-command)
+ (eq org-cycle-global-status 'contents))
+ ;; We just showed the table of contents - now show everything
+ (show-all)
+ (message "SHOW ALL")
+ (setq org-cycle-global-status 'all)
+ (run-hook-with-args 'org-cycle-hook 'all))
+
+ (t
+ ;; Default action: go to overview
+ (org-overview)
+ (message "OVERVIEW")
+ (setq org-cycle-global-status 'overview)
+ (run-hook-with-args 'org-cycle-hook 'overview))))
+
+ ((and org-drawers org-drawer-regexp
+ (save-excursion
+ (beginning-of-line 1)
+ (looking-at org-drawer-regexp)))
+ ;; Toggle block visibility
+ (org-flag-drawer
+ (not (get-char-property (match-end 0) 'invisible))))
+
+ ((integerp arg)
+ ;; Show-subtree, ARG levels up from here.
+ (save-excursion
+ (org-back-to-heading)
+ (outline-up-heading (if (< arg 0) (- arg)
+ (- (funcall outline-level) arg)))
+ (org-show-subtree)))
+
+ ((and (save-excursion (beginning-of-line 1) (looking-at outline-regexp))
+ (or (bolp) (not (eq org-cycle-emulate-tab 'exc-hl-bol))))
+ ;; At a heading: rotate between three different views
+ (org-back-to-heading)
+ (let ((goal-column 0) eoh eol eos)
+ ;; First, some boundaries
+ (save-excursion
+ (org-back-to-heading)
+ (save-excursion
+ (beginning-of-line 2)
+ (while (and (not (eobp)) ;; this is like `next-line'
+ (get-char-property (1- (point)) 'invisible))
+ (beginning-of-line 2)) (setq eol (point)))
+ (outline-end-of-heading) (setq eoh (point))
+ (org-end-of-subtree t)
+ (unless (eobp)
+ (skip-chars-forward " \t\n")
+ (beginning-of-line 1) ; in case this is an item
+ )
+ (setq eos (1- (point))))
+ ;; Find out what to do next and set `this-command'
+ (cond
+ ((= eos eoh)
+ ;; Nothing is hidden behind this heading
+ (message "EMPTY ENTRY")
+ (setq org-cycle-subtree-status nil)
+ (save-excursion
+ (goto-char eos)
+ (outline-next-heading)
+ (if (org-invisible-p) (org-flag-heading nil))))
+ ((or (>= eol eos)
+ (not (string-match "\\S-" (buffer-substring eol eos))))
+ ;; Entire subtree is hidden in one line: open it
+ (org-show-entry)
+ (show-children)
+ (message "CHILDREN")
+ (save-excursion
+ (goto-char eos)
+ (outline-next-heading)
+ (if (org-invisible-p) (org-flag-heading nil)))
+ (setq org-cycle-subtree-status 'children)
+ (run-hook-with-args 'org-cycle-hook 'children))
+ ((and (eq last-command this-command)
+ (eq org-cycle-subtree-status 'children))
+ ;; We just showed the children, now show everything.
+ (org-show-subtree)
+ (message "SUBTREE")
+ (setq org-cycle-subtree-status 'subtree)
+ (run-hook-with-args 'org-cycle-hook 'subtree))
+ (t
+ ;; Default action: hide the subtree.
+ (hide-subtree)
+ (message "FOLDED")
+ (setq org-cycle-subtree-status 'folded)
+ (run-hook-with-args 'org-cycle-hook 'folded)))))
+
+ ;; TAB emulation
+ (buffer-read-only (org-back-to-heading))
+
+ ((org-try-cdlatex-tab))
+
+ ((and (eq org-cycle-emulate-tab 'exc-hl-bol)
+ (or (not (bolp))
+ (not (looking-at outline-regexp))))
+ (call-interactively (global-key-binding "\t")))
+
+ ((if (and (memq org-cycle-emulate-tab '(white whitestart))
+ (save-excursion (beginning-of-line 1) (looking-at "[ \t]*"))
+ (or (and (eq org-cycle-emulate-tab 'white)
+ (= (match-end 0) (point-at-eol)))
+ (and (eq org-cycle-emulate-tab 'whitestart)
+ (>= (match-end 0) pos))))
+ t
+ (eq org-cycle-emulate-tab t))
+; (if (and (looking-at "[ \n\r\t]")
+; (string-match "^[ \t]*$" (buffer-substring
+; (point-at-bol) (point))))
+; (progn
+; (beginning-of-line 1)
+; (and (looking-at "[ \t]+") (replace-match ""))))
+ (call-interactively (global-key-binding "\t")))
+
+ (t (save-excursion
+ (org-back-to-heading)
+ (org-cycle))))))
+
+;;;###autoload
+(defun org-global-cycle (&optional arg)
+ "Cycle the global visibility. For details see `org-cycle'."
+ (interactive "P")
+ (let ((org-cycle-include-plain-lists
+ (if (org-mode-p) org-cycle-include-plain-lists nil)))
+ (if (integerp arg)
+ (progn
+ (show-all)
+ (hide-sublevels arg)
+ (setq org-cycle-global-status 'contents))
+ (org-cycle '(4)))))
+
+(defun org-overview ()
+ "Switch to overview mode, shoing only top-level headlines.
+Really, this shows all headlines with level equal or greater than the level
+of the first headline in the buffer. This is important, because if the
+first headline is not level one, then (hide-sublevels 1) gives confusing
+results."
+ (interactive)
+ (let ((level (save-excursion
+ (goto-char (point-min))
+ (if (re-search-forward (concat "^" outline-regexp) nil t)
+ (progn
+ (goto-char (match-beginning 0))
+ (funcall outline-level))))))
+ (and level (hide-sublevels level))))
+
+(defun org-content (&optional arg)
+ "Show all headlines in the buffer, like a table of contents.
+With numerical argument N, show content up to level N."
+ (interactive "P")
+ (save-excursion
+ ;; Visit all headings and show their offspring
+ (and (integerp arg) (org-overview))
+ (goto-char (point-max))
+ (catch 'exit
+ (while (and (progn (condition-case nil
+ (outline-previous-visible-heading 1)
+ (error (goto-char (point-min))))
+ t)
+ (looking-at outline-regexp))
+ (if (integerp arg)
+ (show-children (1- arg))
+ (show-branches))
+ (if (bobp) (throw 'exit nil))))))
+
+
+(defun org-optimize-window-after-visibility-change (state)
+ "Adjust the window after a change in outline visibility.
+This function is the default value of the hook `org-cycle-hook'."
+ (when (get-buffer-window (current-buffer))
+ (cond
+; ((eq state 'overview) (org-first-headline-recenter 1))
+; ((eq state 'overview) (org-beginning-of-line))
+ ((eq state 'content) nil)
+ ((eq state 'all) nil)
+ ((eq state 'folded) nil)
+ ((eq state 'children) (or (org-subtree-end-visible-p) (recenter 1)))
+ ((eq state 'subtree) (or (org-subtree-end-visible-p) (recenter 1))))))
+
+(defun org-compact-display-after-subtree-move ()
+ (let (beg end)
+ (save-excursion
+ (if (org-up-heading-safe)
+ (progn
+ (hide-subtree)
+ (show-entry)
+ (show-children)
+ (org-cycle-show-empty-lines 'children)
+ (org-cycle-hide-drawers 'children))
+ (org-overview)))))
+
+(defun org-cycle-show-empty-lines (state)
+ "Show empty lines above all visible headlines.
+The region to be covered depends on STATE when called through
+`org-cycle-hook'. Lisp program can use t for STATE to get the
+entire buffer covered. Note that an empty line is only shown if there
+are at least `org-cycle-separator-lines' empty lines before the headeline."
+ (when (> org-cycle-separator-lines 0)
+ (save-excursion
+ (let* ((n org-cycle-separator-lines)
+ (re (cond
+ ((= n 1) "\\(\n[ \t]*\n\\*+\\) ")
+ ((= n 2) "^[ \t]*\\(\n[ \t]*\n\\*+\\) ")
+ (t (let ((ns (number-to-string (- n 2))))
+ (concat "^\\(?:[ \t]*\n\\)\\{" ns "," ns "\\}"
+ "[ \t]*\\(\n[ \t]*\n\\*+\\) ")))))
+ beg end)
+ (cond
+ ((memq state '(overview contents t))
+ (setq beg (point-min) end (point-max)))
+ ((memq state '(children folded))
+ (setq beg (point) end (progn (org-end-of-subtree t t)
+ (beginning-of-line 2)
+ (point)))))
+ (when beg
+ (goto-char beg)
+ (while (re-search-forward re end t)
+ (if (not (get-char-property (match-end 1) 'invisible))
+ (outline-flag-region
+ (match-beginning 1) (match-end 1) nil)))))))
+ ;; Never hide empty lines at the end of the file.
+ (save-excursion
+ (goto-char (point-max))
+ (outline-previous-heading)
+ (outline-end-of-heading)
+ (if (and (looking-at "[ \t\n]+")
+ (= (match-end 0) (point-max)))
+ (outline-flag-region (point) (match-end 0) nil))))
+
+(defun org-subtree-end-visible-p ()
+ "Is the end of the current subtree visible?"
+ (pos-visible-in-window-p
+ (save-excursion (org-end-of-subtree t) (point))))
+
+(defun org-first-headline-recenter (&optional N)
+ "Move cursor to the first headline and recenter the headline.
+Optional argument N means, put the headline into the Nth line of the window."
+ (goto-char (point-min))
+ (when (re-search-forward (concat "^\\(" outline-regexp "\\)") nil t)
+ (beginning-of-line)
+ (recenter (prefix-numeric-value N))))
+
+;;; Org-goto
+
+(defvar org-goto-window-configuration nil)
+(defvar org-goto-marker nil)
+(defvar org-goto-map
+ (let ((map (make-sparse-keymap)))
+ (let ((cmds '(isearch-forward isearch-backward kill-ring-save set-mark-command mouse-drag-region universal-argument org-occur)) cmd)
+ (while (setq cmd (pop cmds))
+ (substitute-key-definition cmd cmd map global-map)))
+ (suppress-keymap map)
+ (org-defkey map "\C-m" 'org-goto-ret)
+ (org-defkey map [(left)] 'org-goto-left)
+ (org-defkey map [(right)] 'org-goto-right)
+ (org-defkey map [(?q)] 'org-goto-quit)
+ (org-defkey map [(control ?g)] 'org-goto-quit)
+ (org-defkey map "\C-i" 'org-cycle)
+ (org-defkey map [(tab)] 'org-cycle)
+ (org-defkey map [(down)] 'outline-next-visible-heading)
+ (org-defkey map [(up)] 'outline-previous-visible-heading)
+ (org-defkey map "n" 'outline-next-visible-heading)
+ (org-defkey map "p" 'outline-previous-visible-heading)
+ (org-defkey map "f" 'outline-forward-same-level)
+ (org-defkey map "b" 'outline-backward-same-level)
+ (org-defkey map "u" 'outline-up-heading)
+ (org-defkey map "/" 'org-occur)
+ (org-defkey map "\C-c\C-n" 'outline-next-visible-heading)
+ (org-defkey map "\C-c\C-p" 'outline-previous-visible-heading)
+ (org-defkey map "\C-c\C-f" 'outline-forward-same-level)
+ (org-defkey map "\C-c\C-b" 'outline-backward-same-level)
+ (org-defkey map "\C-c\C-u" 'outline-up-heading)
+ map))
+
+(defconst org-goto-help
+"Browse copy of buffer to find location or copy text.
+RET=jump to location [Q]uit and return to previous location
+\[Up]/[Down]=next/prev headline TAB=cycle visibility [/] org-occur"
+)
+
+(defvar org-goto-start-pos) ; dynamically scoped parameter
+
+(defun org-goto ()
+ "Look up a different location in the current file, keeping current visibility.
+
+When you want look-up or go to a different location in a document, the
+fastest way is often to fold the entire buffer and then dive into the tree.
+This method has the disadvantage, that the previous location will be folded,
+which may not be what you want.
+
+This command works around this by showing a copy of the current buffer
+in an indirect buffer, in overview mode. You can dive into the tree in
+that copy, use org-occur and incremental search to find a location.
+When pressing RET or `Q', the command returns to the original buffer in
+which the visibility is still unchanged. After RET is will also jump to
+the location selected in the indirect buffer and expose the
+the headline hierarchy above."
+ (interactive)
+ (let* ((org-goto-start-pos (point))
+ (selected-point
+ (car (org-get-location (current-buffer) org-goto-help))))
+ (if selected-point
+ (progn
+ (org-mark-ring-push org-goto-start-pos)
+ (goto-char selected-point)
+ (if (or (org-invisible-p) (org-invisible-p2))
+ (org-show-context 'org-goto)))
+ (message "Quit"))))
+
+(defvar org-goto-selected-point nil) ; dynamically scoped parameter
+(defvar org-goto-exit-command nil) ; dynamically scoped parameter
+
+(defun org-get-location (buf help)
+ "Let the user select a location in the Org-mode buffer BUF.
+This function uses a recursive edit. It returns the selected position
+or nil."
+ (let (org-goto-selected-point org-goto-exit-command)
+ (save-excursion
+ (save-window-excursion
+ (delete-other-windows)
+ (and (get-buffer "*org-goto*") (kill-buffer "*org-goto*"))
+ (switch-to-buffer
+ (condition-case nil
+ (make-indirect-buffer (current-buffer) "*org-goto*")
+ (error (make-indirect-buffer (current-buffer) "*org-goto*"))))
+ (with-output-to-temp-buffer "*Help*"
+ (princ help))
+ (shrink-window-if-larger-than-buffer (get-buffer-window "*Help*"))
+ (setq buffer-read-only nil)
+ (let ((org-startup-truncated t)
+ (org-startup-folded nil)
+ (org-startup-align-all-tables nil))
+ (org-mode)
+ (org-overview))
+ (setq buffer-read-only t)
+ (if (and (boundp 'org-goto-start-pos)
+ (integer-or-marker-p org-goto-start-pos))
+ (let ((org-show-hierarchy-above t)
+ (org-show-siblings t)
+ (org-show-following-heading t))
+ (goto-char org-goto-start-pos)
+ (and (org-invisible-p) (org-show-context)))
+ (goto-char (point-min)))
+ (org-beginning-of-line)
+ (message "Select location and press RET")
+ ;; now we make sure that during selection, ony very few keys work
+ ;; and that it is impossible to switch to another window.
+; (let ((gm (current-global-map))
+; (overriding-local-map org-goto-map))
+; (unwind-protect
+; (progn
+; (use-global-map org-goto-map)
+; (recursive-edit))
+; (use-global-map gm)))
+ (use-local-map org-goto-map)
+ (recursive-edit)
+ ))
+ (kill-buffer "*org-goto*")
+ (cons org-goto-selected-point org-goto-exit-command)))
+
+(defun org-goto-ret (&optional arg)
+ "Finish `org-goto' by going to the new location."
+ (interactive "P")
+ (setq org-goto-selected-point (point)
+ org-goto-exit-command 'return)
+ (throw 'exit nil))
+
+(defun org-goto-left ()
+ "Finish `org-goto' by going to the new location."
+ (interactive)
+ (if (org-on-heading-p)
+ (progn
+ (beginning-of-line 1)
+ (setq org-goto-selected-point (point)
+ org-goto-exit-command 'left)
+ (throw 'exit nil))
+ (error "Not on a heading")))
+
+(defun org-goto-right ()
+ "Finish `org-goto' by going to the new location."
+ (interactive)
+ (if (org-on-heading-p)
+ (progn
+ (setq org-goto-selected-point (point)
+ org-goto-exit-command 'right)
+ (throw 'exit nil))
+ (error "Not on a heading")))
+
+(defun org-goto-quit ()
+ "Finish `org-goto' without cursor motion."
+ (interactive)
+ (setq org-goto-selected-point nil)
+ (setq org-goto-exit-command 'quit)
+ (throw 'exit nil))
+
+;;; Indirect buffer display of subtrees
+
+(defvar org-indirect-dedicated-frame nil
+ "This is the frame being used for indirect tree display.")
+(defvar org-last-indirect-buffer nil)
+
+(defun org-tree-to-indirect-buffer (&optional arg)
+ "Create indirect buffer and narrow it to current subtree.
+With numerical prefix ARG, go up to this level and then take that tree.
+If ARG is negative, go up that many levels.
+If `org-indirect-buffer-display' is not `new-frame', the command removes the
+indirect buffer previously made with this command, to avoid proliferation of
+indirect buffers. However, when you call the command with a `C-u' prefix, or
+when `org-indirect-buffer-display' is `new-frame', the last buffer
+is kept so that you can work with several indirect buffers at the same time.
+If `org-indirect-buffer-display' is `dedicated-frame', the C-u prefix also
+requests that a new frame be made for the new buffer, so that the dedicated
+frame is not changed."
+ (interactive "P")
+ (let ((cbuf (current-buffer))
+ (cwin (selected-window))
+ (pos (point))
+ beg end level heading ibuf)
+ (save-excursion
+ (org-back-to-heading t)
+ (when (numberp arg)
+ (setq level (org-outline-level))
+ (if (< arg 0) (setq arg (+ level arg)))
+ (while (> (setq level (org-outline-level)) arg)
+ (outline-up-heading 1 t)))
+ (setq beg (point)
+ heading (org-get-heading))
+ (org-end-of-subtree t) (setq end (point)))
+ (if (and (buffer-live-p org-last-indirect-buffer)
+ (not (eq org-indirect-buffer-display 'new-frame))
+ (not arg))
+ (kill-buffer org-last-indirect-buffer))
+ (setq ibuf (org-get-indirect-buffer cbuf)
+ org-last-indirect-buffer ibuf)
+ (cond
+ ((or (eq org-indirect-buffer-display 'new-frame)
+ (and arg (eq org-indirect-buffer-display 'dedicated-frame)))
+ (select-frame (make-frame))
+ (delete-other-windows)
+ (switch-to-buffer ibuf)
+ (org-set-frame-title heading))
+ ((eq org-indirect-buffer-display 'dedicated-frame)
+ (raise-frame
+ (select-frame (or (and org-indirect-dedicated-frame
+ (frame-live-p org-indirect-dedicated-frame)
+ org-indirect-dedicated-frame)
+ (setq org-indirect-dedicated-frame (make-frame)))))
+ (delete-other-windows)
+ (switch-to-buffer ibuf)
+ (org-set-frame-title (concat "Indirect: " heading)))
+ ((eq org-indirect-buffer-display 'current-window)
+ (switch-to-buffer ibuf))
+ ((eq org-indirect-buffer-display 'other-window)
+ (pop-to-buffer ibuf))
+ (t (error "Invalid value.")))
+ (if (featurep 'xemacs)
+ (save-excursion (org-mode) (turn-on-font-lock)))
+ (narrow-to-region beg end)
+ (show-all)
+ (goto-char pos)
+ (and (window-live-p cwin) (select-window cwin))))
+
+(defun org-get-indirect-buffer (&optional buffer)
+ (setq buffer (or buffer (current-buffer)))
+ (let ((n 1) (base (buffer-name buffer)) bname)
+ (while (buffer-live-p
+ (get-buffer (setq bname (concat base "-" (number-to-string n)))))
+ (setq n (1+ n)))
+ (condition-case nil
+ (make-indirect-buffer buffer bname 'clone)
+ (error (make-indirect-buffer buffer bname)))))
+
+(defun org-set-frame-title (title)
+ "Set the title of the current frame to the string TITLE."
+ ;; FIXME: how to name a single frame in XEmacs???
+ (unless (featurep 'xemacs)
+ (modify-frame-parameters (selected-frame) (list (cons 'name title)))))
+
+;;;; Structure editing
+
+;;; Inserting headlines
+
+(defun org-insert-heading (&optional force-heading)
+ "Insert a new heading or item with same depth at point.
+If point is in a plain list and FORCE-HEADING is nil, create a new list item.
+If point is at the beginning of a headline, insert a sibling before the
+current headline. If point is in the middle of a headline, split the headline
+at that position and make the rest of the headline part of the sibling below
+the current headline."
+ (interactive "P")
+ (if (= (buffer-size) 0)
+ (insert "\n* ")
+ (when (or force-heading (not (org-insert-item)))
+ (let* ((head (save-excursion
+ (condition-case nil
+ (progn
+ (org-back-to-heading)
+ (match-string 0))
+ (error "*"))))
+ (blank (cdr (assq 'heading org-blank-before-new-entry)))
+ pos)
+ (cond
+ ((and (org-on-heading-p) (bolp)
+ (or (bobp)
+ (save-excursion (backward-char 1) (not (org-invisible-p)))))
+ (open-line (if blank 2 1)))
+ ((and (bolp)
+ (or (bobp)
+ (save-excursion
+ (backward-char 1) (not (org-invisible-p)))))
+ nil)
+ (t (newline (if blank 2 1))))
+ (insert head) (just-one-space)
+ (setq pos (point))
+ (end-of-line 1)
+ (unless (= (point) pos) (just-one-space) (backward-delete-char 1))
+ (run-hooks 'org-insert-heading-hook)))))
+
+(defun org-insert-heading-after-current ()
+ "Insert a new heading with same level as current, after current subtree."
+ (interactive)
+ (org-back-to-heading)
+ (org-insert-heading)
+ (org-move-subtree-down)
+ (end-of-line 1))
+
+(defun org-insert-todo-heading (arg)
+ "Insert a new heading with the same level and TODO state as current heading.
+If the heading has no TODO state, or if the state is DONE, use the first
+state (TODO by default). Also with prefix arg, force first state."
+ (interactive "P")
+ (when (not (org-insert-item 'checkbox))
+ (org-insert-heading)
+ (save-excursion
+ (org-back-to-heading)
+ (outline-previous-heading)
+ (looking-at org-todo-line-regexp))
+ (if (or arg
+ (not (match-beginning 2))
+ (member (match-string 2) org-done-keywords))
+ (insert (car org-todo-keywords-1) " ")
+ (insert (match-string 2) " "))))
+
+(defun org-insert-subheading (arg)
+ "Insert a new subheading and demote it.
+Works for outline headings and for plain lists alike."
+ (interactive "P")
+ (org-insert-heading arg)
+ (cond
+ ((org-on-heading-p) (org-do-demote))
+ ((org-at-item-p) (org-indent-item 1))))
+
+(defun org-insert-todo-subheading (arg)
+ "Insert a new subheading with TODO keyword or checkbox and demote it.
+Works for outline headings and for plain lists alike."
+ (interactive "P")
+ (org-insert-todo-heading arg)
+ (cond
+ ((org-on-heading-p) (org-do-demote))
+ ((org-at-item-p) (org-indent-item 1))))
+
+;;; Promotion and Demotion
+
+(defun org-promote-subtree ()
+ "Promote the entire subtree.
+See also `org-promote'."
+ (interactive)
+ (save-excursion
+ (org-map-tree 'org-promote))
+ (org-fix-position-after-promote))
+
+(defun org-demote-subtree ()
+ "Demote the entire subtree. See `org-demote'.
+See also `org-promote'."
+ (interactive)
+ (save-excursion
+ (org-map-tree 'org-demote))
+ (org-fix-position-after-promote))
+
+
+(defun org-do-promote ()
+ "Promote the current heading higher up the tree.
+If the region is active in `transient-mark-mode', promote all headings
+in the region."
+ (interactive)
+ (save-excursion
+ (if (org-region-active-p)
+ (org-map-region 'org-promote (region-beginning) (region-end))
+ (org-promote)))
+ (org-fix-position-after-promote))
+
+(defun org-do-demote ()
+ "Demote the current heading lower down the tree.
+If the region is active in `transient-mark-mode', demote all headings
+in the region."
+ (interactive)
+ (save-excursion
+ (if (org-region-active-p)
+ (org-map-region 'org-demote (region-beginning) (region-end))
+ (org-demote)))
+ (org-fix-position-after-promote))
+
+(defun org-fix-position-after-promote ()
+ "Make sure that after pro/demotion cursor position is right."
+ (let ((pos (point)))
+ (when (save-excursion
+ (beginning-of-line 1)
+ (looking-at org-todo-line-regexp)
+ (or (equal pos (match-end 1)) (equal pos (match-end 2))))
+ (cond ((eobp) (insert " "))
+ ((eolp) (insert " "))
+ ((equal (char-after) ?\ ) (forward-char 1))))))
+
+(defun org-reduced-level (l)
+ (if org-odd-levels-only (1+ (floor (/ l 2))) l))
+
+(defun org-get-legal-level (level &optional change)
+ "Rectify a level change under the influence of `org-odd-levels-only'
+LEVEL is a current level, CHANGE is by how much the level should be
+modified. Even if CHANGE is nil, LEVEL may be returned modified because
+even level numbers will become the next higher odd number."
+ (if org-odd-levels-only
+ (cond ((or (not change) (= 0 change)) (1+ (* 2 (/ level 2))))
+ ((> change 0) (1+ (* 2 (/ (+ level (* 2 change)) 2))))
+ ((< change 0) (max 1 (1+ (* 2 (/ (+ level (* 2 change)) 2))))))
+ (max 1 (+ level change))))
+
+(defun org-promote ()
+ "Promote the current heading higher up the tree.
+If the region is active in `transient-mark-mode', promote all headings
+in the region."
+ (org-back-to-heading t)
+ (let* ((level (save-match-data (funcall outline-level)))
+ (up-head (concat (make-string (org-get-legal-level level -1) ?*) " "))
+ (diff (abs (- level (length up-head) -1))))
+ (if (= level 1) (error "Cannot promote to level 0. UNDO to recover if necessary"))
+ (replace-match up-head nil t)
+ ;; Fixup tag positioning
+ (and org-auto-align-tags (org-set-tags nil t))
+ (if org-adapt-indentation (org-fixup-indentation (- diff)))))
+
+(defun org-demote ()
+ "Demote the current heading lower down the tree.
+If the region is active in `transient-mark-mode', demote all headings
+in the region."
+ (org-back-to-heading t)
+ (let* ((level (save-match-data (funcall outline-level)))
+ (down-head (concat (make-string (org-get-legal-level level 1) ?*) " "))
+ (diff (abs (- level (length down-head) -1))))
+ (replace-match down-head nil t)
+ ;; Fixup tag positioning
+ (and org-auto-align-tags (org-set-tags nil t))
+ (if org-adapt-indentation (org-fixup-indentation diff))))
+
+(defun org-map-tree (fun)
+ "Call FUN for every heading underneath the current one."
+ (org-back-to-heading)
+ (let ((level (funcall outline-level)))
+ (save-excursion
+ (funcall fun)
+ (while (and (progn
+ (outline-next-heading)
+ (> (funcall outline-level) level))
+ (not (eobp)))
+ (funcall fun)))))
+
+(defun org-map-region (fun beg end)
+ "Call FUN for every heading between BEG and END."
+ (let ((org-ignore-region t))
+ (save-excursion
+ (setq end (copy-marker end))
+ (goto-char beg)
+ (if (and (re-search-forward (concat "^" outline-regexp) nil t)
+ (< (point) end))
+ (funcall fun))
+ (while (and (progn
+ (outline-next-heading)
+ (< (point) end))
+ (not (eobp)))
+ (funcall fun)))))
+
+(defun org-fixup-indentation (diff)
+ "Change the indentation in the current entry by DIFF
+However, if any line in the current entry has no indentation, or if it
+would end up with no indentation after the change, nothing at all is done."
+ (save-excursion
+ (let ((end (save-excursion (outline-next-heading)
+ (point-marker)))
+ (prohibit (if (> diff 0)
+ "^\\S-"
+ (concat "^ \\{0," (int-to-string (- diff)) "\\}\\S-")))
+ col)
+ (unless (save-excursion (end-of-line 1)
+ (re-search-forward prohibit end t))
+ (while (and (< (point) end)
+ (re-search-forward "^[ \t]+" end t))
+ (goto-char (match-end 0))
+ (setq col (current-column))
+ (if (< diff 0) (replace-match ""))
+ (indent-to (+ diff col))))
+ (move-marker end nil))))
+
+(defun org-convert-to-odd-levels ()
+ "Convert an org-mode file with all levels allowed to one with odd levels.
+This will leave level 1 alone, convert level 2 to level 3, level 3 to
+level 5 etc."
+ (interactive)
+ (when (yes-or-no-p "Are you sure you want to globally change levels to odd? ")
+ (let ((org-odd-levels-only nil) n)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^\\*\\*+ " nil t)
+ (setq n (- (length (match-string 0)) 2))
+ (while (>= (setq n (1- n)) 0)
+ (org-demote))
+ (end-of-line 1))))))
+
+
+(defun org-convert-to-oddeven-levels ()
+ "Convert an org-mode file with only odd levels to one with odd and even levels.
+This promotes level 3 to level 2, level 5 to level 3 etc. If the file contains a
+section with an even level, conversion would destroy the structure of the file. An error
+is signaled in this case."
+ (interactive)
+ (goto-char (point-min))
+ ;; First check if there are no even levels
+ (when (re-search-forward "^\\(\\*\\*\\)+ " nil t)
+ (org-show-context t)
+ (error "Not all levels are odd in this file. Conversion not possible."))
+ (when (yes-or-no-p "Are you sure you want to globally change levels to odd-even? ")
+ (let ((org-odd-levels-only nil) n)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^\\*\\*+ " nil t)
+ (setq n (/ (1- (length (match-string 0))) 2))
+ (while (>= (setq n (1- n)) 0)
+ (org-promote))
+ (end-of-line 1))))))
+
+(defun org-tr-level (n)
+ "Make N odd if required."
+ (if org-odd-levels-only (1+ (/ n 2)) n))
+
+;;; Vertical tree motion, cutting and pasting of subtrees
+
+(defun org-move-subtree-up (&optional arg)
+ "Move the current subtree up past ARG headlines of the same level."
+ (interactive "p")
+ (org-move-subtree-down (- (prefix-numeric-value arg))))
+
+(defun org-move-subtree-down (&optional arg)
+ "Move the current subtree down past ARG headlines of the same level."
+ (interactive "p")
+ (setq arg (prefix-numeric-value arg))
+ (let ((movfunc (if (> arg 0) 'outline-get-next-sibling
+ 'outline-get-last-sibling))
+ (ins-point (make-marker))
+ (cnt (abs arg))
+ beg beg0 end txt folded ne-beg ne-end ne-ins ins-end)
+ ;; Select the tree
+ (org-back-to-heading)
+ (setq beg0 (point))
+ (save-excursion
+ (setq ne-beg (org-back-over-empty-lines))
+ (setq beg (point)))
+ (save-match-data
+ (save-excursion (outline-end-of-heading)
+ (setq folded (org-invisible-p)))
+ (outline-end-of-subtree))
+ (outline-next-heading)
+ (setq ne-end (org-back-over-empty-lines))
+ (setq end (point))
+ (goto-char beg0)
+ (when (and (> arg 0) (org-first-sibling-p) (< ne-end ne-beg))
+ ;; include less whitespace
+ (save-excursion
+ (goto-char beg)
+ (forward-line (- ne-beg ne-end))
+ (setq beg (point))))
+ ;; Find insertion point, with error handling
+ (while (> cnt 0)
+ (or (and (funcall movfunc) (looking-at outline-regexp))
+ (progn (goto-char beg0)
+ (error "Cannot move past superior level or buffer limit")))
+ (setq cnt (1- cnt)))
+ (if (> arg 0)
+ ;; Moving forward - still need to move over subtree
+ (progn (org-end-of-subtree t t)
+ (save-excursion
+ (org-back-over-empty-lines)
+ (or (bolp) (newline)))))
+ (setq ne-ins (org-back-over-empty-lines))
+ (move-marker ins-point (point))
+ (setq txt (buffer-substring beg end))
+ (delete-region beg end)
+ (outline-flag-region (1- beg) beg nil)
+ (outline-flag-region (1- (point)) (point) nil)
+ (insert txt)
+ (or (bolp) (insert "\n"))
+ (setq ins-end (point))
+ (goto-char ins-point)
+ (org-skip-whitespace)
+ (when (and (< arg 0)
+ (org-first-sibling-p)
+ (> ne-ins ne-beg))
+ ;; Move whitespace back to beginning
+ (save-excursion
+ (goto-char ins-end)
+ (let ((kill-whole-line t))
+ (kill-line (- ne-ins ne-beg)) (point)))
+ (insert (make-string (- ne-ins ne-beg) ?\n)))
+ (move-marker ins-point nil)
+ (org-compact-display-after-subtree-move)
+ (unless folded
+ (org-show-entry)
+ (show-children)
+ (org-cycle-hide-drawers 'children))))
+
+(defvar org-subtree-clip ""
+ "Clipboard for cut and paste of subtrees.
+This is actually only a copy of the kill, because we use the normal kill
+ring. We need it to check if the kill was created by `org-copy-subtree'.")
+
+(defvar org-subtree-clip-folded nil
+ "Was the last copied subtree folded?
+This is used to fold the tree back after pasting.")
+
+(defun org-cut-subtree (&optional n)
+ "Cut the current subtree into the clipboard.
+With prefix arg N, cut this many sequential subtrees.
+This is a short-hand for marking the subtree and then cutting it."
+ (interactive "p")
+ (org-copy-subtree n 'cut))
+
+(defun org-copy-subtree (&optional n cut)
+ "Cut the current subtree into the clipboard.
+With prefix arg N, cut this many sequential subtrees.
+This is a short-hand for marking the subtree and then copying it.
+If CUT is non-nil, actually cut the subtree."
+ (interactive "p")
+ (let (beg end folded (beg0 (point)))
+ (if (interactive-p)
+ (org-back-to-heading nil) ; take what looks like a subtree
+ (org-back-to-heading t)) ; take what is really there
+ (org-back-over-empty-lines)
+ (setq beg (point))
+ (skip-chars-forward " \t\r\n")
+ (save-match-data
+ (save-excursion (outline-end-of-heading)
+ (setq folded (org-invisible-p)))
+ (condition-case nil
+ (outline-forward-same-level (1- n))
+ (error nil))
+ (org-end-of-subtree t t))
+ (org-back-over-empty-lines)
+ (setq end (point))
+ (goto-char beg0)
+ (when (> end beg)
+ (setq org-subtree-clip-folded folded)
+ (if cut (kill-region beg end) (copy-region-as-kill beg end))
+ (setq org-subtree-clip (current-kill 0))
+ (message "%s: Subtree(s) with %d characters"
+ (if cut "Cut" "Copied")
+ (length org-subtree-clip)))))
+
+(defun org-paste-subtree (&optional level tree)
+ "Paste the clipboard as a subtree, with modification of headline level.
+The entire subtree is promoted or demoted in order to match a new headline
+level. By default, the new level is derived from the visible headings
+before and after the insertion point, and taken to be the inferior headline
+level of the two. So if the previous visible heading is level 3 and the
+next is level 4 (or vice versa), level 4 will be used for insertion.
+This makes sure that the subtree remains an independent subtree and does
+not swallow low level entries.
+
+You can also force a different level, either by using a numeric prefix
+argument, or by inserting the heading marker by hand. For example, if the
+cursor is after \"*****\", then the tree will be shifted to level 5.
+
+If you want to insert the tree as is, just use \\[yank].
+
+If optional TREE is given, use this text instead of the kill ring."
+ (interactive "P")
+ (unless (org-kill-is-subtree-p tree)
+ (error "%s"
+ (substitute-command-keys
+ "The kill is not a (set of) tree(s) - please use \\[yank] to yank anyway")))
+ (let* ((txt (or tree (and kill-ring (current-kill 0))))
+ (^re (concat "^\\(" outline-regexp "\\)"))
+ (re (concat "\\(" outline-regexp "\\)"))
+ (^re_ (concat "\\(\\*+\\)[ \t]*"))
+
+ (old-level (if (string-match ^re txt)
+ (- (match-end 0) (match-beginning 0) 1)
+ -1))
+ (force-level (cond (level (prefix-numeric-value level))
+ ((string-match
+ ^re_ (buffer-substring (point-at-bol) (point)))
+ (- (match-end 1) (match-beginning 1)))
+ (t nil)))
+ (previous-level (save-excursion
+ (condition-case nil
+ (progn
+ (outline-previous-visible-heading 1)
+ (if (looking-at re)
+ (- (match-end 0) (match-beginning 0) 1)
+ 1))
+ (error 1))))
+ (next-level (save-excursion
+ (condition-case nil
+ (progn
+ (or (looking-at outline-regexp)
+ (outline-next-visible-heading 1))
+ (if (looking-at re)
+ (- (match-end 0) (match-beginning 0) 1)
+ 1))
+ (error 1))))
+ (new-level (or force-level (max previous-level next-level)))
+ (shift (if (or (= old-level -1)
+ (= new-level -1)
+ (= old-level new-level))
+ 0
+ (- new-level old-level)))
+ (delta (if (> shift 0) -1 1))
+ (func (if (> shift 0) 'org-demote 'org-promote))
+ (org-odd-levels-only nil)
+ beg end)
+ ;; Remove the forced level indicator
+ (if force-level
+ (delete-region (point-at-bol) (point)))
+ ;; Paste
+ (beginning-of-line 1)
+ (org-back-over-empty-lines) ;; FIXME: correct fix????
+ (setq beg (point))
+ (insert-before-markers txt) ;; FIXME: correct fix????
+ (unless (string-match "\n\\'" txt) (insert "\n"))
+ (setq end (point))
+ (goto-char beg)
+ (skip-chars-forward " \t\n\r")
+ (setq beg (point))
+ ;; Shift if necessary
+ (unless (= shift 0)
+ (save-restriction
+ (narrow-to-region beg end)
+ (while (not (= shift 0))
+ (org-map-region func (point-min) (point-max))
+ (setq shift (+ delta shift)))
+ (goto-char (point-min))))
+ (when (interactive-p)
+ (message "Clipboard pasted as level %d subtree" new-level))
+ (if (and kill-ring
+ (eq org-subtree-clip (current-kill 0))
+ org-subtree-clip-folded)
+ ;; The tree was folded before it was killed/copied
+ (hide-subtree))))
+
+(defun org-kill-is-subtree-p (&optional txt)
+ "Check if the current kill is an outline subtree, or a set of trees.
+Returns nil if kill does not start with a headline, or if the first
+headline level is not the largest headline level in the tree.
+So this will actually accept several entries of equal levels as well,
+which is OK for `org-paste-subtree'.
+If optional TXT is given, check this string instead of the current kill."
+ (let* ((kill (or txt (and kill-ring (current-kill 0)) ""))
+ (start-level (and kill
+ (string-match (concat "\\`\\([ \t\n\r]*?\n\\)?\\("
+ org-outline-regexp "\\)")
+ kill)
+ (- (match-end 2) (match-beginning 2) 1)))
+ (re (concat "^" org-outline-regexp))
+ (start (1+ (match-beginning 2))))
+ (if (not start-level)
+ (progn
+ nil) ;; does not even start with a heading
+ (catch 'exit
+ (while (setq start (string-match re kill (1+ start)))
+ (when (< (- (match-end 0) (match-beginning 0) 1) start-level)
+ (throw 'exit nil)))
+ t))))
+
+(defun org-narrow-to-subtree ()
+ "Narrow buffer to the current subtree."
+ (interactive)
+ (save-excursion
+ (narrow-to-region
+ (progn (org-back-to-heading) (point))
+ (progn (org-end-of-subtree t t) (point)))))
+
+
+;;; Outline Sorting
+
+(defun org-sort (with-case)
+ "Call `org-sort-entries-or-items' or `org-table-sort-lines'.
+Optional argument WITH-CASE means sort case-sensitively."
+ (interactive "P")
+ (if (org-at-table-p)
+ (org-call-with-arg 'org-table-sort-lines with-case)
+ (org-call-with-arg 'org-sort-entries-or-items with-case)))
+
+(defvar org-priority-regexp) ; defined later in the file
+
+(defun org-sort-entries-or-items (&optional with-case sorting-type getkey-func property)
+ "Sort entries on a certain level of an outline tree.
+If there is an active region, the entries in the region are sorted.
+Else, if the cursor is before the first entry, sort the top-level items.
+Else, the children of the entry at point are sorted.
+
+Sorting can be alphabetically, numerically, and by date/time as given by
+the first time stamp in the entry. The command prompts for the sorting
+type unless it has been given to the function through the SORTING-TYPE
+argument, which needs to a character, any of (?n ?N ?a ?A ?t ?T ?p ?P ?f ?F).
+If the SORTING-TYPE is ?f or ?F, then GETKEY-FUNC specifies a function to be
+called with point at the beginning of the record. It must return either
+a string or a number that should serve as the sorting key for that record.
+
+Comparing entries ignores case by default. However, with an optional argument
+WITH-CASE, the sorting considers case as well."
+ (interactive "P")
+ (let ((case-func (if with-case 'identity 'downcase))
+ start beg end stars re re2
+ txt what tmp plain-list-p)
+ ;; Find beginning and end of region to sort
+ (cond
+ ((org-region-active-p)
+ ;; we will sort the region
+ (setq end (region-end)
+ what "region")
+ (goto-char (region-beginning))
+ (if (not (org-on-heading-p)) (outline-next-heading))
+ (setq start (point)))
+ ((org-at-item-p)
+ ;; we will sort this plain list
+ (org-beginning-of-item-list) (setq start (point))
+ (org-end-of-item-list) (setq end (point))
+ (goto-char start)
+ (setq plain-list-p t
+ what "plain list"))
+ ((or (org-on-heading-p)
+ (condition-case nil (progn (org-back-to-heading) t) (error nil)))
+ ;; we will sort the children of the current headline
+ (org-back-to-heading)
+ (setq start (point)
+ end (progn (org-end-of-subtree t t)
+ (org-back-over-empty-lines)
+ (point))
+ what "children")
+ (goto-char start)
+ (show-subtree)
+ (outline-next-heading))
+ (t
+ ;; we will sort the top-level entries in this file
+ (goto-char (point-min))
+ (or (org-on-heading-p) (outline-next-heading))
+ (setq start (point) end (point-max) what "top-level")
+ (goto-char start)
+ (show-all)))
+
+ (setq beg (point))
+ (if (>= beg end) (error "Nothing to sort"))
+
+ (unless plain-list-p
+ (looking-at "\\(\\*+\\)")
+ (setq stars (match-string 1)
+ re (concat "^" (regexp-quote stars) " +")
+ re2 (concat "^" (regexp-quote (substring stars 0 -1)) "[^*]")
+ txt (buffer-substring beg end))
+ (if (not (equal (substring txt -1) "\n")) (setq txt (concat txt "\n")))
+ (if (and (not (equal stars "*")) (string-match re2 txt))
+ (error "Region to sort contains a level above the first entry")))
+
+ (unless sorting-type
+ (message
+ (if plain-list-p
+ "Sort %s: [a]lpha [n]umeric [t]ime [f]unc A/N/T/F means reversed:"
+ "Sort %s: [a]lpha [n]umeric [t]ime [p]riority p[r]operty [f]unc A/N/T/P/F means reversed:")
+ what)
+ (setq sorting-type (read-char-exclusive))
+
+ (and (= (downcase sorting-type) ?f)
+ (setq getkey-func
+ (completing-read "Sort using function: "
+ obarray 'fboundp t nil nil))
+ (setq getkey-func (intern getkey-func)))
+
+ (and (= (downcase sorting-type) ?r)
+ (setq property
+ (completing-read "Property: "
+ (mapcar 'list (org-buffer-property-keys t))
+ nil t))))
+
+ (message "Sorting entries...")
+
+ (save-restriction
+ (narrow-to-region start end)
+
+ (let ((dcst (downcase sorting-type))
+ (now (current-time)))
+ (sort-subr
+ (/= dcst sorting-type)
+ ;; This function moves to the beginning character of the "record" to
+ ;; be sorted.
+ (if plain-list-p
+ (lambda nil
+ (if (org-at-item-p) t (goto-char (point-max))))
+ (lambda nil
+ (if (re-search-forward re nil t)
+ (goto-char (match-beginning 0))
+ (goto-char (point-max)))))
+ ;; This function moves to the last character of the "record" being
+ ;; sorted.
+ (if plain-list-p
+ 'org-end-of-item
+ (lambda nil
+ (save-match-data
+ (condition-case nil
+ (outline-forward-same-level 1)
+ (error
+ (goto-char (point-max)))))))
+
+ ;; This function returns the value that gets sorted against.
+ (if plain-list-p
+ (lambda nil
+ (when (looking-at "[ \t]*[-+*0-9.)]+[ \t]+")
+ (cond
+ ((= dcst ?n)
+ (string-to-number (buffer-substring (match-end 0)
+ (point-at-eol))))
+ ((= dcst ?a)
+ (buffer-substring (match-end 0) (point-at-eol)))
+ ((= dcst ?t)
+ (if (re-search-forward org-ts-regexp
+ (point-at-eol) t)
+ (org-time-string-to-time (match-string 0))
+ now))
+ ((= dcst ?f)
+ (if getkey-func
+ (progn
+ (setq tmp (funcall getkey-func))
+ (if (stringp tmp) (setq tmp (funcall case-func tmp)))
+ tmp)
+ (error "Invalid key function `%s'" getkey-func)))
+ (t (error "Invalid sorting type `%c'" sorting-type)))))
+ (lambda nil
+ (cond
+ ((= dcst ?n)
+ (if (looking-at outline-regexp)
+ (string-to-number (buffer-substring (match-end 0)
+ (point-at-eol)))
+ nil))
+ ((= dcst ?a)
+ (funcall case-func (buffer-substring (point-at-bol)
+ (point-at-eol))))
+ ((= dcst ?t)
+ (if (re-search-forward org-ts-regexp
+ (save-excursion
+ (forward-line 2)
+ (point)) t)
+ (org-time-string-to-time (match-string 0))
+ now))
+ ((= dcst ?p)
+ (if (re-search-forward org-priority-regexp (point-at-eol) t)
+ (string-to-char (match-string 2))
+ org-default-priority))
+ ((= dcst ?r)
+ (or (org-entry-get nil property) ""))
+ ((= dcst ?f)
+ (if getkey-func
+ (progn
+ (setq tmp (funcall getkey-func))
+ (if (stringp tmp) (setq tmp (funcall case-func tmp)))
+ tmp)
+ (error "Invalid key function `%s'" getkey-func)))
+ (t (error "Invalid sorting type `%c'" sorting-type)))))
+ nil
+ (cond
+ ((= dcst ?a) 'string<)
+ ((= dcst ?t) 'time-less-p)
+ (t nil)))))
+ (message "Sorting entries...done")))
+
+(defun org-do-sort (table what &optional with-case sorting-type)
+ "Sort TABLE of WHAT according to SORTING-TYPE.
+The user will be prompted for the SORTING-TYPE if the call to this
+function does not specify it. WHAT is only for the prompt, to indicate
+what is being sorted. The sorting key will be extracted from
+the car of the elements of the table.
+If WITH-CASE is non-nil, the sorting will be case-sensitive."
+ (unless sorting-type
+ (message
+ "Sort %s: [a]lphabetic. [n]umeric. [t]ime. A/N/T means reversed:"
+ what)
+ (setq sorting-type (read-char-exclusive)))
+ (let ((dcst (downcase sorting-type))
+ extractfun comparefun)
+ ;; Define the appropriate functions
+ (cond
+ ((= dcst ?n)
+ (setq extractfun 'string-to-number
+ comparefun (if (= dcst sorting-type) '< '>)))
+ ((= dcst ?a)
+ (setq extractfun (if with-case (lambda(x) (org-sort-remove-invisible x))
+ (lambda(x) (downcase (org-sort-remove-invisible x))))
+ comparefun (if (= dcst sorting-type)
+ 'string<
+ (lambda (a b) (and (not (string< a b))
+ (not (string= a b)))))))
+ ((= dcst ?t)
+ (setq extractfun
+ (lambda (x)
+ (if (string-match org-ts-regexp x)
+ (time-to-seconds
+ (org-time-string-to-time (match-string 0 x)))
+ 0))
+ comparefun (if (= dcst sorting-type) '< '>)))
+ (t (error "Invalid sorting type `%c'" sorting-type)))
+
+ (sort (mapcar (lambda (x) (cons (funcall extractfun (car x)) (cdr x)))
+ table)
+ (lambda (a b) (funcall comparefun (car a) (car b))))))
+
+;;;; Plain list items, including checkboxes
+
+;;; Plain list items
+
+(defun org-at-item-p ()
+ "Is point in a line starting a hand-formatted item?"
+ (let ((llt org-plain-list-ordered-item-terminator))
+ (save-excursion
+ (goto-char (point-at-bol))
+ (looking-at
+ (cond
+ ((eq llt t) "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)")
+ ((= llt ?.) "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)")
+ ((= llt ?\)) "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)")
+ (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))))))
+
+(defun org-in-item-p ()
+ "It the cursor inside a plain list item.
+Does not have to be the first line."
+ (save-excursion
+ (condition-case nil
+ (progn
+ (org-beginning-of-item)
+ (org-at-item-p)
+ t)
+ (error nil))))
+
+(defun org-insert-item (&optional checkbox)
+ "Insert a new item at the current level.
+Return t when things worked, nil when we are not in an item."
+ (when (save-excursion
+ (condition-case nil
+ (progn
+ (org-beginning-of-item)
+ (org-at-item-p)
+ (if (org-invisible-p) (error "Invisible item"))
+ t)
+ (error nil)))
+ (let* ((bul (match-string 0))
+ (eow (save-excursion (beginning-of-line 1) (looking-at "[ \t]*")
+ (match-end 0)))
+ (blank (cdr (assq 'plain-list-item org-blank-before-new-entry)))
+ pos)
+ (cond
+ ((and (org-at-item-p) (<= (point) eow))
+ ;; before the bullet
+ (beginning-of-line 1)
+ (open-line (if blank 2 1)))
+ ((<= (point) eow)
+ (beginning-of-line 1))
+ (t (newline (if blank 2 1))))
+ (insert bul (if checkbox "[ ]" ""))
+ (just-one-space)
+ (setq pos (point))
+ (end-of-line 1)
+ (unless (= (point) pos) (just-one-space) (backward-delete-char 1)))
+ (org-maybe-renumber-ordered-list)
+ (and checkbox (org-update-checkbox-count-maybe))
+ t))
+
+;;; Checkboxes
+
+(defun org-at-item-checkbox-p ()
+ "Is point at a line starting a plain-list item with a checklet?"
+ (and (org-at-item-p)
+ (save-excursion
+ (goto-char (match-end 0))
+ (skip-chars-forward " \t")
+ (looking-at "\\[[- X]\\]"))))
+
+(defun org-toggle-checkbox (&optional arg)
+ "Toggle the checkbox in the current line."
+ (interactive "P")
+ (catch 'exit
+ (let (beg end status (firstnew 'unknown))
+ (cond
+ ((org-region-active-p)
+ (setq beg (region-beginning) end (region-end)))
+ ((org-on-heading-p)
+ (setq beg (point) end (save-excursion (outline-next-heading) (point))))
+ ((org-at-item-checkbox-p)
+ (let ((pos (point)))
+ (replace-match
+ (cond (arg "[-]")
+ ((member (match-string 0) '("[ ]" "[-]")) "[X]")
+ (t "[ ]"))
+ t t)
+ (goto-char pos))
+ (throw 'exit t))
+ (t (error "Not at a checkbox or heading, and no active region")))
+ (save-excursion
+ (goto-char beg)
+ (while (< (point) end)
+ (when (org-at-item-checkbox-p)
+ (setq status (equal (match-string 0) "[X]"))
+ (when (eq firstnew 'unknown)
+ (setq firstnew (not status)))
+ (replace-match
+ (if (if arg (not status) firstnew) "[X]" "[ ]") t t))
+ (beginning-of-line 2)))))
+ (org-update-checkbox-count-maybe))
+
+(defun org-update-checkbox-count-maybe ()
+ "Update checkbox statistics unless turned off by user."
+ (when org-provide-checkbox-statistics
+ (org-update-checkbox-count)))
+
+(defun org-update-checkbox-count (&optional all)
+ "Update the checkbox statistics in the current section.
+This will find all statistic cookies like [57%] and [6/12] and update them
+with the current numbers. With optional prefix argument ALL, do this for
+the whole buffer."
+ (interactive "P")
+ (save-excursion
+ (let* ((buffer-invisibility-spec (org-inhibit-invisibility)) ; Emacs 21
+ (beg (condition-case nil
+ (progn (outline-back-to-heading) (point))
+ (error (point-min))))
+ (end (move-marker (make-marker)
+ (progn (outline-next-heading) (point))))
+ (re "\\(\\[[0-9]*%\\]\\)\\|\\(\\[[0-9]*/[0-9]*\\]\\)")
+ (re-box "^[ \t]*\\([-+*]\\|[0-9]+[.)]\\) +\\(\\[[- X]\\]\\)")
+ b1 e1 f1 c-on c-off lim (cstat 0))
+ (when all
+ (goto-char (point-min))
+ (outline-next-heading)
+ (setq beg (point) end (point-max)))
+ (goto-char beg)
+ (while (re-search-forward re end t)
+ (setq cstat (1+ cstat)
+ b1 (match-beginning 0)
+ e1 (match-end 0)
+ f1 (match-beginning 1)
+ lim (cond
+ ((org-on-heading-p) (outline-next-heading) (point))
+ ((org-at-item-p) (org-end-of-item) (point))
+ (t nil))
+ c-on 0 c-off 0)
+ (goto-char e1)
+ (when lim
+ (while (re-search-forward re-box lim t)
+ (if (member (match-string 2) '("[ ]" "[-]"))
+ (setq c-off (1+ c-off))
+ (setq c-on (1+ c-on))))
+; (delete-region b1 e1)
+ (goto-char b1)
+ (insert (if f1
+ (format "[%d%%]" (/ (* 100 c-on) (max 1 (+ c-on c-off))))
+ (format "[%d/%d]" c-on (+ c-on c-off))))
+ (and (looking-at "\\[.*?\\]")
+ (replace-match ""))))
+ (when (interactive-p)
+ (message "Checkbox satistics updated %s (%d places)"
+ (if all "in entire file" "in current outline entry") cstat)))))
+
+(defun org-get-checkbox-statistics-face ()
+ "Select the face for checkbox statistics.
+The face will be `org-done' when all relevant boxes are checked. Otherwise
+it will be `org-todo'."
+ (if (match-end 1)
+ (if (equal (match-string 1) "100%") 'org-done 'org-todo)
+ (if (and (> (match-end 2) (match-beginning 2))
+ (equal (match-string 2) (match-string 3)))
+ 'org-done
+ 'org-todo)))
+
+(defun org-get-indentation (&optional line)
+ "Get the indentation of the current line, interpreting tabs.
+When LINE is given, assume it represents a line and compute its indentation."
+ (if line
+ (if (string-match "^ *" (org-remove-tabs line))
+ (match-end 0))
+ (save-excursion
+ (beginning-of-line 1)
+ (skip-chars-forward " \t")
+ (current-column))))
+
+(defun org-remove-tabs (s &optional width)
+ "Replace tabulators in S with spaces.
+Assumes that s is a single line, starting in column 0."
+ (setq width (or width tab-width))
+ (while (string-match "\t" s)
+ (setq s (replace-match
+ (make-string
+ (- (* width (/ (+ (match-beginning 0) width) width))
+ (match-beginning 0)) ?\ )
+ t t s)))
+ s)
+
+(defun org-fix-indentation (line ind)
+ "Fix indentation in LINE.
+IND is a cons cell with target and minimum indentation.
+If the current indenation in LINE is smaller than the minimum,
+leave it alone. If it is larger than ind, set it to the target."
+ (let* ((l (org-remove-tabs line))
+ (i (org-get-indentation l))
+ (i1 (car ind)) (i2 (cdr ind)))
+ (if (>= i i2) (setq l (substring line i2)))
+ (if (> i1 0)
+ (concat (make-string i1 ?\ ) l)
+ l)))
+
+(defcustom org-empty-line-terminates-plain-lists nil
+ "Non-nil means, an empty line ends all plain list levels.
+When nil, empty lines are part of the preceeding item."
+ :group 'org-plain-lists
+ :type 'boolean)
+
+(defun org-beginning-of-item ()
+ "Go to the beginning of the current hand-formatted item.
+If the cursor is not in an item, throw an error."
+ (interactive)
+ (let ((pos (point))
+ (limit (save-excursion
+ (condition-case nil
+ (progn
+ (org-back-to-heading)
+ (beginning-of-line 2) (point))
+ (error (point-min)))))
+ (ind-empty (if org-empty-line-terminates-plain-lists 0 10000))
+ ind ind1)
+ (if (org-at-item-p)
+ (beginning-of-line 1)
+ (beginning-of-line 1)
+ (skip-chars-forward " \t")
+ (setq ind (current-column))
+ (if (catch 'exit
+ (while t
+ (beginning-of-line 0)
+ (if (or (bobp) (< (point) limit)) (throw 'exit nil))
+
+ (if (looking-at "[ \t]*$")
+ (setq ind1 ind-empty)
+ (skip-chars-forward " \t")
+ (setq ind1 (current-column)))
+ (if (< ind1 ind)
+ (progn (beginning-of-line 1) (throw 'exit (org-at-item-p))))))
+ nil
+ (goto-char pos)
+ (error "Not in an item")))))
+
+(defun org-end-of-item ()
+ "Go to the end of the current hand-formatted item.
+If the cursor is not in an item, throw an error."
+ (interactive)
+ (let* ((pos (point))
+ ind1
+ (ind-empty (if org-empty-line-terminates-plain-lists 0 10000))
+ (limit (save-excursion (outline-next-heading) (point)))
+ (ind (save-excursion
+ (org-beginning-of-item)
+ (skip-chars-forward " \t")
+ (current-column)))
+ (end (catch 'exit
+ (while t
+ (beginning-of-line 2)
+ (if (eobp) (throw 'exit (point)))
+ (if (>= (point) limit) (throw 'exit (point-at-bol)))
+ (if (looking-at "[ \t]*$")
+ (setq ind1 ind-empty)
+ (skip-chars-forward " \t")
+ (setq ind1 (current-column)))
+ (if (<= ind1 ind)
+ (throw 'exit (point-at-bol)))))))
+ (if end
+ (goto-char end)
+ (goto-char pos)
+ (error "Not in an item"))))
+
+(defun org-next-item ()
+ "Move to the beginning of the next item in the current plain list.
+Error if not at a plain list, or if this is the last item in the list."
+ (interactive)
+ (let (ind ind1 (pos (point)))
+ (org-beginning-of-item)
+ (setq ind (org-get-indentation))
+ (org-end-of-item)
+ (setq ind1 (org-get-indentation))
+ (unless (and (org-at-item-p) (= ind ind1))
+ (goto-char pos)
+ (error "On last item"))))
+
+(defun org-previous-item ()
+ "Move to the beginning of the previous item in the current plain list.
+Error if not at a plain list, or if this is the first item in the list."
+ (interactive)
+ (let (beg ind ind1 (pos (point)))
+ (org-beginning-of-item)
+ (setq beg (point))
+ (setq ind (org-get-indentation))
+ (goto-char beg)
+ (catch 'exit
+ (while t
+ (beginning-of-line 0)
+ (if (looking-at "[ \t]*$")
+ nil
+ (if (<= (setq ind1 (org-get-indentation)) ind)
+ (throw 'exit t)))))
+ (condition-case nil
+ (if (or (not (org-at-item-p))
+ (< ind1 (1- ind)))
+ (error "")
+ (org-beginning-of-item))
+ (error (goto-char pos)
+ (error "On first item")))))
+
+(defun org-first-list-item-p ()
+ "Is this heading the item in a plain list?"
+ (unless (org-at-item-p)
+ (error "Not at a plain list item"))
+ (org-beginning-of-item)
+ (= (point) (save-excursion (org-beginning-of-item-list))))
+
+(defun org-move-item-down ()
+ "Move the plain list item at point down, i.e. swap with following item.
+Subitems (items with larger indentation) are considered part of the item,
+so this really moves item trees."
+ (interactive)
+ (let (beg beg0 end end0 ind ind1 (pos (point)) txt ne-end ne-beg)
+ (org-beginning-of-item)
+ (setq beg0 (point))
+ (save-excursion
+ (setq ne-beg (org-back-over-empty-lines))
+ (setq beg (point)))
+ (goto-char beg0)
+ (setq ind (org-get-indentation))
+ (org-end-of-item)
+ (setq end0 (point))
+ (setq ind1 (org-get-indentation))
+ (setq ne-end (org-back-over-empty-lines))
+ (setq end (point))
+ (goto-char beg0)
+ (when (and (org-first-list-item-p) (< ne-end ne-beg))
+ ;; include less whitespace
+ (save-excursion
+ (goto-char beg)
+ (forward-line (- ne-beg ne-end))
+ (setq beg (point))))
+ (goto-char end0)
+ (if (and (org-at-item-p) (= ind ind1))
+ (progn
+ (org-end-of-item)
+ (org-back-over-empty-lines)
+ (setq txt (buffer-substring beg end))
+ (save-excursion
+ (delete-region beg end))
+ (setq pos (point))
+ (insert txt)
+ (goto-char pos) (org-skip-whitespace)
+ (org-maybe-renumber-ordered-list))
+ (goto-char pos)
+ (error "Cannot move this item further down"))))
+
+(defun org-move-item-up (arg)
+ "Move the plain list item at point up, i.e. swap with previous item.
+Subitems (items with larger indentation) are considered part of the item,
+so this really moves item trees."
+ (interactive "p")
+ (let (beg beg0 end end0 ind ind1 (pos (point)) txt
+ ne-beg ne-end ne-ins ins-end)
+ (org-beginning-of-item)
+ (setq beg0 (point))
+ (setq ind (org-get-indentation))
+ (save-excursion
+ (setq ne-beg (org-back-over-empty-lines))
+ (setq beg (point)))
+ (goto-char beg0)
+ (org-end-of-item)
+ (setq ne-end (org-back-over-empty-lines))
+ (setq end (point))
+ (goto-char beg0)
+ (catch 'exit
+ (while t
+ (beginning-of-line 0)
+ (if (looking-at "[ \t]*$")
+ (if org-empty-line-terminates-plain-lists
+ (progn
+ (goto-char pos)
+ (error "Cannot move this item further up"))
+ nil)
+ (if (<= (setq ind1 (org-get-indentation)) ind)
+ (throw 'exit t)))))
+ (condition-case nil
+ (org-beginning-of-item)
+ (error (goto-char beg)
+ (error "Cannot move this item further up")))
+ (setq ind1 (org-get-indentation))
+ (if (and (org-at-item-p) (= ind ind1))
+ (progn
+ (setq ne-ins (org-back-over-empty-lines))
+ (setq txt (buffer-substring beg end))
+ (save-excursion
+ (delete-region beg end))
+ (setq pos (point))
+ (insert txt)
+ (setq ins-end (point))
+ (goto-char pos) (org-skip-whitespace)
+
+ (when (and (org-first-list-item-p) (> ne-ins ne-beg))
+ ;; Move whitespace back to beginning
+ (save-excursion
+ (goto-char ins-end)
+ (let ((kill-whole-line t))
+ (kill-line (- ne-ins ne-beg)) (point)))
+ (insert (make-string (- ne-ins ne-beg) ?\n)))
+
+ (org-maybe-renumber-ordered-list))
+ (goto-char pos)
+ (error "Cannot move this item further up"))))
+
+(defun org-maybe-renumber-ordered-list ()
+ "Renumber the ordered list at point if setup allows it.
+This tests the user option `org-auto-renumber-ordered-lists' before
+doing the renumbering."
+ (interactive)
+ (when (and org-auto-renumber-ordered-lists
+ (org-at-item-p))
+ (if (match-beginning 3)
+ (org-renumber-ordered-list 1)
+ (org-fix-bullet-type))))
+
+(defun org-maybe-renumber-ordered-list-safe ()
+ (condition-case nil
+ (save-excursion
+ (org-maybe-renumber-ordered-list))
+ (error nil)))
+
+(defun org-cycle-list-bullet (&optional which)
+ "Cycle through the different itemize/enumerate bullets.
+This cycle the entire list level through the sequence:
+
+ `-' -> `+' -> `*' -> `1.' -> `1)'
+
+If WHICH is a string, use that as the new bullet. If WHICH is an integer,
+0 meand `-', 1 means `+' etc."
+ (interactive "P")
+ (org-preserve-lc
+ (org-beginning-of-item-list)
+ (org-at-item-p)
+ (beginning-of-line 1)
+ (let ((current (match-string 0))
+ (prevp (eq which 'previous))
+ new)
+ (setq new (cond
+ ((and (numberp which)
+ (nth (1- which) '("-" "+" "*" "1." "1)"))))
+ ((string-match "-" current) (if prevp "1)" "+"))
+ ((string-match "\\+" current)
+ (if prevp "-" (if (looking-at "\\S-") "1." "*")))
+ ((string-match "\\*" current) (if prevp "+" "1."))
+ ((string-match "\\." current) (if prevp "*" "1)"))
+ ((string-match ")" current) (if prevp "1." "-"))
+ (t (error "This should not happen"))))
+ (and (looking-at "\\([ \t]*\\)\\S-+") (replace-match (concat "\\1" new)))
+ (org-fix-bullet-type)
+ (org-maybe-renumber-ordered-list))))
+
+(defun org-get-string-indentation (s)
+ "What indentation has S due to SPACE and TAB at the beginning of the string?"
+ (let ((n -1) (i 0) (w tab-width) c)
+ (catch 'exit
+ (while (< (setq n (1+ n)) (length s))
+ (setq c (aref s n))
+ (cond ((= c ?\ ) (setq i (1+ i)))
+ ((= c ?\t) (setq i (* (/ (+ w i) w) w)))
+ (t (throw 'exit t)))))
+ i))
+
+(defun org-renumber-ordered-list (arg)
+ "Renumber an ordered plain list.
+Cursor needs to be in the first line of an item, the line that starts
+with something like \"1.\" or \"2)\"."
+ (interactive "p")
+ (unless (and (org-at-item-p)
+ (match-beginning 3))
+ (error "This is not an ordered list"))
+ (let ((line (org-current-line))
+ (col (current-column))
+ (ind (org-get-string-indentation
+ (buffer-substring (point-at-bol) (match-beginning 3))))
+ ;; (term (substring (match-string 3) -1))
+ ind1 (n (1- arg))
+ fmt)
+ ;; find where this list begins
+ (org-beginning-of-item-list)
+ (looking-at "[ \t]*[0-9]+\\([.)]\\)")
+ (setq fmt (concat "%d" (match-string 1)))
+ (beginning-of-line 0)
+ ;; walk forward and replace these numbers
+ (catch 'exit
+ (while t
+ (catch 'next
+ (beginning-of-line 2)
+ (if (eobp) (throw 'exit nil))
+ (if (looking-at "[ \t]*$") (throw 'next nil))
+ (skip-chars-forward " \t") (setq ind1 (current-column))
+ (if (> ind1 ind) (throw 'next t))
+ (if (< ind1 ind) (throw 'exit t))
+ (if (not (org-at-item-p)) (throw 'exit nil))
+ (delete-region (match-beginning 2) (match-end 2))
+ (goto-char (match-beginning 2))
+ (insert (format fmt (setq n (1+ n)))))))
+ (goto-line line)
+ (move-to-column col)))
+
+(defun org-fix-bullet-type ()
+ "Make sure all items in this list have the same bullet as the firsst item."
+ (interactive)
+ (unless (org-at-item-p) (error "This is not a list"))
+ (let ((line (org-current-line))
+ (col (current-column))
+ (ind (current-indentation))
+ ind1 bullet)
+ ;; find where this list begins
+ (org-beginning-of-item-list)
+ (beginning-of-line 1)
+ ;; find out what the bullet type is
+ (looking-at "[ \t]*\\(\\S-+\\)")
+ (setq bullet (match-string 1))
+ ;; walk forward and replace these numbers
+ (beginning-of-line 0)
+ (catch 'exit
+ (while t
+ (catch 'next
+ (beginning-of-line 2)
+ (if (eobp) (throw 'exit nil))
+ (if (looking-at "[ \t]*$") (throw 'next nil))
+ (skip-chars-forward " \t") (setq ind1 (current-column))
+ (if (> ind1 ind) (throw 'next t))
+ (if (< ind1 ind) (throw 'exit t))
+ (if (not (org-at-item-p)) (throw 'exit nil))
+ (skip-chars-forward " \t")
+ (looking-at "\\S-+")
+ (replace-match bullet))))
+ (goto-line line)
+ (move-to-column col)
+ (if (string-match "[0-9]" bullet)
+ (org-renumber-ordered-list 1))))
+
+(defun org-beginning-of-item-list ()
+ "Go to the beginning of the current item list.
+I.e. to the first item in this list."
+ (interactive)
+ (org-beginning-of-item)
+ (let ((pos (point-at-bol))
+ (ind (org-get-indentation))
+ ind1)
+ ;; find where this list begins
+ (catch 'exit
+ (while t
+ (catch 'next
+ (beginning-of-line 0)
+ (if (looking-at "[ \t]*$")
+ (throw (if (bobp) 'exit 'next) t))
+ (skip-chars-forward " \t") (setq ind1 (current-column))
+ (if (or (< ind1 ind)
+ (and (= ind1 ind)
+ (not (org-at-item-p)))
+ (bobp))
+ (throw 'exit t)
+ (when (org-at-item-p) (setq pos (point-at-bol)))))))
+ (goto-char pos)))
+
+
+(defun org-end-of-item-list ()
+ "Go to the end of the current item list.
+I.e. to the text after the last item."
+ (interactive)
+ (org-beginning-of-item)
+ (let ((pos (point-at-bol))
+ (ind (org-get-indentation))
+ ind1)
+ ;; find where this list begins
+ (catch 'exit
+ (while t
+ (catch 'next
+ (beginning-of-line 2)
+ (if (looking-at "[ \t]*$")
+ (throw (if (eobp) 'exit 'next) t))
+ (skip-chars-forward " \t") (setq ind1 (current-column))
+ (if (or (< ind1 ind)
+ (and (= ind1 ind)
+ (not (org-at-item-p)))
+ (eobp))
+ (progn
+ (setq pos (point-at-bol))
+ (throw 'exit t))))))
+ (goto-char pos)))
+
+
+(defvar org-last-indent-begin-marker (make-marker))
+(defvar org-last-indent-end-marker (make-marker))
+
+(defun org-outdent-item (arg)
+ "Outdent a local list item."
+ (interactive "p")
+ (org-indent-item (- arg)))
+
+(defun org-indent-item (arg)
+ "Indent a local list item."
+ (interactive "p")
+ (unless (org-at-item-p)
+ (error "Not on an item"))
+ (save-excursion
+ (let (beg end ind ind1 tmp delta ind-down ind-up)
+ (if (memq last-command '(org-shiftmetaright org-shiftmetaleft))
+ (setq beg org-last-indent-begin-marker
+ end org-last-indent-end-marker)
+ (org-beginning-of-item)
+ (setq beg (move-marker org-last-indent-begin-marker (point)))
+ (org-end-of-item)
+ (setq end (move-marker org-last-indent-end-marker (point))))
+ (goto-char beg)
+ (setq tmp (org-item-indent-positions)
+ ind (car tmp)
+ ind-down (nth 2 tmp)
+ ind-up (nth 1 tmp)
+ delta (if (> arg 0)
+ (if ind-down (- ind-down ind) 2)
+ (if ind-up (- ind-up ind) -2)))
+ (if (< (+ delta ind) 0) (error "Cannot outdent beyond margin"))
+ (while (< (point) end)
+ (beginning-of-line 1)
+ (skip-chars-forward " \t") (setq ind1 (current-column))
+ (delete-region (point-at-bol) (point))
+ (or (eolp) (indent-to-column (+ ind1 delta)))
+ (beginning-of-line 2))))
+ (org-fix-bullet-type)
+ (org-maybe-renumber-ordered-list-safe)
+ (save-excursion
+ (beginning-of-line 0)
+ (condition-case nil (org-beginning-of-item) (error nil))
+ (org-maybe-renumber-ordered-list-safe)))
+
+(defun org-item-indent-positions ()
+ "Return indentation for plain list items.
+This returns a list with three values: The current indentation, the
+parent indentation and the indentation a child should habe.
+Assumes cursor in item line."
+ (let* ((bolpos (point-at-bol))
+ (ind (org-get-indentation))
+ ind-down ind-up pos)
+ (save-excursion
+ (org-beginning-of-item-list)
+ (skip-chars-backward "\n\r \t")
+ (when (org-in-item-p)
+ (org-beginning-of-item)
+ (setq ind-up (org-get-indentation))))
+ (setq pos (point))
+ (save-excursion
+ (cond
+ ((and (condition-case nil (progn (org-previous-item) t)
+ (error nil))
+ (or (forward-char 1) t)
+ (re-search-forward "^\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)" bolpos t))
+ (setq ind-down (org-get-indentation)))
+ ((and (goto-char pos)
+ (org-at-item-p))
+ (goto-char (match-end 0))
+ (skip-chars-forward " \t")
+ (setq ind-down (current-column)))))
+ (list ind ind-up ind-down)))
+
+;;; The orgstruct minor mode
+
+;; Define a minor mode which can be used in other modes in order to
+;; integrate the org-mode structure editing commands.
+
+;; This is really a hack, because the org-mode structure commands use
+;; keys which normally belong to the major mode. Here is how it
+;; works: The minor mode defines all the keys necessary to operate the
+;; structure commands, but wraps the commands into a function which
+;; tests if the cursor is currently at a headline or a plain list
+;; item. If that is the case, the structure command is used,
+;; temporarily setting many Org-mode variables like regular
+;; expressions for filling etc. However, when any of those keys is
+;; used at a different location, function uses `key-binding' to look
+;; up if the key has an associated command in another currently active
+;; keymap (minor modes, major mode, global), and executes that
+;; command. There might be problems if any of the keys is otherwise
+;; used as a prefix key.
+
+;; Another challenge is that the key binding for TAB can be tab or \C-i,
+;; likewise the binding for RET can be return or \C-m. Orgtbl-mode
+;; addresses this by checking explicitly for both bindings.
+
+(defvar orgstruct-mode-map (make-sparse-keymap)
+ "Keymap for the minor `orgstruct-mode'.")
+
+(defvar org-local-vars nil
+ "List of local variables, for use by `orgstruct-mode'")
+
+;;;###autoload
+(define-minor-mode orgstruct-mode
+ "Toggle the minor more `orgstruct-mode'.
+This mode is for using Org-mode structure commands in other modes.
+The following key behave as if Org-mode was active, if the cursor
+is on a headline, or on a plain list item (both in the definition
+of Org-mode).
+
+M-up Move entry/item up
+M-down Move entry/item down
+M-left Promote
+M-right Demote
+M-S-up Move entry/item up
+M-S-down Move entry/item down
+M-S-left Promote subtree
+M-S-right Demote subtree
+M-q Fill paragraph and items like in Org-mode
+C-c ^ Sort entries
+C-c - Cycle list bullet
+TAB Cycle item visibility
+M-RET Insert new heading/item
+S-M-RET Insert new TODO heading / Chekbox item
+C-c C-c Set tags / toggle checkbox"
+ nil " OrgStruct" nil
+ (and (orgstruct-setup) (defun orgstruct-setup () nil)))
+
+;;;###autoload
+(defun turn-on-orgstruct ()
+ "Unconditionally turn on `orgstruct-mode'."
+ (orgstruct-mode 1))
+
+;;;###autoload
+(defun turn-on-orgstruct++ ()
+ "Unconditionally turn on `orgstruct-mode', and force org-mode indentations.
+In addition to setting orgstruct-mode, this also exports all indentation and
+autofilling variables from org-mode into the buffer. Note that turning
+off orgstruct-mode will *not* remove these additonal settings."
+ (orgstruct-mode 1)
+ (let (var val)
+ (mapc
+ (lambda (x)
+ (when (string-match
+ "^\\(paragraph-\\|auto-fill\\|fill-paragraph\\|adaptive-fill\\|indent-\\)"
+ (symbol-name (car x)))
+ (setq var (car x) val (nth 1 x))
+ (org-set-local var (if (eq (car-safe val) 'quote) (nth 1 val) val))))
+ org-local-vars)))
+
+(defun orgstruct-error ()
+ "Error when there is no default binding for a structure key."
+ (interactive)
+ (error "This key has no function outside structure elements"))
+
+(defun orgstruct-setup ()
+ "Setup orgstruct keymaps."
+ (let ((nfunc 0)
+ (bindings
+ (list
+ '([(meta up)] org-metaup)
+ '([(meta down)] org-metadown)
+ '([(meta left)] org-metaleft)
+ '([(meta right)] org-metaright)
+ '([(meta shift up)] org-shiftmetaup)
+ '([(meta shift down)] org-shiftmetadown)
+ '([(meta shift left)] org-shiftmetaleft)
+ '([(meta shift right)] org-shiftmetaright)
+ '([(shift up)] org-shiftup)
+ '([(shift down)] org-shiftdown)
+ '("\C-c\C-c" org-ctrl-c-ctrl-c)
+ '("\M-q" fill-paragraph)
+ '("\C-c^" org-sort)
+ '("\C-c-" org-cycle-list-bullet)))
+ elt key fun cmd)
+ (while (setq elt (pop bindings))
+ (setq nfunc (1+ nfunc))
+ (setq key (org-key (car elt))
+ fun (nth 1 elt)
+ cmd (orgstruct-make-binding fun nfunc key))
+ (org-defkey orgstruct-mode-map key cmd))
+
+ ;; Special treatment needed for TAB and RET
+ (org-defkey orgstruct-mode-map [(tab)]
+ (orgstruct-make-binding 'org-cycle 102 [(tab)] "\C-i"))
+ (org-defkey orgstruct-mode-map "\C-i"
+ (orgstruct-make-binding 'org-cycle 103 "\C-i" [(tab)]))
+
+ (org-defkey orgstruct-mode-map "\M-\C-m"
+ (orgstruct-make-binding 'org-insert-heading 105
+ "\M-\C-m" [(meta return)]))
+ (org-defkey orgstruct-mode-map [(meta return)]
+ (orgstruct-make-binding 'org-insert-heading 106
+ [(meta return)] "\M-\C-m"))
+
+ (org-defkey orgstruct-mode-map [(shift meta return)]
+ (orgstruct-make-binding 'org-insert-todo-heading 107
+ [(meta return)] "\M-\C-m"))
+
+ (unless org-local-vars
+ (setq org-local-vars (org-get-local-variables)))
+
+ t))
+
+(defun orgstruct-make-binding (fun n &rest keys)
+ "Create a function for binding in the structure minor mode.
+FUN is the command to call inside a table. N is used to create a unique
+command name. KEYS are keys that should be checked in for a command
+to execute outside of tables."
+ (eval
+ (list 'defun
+ (intern (concat "orgstruct-hijacker-command-" (int-to-string n)))
+ '(arg)
+ (concat "In Structure, run `" (symbol-name fun) "'.\n"
+ "Outside of structure, run the binding of `"
+ (mapconcat (lambda (x) (format "%s" x)) keys "' or `")
+ "'.")
+ '(interactive "p")
+ (list 'if
+ '(org-context-p 'headline 'item)
+ (list 'org-run-like-in-org-mode (list 'quote fun))
+ (list 'let '(orgstruct-mode)
+ (list 'call-interactively
+ (append '(or)
+ (mapcar (lambda (k)
+ (list 'key-binding k))
+ keys)
+ '('orgstruct-error))))))))
+
+(defun org-context-p (&rest contexts)
+ "Check if local context is and of CONTEXTS.
+Possible values in the list of contexts are `table', `headline', and `item'."
+ (let ((pos (point)))
+ (goto-char (point-at-bol))
+ (prog1 (or (and (memq 'table contexts)
+ (looking-at "[ \t]*|"))
+ (and (memq 'headline contexts)
+ (looking-at "\\*+"))
+ (and (memq 'item contexts)
+ (looking-at "[ \t]*\\([-+*] \\|[0-9]+[.)] \\)")))
+ (goto-char pos))))
+
+(defun org-get-local-variables ()
+ "Return a list of all local variables in an org-mode buffer."
+ (let (varlist)
+ (with-current-buffer (get-buffer-create "*Org tmp*")
+ (erase-buffer)
+ (org-mode)
+ (setq varlist (buffer-local-variables)))
+ (kill-buffer "*Org tmp*")
+ (delq nil
+ (mapcar
+ (lambda (x)
+ (setq x
+ (if (symbolp x)
+ (list x)
+ (list (car x) (list 'quote (cdr x)))))
+ (if (string-match
+ "^\\(org-\\|orgtbl-\\|outline-\\|comment-\\|paragraph-\\|auto-fill\\|fill-paragraph\\|adaptive-fill\\|indent-\\)"
+ (symbol-name (car x)))
+ x nil))
+ varlist))))
+
+;;;###autoload
+(defun org-run-like-in-org-mode (cmd)
+ (unless org-local-vars
+ (setq org-local-vars (org-get-local-variables)))
+ (eval (list 'let org-local-vars
+ (list 'call-interactively (list 'quote cmd)))))
+
+;;;; Archiving
+
+(defalias 'org-advertized-archive-subtree 'org-archive-subtree)
+
+(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))
+ (org-archive-location org-archive-location)
+ (re "^#\\+ARCHIVE:[ \t]+\\(\\S-.*\\S-\\)[ \t]*$")
+ ;; 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)))
+ (time (format-time-string
+ (substring (cdr org-time-stamp-formats) 1 -1)
+ (current-time)))
+ afile heading buffer level newfile-p
+ category todo priority
+ ;; start of variables that will be used for savind context
+ ltags itags prop)
+
+ ;; Try to find a local archive location
+ (save-excursion
+ (save-restriction
+ (widen)
+ (setq prop (org-entry-get nil "ARCHIVE" 'inherit))
+ (if (and prop (string-match "\\S-" prop))
+ (setq org-archive-location prop)
+ (if (or (re-search-backward re nil t)
+ (re-search-forward re nil t))
+ (setq org-archive-location (match-string 1))))))
+
+ (if (string-match "\\(.*\\)::\\(.*\\)" org-archive-location)
+ (progn
+ (setq afile (format (match-string 1 org-archive-location)
+ (file-name-nondirectory buffer-file-name))
+ heading (match-string 2 org-archive-location)))
+ (error "Invalid `org-archive-location'"))
+ (if (> (length afile) 0)
+ (setq newfile-p (not (file-exists-p afile))
+ buffer (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))
+ (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))
+ (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-legal-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
+ (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 the buffer, if it is not the same buffer.
+ (if (not (eq this-buffer buffer)) (save-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))
+ (if (and (not (eobp)) (looking-at "[ \t]*$")) (kill-line))
+ (message "Subtree archived %s"
+ (if (eq this-buffer buffer)
+ (concat "under heading: " heading)
+ (concat "in file: " (abbreviate-file-name afile)))))))
+
+(defun org-refresh-category-properties ()
+ "Refresh category text properties in teh buffer."
+ (let ((def-cat (cond
+ ((null org-category)
+ (if buffer-file-name
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))
+ "???"))
+ ((symbolp org-category) (symbol-name org-category))
+ (t org-category)))
+ beg end cat pos optionp)
+ (org-unmodified
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (put-text-property (point) (point-max) 'org-category def-cat)
+ (while (re-search-forward
+ "^\\(#\\+CATEGORY:\\|[ \t]*:CATEGORY:\\)\\(.*\\)" nil t)
+ (setq pos (match-end 0)
+ optionp (equal (char-after (match-beginning 0)) ?#)
+ cat (org-trim (match-string 2)))
+ (if optionp
+ (setq beg (point-at-bol) end (point-max))
+ (org-back-to-heading t)
+ (setq beg (point) end (org-end-of-subtree t t)))
+ (put-text-property beg end 'org-category cat)
+ (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)))
+ ?*))
+ " "))
+ (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-cycle-hide-drawers (state)
+ "Re-hide all drawers after a visibility state change."
+ (when (and (org-mode-p)
+ (not (memq state '(overview folded))))
+ (save-excursion
+ (let* ((globalp (memq state '(contents all)))
+ (beg (if globalp (point-min) (point)))
+ (end (if globalp (point-max) (org-end-of-subtree t))))
+ (goto-char beg)
+ (while (re-search-forward org-drawer-regexp end t)
+ (org-flag-drawer t))))))
+
+(defun org-flag-drawer (flag)
+ (save-excursion
+ (beginning-of-line 1)
+ (when (looking-at "^[ \t]*:[a-zA-Z][a-zA-Z0-9]*:")
+ (let ((b (match-end 0)))
+ (if (re-search-forward
+ "^[ \t]*:END:"
+ (save-excursion (outline-next-heading) (point)) t)
+ (outline-flag-region b (point-at-eol) flag)
+ (error ":END: line missing"))))))
+
+(defun org-cycle-hide-archived-subtrees (state)
+ "Re-hide all archived subtrees after a visibility state change."
+ (when (and (not org-cycle-open-archived-trees)
+ (not (memq state '(overview folded))))
+ (save-excursion
+ (let* ((globalp (memq state '(contents all)))
+ (beg (if globalp (point-min) (point)))
+ (end (if globalp (point-max) (org-end-of-subtree t))))
+ (org-hide-archived-subtrees beg end)
+ (goto-char beg)
+ (if (looking-at (concat ".*:" org-archive-tag ":"))
+ (message "%s" (substitute-command-keys
+ "Subtree is archived and stays closed. Use \\[org-force-cycle-archived] to cycle it anyway.")))))))
+
+(defun org-force-cycle-archived ()
+ "Cycle subtree even if it is archived."
+ (interactive)
+ (setq this-command 'org-cycle)
+ (let ((org-cycle-open-archived-trees t))
+ (call-interactively 'org-cycle)))
+
+(defun org-hide-archived-subtrees (beg end)
+ "Re-hide all archived subtrees after a visibility state change."
+ (save-excursion
+ (let* ((re (concat ":" org-archive-tag ":")))
+ (goto-char beg)
+ (while (re-search-forward re end t)
+ (and (org-on-heading-p) (hide-subtree))
+ (org-end-of-subtree t)))))
+
+(defun org-toggle-tag (tag &optional onoff)
+ "Toggle the tag TAG for the current line.
+If ONOFF is `on' or `off', don't toggle but set to this state."
+ (unless (org-on-heading-p t) (error "Not on headling"))
+ (let (res current)
+ (save-excursion
+ (beginning-of-line)
+ (if (re-search-forward (org-re "[ \t]:\\([[:alnum:]_@:]+\\):[ \t]*$")
+ (point-at-eol) t)
+ (progn
+ (setq current (match-string 1))
+ (replace-match ""))
+ (setq current ""))
+ (setq current (nreverse (org-split-string current ":")))
+ (cond
+ ((eq onoff 'on)
+ (setq res t)
+ (or (member tag current) (push tag current)))
+ ((eq onoff 'off)
+ (or (not (member tag current)) (setq current (delete tag current))))
+ (t (if (member tag current)
+ (setq current (delete tag current))
+ (setq res t)
+ (push tag current))))
+ (end-of-line 1)
+ (if current
+ (progn
+ (insert " :" (mapconcat 'identity (nreverse current) ":") ":")
+ (org-set-tags nil t))
+ (delete-horizontal-space))
+ (run-hooks 'org-after-tags-change-hook))
+ res))
+
+(defun org-toggle-archive-tag (&optional arg)
+ "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 arg
+ (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")))))
+
+
+;;;; Tables
+
+;;; The table editor
+
+;; Watch out: Here we are talking about two different kind of tables.
+;; Most of the code is for the tables created with the Org-mode table editor.
+;; Sometimes, we talk about tables created and edited with the table.el
+;; Emacs package. We call the former org-type tables, and the latter
+;; table.el-type tables.
+
+(defun org-before-change-function (beg end)
+ "Every change indicates that a table might need an update."
+ (setq org-table-may-need-update t))
+
+(defconst org-table-line-regexp "^[ \t]*|"
+ "Detects an org-type table line.")
+(defconst org-table-dataline-regexp "^[ \t]*|[^-]"
+ "Detects an org-type table line.")
+(defconst org-table-auto-recalculate-regexp "^[ \t]*| *# *\\(|\\|$\\)"
+ "Detects a table line marked for automatic recalculation.")
+(defconst org-table-recalculate-regexp "^[ \t]*| *[#*] *\\(|\\|$\\)"
+ "Detects a table line marked for automatic recalculation.")
+(defconst org-table-calculate-mark-regexp "^[ \t]*| *[!$^_#*] *\\(|\\|$\\)"
+ "Detects a table line marked for automatic recalculation.")
+(defconst org-table-hline-regexp "^[ \t]*|-"
+ "Detects an org-type table hline.")
+(defconst org-table1-hline-regexp "^[ \t]*\\+-[-+]"
+ "Detects a table-type table hline.")
+(defconst org-table-any-line-regexp "^[ \t]*\\(|\\|\\+-[-+]\\)"
+ "Detects an org-type or table-type table.")
+(defconst org-table-border-regexp "^[ \t]*[^| \t]"
+ "Searching from within a table (any type) this finds the first line
+outside the table.")
+(defconst org-table-any-border-regexp "^[ \t]*[^|+ \t]"
+ "Searching from within a table (any type) this finds the first line
+outside the table.")
+
+(defvar org-table-last-highlighted-reference nil)
+(defvar org-table-formula-history nil)
+
+(defvar org-table-column-names nil
+ "Alist with column names, derived from the `!' line.")
+(defvar org-table-column-name-regexp nil
+ "Regular expression matching the current column names.")
+(defvar org-table-local-parameters nil
+ "Alist with parameter names, derived from the `$' line.")
+(defvar org-table-named-field-locations nil
+ "Alist with locations of named fields.")
+
+(defvar org-table-current-line-types nil
+ "Table row types, non-nil only for the duration of a comand.")
+(defvar org-table-current-begin-line nil
+ "Table begin line, non-nil only for the duration of a comand.")
+(defvar org-table-current-begin-pos nil
+ "Table begin position, non-nil only for the duration of a comand.")
+(defvar org-table-dlines nil
+ "Vector of data line line numbers in the current table.")
+(defvar org-table-hlines nil
+ "Vector of hline line numbers in the current table.")
+
+(defconst org-table-range-regexp
+ "@\\([-+]?I*[-+]?[0-9]*\\)?\\(\\$[-+]?[0-9]+\\)?\\(\\.\\.@?\\([-+]?I*[-+]?[0-9]*\\)?\\(\\$[-+]?[0-9]+\\)?\\)?"
+ ;; 1 2 3 4 5
+ "Regular expression for matching ranges in formulas.")
+
+(defconst org-table-range-regexp2
+ (concat
+ "\\(" "@[-0-9I$&]+" "\\|" "[a-zA-Z]\\{1,2\\}\\([0-9]+\\|&\\)" "\\|" "\\$[a-zA-Z0-9]+" "\\)"
+ "\\.\\."
+ "\\(" "@?[-0-9I$&]+" "\\|" "[a-zA-Z]\\{1,2\\}\\([0-9]+\\|&\\)" "\\|" "\\$[a-zA-Z0-9]+" "\\)")
+ "Match a range for reference display.")
+
+(defconst org-table-translate-regexp
+ (concat "\\(" "@[-0-9I$]+" "\\|" "[a-zA-Z]\\{1,2\\}\\([0-9]+\\|&\\)" "\\)")
+ "Match a reference that needs translation, for reference display.")
+
+(defvar org-inhibit-highlight-removal nil) ; dynamically scoped param
+
+(defun org-table-create-with-table.el ()
+ "Use the table.el package to insert a new table.
+If there is already a table at point, convert between Org-mode tables
+and table.el tables."
+ (interactive)
+ (require 'table)
+ (cond
+ ((org-at-table.el-p)
+ (if (y-or-n-p "Convert table to Org-mode table? ")
+ (org-table-convert)))
+ ((org-at-table-p)
+ (if (y-or-n-p "Convert table to table.el table? ")
+ (org-table-convert)))
+ (t (call-interactively 'table-insert))))
+
+(defun org-table-create-or-convert-from-region (arg)
+ "Convert region to table, or create an empty table.
+If there is an active region, convert it to a table, using the function
+`org-table-convert-region'. See the documentation of that function
+to learn how the prefix argument is interpreted to determine the field
+separator.
+If there is no such region, create an empty table with `org-table-create'."
+ (interactive "P")
+ (if (org-region-active-p)
+ (org-table-convert-region (region-beginning) (region-end) arg)
+ (org-table-create arg)))
+
+(defun org-table-create (&optional size)
+ "Query for a size and insert a table skeleton.
+SIZE is a string Columns x Rows like for example \"3x2\"."
+ (interactive "P")
+ (unless size
+ (setq size (read-string
+ (concat "Table size Columns x Rows [e.g. "
+ org-table-default-size "]: ")
+ "" nil org-table-default-size)))
+
+ (let* ((pos (point))
+ (indent (make-string (current-column) ?\ ))
+ (split (org-split-string size " *x *"))
+ (rows (string-to-number (nth 1 split)))
+ (columns (string-to-number (car split)))
+ (line (concat (apply 'concat indent "|" (make-list columns " |"))
+ "\n")))
+ (if (string-match "^[ \t]*$" (buffer-substring-no-properties
+ (point-at-bol) (point)))
+ (beginning-of-line 1)
+ (newline))
+ ;; (mapcar (lambda (x) (insert line)) (make-list rows t))
+ (dotimes (i rows) (insert line))
+ (goto-char pos)
+ (if (> rows 1)
+ ;; Insert a hline after the first row.
+ (progn
+ (end-of-line 1)
+ (insert "\n|-")
+ (goto-char pos)))
+ (org-table-align)))
+
+(defun org-table-convert-region (beg0 end0 &optional separator)
+ "Convert region to a table.
+The region goes from BEG0 to END0, but these borders will be moved
+slightly, to make sure a beginning of line in the first line is included.
+
+SEPARATOR specifies the field separator in the lines. It can have the
+following values:
+
+'(4) Use the comma as a field separator
+'(16) Use a TAB as field separator
+integer When a number, use that many spaces as field separator
+nil When nil, the command tries to be smart and figure out the
+ separator in the following way:
+ - when each line contains a TAB, assume TAB-separated material
+ - when each line contains a comme, assume CSV material
+ - else, assume one or more SPACE charcters as separator."
+ (interactive "rP")
+ (let* ((beg (min beg0 end0))
+ (end (max beg0 end0))
+ re)
+ (goto-char beg)
+ (beginning-of-line 1)
+ (setq beg (move-marker (make-marker) (point)))
+ (goto-char end)
+ (if (bolp) (backward-char 1) (end-of-line 1))
+ (setq end (move-marker (make-marker) (point)))
+ ;; Get the right field separator
+ (unless separator
+ (goto-char beg)
+ (setq separator
+ (cond
+ ((not (re-search-forward "^[^\n\t]+$" end t)) '(16))
+ ((not (re-search-forward "^[^\n,]+$" end t)) '(4))
+ (t 1))))
+ (setq re (cond
+ ((equal separator '(4)) "^\\|\"?[ \t]*,[ \t]*\"?")
+ ((equal separator '(16)) "^\\|\t")
+ ((integerp separator)
+ (format "^ *\\| *\t *\\| \\{%d,\\}" separator))
+ (t (error "This should not happen"))))
+ (goto-char beg)
+ (while (re-search-forward re end t)
+ (replace-match "| " t t))
+ (goto-char beg)
+ (insert " ")
+ (org-table-align)))
+
+(defun org-table-import (file arg)
+ "Import FILE as a table.
+The file is assumed to be tab-separated. Such files can be produced by most
+spreadsheet and database applications. If no tabs (at least one per line)
+are found, lines will be split on whitespace into fields."
+ (interactive "f\nP")
+ (or (bolp) (newline))
+ (let ((beg (point))
+ (pm (point-max)))
+ (insert-file-contents file)
+ (org-table-convert-region beg (+ (point) (- (point-max) pm)) arg)))
+
+(defun org-table-export ()
+ "Export table as a tab-separated file.
+Such a file can be imported into a spreadsheet program like Excel."
+ (interactive)
+ (let* ((beg (org-table-begin))
+ (end (org-table-end))
+ (table (buffer-substring beg end))
+ (file (read-file-name "Export table to: "))
+ buf)
+ (unless (or (not (file-exists-p file))
+ (y-or-n-p (format "Overwrite file %s? " file)))
+ (error "Abort"))
+ (with-current-buffer (find-file-noselect file)
+ (setq buf (current-buffer))
+ (erase-buffer)
+ (fundamental-mode)
+ (insert table)
+ (goto-char (point-min))
+ (while (re-search-forward "^[ \t]*|[ \t]*" nil t)
+ (replace-match "" t t)
+ (end-of-line 1))
+ (goto-char (point-min))
+ (while (re-search-forward "[ \t]*|[ \t]*$" nil t)
+ (replace-match "" t t)
+ (goto-char (min (1+ (point)) (point-max))))
+ (goto-char (point-min))
+ (while (re-search-forward "^-[-+]*$" nil t)
+ (replace-match "")
+ (if (looking-at "\n")
+ (delete-char 1)))
+ (goto-char (point-min))
+ (while (re-search-forward "[ \t]*|[ \t]*" nil t)
+ (replace-match "\t" t t))
+ (save-buffer))
+ (kill-buffer buf)))
+
+(defvar org-table-aligned-begin-marker (make-marker)
+ "Marker at the beginning of the table last aligned.
+Used to check if cursor still is in that table, to minimize realignment.")
+(defvar org-table-aligned-end-marker (make-marker)
+ "Marker at the end of the table last aligned.
+Used to check if cursor still is in that table, to minimize realignment.")
+(defvar org-table-last-alignment nil
+ "List of flags for flushright alignment, from the last re-alignment.
+This is being used to correctly align a single field after TAB or RET.")
+(defvar org-table-last-column-widths nil
+ "List of max width of fields in each column.
+This is being used to correctly align a single field after TAB or RET.")
+(defvar org-table-overlay-coordinates nil
+ "Overlay coordinates after each align of a table.")
+(make-variable-buffer-local 'org-table-overlay-coordinates)
+
+(defvar org-last-recalc-line nil)
+(defconst org-narrow-column-arrow "=>"
+ "Used as display property in narrowed table columns.")
+
+(defun org-table-align ()
+ "Align the table at point by aligning all vertical bars."
+ (interactive)
+ (let* (
+ ;; Limits of table
+ (beg (org-table-begin))
+ (end (org-table-end))
+ ;; Current cursor position
+ (linepos (org-current-line))
+ (colpos (org-table-current-column))
+ (winstart (window-start))
+ (winstartline (org-current-line (min winstart (1- (point-max)))))
+ lines (new "") lengths l typenums ty fields maxfields i
+ column
+ (indent "") cnt frac
+ rfmt hfmt
+ (spaces '(1 . 1))
+ (sp1 (car spaces))
+ (sp2 (cdr spaces))
+ (rfmt1 (concat
+ (make-string sp2 ?\ ) "%%%s%ds" (make-string sp1 ?\ ) "|"))
+ (hfmt1 (concat
+ (make-string sp2 ?-) "%s" (make-string sp1 ?-) "+"))
+ emptystrings links dates emph narrow fmax f1 len c e)
+ (untabify beg end)
+ (remove-text-properties beg end '(org-cwidth t org-dwidth t display t))
+ ;; Check if we have links or dates
+ (goto-char beg)
+ (setq links (re-search-forward org-bracket-link-regexp end t))
+ (goto-char beg)
+ (setq emph (and org-hide-emphasis-markers
+ (re-search-forward org-emph-re end t)))
+ (goto-char beg)
+ (setq dates (and org-display-custom-times
+ (re-search-forward org-ts-regexp-both end t)))
+ ;; Make sure the link properties are right
+ (when links (goto-char beg) (while (org-activate-bracket-links end)))
+ ;; Make sure the date properties are right
+ (when dates (goto-char beg) (while (org-activate-dates end)))
+ (when emph (goto-char beg) (while (org-do-emphasis-faces end)))
+
+ ;; Check if we are narrowing any columns
+ (goto-char beg)
+ (setq narrow (and org-format-transports-properties-p
+ (re-search-forward "<[0-9]+>" end t)))
+ ;; Get the rows
+ (setq lines (org-split-string
+ (buffer-substring beg end) "\n"))
+ ;; Store the indentation of the first line
+ (if (string-match "^ *" (car lines))
+ (setq indent (make-string (- (match-end 0) (match-beginning 0)) ?\ )))
+ ;; Mark the hlines by setting the corresponding element to nil
+ ;; At the same time, we remove trailing space.
+ (setq lines (mapcar (lambda (l)
+ (if (string-match "^ *|-" l)
+ nil
+ (if (string-match "[ \t]+$" l)
+ (substring l 0 (match-beginning 0))
+ l)))
+ lines))
+ ;; Get the data fields by splitting the lines.
+ (setq fields (mapcar
+ (lambda (l)
+ (org-split-string l " *| *"))
+ (delq nil (copy-sequence lines))))
+ ;; How many fields in the longest line?
+ (condition-case nil
+ (setq maxfields (apply 'max (mapcar 'length fields)))
+ (error
+ (kill-region beg end)
+ (org-table-create org-table-default-size)
+ (error "Empty table - created default table")))
+ ;; A list of empty strings to fill any short rows on output
+ (setq emptystrings (make-list maxfields ""))
+ ;; Check for special formatting.
+ (setq i -1)
+ (while (< (setq i (1+ i)) maxfields) ;; Loop over all columns
+ (setq column (mapcar (lambda (x) (or (nth i x) "")) fields))
+ ;; Check if there is an explicit width specified
+ (when narrow
+ (setq c column fmax nil)
+ (while c
+ (setq e (pop c))
+ (if (and (stringp e) (string-match "^<\\([0-9]+\\)>$" e))
+ (setq fmax (string-to-number (match-string 1 e)) c nil)))
+ ;; Find fields that are wider than fmax, and shorten them
+ (when fmax
+ (loop for xx in column do
+ (when (and (stringp xx)
+ (> (org-string-width xx) fmax))
+ (org-add-props xx nil
+ 'help-echo
+ (concat "Clipped table field, use C-c ` to edit. Full value is:\n" (org-no-properties (copy-sequence xx))))
+ (setq f1 (min fmax (or (string-match org-bracket-link-regexp xx) fmax)))
+ (unless (> f1 1)
+ (error "Cannot narrow field starting with wide link \"%s\""
+ (match-string 0 xx)))
+ (add-text-properties f1 (length xx) (list 'org-cwidth t) xx)
+ (add-text-properties (- f1 2) f1
+ (list 'display org-narrow-column-arrow)
+ xx)))))
+ ;; Get the maximum width for each column
+ (push (apply 'max 1 (mapcar 'org-string-width column)) lengths)
+ ;; Get the fraction of numbers, to decide about alignment of the column
+ (setq cnt 0 frac 0.0)
+ (loop for x in column do
+ (if (equal x "")
+ nil
+ (setq frac ( / (+ (* frac cnt)
+ (if (string-match org-table-number-regexp x) 1 0))
+ (setq cnt (1+ cnt))))))
+ (push (>= frac org-table-number-fraction) typenums))
+ (setq lengths (nreverse lengths) typenums (nreverse typenums))
+
+ ;; Store the alignment of this table, for later editing of single fields
+ (setq org-table-last-alignment typenums
+ org-table-last-column-widths lengths)
+
+ ;; With invisible characters, `format' does not get the field width right
+ ;; So we need to make these fields wide by hand.
+ (when (or links emph)
+ (loop for i from 0 upto (1- maxfields) do
+ (setq len (nth i lengths))
+ (loop for j from 0 upto (1- (length fields)) do
+ (setq c (nthcdr i (car (nthcdr j fields))))
+ (if (and (stringp (car c))
+ (text-property-any 0 (length (car c)) 'invisible 'org-link (car c))
+; (string-match org-bracket-link-regexp (car c))
+ (< (org-string-width (car c)) len))
+ (setcar c (concat (car c) (make-string (- len (org-string-width (car c))) ?\ )))))))
+
+ ;; Compute the formats needed for output of the table
+ (setq rfmt (concat indent "|") hfmt (concat indent "|"))
+ (while (setq l (pop lengths))
+ (setq ty (if (pop typenums) "" "-")) ; number types flushright
+ (setq rfmt (concat rfmt (format rfmt1 ty l))
+ hfmt (concat hfmt (format hfmt1 (make-string l ?-)))))
+ (setq rfmt (concat rfmt "\n")
+ hfmt (concat (substring hfmt 0 -1) "|\n"))
+
+ (setq new (mapconcat
+ (lambda (l)
+ (if l (apply 'format rfmt
+ (append (pop fields) emptystrings))
+ hfmt))
+ lines ""))
+ ;; Replace the old one
+ (delete-region beg end)
+ (move-marker end nil)
+ (move-marker org-table-aligned-begin-marker (point))
+ (insert new)
+ (move-marker org-table-aligned-end-marker (point))
+ (when (and orgtbl-mode (not (org-mode-p)))
+ (goto-char org-table-aligned-begin-marker)
+ (while (org-hide-wide-columns org-table-aligned-end-marker)))
+ ;; Try to move to the old location
+ (goto-line winstartline)
+ (setq winstart (point-at-bol))
+ (goto-line linepos)
+ (set-window-start (selected-window) winstart 'noforce)
+ (org-table-goto-column colpos)
+ (and org-table-overlay-coordinates (org-table-overlay-coordinates))
+ (setq org-table-may-need-update nil)
+ ))
+
+(defun org-string-width (s)
+ "Compute width of string, ignoring invisible characters.
+This ignores character with invisibility property `org-link', and also
+characters with property `org-cwidth', because these will become invisible
+upon the next fontification round."
+ (let (b l)
+ (when (or (eq t buffer-invisibility-spec)
+ (assq 'org-link buffer-invisibility-spec))
+ (while (setq b (text-property-any 0 (length s)
+ 'invisible 'org-link s))
+ (setq s (concat (substring s 0 b)
+ (substring s (or (next-single-property-change
+ b 'invisible s) (length s)))))))
+ (while (setq b (text-property-any 0 (length s) 'org-cwidth t s))
+ (setq s (concat (substring s 0 b)
+ (substring s (or (next-single-property-change
+ b 'org-cwidth s) (length s))))))
+ (setq l (string-width s) b -1)
+ (while (setq b (text-property-any (1+ b) (length s) 'org-dwidth t s))
+ (setq l (- l (get-text-property b 'org-dwidth-n s))))
+ l))
+
+(defun org-table-begin (&optional table-type)
+ "Find the beginning of the table and return its position.
+With argument TABLE-TYPE, go to the beginning of a table.el-type table."
+ (save-excursion
+ (if (not (re-search-backward
+ (if table-type org-table-any-border-regexp
+ org-table-border-regexp)
+ nil t))
+ (progn (goto-char (point-min)) (point))
+ (goto-char (match-beginning 0))
+ (beginning-of-line 2)
+ (point))))
+
+(defun org-table-end (&optional table-type)
+ "Find the end of the table and return its position.
+With argument TABLE-TYPE, go to the end of a table.el-type table."
+ (save-excursion
+ (if (not (re-search-forward
+ (if table-type org-table-any-border-regexp
+ org-table-border-regexp)
+ nil t))
+ (goto-char (point-max))
+ (goto-char (match-beginning 0)))
+ (point-marker)))
+
+(defun org-table-justify-field-maybe (&optional new)
+ "Justify the current field, text to left, number to right.
+Optional argument NEW may specify text to replace the current field content."
+ (cond
+ ((and (not new) org-table-may-need-update)) ; Realignment will happen anyway
+ ((org-at-table-hline-p))
+ ((and (not new)
+ (or (not (equal (marker-buffer org-table-aligned-begin-marker)
+ (current-buffer)))
+ (< (point) org-table-aligned-begin-marker)
+ (>= (point) org-table-aligned-end-marker)))
+ ;; This is not the same table, force a full re-align
+ (setq org-table-may-need-update t))
+ (t ;; realign the current field, based on previous full realign
+ (let* ((pos (point)) s
+ (col (org-table-current-column))
+ (num (if (> col 0) (nth (1- col) org-table-last-alignment)))
+ l f n o e)
+ (when (> col 0)
+ (skip-chars-backward "^|\n")
+ (if (looking-at " *\\([^|\n]*?\\) *\\(|\\|$\\)")
+ (progn
+ (setq s (match-string 1)
+ o (match-string 0)
+ l (max 1 (- (match-end 0) (match-beginning 0) 3))
+ e (not (= (match-beginning 2) (match-end 2))))
+ (setq f (format (if num " %%%ds %s" " %%-%ds %s")
+ l (if e "|" (setq org-table-may-need-update t) ""))
+ n (format f s))
+ (if new
+ (if (<= (length new) l) ;; FIXME: length -> str-width?
+ (setq n (format f new))
+ (setq n (concat new "|") org-table-may-need-update t)))
+ (or (equal n o)
+ (let (org-table-may-need-update)
+ (replace-match n t t))))
+ (setq org-table-may-need-update t))
+ (goto-char pos))))))
+
+(defun org-table-next-field ()
+ "Go to the next field in the current table, creating new lines as needed.
+Before doing so, re-align the table if necessary."
+ (interactive)
+ (org-table-maybe-eval-formula)
+ (org-table-maybe-recalculate-line)
+ (if (and org-table-automatic-realign
+ org-table-may-need-update)
+ (org-table-align))
+ (let ((end (org-table-end)))
+ (if (org-at-table-hline-p)
+ (end-of-line 1))
+ (condition-case nil
+ (progn
+ (re-search-forward "|" end)
+ (if (looking-at "[ \t]*$")
+ (re-search-forward "|" end))
+ (if (and (looking-at "-")
+ org-table-tab-jumps-over-hlines
+ (re-search-forward "^[ \t]*|\\([^-]\\)" end t))
+ (goto-char (match-beginning 1)))
+ (if (looking-at "-")
+ (progn
+ (beginning-of-line 0)
+ (org-table-insert-row 'below))
+ (if (looking-at " ") (forward-char 1))))
+ (error
+ (org-table-insert-row 'below)))))
+
+(defun org-table-previous-field ()
+ "Go to the previous field in the table.
+Before doing so, re-align the table if necessary."
+ (interactive)
+ (org-table-justify-field-maybe)
+ (org-table-maybe-recalculate-line)
+ (if (and org-table-automatic-realign
+ org-table-may-need-update)
+ (org-table-align))
+ (if (org-at-table-hline-p)
+ (end-of-line 1))
+ (re-search-backward "|" (org-table-begin))
+ (re-search-backward "|" (org-table-begin))
+ (while (looking-at "|\\(-\\|[ \t]*$\\)")
+ (re-search-backward "|" (org-table-begin)))
+ (if (looking-at "| ?")
+ (goto-char (match-end 0))))
+
+(defun org-table-next-row ()
+ "Go to the next row (same column) in the current table.
+Before doing so, re-align the table if necessary."
+ (interactive)
+ (org-table-maybe-eval-formula)
+ (org-table-maybe-recalculate-line)
+ (if (or (looking-at "[ \t]*$")
+ (save-excursion (skip-chars-backward " \t") (bolp)))
+ (newline)
+ (if (and org-table-automatic-realign
+ org-table-may-need-update)
+ (org-table-align))
+ (let ((col (org-table-current-column)))
+ (beginning-of-line 2)
+ (if (or (not (org-at-table-p))
+ (org-at-table-hline-p))
+ (progn
+ (beginning-of-line 0)
+ (org-table-insert-row 'below)))
+ (org-table-goto-column col)
+ (skip-chars-backward "^|\n\r")
+ (if (looking-at " ") (forward-char 1)))))
+
+(defun org-table-copy-down (n)
+ "Copy a field down in the current column.
+If the field at the cursor is empty, copy into it the content of the nearest
+non-empty field above. With argument N, use the Nth non-empty field.
+If the current field is not empty, it is copied down to the next row, and
+the cursor is moved with it. Therefore, repeating this command causes the
+column to be filled row-by-row.
+If the variable `org-table-copy-increment' is non-nil and the field is an
+integer or a timestamp, it will be incremented while copying. In the case of
+a timestamp, if the cursor is on the year, change the year. If it is on the
+month or the day, change that. Point will stay on the current date field
+in order to easily repeat the interval."
+ (interactive "p")
+ (let* ((colpos (org-table-current-column))
+ (col (current-column))
+ (field (org-table-get-field))
+ (non-empty (string-match "[^ \t]" field))
+ (beg (org-table-begin))
+ txt)
+ (org-table-check-inside-data-field)
+ (if non-empty
+ (progn
+ (setq txt (org-trim field))
+ (org-table-next-row)
+ (org-table-blank-field))
+ (save-excursion
+ (setq txt
+ (catch 'exit
+ (while (progn (beginning-of-line 1)
+ (re-search-backward org-table-dataline-regexp
+ beg t))
+ (org-table-goto-column colpos t)
+ (if (and (looking-at
+ "|[ \t]*\\([^| \t][^|]*?\\)[ \t]*|")
+ (= (setq n (1- n)) 0))
+ (throw 'exit (match-string 1))))))))
+ (if txt
+ (progn
+ (if (and org-table-copy-increment
+ (string-match "^[0-9]+$" txt))
+ (setq txt (format "%d" (+ (string-to-number txt) 1))))
+ (insert txt)
+ (move-to-column col)
+ (if (and org-table-copy-increment (org-at-timestamp-p t))
+ (org-timestamp-up 1)
+ (org-table-maybe-recalculate-line))
+ (org-table-align)
+ (move-to-column col))
+ (error "No non-empty field found"))))
+
+(defun org-table-check-inside-data-field ()
+ "Is point inside a table data field?
+I.e. not on a hline or before the first or after the last column?
+This actually throws an error, so it aborts the current command."
+ (if (or (not (org-at-table-p))
+ (= (org-table-current-column) 0)
+ (org-at-table-hline-p)
+ (looking-at "[ \t]*$"))
+ (error "Not in table data field")))
+
+(defvar org-table-clip nil
+ "Clipboard for table regions.")
+
+(defun org-table-blank-field ()
+ "Blank the current table field or active region."
+ (interactive)
+ (org-table-check-inside-data-field)
+ (if (and (interactive-p) (org-region-active-p))
+ (let (org-table-clip)
+ (org-table-cut-region (region-beginning) (region-end)))
+ (skip-chars-backward "^|")
+ (backward-char 1)
+ (if (looking-at "|[^|\n]+")
+ (let* ((pos (match-beginning 0))
+ (match (match-string 0))
+ (len (org-string-width match)))
+ (replace-match (concat "|" (make-string (1- len) ?\ )))
+ (goto-char (+ 2 pos))
+ (substring match 1)))))
+
+(defun org-table-get-field (&optional n replace)
+ "Return the value of the field in column N of current row.
+N defaults to current field.
+If REPLACE is a string, replace field with this value. The return value
+is always the old value."
+ (and n (org-table-goto-column n))
+ (skip-chars-backward "^|\n")
+ (backward-char 1)
+ (if (looking-at "|[^|\r\n]*")
+ (let* ((pos (match-beginning 0))
+ (val (buffer-substring (1+ pos) (match-end 0))))
+ (if replace
+ (replace-match (concat "|" replace) t t))
+ (goto-char (min (point-at-eol) (+ 2 pos)))
+ val)
+ (forward-char 1) ""))
+
+(defun org-table-field-info (arg)
+ "Show info about the current field, and highlight any reference at point."
+ (interactive "P")
+ (org-table-get-specials)
+ (save-excursion
+ (let* ((pos (point))
+ (col (org-table-current-column))
+ (cname (car (rassoc (int-to-string col) org-table-column-names)))
+ (name (car (rassoc (list (org-current-line) col)
+ org-table-named-field-locations)))
+ (eql (org-table-get-stored-formulas))
+ (dline (org-table-current-dline))
+ (ref (format "@%d$%d" dline col))
+ (ref1 (org-table-convert-refs-to-an ref))
+ (fequation (or (assoc name eql) (assoc ref eql)))
+ (cequation (assoc (int-to-string col) eql))
+ (eqn (or fequation cequation)))
+ (goto-char pos)
+ (condition-case nil
+ (org-table-show-reference 'local)
+ (error nil))
+ (message "line @%d, col $%s%s, ref @%d$%d or %s%s%s"
+ dline col
+ (if cname (concat " or $" cname) "")
+ dline col ref1
+ (if name (concat " or $" name) "")
+ ;; FIXME: formula info not correct if special table line
+ (if eqn
+ (concat ", formula: "
+ (org-table-formula-to-user
+ (concat
+ (if (string-match "^[$@]"(car eqn)) "" "$")
+ (car eqn) "=" (cdr eqn))))
+ "")))))
+
+(defun org-table-current-column ()
+ "Find out which column we are in.
+When called interactively, column is also displayed in echo area."
+ (interactive)
+ (if (interactive-p) (org-table-check-inside-data-field))
+ (save-excursion
+ (let ((cnt 0) (pos (point)))
+ (beginning-of-line 1)
+ (while (search-forward "|" pos t)
+ (setq cnt (1+ cnt)))
+ (if (interactive-p) (message "This is table column %d" cnt))
+ cnt)))
+
+(defun org-table-current-dline ()
+ "Find out what table data line we are in.
+Only datalins count for this."
+ (interactive)
+ (if (interactive-p) (org-table-check-inside-data-field))
+ (save-excursion
+ (let ((cnt 0) (pos (point)))
+ (goto-char (org-table-begin))
+ (while (<= (point) pos)
+ (if (looking-at org-table-dataline-regexp) (setq cnt (1+ cnt)))
+ (beginning-of-line 2))
+ (if (interactive-p) (message "This is table line %d" cnt))
+ cnt)))
+
+(defun org-table-goto-column (n &optional on-delim force)
+ "Move the cursor to the Nth column in the current table line.
+With optional argument ON-DELIM, stop with point before the left delimiter
+of the field.
+If there are less than N fields, just go to after the last delimiter.
+However, when FORCE is non-nil, create new columns if necessary."
+ (interactive "p")
+ (let ((pos (point-at-eol)))
+ (beginning-of-line 1)
+ (when (> n 0)
+ (while (and (> (setq n (1- n)) -1)
+ (or (search-forward "|" pos t)
+ (and force
+ (progn (end-of-line 1)
+ (skip-chars-backward "^|")
+ (insert " | "))))))
+; (backward-char 2) t)))))
+ (when (and force (not (looking-at ".*|")))
+ (save-excursion (end-of-line 1) (insert " | ")))
+ (if on-delim
+ (backward-char 1)
+ (if (looking-at " ") (forward-char 1))))))
+
+(defun org-at-table-p (&optional table-type)
+ "Return t if the cursor is inside an org-type table.
+If TABLE-TYPE is non-nil, also check for table.el-type tables."
+ (if org-enable-table-editor
+ (save-excursion
+ (beginning-of-line 1)
+ (looking-at (if table-type org-table-any-line-regexp
+ org-table-line-regexp)))
+ nil))
+
+(defun org-at-table.el-p ()
+ "Return t if and only if we are at a table.el table."
+ (and (org-at-table-p 'any)
+ (save-excursion
+ (goto-char (org-table-begin 'any))
+ (looking-at org-table1-hline-regexp))))
+
+(defun org-table-recognize-table.el ()
+ "If there is a table.el table nearby, recognize it and move into it."
+ (if org-table-tab-recognizes-table.el
+ (if (org-at-table.el-p)
+ (progn
+ (beginning-of-line 1)
+ (if (looking-at org-table-dataline-regexp)
+ nil
+ (if (looking-at org-table1-hline-regexp)
+ (progn
+ (beginning-of-line 2)
+ (if (looking-at org-table-any-border-regexp)
+ (beginning-of-line -1)))))
+ (if (re-search-forward "|" (org-table-end t) t)
+ (progn
+ (require 'table)
+ (if (table--at-cell-p (point))
+ t
+ (message "recognizing table.el table...")
+ (table-recognize-table)
+ (message "recognizing table.el table...done")))
+ (error "This should not happen..."))
+ t)
+ nil)
+ nil))
+
+(defun org-at-table-hline-p ()
+ "Return t if the cursor is inside a hline in a table."
+ (if org-enable-table-editor
+ (save-excursion
+ (beginning-of-line 1)
+ (looking-at org-table-hline-regexp))
+ nil))
+
+(defun org-table-insert-column ()
+ "Insert a new column into the table."
+ (interactive)
+ (if (not (org-at-table-p))
+ (error "Not at a table"))
+ (org-table-find-dataline)
+ (let* ((col (max 1 (org-table-current-column)))
+ (beg (org-table-begin))
+ (end (org-table-end))
+ ;; Current cursor position
+ (linepos (org-current-line))
+ (colpos col))
+ (goto-char beg)
+ (while (< (point) end)
+ (if (org-at-table-hline-p)
+ nil
+ (org-table-goto-column col t)
+ (insert "| "))
+ (beginning-of-line 2))
+ (move-marker end nil)
+ (goto-line linepos)
+ (org-table-goto-column colpos)
+ (org-table-align)
+ (org-table-fix-formulas "$" nil (1- col) 1)))
+
+(defun org-table-find-dataline ()
+ "Find a dataline in the current table, which is needed for column commands."
+ (if (and (org-at-table-p)
+ (not (org-at-table-hline-p)))
+ t
+ (let ((col (current-column))
+ (end (org-table-end)))
+ (move-to-column col)
+ (while (and (< (point) end)
+ (or (not (= (current-column) col))
+ (org-at-table-hline-p)))
+ (beginning-of-line 2)
+ (move-to-column col))
+ (if (and (org-at-table-p)
+ (not (org-at-table-hline-p)))
+ t
+ (error
+ "Please position cursor in a data line for column operations")))))
+
+(defun org-table-delete-column ()
+ "Delete a column from the table."
+ (interactive)
+ (if (not (org-at-table-p))
+ (error "Not at a table"))
+ (org-table-find-dataline)
+ (org-table-check-inside-data-field)
+ (let* ((col (org-table-current-column))
+ (beg (org-table-begin))
+ (end (org-table-end))
+ ;; Current cursor position
+ (linepos (org-current-line))
+ (colpos col))
+ (goto-char beg)
+ (while (< (point) end)
+ (if (org-at-table-hline-p)
+ nil
+ (org-table-goto-column col t)
+ (and (looking-at "|[^|\n]+|")
+ (replace-match "|")))
+ (beginning-of-line 2))
+ (move-marker end nil)
+ (goto-line linepos)
+ (org-table-goto-column colpos)
+ (org-table-align)
+ (org-table-fix-formulas "$" (list (cons (number-to-string col) "INVALID"))
+ col -1 col)))
+
+(defun org-table-move-column-right ()
+ "Move column to the right."
+ (interactive)
+ (org-table-move-column nil))
+(defun org-table-move-column-left ()
+ "Move column to the left."
+ (interactive)
+ (org-table-move-column 'left))
+
+(defun org-table-move-column (&optional left)
+ "Move the current column to the right. With arg LEFT, move to the left."
+ (interactive "P")
+ (if (not (org-at-table-p))
+ (error "Not at a table"))
+ (org-table-find-dataline)
+ (org-table-check-inside-data-field)
+ (let* ((col (org-table-current-column))
+ (col1 (if left (1- col) col))
+ (beg (org-table-begin))
+ (end (org-table-end))
+ ;; Current cursor position
+ (linepos (org-current-line))
+ (colpos (if left (1- col) (1+ col))))
+ (if (and left (= col 1))
+ (error "Cannot move column further left"))
+ (if (and (not left) (looking-at "[^|\n]*|[^|\n]*$"))
+ (error "Cannot move column further right"))
+ (goto-char beg)
+ (while (< (point) end)
+ (if (org-at-table-hline-p)
+ nil
+ (org-table-goto-column col1 t)
+ (and (looking-at "|\\([^|\n]+\\)|\\([^|\n]+\\)|")
+ (replace-match "|\\2|\\1|")))
+ (beginning-of-line 2))
+ (move-marker end nil)
+ (goto-line linepos)
+ (org-table-goto-column colpos)
+ (org-table-align)
+ (org-table-fix-formulas
+ "$" (list (cons (number-to-string col) (number-to-string colpos))
+ (cons (number-to-string colpos) (number-to-string col))))))
+
+(defun org-table-move-row-down ()
+ "Move table row down."
+ (interactive)
+ (org-table-move-row nil))
+(defun org-table-move-row-up ()
+ "Move table row up."
+ (interactive)
+ (org-table-move-row 'up))
+
+(defun org-table-move-row (&optional up)
+ "Move the current table line down. With arg UP, move it up."
+ (interactive "P")
+ (let* ((col (current-column))
+ (pos (point))
+ (hline1p (save-excursion (beginning-of-line 1)
+ (looking-at org-table-hline-regexp)))
+ (dline1 (org-table-current-dline))
+ (dline2 (+ dline1 (if up -1 1)))
+ (tonew (if up 0 2))
+ txt hline2p)
+ (beginning-of-line tonew)
+ (unless (org-at-table-p)
+ (goto-char pos)
+ (error "Cannot move row further"))
+ (setq hline2p (looking-at org-table-hline-regexp))
+ (goto-char pos)
+ (beginning-of-line 1)
+ (setq pos (point))
+ (setq txt (buffer-substring (point) (1+ (point-at-eol))))
+ (delete-region (point) (1+ (point-at-eol)))
+ (beginning-of-line tonew)
+ (insert txt)
+ (beginning-of-line 0)
+ (move-to-column col)
+ (unless (or hline1p hline2p)
+ (org-table-fix-formulas
+ "@" (list (cons (number-to-string dline1) (number-to-string dline2))
+ (cons (number-to-string dline2) (number-to-string dline1)))))))
+
+(defun org-table-insert-row (&optional arg)
+ "Insert a new row above the current line into the table.
+With prefix ARG, insert below the current line."
+ (interactive "P")
+ (if (not (org-at-table-p))
+ (error "Not at a table"))
+ (let* ((line (buffer-substring (point-at-bol) (point-at-eol)))
+ (new (org-table-clean-line line)))
+ ;; Fix the first field if necessary
+ (if (string-match "^[ \t]*| *[#$] *|" line)
+ (setq new (replace-match (match-string 0 line) t t new)))
+ (beginning-of-line (if arg 2 1))
+ (let (org-table-may-need-update) (insert-before-markers new "\n"))
+ (beginning-of-line 0)
+ (re-search-forward "| ?" (point-at-eol) t)
+ (and (or org-table-may-need-update org-table-overlay-coordinates)
+ (org-table-align))
+ (org-table-fix-formulas "@" nil (1- (org-table-current-dline)) 1)))
+
+(defun org-table-insert-hline (&optional above)
+ "Insert a horizontal-line below the current line into the table.
+With prefix ABOVE, insert above the current line."
+ (interactive "P")
+ (if (not (org-at-table-p))
+ (error "Not at a table"))
+ (let ((line (org-table-clean-line
+ (buffer-substring (point-at-bol) (point-at-eol))))
+ (col (current-column)))
+ (while (string-match "|\\( +\\)|" line)
+ (setq line (replace-match
+ (concat "+" (make-string (- (match-end 1) (match-beginning 1))
+ ?-) "|") t t line)))
+ (and (string-match "\\+" line) (setq line (replace-match "|" t t line)))
+ (beginning-of-line (if above 1 2))
+ (insert line "\n")
+ (beginning-of-line (if above 1 -1))
+ (move-to-column col)
+ (and org-table-overlay-coordinates (org-table-align))))
+
+(defun org-table-hline-and-move (&optional same-column)
+ "Insert a hline and move to the row below that line."
+ (interactive "P")
+ (let ((col (org-table-current-column)))
+ (org-table-maybe-eval-formula)
+ (org-table-maybe-recalculate-line)
+ (org-table-insert-hline)
+ (end-of-line 2)
+ (if (looking-at "\n[ \t]*|-")
+ (progn (insert "\n|") (org-table-align))
+ (org-table-next-field))
+ (if same-column (org-table-goto-column col))))
+
+(defun org-table-clean-line (s)
+ "Convert a table line S into a string with only \"|\" and space.
+In particular, this does handle wide and invisible characters."
+ (if (string-match "^[ \t]*|-" s)
+ ;; It's a hline, just map the characters
+ (setq s (mapconcat (lambda (x) (if (member x '(?| ?+)) "|" " ")) s ""))
+ (while (string-match "|\\([ \t]*?[^ \t\r\n|][^\r\n|]*\\)|" s)
+ (setq s (replace-match
+ (concat "|" (make-string (org-string-width (match-string 1 s))
+ ?\ ) "|")
+ t t s)))
+ s))
+
+(defun org-table-kill-row ()
+ "Delete the current row or horizontal line from the table."
+ (interactive)
+ (if (not (org-at-table-p))
+ (error "Not at a table"))
+ (let ((col (current-column))
+ (dline (org-table-current-dline)))
+ (kill-region (point-at-bol) (min (1+ (point-at-eol)) (point-max)))
+ (if (not (org-at-table-p)) (beginning-of-line 0))
+ (move-to-column col)
+ (org-table-fix-formulas "@" (list (cons (number-to-string dline) "INVALID"))
+ dline -1 dline)))
+
+(defun org-table-sort-lines (with-case &optional sorting-type)
+ "Sort table lines according to the column at point.
+
+The position of point indicates the column to be used for
+sorting, and the range of lines is the range between the nearest
+horizontal separator lines, or the entire table of no such lines
+exist. If point is before the first column, you will be prompted
+for the sorting column. If there is an active region, the mark
+specifies the first line and the sorting column, while point
+should be in the last line to be included into the sorting.
+
+The command then prompts for the sorting type which can be
+alphabetically, numerically, or by time (as given in a time stamp
+in the field). Sorting in reverse order is also possible.
+
+With prefix argument WITH-CASE, alphabetic sorting will be case-sensitive.
+
+If SORTING-TYPE is specified when this function is called from a Lisp
+program, no prompting will take place. SORTING-TYPE must be a character,
+any of (?a ?A ?n ?N ?t ?T) where the capital letter indicate that sorting
+should be done in reverse order."
+ (interactive "P")
+ (let* ((thisline (org-current-line))
+ (thiscol (org-table-current-column))
+ beg end bcol ecol tend tbeg column lns pos)
+ (when (equal thiscol 0)
+ (if (interactive-p)
+ (setq thiscol
+ (string-to-number
+ (read-string "Use column N for sorting: ")))
+ (setq thiscol 1))
+ (org-table-goto-column thiscol))
+ (org-table-check-inside-data-field)
+ (if (org-region-active-p)
+ (progn
+ (setq beg (region-beginning) end (region-end))
+ (goto-char beg)
+ (setq column (org-table-current-column)
+ beg (point-at-bol))
+ (goto-char end)
+ (setq end (point-at-bol 2)))
+ (setq column (org-table-current-column)
+ pos (point)
+ tbeg (org-table-begin)
+ tend (org-table-end))
+ (if (re-search-backward org-table-hline-regexp tbeg t)
+ (setq beg (point-at-bol 2))
+ (goto-char tbeg)
+ (setq beg (point-at-bol 1)))
+ (goto-char pos)
+ (if (re-search-forward org-table-hline-regexp tend t)
+ (setq end (point-at-bol 1))
+ (goto-char tend)
+ (setq end (point-at-bol))))
+ (setq beg (move-marker (make-marker) beg)
+ end (move-marker (make-marker) end))
+ (untabify beg end)
+ (goto-char beg)
+ (org-table-goto-column column)
+ (skip-chars-backward "^|")
+ (setq bcol (current-column))
+ (org-table-goto-column (1+ column))
+ (skip-chars-backward "^|")
+ (setq ecol (1- (current-column)))
+ (org-table-goto-column column)
+ (setq lns (mapcar (lambda(x) (cons
+ (org-sort-remove-invisible
+ (nth (1- column)
+ (org-split-string x "[ \t]*|[ \t]*")))
+ x))
+ (org-split-string (buffer-substring beg end) "\n")))
+ (setq lns (org-do-sort lns "Table" with-case sorting-type))
+ (delete-region beg end)
+ (move-marker beg nil)
+ (move-marker end nil)
+ (insert (mapconcat 'cdr lns "\n") "\n")
+ (goto-line thisline)
+ (org-table-goto-column thiscol)
+ (message "%d lines sorted, based on column %d" (length lns) column)))
+
+;; FIXME: maybe we will not need this? Table sorting is broken....
+(defun org-sort-remove-invisible (s)
+ (remove-text-properties 0 (length s) org-rm-props s)
+ (while (string-match org-bracket-link-regexp s)
+ (setq s (replace-match (if (match-end 2)
+ (match-string 3 s)
+ (match-string 1 s)) t t s)))
+ s)
+
+(defun org-table-cut-region (beg end)
+ "Copy region in table to the clipboard and blank all relevant fields."
+ (interactive "r")
+ (org-table-copy-region beg end 'cut))
+
+(defun org-table-copy-region (beg end &optional cut)
+ "Copy rectangular region in table to clipboard.
+A special clipboard is used which can only be accessed
+with `org-table-paste-rectangle'."
+ (interactive "rP")
+ (let* (l01 c01 l02 c02 l1 c1 l2 c2 ic1 ic2
+ region cols
+ (rpl (if cut " " nil)))
+ (goto-char beg)
+ (org-table-check-inside-data-field)
+ (setq l01 (org-current-line)
+ c01 (org-table-current-column))
+ (goto-char end)
+ (org-table-check-inside-data-field)
+ (setq l02 (org-current-line)
+ c02 (org-table-current-column))
+ (setq l1 (min l01 l02) l2 (max l01 l02)
+ c1 (min c01 c02) c2 (max c01 c02))
+ (catch 'exit
+ (while t
+ (catch 'nextline
+ (if (> l1 l2) (throw 'exit t))
+ (goto-line l1)
+ (if (org-at-table-hline-p) (throw 'nextline (setq l1 (1+ l1))))
+ (setq cols nil ic1 c1 ic2 c2)
+ (while (< ic1 (1+ ic2))
+ (push (org-table-get-field ic1 rpl) cols)
+ (setq ic1 (1+ ic1)))
+ (push (nreverse cols) region)
+ (setq l1 (1+ l1)))))
+ (setq org-table-clip (nreverse region))
+ (if cut (org-table-align))
+ org-table-clip))
+
+(defun org-table-paste-rectangle ()
+ "Paste a rectangular region into a table.
+The upper right corner ends up in the current field. All involved fields
+will be overwritten. If the rectangle does not fit into the present table,
+the table is enlarged as needed. The process ignores horizontal separator
+lines."
+ (interactive)
+ (unless (and org-table-clip (listp org-table-clip))
+ (error "First cut/copy a region to paste!"))
+ (org-table-check-inside-data-field)
+ (let* ((clip org-table-clip)
+ (line (org-current-line))
+ (col (org-table-current-column))
+ (org-enable-table-editor t)
+ (org-table-automatic-realign nil)
+ c cols field)
+ (while (setq cols (pop clip))
+ (while (org-at-table-hline-p) (beginning-of-line 2))
+ (if (not (org-at-table-p))
+ (progn (end-of-line 0) (org-table-next-field)))
+ (setq c col)
+ (while (setq field (pop cols))
+ (org-table-goto-column c nil 'force)
+ (org-table-get-field nil field)
+ (setq c (1+ c)))
+ (beginning-of-line 2))
+ (goto-line line)
+ (org-table-goto-column col)
+ (org-table-align)))
+
+(defun org-table-convert ()
+ "Convert from `org-mode' table to table.el and back.
+Obviously, this only works within limits. When an Org-mode table is
+converted to table.el, all horizontal separator lines get lost, because
+table.el uses these as cell boundaries and has no notion of horizontal lines.
+A table.el table can be converted to an Org-mode table only if it does not
+do row or column spanning. Multiline cells will become multiple cells.
+Beware, Org-mode does not test if the table can be successfully converted - it
+blindly applies a recipe that works for simple tables."
+ (interactive)
+ (require 'table)
+ (if (org-at-table.el-p)
+ ;; convert to Org-mode table
+ (let ((beg (move-marker (make-marker) (org-table-begin t)))
+ (end (move-marker (make-marker) (org-table-end t))))
+ (table-unrecognize-region beg end)
+ (goto-char beg)
+ (while (re-search-forward "^\\([ \t]*\\)\\+-.*\n" end t)
+ (replace-match ""))
+ (goto-char beg))
+ (if (org-at-table-p)
+ ;; convert to table.el table
+ (let ((beg (move-marker (make-marker) (org-table-begin)))
+ (end (move-marker (make-marker) (org-table-end))))
+ ;; first, get rid of all horizontal lines
+ (goto-char beg)
+ (while (re-search-forward "^\\([ \t]*\\)|-.*\n" end t)
+ (replace-match ""))
+ ;; insert a hline before first
+ (goto-char beg)
+ (org-table-insert-hline 'above)
+ (beginning-of-line -1)
+ ;; insert a hline after each line
+ (while (progn (beginning-of-line 3) (< (point) end))
+ (org-table-insert-hline))
+ (goto-char beg)
+ (setq end (move-marker end (org-table-end)))
+ ;; replace "+" at beginning and ending of hlines
+ (while (re-search-forward "^\\([ \t]*\\)|-" end t)
+ (replace-match "\\1+-"))
+ (goto-char beg)
+ (while (re-search-forward "-|[ \t]*$" end t)
+ (replace-match "-+"))
+ (goto-char beg)))))
+
+(defun org-table-wrap-region (arg)
+ "Wrap several fields in a column like a paragraph.
+This is useful if you'd like to spread the contents of a field over several
+lines, in order to keep the table compact.
+
+If there is an active region, and both point and mark are in the same column,
+the text in the column is wrapped to minimum width for the given number of
+lines. Generally, this makes the table more compact. A prefix ARG may be
+used to change the number of desired lines. For example, `C-2 \\[org-table-wrap]'
+formats the selected text to two lines. If the region was longer than two
+lines, the remaining lines remain empty. A negative prefix argument reduces
+the current number of lines by that amount. The wrapped text is pasted back
+into the table. If you formatted it to more lines than it was before, fields
+further down in the table get overwritten - so you might need to make space in
+the table first.
+
+If there is no region, the current field is split at the cursor position and
+the text fragment to the right of the cursor is prepended to the field one
+line down.
+
+If there is no region, but you specify a prefix ARG, the current field gets
+blank, and the content is appended to the field above."
+ (interactive "P")
+ (org-table-check-inside-data-field)
+ (if (org-region-active-p)
+ ;; There is a region: fill as a paragraph
+ (let* ((beg (region-beginning))
+ (cline (save-excursion (goto-char beg) (org-current-line)))
+ (ccol (save-excursion (goto-char beg) (org-table-current-column)))
+ nlines)
+ (org-table-cut-region (region-beginning) (region-end))
+ (if (> (length (car org-table-clip)) 1)
+ (error "Region must be limited to single column"))
+ (setq nlines (if arg
+ (if (< arg 1)
+ (+ (length org-table-clip) arg)
+ arg)
+ (length org-table-clip)))
+ (setq org-table-clip
+ (mapcar 'list (org-wrap (mapconcat 'car org-table-clip " ")
+ nil nlines)))
+ (goto-line cline)
+ (org-table-goto-column ccol)
+ (org-table-paste-rectangle))
+ ;; No region, split the current field at point
+ (if arg
+ ;; combine with field above
+ (let ((s (org-table-blank-field))
+ (col (org-table-current-column)))
+ (beginning-of-line 0)
+ (while (org-at-table-hline-p) (beginning-of-line 0))
+ (org-table-goto-column col)
+ (skip-chars-forward "^|")
+ (skip-chars-backward " ")
+ (insert " " (org-trim s))
+ (org-table-align))
+ ;; split field
+ (when (looking-at "\\([^|]+\\)+|")
+ (let ((s (match-string 1)))
+ (replace-match " |")
+ (goto-char (match-beginning 0))
+ (org-table-next-row)
+ (insert (org-trim s) " ")
+ (org-table-align))))))
+
+(defvar org-field-marker nil)
+
+(defun org-table-edit-field (arg)
+ "Edit table field in a different window.
+This is mainly useful for fields that contain hidden parts.
+When called with a \\[universal-argument] prefix, just make the full field visible so that
+it can be edited in place."
+ (interactive "P")
+ (if arg
+ (let ((b (save-excursion (skip-chars-backward "^|") (point)))
+ (e (save-excursion (skip-chars-forward "^|\r\n") (point))))
+ (remove-text-properties b e '(org-cwidth t invisible t
+ display t intangible t))
+ (if (and (boundp 'font-lock-mode) font-lock-mode)
+ (font-lock-fontify-block)))
+ (let ((pos (move-marker (make-marker) (point)))
+ (field (org-table-get-field))
+ (cw (current-window-configuration))
+ p)
+ (org-switch-to-buffer-other-window "*Org tmp*")
+ (erase-buffer)
+ (insert "#\n# Edit field and finish with C-c C-c\n#\n")
+ (let ((org-inhibit-startup t)) (org-mode))
+ (goto-char (setq p (point-max)))
+ (insert (org-trim field))
+ (remove-text-properties p (point-max)
+ '(invisible t org-cwidth t display t
+ intangible t))
+ (goto-char p)
+ (org-set-local 'org-finish-function 'org-table-finish-edit-field)
+ (org-set-local 'org-window-configuration cw)
+ (org-set-local 'org-field-marker pos)
+ (message "Edit and finish with C-c C-c"))))
+
+(defun org-table-finish-edit-field ()
+ "Finish editing a table data field.
+Remove all newline characters, insert the result into the table, realign
+the table and kill the editing buffer."
+ (let ((pos org-field-marker)
+ (cw org-window-configuration)
+ (cb (current-buffer))
+ text)
+ (goto-char (point-min))
+ (while (re-search-forward "^#.*\n?" nil t) (replace-match ""))
+ (while (re-search-forward "\\([ \t]*\n[ \t]*\\)+" nil t)
+ (replace-match " "))
+ (setq text (org-trim (buffer-string)))
+ (set-window-configuration cw)
+ (kill-buffer cb)
+ (select-window (get-buffer-window (marker-buffer pos)))
+ (goto-char pos)
+ (move-marker pos nil)
+ (org-table-check-inside-data-field)
+ (org-table-get-field nil text)
+ (org-table-align)
+ (message "New field value inserted")))
+
+(defun org-trim (s)
+ "Remove whitespace at beginning and end of string."
+ (if (string-match "\\`[ \t\n\r]+" s) (setq s (replace-match "" t t s)))
+ (if (string-match "[ \t\n\r]+\\'" s) (setq s (replace-match "" t t s)))
+ s)
+
+(defun org-wrap (string &optional width lines)
+ "Wrap string to either a number of lines, or a width in characters.
+If WIDTH is non-nil, the string is wrapped to that width, however many lines
+that costs. If there is a word longer than WIDTH, the text is actually
+wrapped to the length of that word.
+IF WIDTH is nil and LINES is non-nil, the string is forced into at most that
+many lines, whatever width that takes.
+The return value is a list of lines, without newlines at the end."
+ (let* ((words (org-split-string string "[ \t\n]+"))
+ (maxword (apply 'max (mapcar 'org-string-width words)))
+ w ll)
+ (cond (width
+ (org-do-wrap words (max maxword width)))
+ (lines
+ (setq w maxword)
+ (setq ll (org-do-wrap words maxword))
+ (if (<= (length ll) lines)
+ ll
+ (setq ll words)
+ (while (> (length ll) lines)
+ (setq w (1+ w))
+ (setq ll (org-do-wrap words w)))
+ ll))
+ (t (error "Cannot wrap this")))))
+
+
+(defun org-do-wrap (words width)
+ "Create lines of maximum width WIDTH (in characters) from word list WORDS."
+ (let (lines line)
+ (while words
+ (setq line (pop words))
+ (while (and words (< (+ (length line) (length (car words))) width))
+ (setq line (concat line " " (pop words))))
+ (setq lines (push line lines)))
+ (nreverse lines)))
+
+(defun org-split-string (string &optional separators)
+ "Splits STRING into substrings at SEPARATORS.
+No empty strings are returned if there are matches at the beginning
+and end of string."
+ (let ((rexp (or separators "[ \f\t\n\r\v]+"))
+ (start 0)
+ notfirst
+ (list nil))
+ (while (and (string-match rexp string
+ (if (and notfirst
+ (= start (match-beginning 0))
+ (< start (length string)))
+ (1+ start) start))
+ (< (match-beginning 0) (length string)))
+ (setq notfirst t)
+ (or (eq (match-beginning 0) 0)
+ (and (eq (match-beginning 0) (match-end 0))
+ (eq (match-beginning 0) start))
+ (setq list
+ (cons (substring string start (match-beginning 0))
+ list)))
+ (setq start (match-end 0)))
+ (or (eq start (length string))
+ (setq list
+ (cons (substring string start)
+ list)))
+ (nreverse list)))
+
+(defun org-table-map-tables (function)
+ "Apply FUNCTION to the start of all tables in the buffer."
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (while (re-search-forward org-table-any-line-regexp nil t)
+ (message "Mapping tables: %d%%" (/ (* 100.0 (point)) (buffer-size)))
+ (beginning-of-line 1)
+ (if (looking-at org-table-line-regexp)
+ (save-excursion (funcall function)))
+ (re-search-forward org-table-any-border-regexp nil 1))))
+ (message "Mapping tables: done"))
+
+(defvar org-timecnt) ; dynamically scoped parameter
+
+(defun org-table-sum (&optional beg end nlast)
+ "Sum numbers in region of current table column.
+The result will be displayed in the echo area, and will be available
+as kill to be inserted with \\[yank].
+
+If there is an active region, it is interpreted as a rectangle and all
+numbers in that rectangle will be summed. If there is no active
+region and point is located in a table column, sum all numbers in that
+column.
+
+If at least one number looks like a time HH:MM or HH:MM:SS, all other
+numbers are assumed to be times as well (in decimal hours) and the
+numbers are added as such.
+
+If NLAST is a number, only the NLAST fields will actually be summed."
+ (interactive)
+ (save-excursion
+ (let (col (org-timecnt 0) diff h m s org-table-clip)
+ (cond
+ ((and beg end)) ; beg and end given explicitly
+ ((org-region-active-p)
+ (setq beg (region-beginning) end (region-end)))
+ (t
+ (setq col (org-table-current-column))
+ (goto-char (org-table-begin))
+ (unless (re-search-forward "^[ \t]*|[^-]" nil t)
+ (error "No table data"))
+ (org-table-goto-column col)
+ (setq beg (point))
+ (goto-char (org-table-end))
+ (unless (re-search-backward "^[ \t]*|[^-]" nil t)
+ (error "No table data"))
+ (org-table-goto-column col)
+ (setq end (point))))
+ (let* ((items (apply 'append (org-table-copy-region beg end)))
+ (items1 (cond ((not nlast) items)
+ ((>= nlast (length items)) items)
+ (t (setq items (reverse items))
+ (setcdr (nthcdr (1- nlast) items) nil)
+ (nreverse items))))
+ (numbers (delq nil (mapcar 'org-table-get-number-for-summing
+ items1)))
+ (res (apply '+ numbers))
+ (sres (if (= org-timecnt 0)
+ (format "%g" res)
+ (setq diff (* 3600 res)
+ h (floor (/ diff 3600)) diff (mod diff 3600)
+ m (floor (/ diff 60)) diff (mod diff 60)
+ s diff)
+ (format "%d:%02d:%02d" h m s))))
+ (kill-new sres)
+ (if (interactive-p)
+ (message "%s"
+ (substitute-command-keys
+ (format "Sum of %d items: %-20s (\\[yank] will insert result into buffer)"
+ (length numbers) sres))))
+ sres))))
+
+(defun org-table-get-number-for-summing (s)
+ (let (n)
+ (if (string-match "^ *|? *" s)
+ (setq s (replace-match "" nil nil s)))
+ (if (string-match " *|? *$" s)
+ (setq s (replace-match "" nil nil s)))
+ (setq n (string-to-number s))
+ (cond
+ ((and (string-match "0" s)
+ (string-match "\\`[-+ \t0.edED]+\\'" s)) 0)
+ ((string-match "\\`[ \t]+\\'" s) nil)
+ ((string-match "\\`\\([0-9]+\\):\\([0-9]+\\)\\(:\\([0-9]+\\)\\)?\\'" s)
+ (let ((h (string-to-number (or (match-string 1 s) "0")))
+ (m (string-to-number (or (match-string 2 s) "0")))
+ (s (string-to-number (or (match-string 4 s) "0"))))
+ (if (boundp 'org-timecnt) (setq org-timecnt (1+ org-timecnt)))
+ (* 1.0 (+ h (/ m 60.0) (/ s 3600.0)))))
+ ((equal n 0) nil)
+ (t n))))
+
+(defun org-table-current-field-formula (&optional key noerror)
+ "Return the formula active for the current field.
+Assumes that specials are in place.
+If KEY is given, return the key to this formula.
+Otherwise return the formula preceeded with \"=\" or \":=\"."
+ (let* ((name (car (rassoc (list (org-current-line)
+ (org-table-current-column))
+ org-table-named-field-locations)))
+ (col (org-table-current-column))
+ (scol (int-to-string col))
+ (ref (format "@%d$%d" (org-table-current-dline) col))
+ (stored-list (org-table-get-stored-formulas noerror))
+ (ass (or (assoc name stored-list)
+ (assoc ref stored-list)
+ (assoc scol stored-list))))
+ (if key
+ (car ass)
+ (if ass (concat (if (string-match "^[0-9]+$" (car ass)) "=" ":=")
+ (cdr ass))))))
+
+(defun org-table-get-formula (&optional equation named)
+ "Read a formula from the minibuffer, offer stored formula as default.
+When NAMED is non-nil, look for a named equation."
+ (let* ((stored-list (org-table-get-stored-formulas))
+ (name (car (rassoc (list (org-current-line)
+ (org-table-current-column))
+ org-table-named-field-locations)))
+ (ref (format "@%d$%d" (org-table-current-dline)
+ (org-table-current-column)))
+ (refass (assoc ref stored-list))
+ (scol (if named
+ (if name name ref)
+ (int-to-string (org-table-current-column))))
+ (dummy (and (or name refass) (not named)
+ (not (y-or-n-p "Replace field formula with column formula? " ))
+ (error "Abort")))
+ (name (or name ref))
+ (org-table-may-need-update nil)
+ (stored (cdr (assoc scol stored-list)))
+ (eq (cond
+ ((and stored equation (string-match "^ *=? *$" equation))
+ stored)
+ ((stringp equation)
+ equation)
+ (t (org-table-formula-from-user
+ (read-string
+ (org-table-formula-to-user
+ (format "%s formula %s%s="
+ (if named "Field" "Column")
+ (if (member (string-to-char scol) '(?$ ?@)) "" "$")
+ scol))
+ (if stored (org-table-formula-to-user stored) "")
+ 'org-table-formula-history
+ )))))
+ mustsave)
+ (when (not (string-match "\\S-" eq))
+ ;; remove formula
+ (setq stored-list (delq (assoc scol stored-list) stored-list))
+ (org-table-store-formulas stored-list)
+ (error "Formula removed"))
+ (if (string-match "^ *=?" eq) (setq eq (replace-match "" t t eq)))
+ (if (string-match " *$" eq) (setq eq (replace-match "" t t eq)))
+ (if (and name (not named))
+ ;; We set the column equation, delete the named one.
+ (setq stored-list (delq (assoc name stored-list) stored-list)
+ mustsave t))
+ (if stored
+ (setcdr (assoc scol stored-list) eq)
+ (setq stored-list (cons (cons scol eq) stored-list)))
+ (if (or mustsave (not (equal stored eq)))
+ (org-table-store-formulas stored-list))
+ eq))
+
+(defun org-table-store-formulas (alist)
+ "Store the list of formulas below the current table."
+ (setq alist (sort alist 'org-table-formula-less-p))
+ (save-excursion
+ (goto-char (org-table-end))
+ (if (looking-at "\\([ \t]*\n\\)*#\\+TBLFM:\\(.*\n?\\)")
+ (progn
+ ;; don't overwrite TBLFM, we might use text properties to store stuff
+ (goto-char (match-beginning 2))
+ (delete-region (match-beginning 2) (match-end 0)))
+ (insert "#+TBLFM:"))
+ (insert " "
+ (mapconcat (lambda (x)
+ (concat
+ (if (equal (string-to-char (car x)) ?@) "" "$")
+ (car x) "=" (cdr x)))
+ alist "::")
+ "\n")))
+
+(defsubst org-table-formula-make-cmp-string (a)
+ (when (string-match "^\\(@\\([0-9]+\\)\\)?\\(\\$?\\([0-9]+\\)\\)?\\(\\$?[a-zA-Z0-9]+\\)?" a)
+ (concat
+ (if (match-end 2) (format "@%05d" (string-to-number (match-string 2 a))) "")
+ (if (match-end 4) (format "$%05d" (string-to-number (match-string 4 a))) "")
+ (if (match-end 5) (concat "@@" (match-string 5 a))))))
+
+(defun org-table-formula-less-p (a b)
+ "Compare two formulas for sorting."
+ (let ((as (org-table-formula-make-cmp-string (car a)))
+ (bs (org-table-formula-make-cmp-string (car b))))
+ (and as bs (string< as bs))))
+
+(defun org-table-get-stored-formulas (&optional noerror)
+ "Return an alist with the stored formulas directly after current table."
+ (interactive)
+ (let (scol eq eq-alist strings string seen)
+ (save-excursion
+ (goto-char (org-table-end))
+ (when (looking-at "\\([ \t]*\n\\)*#\\+TBLFM: *\\(.*\\)")
+ (setq strings (org-split-string (match-string 2) " *:: *"))
+ (while (setq string (pop strings))
+ (when (string-match "\\(@[0-9]+\\$[0-9]+\\|\\$\\([a-zA-Z0-9]+\\)\\) *= *\\(.*[^ \t]\\)" string)
+ (setq scol (if (match-end 2)
+ (match-string 2 string)
+ (match-string 1 string))
+ eq (match-string 3 string)
+ eq-alist (cons (cons scol eq) eq-alist))
+ (if (member scol seen)
+ (if noerror
+ (progn
+ (message "Double definition `$%s=' in TBLFM line, please fix by hand" scol)
+ (ding)
+ (sit-for 2))
+ (error "Double definition `$%s=' in TBLFM line, please fix by hand" scol))
+ (push scol seen))))))
+ (nreverse eq-alist)))
+
+(defun org-table-fix-formulas (key replace &optional limit delta remove)
+ "Modify the equations after the table structure has been edited.
+KEY is \"@\" or \"$\". REPLACE is an alist of numbers to replace.
+For all numbers larger than LIMIT, shift them by DELTA."
+ (save-excursion
+ (goto-char (org-table-end))
+ (when (looking-at "#\\+TBLFM:")
+ (let ((re (concat key "\\([0-9]+\\)"))
+ (re2
+ (when remove
+ (if (equal key "$")
+ (format "\\(@[0-9]+\\)?\\$%d=.*?\\(::\\|$\\)" remove)
+ (format "@%d\\$[0-9]+=.*?\\(::\\|$\\)" remove))))
+ s n a)
+ (when remove
+ (while (re-search-forward re2 (point-at-eol) t)
+ (replace-match "")))
+ (while (re-search-forward re (point-at-eol) t)
+ (setq s (match-string 1) n (string-to-number s))
+ (cond
+ ((setq a (assoc s replace))
+ (replace-match (concat key (cdr a)) t t))
+ ((and limit (> n limit))
+ (replace-match (concat key (int-to-string (+ n delta))) t t))))))))
+
+(defun org-table-get-specials ()
+ "Get the column names and local parameters for this table."
+ (save-excursion
+ (let ((beg (org-table-begin)) (end (org-table-end))
+ names name fields fields1 field cnt
+ c v l line col types dlines hlines)
+ (setq org-table-column-names nil
+ org-table-local-parameters nil
+ org-table-named-field-locations nil
+ org-table-current-begin-line nil
+ org-table-current-begin-pos nil
+ org-table-current-line-types nil)
+ (goto-char beg)
+ (when (re-search-forward "^[ \t]*| *! *\\(|.*\\)" end t)
+ (setq names (org-split-string (match-string 1) " *| *")
+ cnt 1)
+ (while (setq name (pop names))
+ (setq cnt (1+ cnt))
+ (if (string-match "^[a-zA-Z][a-zA-Z0-9]*$" name)
+ (push (cons name (int-to-string cnt)) org-table-column-names))))
+ (setq org-table-column-names (nreverse org-table-column-names))
+ (setq org-table-column-name-regexp
+ (concat "\\$\\(" (mapconcat 'car org-table-column-names "\\|") "\\)\\>"))
+ (goto-char beg)
+ (while (re-search-forward "^[ \t]*| *\\$ *\\(|.*\\)" end t)
+ (setq fields (org-split-string (match-string 1) " *| *"))
+ (while (setq field (pop fields))
+ (if (string-match "^\\([a-zA-Z][_a-zA-Z0-9]*\\|%\\) *= *\\(.*\\)" field)
+ (push (cons (match-string 1 field) (match-string 2 field))
+ org-table-local-parameters))))
+ (goto-char beg)
+ (while (re-search-forward "^[ \t]*| *\\([_^]\\) *\\(|.*\\)" end t)
+ (setq c (match-string 1)
+ fields (org-split-string (match-string 2) " *| *"))
+ (save-excursion
+ (beginning-of-line (if (equal c "_") 2 0))
+ (setq line (org-current-line) col 1)
+ (and (looking-at "^[ \t]*|[^|]*\\(|.*\\)")
+ (setq fields1 (org-split-string (match-string 1) " *| *"))))
+ (while (and fields1 (setq field (pop fields)))
+ (setq v (pop fields1) col (1+ col))
+ (when (and (stringp field) (stringp v)
+ (string-match "^[a-zA-Z][a-zA-Z0-9]*$" field))
+ (push (cons field v) org-table-local-parameters)
+ (push (list field line col) org-table-named-field-locations))))
+ ;; Analyse the line types
+ (goto-char beg)
+ (setq org-table-current-begin-line (org-current-line)
+ org-table-current-begin-pos (point)
+ l org-table-current-begin-line)
+ (while (looking-at "[ \t]*|\\(-\\)?")
+ (push (if (match-end 1) 'hline 'dline) types)
+ (if (match-end 1) (push l hlines) (push l dlines))
+ (beginning-of-line 2)
+ (setq l (1+ l)))
+ (setq org-table-current-line-types (apply 'vector (nreverse types))
+ org-table-dlines (apply 'vector (cons nil (nreverse dlines)))
+ org-table-hlines (apply 'vector (cons nil (nreverse hlines)))))))
+
+(defun org-table-maybe-eval-formula ()
+ "Check if the current field starts with \"=\" or \":=\".
+If yes, store the formula and apply it."
+ ;; We already know we are in a table. Get field will only return a formula
+ ;; when appropriate. It might return a separator line, but no problem.
+ (when org-table-formula-evaluate-inline
+ (let* ((field (org-trim (or (org-table-get-field) "")))
+ named eq)
+ (when (string-match "^:?=\\(.*\\)" field)
+ (setq named (equal (string-to-char field) ?:)
+ eq (match-string 1 field))
+ (if (or (fboundp 'calc-eval)
+ (equal (substring eq 0 (min 2 (length eq))) "'("))
+ (org-table-eval-formula (if named '(4) nil)
+ (org-table-formula-from-user eq))
+ (error "Calc does not seem to be installed, and is needed to evaluate the formula"))))))
+
+(defvar org-recalc-commands nil
+ "List of commands triggering the recalculation of a line.
+Will be filled automatically during use.")
+
+(defvar org-recalc-marks
+ '((" " . "Unmarked: no special line, no automatic recalculation")
+ ("#" . "Automatically recalculate this line upon TAB, RET, and C-c C-c in the line")
+ ("*" . "Recalculate only when entire table is recalculated with `C-u C-c *'")
+ ("!" . "Column name definition line. Reference in formula as $name.")
+ ("$" . "Parameter definition line name=value. Reference in formula as $name.")
+ ("_" . "Names for values in row below this one.")
+ ("^" . "Names for values in row above this one.")))
+
+(defun org-table-rotate-recalc-marks (&optional newchar)
+ "Rotate the recalculation mark in the first column.
+If in any row, the first field is not consistent with a mark,
+insert a new column for the markers.
+When there is an active region, change all the lines in the region,
+after prompting for the marking character.
+After each change, a message will be displayed indicating the meaning
+of the new mark."
+ (interactive)
+ (unless (org-at-table-p) (error "Not at a table"))
+ (let* ((marks (append (mapcar 'car org-recalc-marks) '(" ")))
+ (beg (org-table-begin))
+ (end (org-table-end))
+ (l (org-current-line))
+ (l1 (if (org-region-active-p) (org-current-line (region-beginning))))
+ (l2 (if (org-region-active-p) (org-current-line (region-end))))
+ (have-col
+ (save-excursion
+ (goto-char beg)
+ (not (re-search-forward "^[ \t]*|[^-|][^|]*[^#!$*_^| \t][^|]*|" end t))))
+ (col (org-table-current-column))
+ (forcenew (car (assoc newchar org-recalc-marks)))
+ epos new)
+ (when l1
+ (message "Change region to what mark? Type # * ! $ or SPC: ")
+ (setq newchar (char-to-string (read-char-exclusive))
+ forcenew (car (assoc newchar org-recalc-marks))))
+ (if (and newchar (not forcenew))
+ (error "Invalid NEWCHAR `%s' in `org-table-rotate-recalc-marks'"
+ newchar))
+ (if l1 (goto-line l1))
+ (save-excursion
+ (beginning-of-line 1)
+ (unless (looking-at org-table-dataline-regexp)
+ (error "Not at a table data line")))
+ (unless have-col
+ (org-table-goto-column 1)
+ (org-table-insert-column)
+ (org-table-goto-column (1+ col)))
+ (setq epos (point-at-eol))
+ (save-excursion
+ (beginning-of-line 1)
+ (org-table-get-field
+ 1 (if (looking-at "^[ \t]*| *\\([#!$*^_ ]\\) *|")
+ (concat " "
+ (setq new (or forcenew
+ (cadr (member (match-string 1) marks))))
+ " ")
+ " # ")))
+ (if (and l1 l2)
+ (progn
+ (goto-line l1)
+ (while (progn (beginning-of-line 2) (not (= (org-current-line) l2)))
+ (and (looking-at org-table-dataline-regexp)
+ (org-table-get-field 1 (concat " " new " "))))
+ (goto-line l1)))
+ (if (not (= epos (point-at-eol))) (org-table-align))
+ (goto-line l)
+ (and (interactive-p) (message "%s" (cdr (assoc new org-recalc-marks))))))
+
+(defun org-table-maybe-recalculate-line ()
+ "Recompute the current line if marked for it, and if we haven't just done it."
+ (interactive)
+ (and org-table-allow-automatic-line-recalculation
+ (not (and (memq last-command org-recalc-commands)
+ (equal org-last-recalc-line (org-current-line))))
+ (save-excursion (beginning-of-line 1)
+ (looking-at org-table-auto-recalculate-regexp))
+ (org-table-recalculate) t))
+
+(defvar org-table-formula-debug nil
+ "Non-nil means, debug table formulas.
+When nil, simply write \"#ERROR\" in corrupted fields.")
+(make-variable-buffer-local 'org-table-formula-debug)
+
+(defvar modes)
+(defsubst org-set-calc-mode (var &optional value)
+ (if (stringp var)
+ (setq var (assoc var '(("D" calc-angle-mode deg)
+ ("R" calc-angle-mode rad)
+ ("F" calc-prefer-frac t)
+ ("S" calc-symbolic-mode t)))
+ value (nth 2 var) var (nth 1 var)))
+ (if (memq var modes)
+ (setcar (cdr (memq var modes)) value)
+ (cons var (cons value modes)))
+ modes)
+
+(defun org-table-eval-formula (&optional arg equation
+ suppress-align suppress-const
+ suppress-store suppress-analysis)
+ "Replace the table field value at the cursor by the result of a calculation.
+
+This function makes use of Dave Gillespie's Calc package, in my view the
+most exciting program ever written for GNU Emacs. So you need to have Calc
+installed in order to use this function.
+
+In a table, this command replaces the value in the current field with the
+result of a formula. It also installs the formula as the \"current\" column
+formula, by storing it in a special line below the table. When called
+with a `C-u' prefix, the current field must ba a named field, and the
+formula is installed as valid in only this specific field.
+
+When called with two `C-u' prefixes, insert the active equation
+for the field back into the current field, so that it can be
+edited there. This is useful in order to use \\[org-table-show-reference]
+to check the referenced fields.
+
+When called, the command first prompts for a formula, which is read in
+the minibuffer. Previously entered formulas are available through the
+history list, and the last used formula is offered as a default.
+These stored formulas are adapted correctly when moving, inserting, or
+deleting columns with the corresponding commands.
+
+The formula can be any algebraic expression understood by the Calc package.
+For details, see the Org-mode manual.
+
+This function can also be called from Lisp programs and offers
+additional arguments: EQUATION can be the formula to apply. If this
+argument is given, the user will not be prompted. SUPPRESS-ALIGN is
+used to speed-up recursive calls by by-passing unnecessary aligns.
+SUPPRESS-CONST suppresses the interpretation of constants in the
+formula, assuming that this has been done already outside the function.
+SUPPRESS-STORE means the formula should not be stored, either because
+it is already stored, or because it is a modified equation that should
+not overwrite the stored one."
+ (interactive "P")
+ (org-table-check-inside-data-field)
+ (or suppress-analysis (org-table-get-specials))
+ (if (equal arg '(16))
+ (let ((eq (org-table-current-field-formula)))
+ (or eq (error "No equation active for current field"))
+ (org-table-get-field nil eq)
+ (org-table-align)
+ (setq org-table-may-need-update t))
+ (let* (fields
+ (ndown (if (integerp arg) arg 1))
+ (org-table-automatic-realign nil)
+ (case-fold-search nil)
+ (down (> ndown 1))
+ (formula (if (and equation suppress-store)
+ equation
+ (org-table-get-formula equation (equal arg '(4)))))
+ (n0 (org-table-current-column))
+ (modes (copy-sequence org-calc-default-modes))
+ (numbers nil) ; was a variable, now fixed default
+ (keep-empty nil)
+ n form form0 bw fmt x ev orig c lispp literal)
+ ;; Parse the format string. Since we have a lot of modes, this is
+ ;; a lot of work. However, I think calc still uses most of the time.
+ (if (string-match ";" formula)
+ (let ((tmp (org-split-string formula ";")))
+ (setq formula (car tmp)
+ fmt (concat (cdr (assoc "%" org-table-local-parameters))
+ (nth 1 tmp)))
+ (while (string-match "\\([pnfse]\\)\\(-?[0-9]+\\)" fmt)
+ (setq c (string-to-char (match-string 1 fmt))
+ n (string-to-number (match-string 2 fmt)))
+ (if (= c ?p)
+ (setq modes (org-set-calc-mode 'calc-internal-prec n))
+ (setq modes (org-set-calc-mode
+ 'calc-float-format
+ (list (cdr (assoc c '((?n . float) (?f . fix)
+ (?s . sci) (?e . eng))))
+ n))))
+ (setq fmt (replace-match "" t t fmt)))
+ (if (string-match "[NT]" fmt)
+ (setq numbers (equal (match-string 0 fmt) "N")
+ fmt (replace-match "" t t fmt)))
+ (if (string-match "L" fmt)
+ (setq literal t
+ fmt (replace-match "" t t fmt)))
+ (if (string-match "E" fmt)
+ (setq keep-empty t
+ fmt (replace-match "" t t fmt)))
+ (while (string-match "[DRFS]" fmt)
+ (setq modes (org-set-calc-mode (match-string 0 fmt)))
+ (setq fmt (replace-match "" t t fmt)))
+ (unless (string-match "\\S-" fmt)
+ (setq fmt nil))))
+ (if (and (not suppress-const) org-table-formula-use-constants)
+ (setq formula (org-table-formula-substitute-names formula)))
+ (setq orig (or (get-text-property 1 :orig-formula formula) "?"))
+ (while (> ndown 0)
+ (setq fields (org-split-string
+ (org-no-properties
+ (buffer-substring (point-at-bol) (point-at-eol)))
+ " *| *"))
+ (if (eq numbers t)
+ (setq fields (mapcar
+ (lambda (x) (number-to-string (string-to-number x)))
+ fields)))
+ (setq ndown (1- ndown))
+ (setq form (copy-sequence formula)
+ lispp (and (> (length form) 2)(equal (substring form 0 2) "'(")))
+ (if (and lispp literal) (setq lispp 'literal))
+ ;; Check for old vertical references
+ (setq form (org-rewrite-old-row-references form))
+ ;; Insert complex ranges
+ (while (string-match org-table-range-regexp form)
+ (setq form
+ (replace-match
+ (save-match-data
+ (org-table-make-reference
+ (org-table-get-range (match-string 0 form) nil n0)
+ keep-empty numbers lispp))
+ t t form)))
+ ;; Insert simple ranges
+ (while (string-match "\\$\\([0-9]+\\)\\.\\.\\$\\([0-9]+\\)" form)
+ (setq form
+ (replace-match
+ (save-match-data
+ (org-table-make-reference
+ (org-sublist
+ fields (string-to-number (match-string 1 form))
+ (string-to-number (match-string 2 form)))
+ keep-empty numbers lispp))
+ t t form)))
+ (setq form0 form)
+ ;; Insert the references to fields in same row
+ (while (string-match "\\$\\([0-9]+\\)" form)
+ (setq n (string-to-number (match-string 1 form))
+ x (nth (1- (if (= n 0) n0 n)) fields))
+ (unless x (error "Invalid field specifier \"%s\""
+ (match-string 0 form)))
+ (setq form (replace-match
+ (save-match-data
+ (org-table-make-reference x nil numbers lispp))
+ t t form)))
+
+ (if lispp
+ (setq ev (condition-case nil
+ (eval (eval (read form)))
+ (error "#ERROR"))
+ ev (if (numberp ev) (number-to-string ev) ev))
+ (or (fboundp 'calc-eval)
+ (error "Calc does not seem to be installed, and is needed to evaluate the formula"))
+ (setq ev (calc-eval (cons form modes)
+ (if numbers 'num))))
+
+ (when org-table-formula-debug
+ (with-output-to-temp-buffer "*Substitution History*"
+ (princ (format "Substitution history of formula
+Orig: %s
+$xyz-> %s
+@r$c-> %s
+$1-> %s\n" orig formula form0 form))
+ (if (listp ev)
+ (princ (format " %s^\nError: %s"
+ (make-string (car ev) ?\-) (nth 1 ev)))
+ (princ (format "Result: %s\nFormat: %s\nFinal: %s"
+ ev (or fmt "NONE")
+ (if fmt (format fmt (string-to-number ev)) ev)))))
+ (setq bw (get-buffer-window "*Substitution History*"))
+ (shrink-window-if-larger-than-buffer bw)
+ (unless (and (interactive-p) (not ndown))
+ (unless (let (inhibit-redisplay)
+ (y-or-n-p "Debugging Formula. Continue to next? "))
+ (org-table-align)
+ (error "Abort"))
+ (delete-window bw)
+ (message "")))
+ (if (listp ev) (setq fmt nil ev "#ERROR"))
+ (org-table-justify-field-maybe
+ (if fmt (format fmt (string-to-number ev)) ev))
+ (if (and down (> ndown 0) (looking-at ".*\n[ \t]*|[^-]"))
+ (call-interactively 'org-return)
+ (setq ndown 0)))
+ (and down (org-table-maybe-recalculate-line))
+ (or suppress-align (and org-table-may-need-update
+ (org-table-align))))))
+
+(defun org-table-put-field-property (prop value)
+ (save-excursion
+ (put-text-property (progn (skip-chars-backward "^|") (point))
+ (progn (skip-chars-forward "^|") (point))
+ prop value)))
+
+(defun org-table-get-range (desc &optional tbeg col highlight)
+ "Get a calc vector from a column, accorting to descriptor DESC.
+Optional arguments TBEG and COL can give the beginning of the table and
+the current column, to avoid unnecessary parsing.
+HIGHLIGHT means, just highlight the range."
+ (if (not (equal (string-to-char desc) ?@))
+ (setq desc (concat "@" desc)))
+ (save-excursion
+ (or tbeg (setq tbeg (org-table-begin)))
+ (or col (setq col (org-table-current-column)))
+ (let ((thisline (org-current-line))
+ beg end c1 c2 r1 r2 rangep tmp)
+ (unless (string-match org-table-range-regexp desc)
+ (error "Invalid table range specifier `%s'" desc))
+ (setq rangep (match-end 3)
+ r1 (and (match-end 1) (match-string 1 desc))
+ r2 (and (match-end 4) (match-string 4 desc))
+ c1 (and (match-end 2) (substring (match-string 2 desc) 1))
+ c2 (and (match-end 5) (substring (match-string 5 desc) 1)))
+
+ (and c1 (setq c1 (+ (string-to-number c1)
+ (if (memq (string-to-char c1) '(?- ?+)) col 0))))
+ (and c2 (setq c2 (+ (string-to-number c2)
+ (if (memq (string-to-char c2) '(?- ?+)) col 0))))
+ (if (equal r1 "") (setq r1 nil))
+ (if (equal r2 "") (setq r2 nil))
+ (if r1 (setq r1 (org-table-get-descriptor-line r1)))
+ (if r2 (setq r2 (org-table-get-descriptor-line r2)))
+; (setq r2 (or r2 r1) c2 (or c2 c1))
+ (if (not r1) (setq r1 thisline))
+ (if (not r2) (setq r2 thisline))
+ (if (not c1) (setq c1 col))
+ (if (not c2) (setq c2 col))
+ (if (or (not rangep) (and (= r1 r2) (= c1 c2)))
+ ;; just one field
+ (progn
+ (goto-line r1)
+ (while (not (looking-at org-table-dataline-regexp))
+ (beginning-of-line 2))
+ (prog1 (org-trim (org-table-get-field c1))
+ (if highlight (org-table-highlight-rectangle (point) (point)))))
+ ;; A range, return a vector
+ ;; First sort the numbers to get a regular ractangle
+ (if (< r2 r1) (setq tmp r1 r1 r2 r2 tmp))
+ (if (< c2 c1) (setq tmp c1 c1 c2 c2 tmp))
+ (goto-line r1)
+ (while (not (looking-at org-table-dataline-regexp))
+ (beginning-of-line 2))
+ (org-table-goto-column c1)
+ (setq beg (point))
+ (goto-line r2)
+ (while (not (looking-at org-table-dataline-regexp))
+ (beginning-of-line 0))
+ (org-table-goto-column c2)
+ (setq end (point))
+ (if highlight
+ (org-table-highlight-rectangle
+ beg (progn (skip-chars-forward "^|\n") (point))))
+ ;; return string representation of calc vector
+ (mapcar 'org-trim
+ (apply 'append (org-table-copy-region beg end)))))))
+
+(defun org-table-get-descriptor-line (desc &optional cline bline table)
+ "Analyze descriptor DESC and retrieve the corresponding line number.
+The cursor is currently in line CLINE, the table begins in line BLINE,
+and TABLE is a vector with line types."
+ (if (string-match "^[0-9]+$" desc)
+ (aref org-table-dlines (string-to-number desc))
+ (setq cline (or cline (org-current-line))
+ bline (or bline org-table-current-begin-line)
+ table (or table org-table-current-line-types))
+ (if (or
+ (not (string-match "^\\(\\([-+]\\)?\\(I+\\)\\)?\\(\\([-+]\\)?\\([0-9]+\\)\\)?" desc))
+ ;; 1 2 3 4 5 6
+ (and (not (match-end 3)) (not (match-end 6)))
+ (and (match-end 3) (match-end 6) (not (match-end 5))))
+ (error "invalid row descriptor `%s'" desc))
+ (let* ((hdir (and (match-end 2) (match-string 2 desc)))
+ (hn (if (match-end 3) (- (match-end 3) (match-beginning 3)) nil))
+ (odir (and (match-end 5) (match-string 5 desc)))
+ (on (if (match-end 6) (string-to-number (match-string 6 desc))))
+ (i (- cline bline))
+ (rel (and (match-end 6)
+ (or (and (match-end 1) (not (match-end 3)))
+ (match-end 5)))))
+ (if (and hn (not hdir))
+ (progn
+ (setq i 0 hdir "+")
+ (if (eq (aref table 0) 'hline) (setq hn (1- hn)))))
+ (if (and (not hn) on (not odir))
+ (error "should never happen");;(aref org-table-dlines on)
+ (if (and hn (> hn 0))
+ (setq i (org-find-row-type table i 'hline (equal hdir "-") nil hn)))
+ (if on
+ (setq i (org-find-row-type table i 'dline (equal odir "-") rel on)))
+ (+ bline i)))))
+
+(defun org-find-row-type (table i type backwards relative n)
+ (let ((l (length table)))
+ (while (> n 0)
+ (while (and (setq i (+ i (if backwards -1 1)))
+ (>= i 0) (< i l)
+ (not (eq (aref table i) type))
+ (if (and relative (eq (aref table i) 'hline))
+ (progn (setq i (- i (if backwards -1 1)) n 1) nil)
+ t)))
+ (setq n (1- n)))
+ (if (or (< i 0) (>= i l))
+ (error "Row descriptior leads outside table")
+ i)))
+
+(defun org-rewrite-old-row-references (s)
+ (if (string-match "&[-+0-9I]" s)
+ (error "Formula contains old &row reference, please rewrite using @-syntax")
+ s))
+
+(defun org-table-make-reference (elements keep-empty numbers lispp)
+ "Convert list ELEMENTS to something appropriate to insert into formula.
+KEEP-EMPTY indicated to keep empty fields, default is to skip them.
+NUMBERS indicates that everything should be converted to numbers.
+LISPP means to return something appropriate for a Lisp list."
+ (if (stringp elements) ; just a single val
+ (if lispp
+ (if (eq lispp 'literal)
+ elements
+ (prin1-to-string (if numbers (string-to-number elements) elements)))
+ (if (equal elements "") (setq elements "0"))
+ (if numbers (number-to-string (string-to-number elements)) elements))
+ (unless keep-empty
+ (setq elements
+ (delq nil
+ (mapcar (lambda (x) (if (string-match "\\S-" x) x nil))
+ elements))))
+ (setq elements (or elements '("0")))
+ (if lispp
+ (mapconcat
+ (lambda (x)
+ (if (eq lispp 'literal)
+ x
+ (prin1-to-string (if numbers (string-to-number x) x))))
+ elements " ")
+ (concat "[" (mapconcat
+ (lambda (x)
+ (if numbers (number-to-string (string-to-number x)) x))
+ elements
+ ",") "]"))))
+
+(defun org-table-recalculate (&optional all noalign)
+ "Recalculate the current table line by applying all stored formulas.
+With prefix arg ALL, do this for all lines in the table."
+ (interactive "P")
+ (or (memq this-command org-recalc-commands)
+ (setq org-recalc-commands (cons this-command org-recalc-commands)))
+ (unless (org-at-table-p) (error "Not at a table"))
+ (if (equal all '(16))
+ (org-table-iterate)
+ (org-table-get-specials)
+ (let* ((eqlist (sort (org-table-get-stored-formulas)
+ (lambda (a b) (string< (car a) (car b)))))
+ (inhibit-redisplay (not debug-on-error))
+ (line-re org-table-dataline-regexp)
+ (thisline (org-current-line))
+ (thiscol (org-table-current-column))
+ beg end entry eqlnum eqlname eqlname1 eql (cnt 0) eq a name)
+ ;; Insert constants in all formulas
+ (setq eqlist
+ (mapcar (lambda (x)
+ (setcdr x (org-table-formula-substitute-names (cdr x)))
+ x)
+ eqlist))
+ ;; Split the equation list
+ (while (setq eq (pop eqlist))
+ (if (<= (string-to-char (car eq)) ?9)
+ (push eq eqlnum)
+ (push eq eqlname)))
+ (setq eqlnum (nreverse eqlnum) eqlname (nreverse eqlname))
+ (if all
+ (progn
+ (setq end (move-marker (make-marker) (1+ (org-table-end))))
+ (goto-char (setq beg (org-table-begin)))
+ (if (re-search-forward org-table-calculate-mark-regexp end t)
+ ;; This is a table with marked lines, compute selected lines
+ (setq line-re org-table-recalculate-regexp)
+ ;; Move forward to the first non-header line
+ (if (and (re-search-forward org-table-dataline-regexp end t)
+ (re-search-forward org-table-hline-regexp end t)
+ (re-search-forward org-table-dataline-regexp end t))
+ (setq beg (match-beginning 0))
+ nil))) ;; just leave beg where it is
+ (setq beg (point-at-bol)
+ end (move-marker (make-marker) (1+ (point-at-eol)))))
+ (goto-char beg)
+ (and all (message "Re-applying formulas to full table..."))
+
+ ;; First find the named fields, and mark them untouchanble
+ (remove-text-properties beg end '(org-untouchable t))
+ (while (setq eq (pop eqlname))
+ (setq name (car eq)
+ a (assoc name org-table-named-field-locations))
+ (and (not a)
+ (string-match "@\\([0-9]+\\)\\$\\([0-9]+\\)" name)
+ (setq a (list name
+ (aref org-table-dlines
+ (string-to-number (match-string 1 name)))
+ (string-to-number (match-string 2 name)))))
+ (when (and a (or all (equal (nth 1 a) thisline)))
+ (message "Re-applying formula to field: %s" name)
+ (goto-line (nth 1 a))
+ (org-table-goto-column (nth 2 a))
+ (push (append a (list (cdr eq))) eqlname1)
+ (org-table-put-field-property :org-untouchable t)))
+
+ ;; Now evauluate the column formulas, but skip fields covered by
+ ;; field formulas
+ (goto-char beg)
+ (while (re-search-forward line-re end t)
+ (unless (string-match "^ *[_^!$/] *$" (org-table-get-field 1))
+ ;; Unprotected line, recalculate
+ (and all (message "Re-applying formulas to full table...(line %d)"
+ (setq cnt (1+ cnt))))
+ (setq org-last-recalc-line (org-current-line))
+ (setq eql eqlnum)
+ (while (setq entry (pop eql))
+ (goto-line org-last-recalc-line)
+ (org-table-goto-column (string-to-number (car entry)) nil 'force)
+ (unless (get-text-property (point) :org-untouchable)
+ (org-table-eval-formula nil (cdr entry)
+ 'noalign 'nocst 'nostore 'noanalysis)))))
+
+ ;; Now evaluate the field formulas
+ (while (setq eq (pop eqlname1))
+ (message "Re-applying formula to field: %s" (car eq))
+ (goto-line (nth 1 eq))
+ (org-table-goto-column (nth 2 eq))
+ (org-table-eval-formula nil (nth 3 eq) 'noalign 'nocst
+ 'nostore 'noanalysis))
+
+ (goto-line thisline)
+ (org-table-goto-column thiscol)
+ (remove-text-properties (point-min) (point-max) '(org-untouchable t))
+ (or noalign (and org-table-may-need-update (org-table-align))
+ (and all (message "Re-applying formulas to %d lines...done" cnt)))
+
+ ;; back to initial position
+ (message "Re-applying formulas...done")
+ (goto-line thisline)
+ (org-table-goto-column thiscol)
+ (or noalign (and org-table-may-need-update (org-table-align))
+ (and all (message "Re-applying formulas...done"))))))
+
+(defun org-table-iterate (&optional arg)
+ "Recalculate the table until it does not change anymore."
+ (interactive "P")
+ (let ((imax (if arg (prefix-numeric-value arg) 10))
+ (i 0)
+ (lasttbl (buffer-substring (org-table-begin) (org-table-end)))
+ thistbl)
+ (catch 'exit
+ (while (< i imax)
+ (setq i (1+ i))
+ (org-table-recalculate 'all)
+ (setq thistbl (buffer-substring (org-table-begin) (org-table-end)))
+ (if (not (string= lasttbl thistbl))
+ (setq lasttbl thistbl)
+ (if (> i 1)
+ (message "Convergence after %d iterations" i)
+ (message "Table was already stable"))
+ (throw 'exit t)))
+ (error "No convergence after %d iterations" i))))
+
+(defun org-table-formula-substitute-names (f)
+ "Replace $const with values in string F."
+ (let ((start 0) a (f1 f) (pp (/= (string-to-char f) ?')))
+ ;; First, check for column names
+ (while (setq start (string-match org-table-column-name-regexp f start))
+ (setq start (1+ start))
+ (setq a (assoc (match-string 1 f) org-table-column-names))
+ (setq f (replace-match (concat "$" (cdr a)) t t f)))
+ ;; Parameters and constants
+ (setq start 0)
+ (while (setq start (string-match "\\$\\([a-zA-Z][_a-zA-Z0-9]*\\)" f start))
+ (setq start (1+ start))
+ (if (setq a (save-match-data
+ (org-table-get-constant (match-string 1 f))))
+ (setq f (replace-match
+ (concat (if pp "(") a (if pp ")")) t t f))))
+ (if org-table-formula-debug
+ (put-text-property 0 (length f) :orig-formula f1 f))
+ f))
+
+(defun org-table-get-constant (const)
+ "Find the value for a parameter or constant in a formula.
+Parameters get priority."
+ (or (cdr (assoc const org-table-local-parameters))
+ (cdr (assoc const org-table-formula-constants-local))
+ (cdr (assoc const org-table-formula-constants))
+ (and (fboundp 'constants-get) (constants-get const))
+ (and (string= (substring const 0 (min 5 (length const))) "PROP_")
+ (org-entry-get nil (substring const 5) 'inherit))
+ "#UNDEFINED_NAME"))
+
+(defvar org-table-fedit-map
+ (let ((map (make-sparse-keymap)))
+ (org-defkey map "\C-x\C-s" 'org-table-fedit-finish)
+ (org-defkey map "\C-c\C-s" 'org-table-fedit-finish)
+ (org-defkey map "\C-c\C-c" 'org-table-fedit-finish)
+ (org-defkey map "\C-c\C-q" 'org-table-fedit-abort)
+ (org-defkey map "\C-c?" 'org-table-show-reference)
+ (org-defkey map [(meta shift up)] 'org-table-fedit-line-up)
+ (org-defkey map [(meta shift down)] 'org-table-fedit-line-down)
+ (org-defkey map [(shift up)] 'org-table-fedit-ref-up)
+ (org-defkey map [(shift down)] 'org-table-fedit-ref-down)
+ (org-defkey map [(shift left)] 'org-table-fedit-ref-left)
+ (org-defkey map [(shift right)] 'org-table-fedit-ref-right)
+ (org-defkey map [(meta up)] 'org-table-fedit-scroll-down)
+ (org-defkey map [(meta down)] 'org-table-fedit-scroll)
+ (org-defkey map [(meta tab)] 'lisp-complete-symbol)
+ (org-defkey map "\M-\C-i" 'lisp-complete-symbol)
+ (org-defkey map [(tab)] 'org-table-fedit-lisp-indent)
+ (org-defkey map "\C-i" 'org-table-fedit-lisp-indent)
+ (org-defkey map "\C-c\C-r" 'org-table-fedit-toggle-ref-type)
+ (org-defkey map "\C-c}" 'org-table-fedit-toggle-coordinates)
+ map))
+
+(easy-menu-define org-table-fedit-menu org-table-fedit-map "Org Edit Formulas Menu"
+ '("Edit-Formulas"
+ ["Finish and Install" org-table-fedit-finish t]
+ ["Finish, Install, and Apply" (org-table-fedit-finish t) :keys "C-u C-c C-c"]
+ ["Abort" org-table-fedit-abort t]
+ "--"
+ ["Pretty-Print Lisp Formula" org-table-fedit-lisp-indent t]
+ ["Complete Lisp Symbol" lisp-complete-symbol t]
+ "--"
+ "Shift Reference at Point"
+ ["Up" org-table-fedit-ref-up t]
+ ["Down" org-table-fedit-ref-down t]
+ ["Left" org-table-fedit-ref-left t]
+ ["Right" org-table-fedit-ref-right t]
+ "-"
+ "Change Test Row for Column Formulas"
+ ["Up" org-table-fedit-line-up t]
+ ["Down" org-table-fedit-line-down t]
+ "--"
+ ["Scroll Table Window" org-table-fedit-scroll t]
+ ["Scroll Table Window down" org-table-fedit-scroll-down t]
+ ["Show Table Grid" org-table-fedit-toggle-coordinates
+ :style toggle :selected (with-current-buffer (marker-buffer org-pos)
+ org-table-overlay-coordinates)]
+ "--"
+ ["Standard Refs (B3 instead of @3$2)" org-table-fedit-toggle-ref-type
+ :style toggle :selected org-table-buffer-is-an]))
+
+(defvar org-pos)
+
+(defun org-table-edit-formulas ()
+ "Edit the formulas of the current table in a separate buffer."
+ (interactive)
+ (when (save-excursion (beginning-of-line 1) (looking-at "#\\+TBLFM"))
+ (beginning-of-line 0))
+ (unless (org-at-table-p) (error "Not at a table"))
+ (org-table-get-specials)
+ (let ((key (org-table-current-field-formula 'key 'noerror))
+ (eql (sort (org-table-get-stored-formulas 'noerror)
+ 'org-table-formula-less-p))
+ (pos (move-marker (make-marker) (point)))
+ (startline 1)
+ (wc (current-window-configuration))
+ (titles '((column . "# Column Formulas\n")
+ (field . "# Field Formulas\n")
+ (named . "# Named Field Formulas\n")))
+ entry s type title)
+ (org-switch-to-buffer-other-window "*Edit Formulas*")
+ (erase-buffer)
+ ;; Keep global-font-lock-mode from turning on font-lock-mode
+ (let ((font-lock-global-modes '(not fundamental-mode)))
+ (fundamental-mode))
+ (org-set-local 'font-lock-global-modes (list 'not major-mode))
+ (org-set-local 'org-pos pos)
+ (org-set-local 'org-window-configuration wc)
+ (use-local-map org-table-fedit-map)
+ (org-add-hook 'post-command-hook 'org-table-fedit-post-command t t)
+ (easy-menu-add org-table-fedit-menu)
+ (setq startline (org-current-line))
+ (while (setq entry (pop eql))
+ (setq type (cond
+ ((equal (string-to-char (car entry)) ?@) 'field)
+ ((string-match "^[0-9]" (car entry)) 'column)
+ (t 'named)))
+ (when (setq title (assq type titles))
+ (or (bobp) (insert "\n"))
+ (insert (org-add-props (cdr title) nil 'face font-lock-comment-face))
+ (setq titles (delq title titles)))
+ (if (equal key (car entry)) (setq startline (org-current-line)))
+ (setq s (concat (if (equal (string-to-char (car entry)) ?@) "" "$")
+ (car entry) " = " (cdr entry) "\n"))
+ (remove-text-properties 0 (length s) '(face nil) s)
+ (insert s))
+ (if (eq org-table-use-standard-references t)
+ (org-table-fedit-toggle-ref-type))
+ (goto-line startline)
+ (message "Edit formulas and finish with `C-c C-c'. See menu for more commands.")))
+
+(defun org-table-fedit-post-command ()
+ (when (not (memq this-command '(lisp-complete-symbol)))
+ (let ((win (selected-window)))
+ (save-excursion
+ (condition-case nil
+ (org-table-show-reference)
+ (error nil))
+ (select-window win)))))
+
+(defun org-table-formula-to-user (s)
+ "Convert a formula from internal to user representation."
+ (if (eq org-table-use-standard-references t)
+ (org-table-convert-refs-to-an s)
+ s))
+
+(defun org-table-formula-from-user (s)
+ "Convert a formula from user to internal representation."
+ (if org-table-use-standard-references
+ (org-table-convert-refs-to-rc s)
+ s))
+
+(defun org-table-convert-refs-to-rc (s)
+ "Convert spreadsheet references from AB7 to @7$28.
+Works for single references, but also for entire formulas and even the
+full TBLFM line."
+ (let ((start 0))
+ (while (string-match "\\<\\([a-zA-Z]+\\)\\([0-9]+\\>\\|&\\)\\|\\(;[^\r\n:]+\\)" s start)
+ (cond
+ ((match-end 3)
+ ;; format match, just advance
+ (setq start (match-end 0)))
+ ((and (> (match-beginning 0) 0)
+ (equal ?. (aref s (max (1- (match-beginning 0)) 0)))
+ (not (equal ?. (aref s (max (- (match-beginning 0) 2) 0)))))
+ ;; 3.e5 or something like this.
+ (setq start (match-end 0)))
+ (t
+ (setq start (match-beginning 0)
+ s (replace-match
+ (if (equal (match-string 2 s) "&")
+ (format "$%d" (org-letters-to-number (match-string 1 s)))
+ (format "@%d$%d"
+ (string-to-number (match-string 2 s))
+ (org-letters-to-number (match-string 1 s))))
+ t t s)))))
+ s))
+
+(defun org-table-convert-refs-to-an (s)
+ "Convert spreadsheet references from to @7$28 to AB7.
+Works for single references, but also for entire formulas and even the
+full TBLFM line."
+ (while (string-match "@\\([0-9]+\\)\\$\\([0-9]+\\)" s)
+ (setq s (replace-match
+ (format "%s%d"
+ (org-number-to-letters
+ (string-to-number (match-string 2 s)))
+ (string-to-number (match-string 1 s)))
+ t t s)))
+ (while (string-match "\\(^\\|[^0-9a-zA-Z]\\)\\$\\([0-9]+\\)" s)
+ (setq s (replace-match (concat "\\1"
+ (org-number-to-letters
+ (string-to-number (match-string 2 s))) "&")
+ t nil s)))
+ s)
+
+(defun org-letters-to-number (s)
+ "Convert a base 26 number represented by letters into an integer.
+For example: AB -> 28."
+ (let ((n 0))
+ (setq s (upcase s))
+ (while (> (length s) 0)
+ (setq n (+ (* n 26) (string-to-char s) (- ?A) 1)
+ s (substring s 1)))
+ n))
+
+(defun org-number-to-letters (n)
+ "Convert an integer into a base 26 number represented by letters.
+For example: 28 -> AB."
+ (let ((s ""))
+ (while (> n 0)
+ (setq s (concat (char-to-string (+ (mod (1- n) 26) ?A)) s)
+ n (/ (1- n) 26)))
+ s))
+
+(defun org-table-fedit-convert-buffer (function)
+ "Convert all references in this buffer, using FUNTION."
+ (let ((line (org-current-line)))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (insert (funcall function (buffer-substring (point) (point-at-eol))))
+ (delete-region (point) (point-at-eol))
+ (or (eobp) (forward-char 1)))
+ (goto-line line)))
+
+(defun org-table-fedit-toggle-ref-type ()
+ "Convert all references in the buffer from B3 to @3$2 and back."
+ (interactive)
+ (org-set-local 'org-table-buffer-is-an (not org-table-buffer-is-an))
+ (org-table-fedit-convert-buffer
+ (if org-table-buffer-is-an
+ 'org-table-convert-refs-to-an 'org-table-convert-refs-to-rc))
+ (message "Reference type switched to %s"
+ (if org-table-buffer-is-an "A1 etc" "@row$column")))
+
+(defun org-table-fedit-ref-up ()
+ "Shift the reference at point one row/hline up."
+ (interactive)
+ (org-table-fedit-shift-reference 'up))
+(defun org-table-fedit-ref-down ()
+ "Shift the reference at point one row/hline down."
+ (interactive)
+ (org-table-fedit-shift-reference 'down))
+(defun org-table-fedit-ref-left ()
+ "Shift the reference at point one field to the left."
+ (interactive)
+ (org-table-fedit-shift-reference 'left))
+(defun org-table-fedit-ref-right ()
+ "Shift the reference at point one field to the right."
+ (interactive)
+ (org-table-fedit-shift-reference 'right))
+
+(defun org-table-fedit-shift-reference (dir)
+ (cond
+ ((org-at-regexp-p "\\(\\<[a-zA-Z]\\)&")
+ (if (memq dir '(left right))
+ (org-rematch-and-replace 1 (eq dir 'left))
+ (error "Cannot shift reference in this direction")))
+ ((org-at-regexp-p "\\(\\<[a-zA-Z]\\{1,2\\}\\)\\([0-9]+\\)")
+ ;; A B3-like reference
+ (if (memq dir '(up down))
+ (org-rematch-and-replace 2 (eq dir 'up))
+ (org-rematch-and-replace 1 (eq dir 'left))))
+ ((org-at-regexp-p
+ "\\(@\\|\\.\\.\\)\\([-+]?\\(I+\\>\\|[0-9]+\\)\\)\\(\\$\\([-+]?[0-9]+\\)\\)?")
+ ;; An internal reference
+ (if (memq dir '(up down))
+ (org-rematch-and-replace 2 (eq dir 'up) (match-end 3))
+ (org-rematch-and-replace 5 (eq dir 'left))))))
+
+(defun org-rematch-and-replace (n &optional decr hline)
+ "Re-match the group N, and replace it with the shifted refrence."
+ (or (match-end n) (error "Cannot shift reference in this direction"))
+ (goto-char (match-beginning n))
+ (and (looking-at (regexp-quote (match-string n)))
+ (replace-match (org-shift-refpart (match-string 0) decr hline)
+ t t)))
+
+(defun org-shift-refpart (ref &optional decr hline)
+ "Shift a refrence part REF.
+If DECR is set, decrease the references row/column, else increase.
+If HLINE is set, this may be a hline reference, it certainly is not
+a translation reference."
+ (save-match-data
+ (let* ((sign (string-match "^[-+]" ref)) n)
+
+ (if sign (setq sign (substring ref 0 1) ref (substring ref 1)))
+ (cond
+ ((and hline (string-match "^I+" ref))
+ (setq n (string-to-number (concat sign (number-to-string (length ref)))))
+ (setq n (+ n (if decr -1 1)))
+ (if (= n 0) (setq n (+ n (if decr -1 1))))
+ (if sign
+ (setq sign (if (< n 0) "-" "+") n (abs n))
+ (setq n (max 1 n)))
+ (concat sign (make-string n ?I)))
+
+ ((string-match "^[0-9]+" ref)
+ (setq n (string-to-number (concat sign ref)))
+ (setq n (+ n (if decr -1 1)))
+ (if sign
+ (concat (if (< n 0) "-" "+") (number-to-string (abs n)))
+ (number-to-string (max 1 n))))
+
+ ((string-match "^[a-zA-Z]+" ref)
+ (org-number-to-letters
+ (max 1 (+ (org-letters-to-number ref) (if decr -1 1)))))
+
+ (t (error "Cannot shift reference"))))))
+
+(defun org-table-fedit-toggle-coordinates ()
+ "Toggle the display of coordinates in the refrenced table."
+ (interactive)
+ (let ((pos (marker-position org-pos)))
+ (with-current-buffer (marker-buffer org-pos)
+ (save-excursion
+ (goto-char pos)
+ (org-table-toggle-coordinate-overlays)))))
+
+(defun org-table-fedit-finish (&optional arg)
+ "Parse the buffer for formula definitions and install them.
+With prefix ARG, apply the new formulas to the table."
+ (interactive "P")
+ (org-table-remove-rectangle-highlight)
+ (if org-table-use-standard-references
+ (progn
+ (org-table-fedit-convert-buffer 'org-table-convert-refs-to-rc)
+ (setq org-table-buffer-is-an nil)))
+ (let ((pos org-pos) eql var form)
+ (goto-char (point-min))
+ (while (re-search-forward
+ "^\\(@[0-9]+\\$[0-9]+\\|\\$\\([a-zA-Z0-9]+\\)\\) *= *\\(.*\\(\n[ \t]+.*$\\)*\\)"
+ nil t)
+ (setq var (if (match-end 2) (match-string 2) (match-string 1))
+ form (match-string 3))
+ (setq form (org-trim form))
+ (when (not (equal form ""))
+ (while (string-match "[ \t]*\n[ \t]*" form)
+ (setq form (replace-match " " t t form)))
+ (when (assoc var eql)
+ (error "Double formulas for %s" var))
+ (push (cons var form) eql)))
+ (setq org-pos nil)
+ (set-window-configuration org-window-configuration)
+ (select-window (get-buffer-window (marker-buffer pos)))
+ (goto-char pos)
+ (unless (org-at-table-p)
+ (error "Lost table position - cannot install formulae"))
+ (org-table-store-formulas eql)
+ (move-marker pos nil)
+ (kill-buffer "*Edit Formulas*")
+ (if arg
+ (org-table-recalculate 'all)
+ (message "New formulas installed - press C-u C-c C-c to apply."))))
+
+(defun org-table-fedit-abort ()
+ "Abort editing formulas, without installing the changes."
+ (interactive)
+ (org-table-remove-rectangle-highlight)
+ (let ((pos org-pos))
+ (set-window-configuration org-window-configuration)
+ (select-window (get-buffer-window (marker-buffer pos)))
+ (goto-char pos)
+ (move-marker pos nil)
+ (message "Formula editing aborted without installing changes")))
+
+(defun org-table-fedit-lisp-indent ()
+ "Pretty-print and re-indent Lisp expressions in the Formula Editor."
+ (interactive)
+ (let ((pos (point)) beg end ind)
+ (beginning-of-line 1)
+ (cond
+ ((looking-at "[ \t]")
+ (goto-char pos)
+ (call-interactively 'lisp-indent-line))
+ ((looking-at "[$&@0-9a-zA-Z]+ *= *[^ \t\n']") (goto-char pos))
+ ((not (fboundp 'pp-buffer))
+ (error "Cannot pretty-print. Command `pp-buffer' is not available."))
+ ((looking-at "[$&@0-9a-zA-Z]+ *= *'(")
+ (goto-char (- (match-end 0) 2))
+ (setq beg (point))
+ (setq ind (make-string (current-column) ?\ ))
+ (condition-case nil (forward-sexp 1)
+ (error
+ (error "Cannot pretty-print Lisp expression: Unbalanced parenthesis")))
+ (setq end (point))
+ (save-restriction
+ (narrow-to-region beg end)
+ (if (eq last-command this-command)
+ (progn
+ (goto-char (point-min))
+ (setq this-command nil)
+ (while (re-search-forward "[ \t]*\n[ \t]*" nil t)
+ (replace-match " ")))
+ (pp-buffer)
+ (untabify (point-min) (point-max))
+ (goto-char (1+ (point-min)))
+ (while (re-search-forward "^." nil t)
+ (beginning-of-line 1)
+ (insert ind))
+ (goto-char (point-max))
+ (backward-delete-char 1)))
+ (goto-char beg))
+ (t nil))))
+
+(defvar org-show-positions nil)
+
+(defun org-table-show-reference (&optional local)
+ "Show the location/value of the $ expression at point."
+ (interactive)
+ (org-table-remove-rectangle-highlight)
+ (catch 'exit
+ (let ((pos (if local (point) org-pos))
+ (face2 'highlight)
+ (org-inhibit-highlight-removal t)
+ (win (selected-window))
+ (org-show-positions nil)
+ var name e what match dest)
+ (if local (org-table-get-specials))
+ (setq what (cond
+ ((or (org-at-regexp-p org-table-range-regexp2)
+ (org-at-regexp-p org-table-translate-regexp)
+ (org-at-regexp-p org-table-range-regexp))
+ (setq match
+ (save-match-data
+ (org-table-convert-refs-to-rc (match-string 0))))
+ 'range)
+ ((org-at-regexp-p "\\$[a-zA-Z][a-zA-Z0-9]*") 'name)
+ ((org-at-regexp-p "\\$[0-9]+") 'column)
+ ((not local) nil)
+ (t (error "No reference at point")))
+ match (and what (or match (match-string 0))))
+ (when (and match (not (equal (match-beginning 0) (point-at-bol))))
+ (org-table-add-rectangle-overlay (match-beginning 0) (match-end 0)
+ 'secondary-selection))
+ (org-add-hook 'before-change-functions
+ 'org-table-remove-rectangle-highlight)
+ (if (eq what 'name) (setq var (substring match 1)))
+ (when (eq what 'range)
+ (or (equal (string-to-char match) ?@) (setq match (concat "@" match)))
+ (setq match (org-table-formula-substitute-names match)))
+ (unless local
+ (save-excursion
+ (end-of-line 1)
+ (re-search-backward "^\\S-" nil t)
+ (beginning-of-line 1)
+ (when (looking-at "\\(\\$[0-9a-zA-Z]+\\|@[0-9]+\\$[0-9]+\\|[a-zA-Z]+\\([0-9]+\\|&\\)\\) *=")
+ (setq dest
+ (save-match-data
+ (org-table-convert-refs-to-rc (match-string 1))))
+ (org-table-add-rectangle-overlay
+ (match-beginning 1) (match-end 1) face2))))
+ (if (and (markerp pos) (marker-buffer pos))
+ (if (get-buffer-window (marker-buffer pos))
+ (select-window (get-buffer-window (marker-buffer pos)))
+ (org-switch-to-buffer-other-window (get-buffer-window
+ (marker-buffer pos)))))
+ (goto-char pos)
+ (org-table-force-dataline)
+ (when dest
+ (setq name (substring dest 1))
+ (cond
+ ((string-match "^\\$[a-zA-Z][a-zA-Z0-9]*" dest)
+ (setq e (assoc name org-table-named-field-locations))
+ (goto-line (nth 1 e))
+ (org-table-goto-column (nth 2 e)))
+ ((string-match "^@\\([0-9]+\\)\\$\\([0-9]+\\)" dest)
+ (let ((l (string-to-number (match-string 1 dest)))
+ (c (string-to-number (match-string 2 dest))))
+ (goto-line (aref org-table-dlines l))
+ (org-table-goto-column c)))
+ (t (org-table-goto-column (string-to-number name))))
+ (move-marker pos (point))
+ (org-table-highlight-rectangle nil nil face2))
+ (cond
+ ((equal dest match))
+ ((not match))
+ ((eq what 'range)
+ (condition-case nil
+ (save-excursion
+ (org-table-get-range match nil nil 'highlight))
+ (error nil)))
+ ((setq e (assoc var org-table-named-field-locations))
+ (goto-line (nth 1 e))
+ (org-table-goto-column (nth 2 e))
+ (org-table-highlight-rectangle (point) (point))
+ (message "Named field, column %d of line %d" (nth 2 e) (nth 1 e)))
+ ((setq e (assoc var org-table-column-names))
+ (org-table-goto-column (string-to-number (cdr e)))
+ (org-table-highlight-rectangle (point) (point))
+ (goto-char (org-table-begin))
+ (if (re-search-forward (concat "^[ \t]*| *! *.*?| *\\(" var "\\) *|")
+ (org-table-end) t)
+ (progn
+ (goto-char (match-beginning 1))
+ (org-table-highlight-rectangle)
+ (message "Named column (column %s)" (cdr e)))
+ (error "Column name not found")))
+ ((eq what 'column)
+ ;; column number
+ (org-table-goto-column (string-to-number (substring match 1)))
+ (org-table-highlight-rectangle (point) (point))
+ (message "Column %s" (substring match 1)))
+ ((setq e (assoc var org-table-local-parameters))
+ (goto-char (org-table-begin))
+ (if (re-search-forward (concat "^[ \t]*| *\\$ *.*?| *\\(" var "=\\)") nil t)
+ (progn
+ (goto-char (match-beginning 1))
+ (org-table-highlight-rectangle)
+ (message "Local parameter."))
+ (error "Parameter not found")))
+ (t
+ (cond
+ ((not var) (error "No reference at point"))
+ ((setq e (assoc var org-table-formula-constants-local))
+ (message "Local Constant: $%s=%s in #+CONSTANTS line."
+ var (cdr e)))
+ ((setq e (assoc var org-table-formula-constants))
+ (message "Constant: $%s=%s in `org-table-formula-constants'."
+ var (cdr e)))
+ ((setq e (and (fboundp 'constants-get) (constants-get var)))
+ (message "Constant: $%s=%s, from `constants.el'%s."
+ var e (format " (%s units)" constants-unit-system)))
+ (t (error "Undefined name $%s" var)))))
+ (goto-char pos)
+ (when (and org-show-positions
+ (not (memq this-command '(org-table-fedit-scroll
+ org-table-fedit-scroll-down))))
+ (push pos org-show-positions)
+ (push org-table-current-begin-pos org-show-positions)
+ (let ((min (apply 'min org-show-positions))
+ (max (apply 'max org-show-positions)))
+ (goto-char min) (recenter 0)
+ (goto-char max)
+ (or (pos-visible-in-window-p max) (recenter -1))))
+ (select-window win))))
+
+(defun org-table-force-dataline ()
+ "Make sure the cursor is in a dataline in a table."
+ (unless (save-excursion
+ (beginning-of-line 1)
+ (looking-at org-table-dataline-regexp))
+ (let* ((re org-table-dataline-regexp)
+ (p1 (save-excursion (re-search-forward re nil 'move)))
+ (p2 (save-excursion (re-search-backward re nil 'move))))
+ (cond ((and p1 p2)
+ (goto-char (if (< (abs (- p1 (point))) (abs (- p2 (point))))
+ p1 p2)))
+ ((or p1 p2) (goto-char (or p1 p2)))
+ (t (error "No table dataline around here"))))))
+
+(defun org-table-fedit-line-up ()
+ "Move cursor one line up in the window showing the table."
+ (interactive)
+ (org-table-fedit-move 'previous-line))
+
+(defun org-table-fedit-line-down ()
+ "Move cursor one line down in the window showing the table."
+ (interactive)
+ (org-table-fedit-move 'next-line))
+
+(defun org-table-fedit-move (command)
+ "Move the cursor in the window shoinw the table.
+Use COMMAND to do the motion, repeat if necessary to end up in a data line."
+ (let ((org-table-allow-automatic-line-recalculation nil)
+ (pos org-pos) (win (selected-window)) p)
+ (select-window (get-buffer-window (marker-buffer org-pos)))
+ (setq p (point))
+ (call-interactively command)
+ (while (and (org-at-table-p)
+ (org-at-table-hline-p))
+ (call-interactively command))
+ (or (org-at-table-p) (goto-char p))
+ (move-marker pos (point))
+ (select-window win)))
+
+(defun org-table-fedit-scroll (N)
+ (interactive "p")
+ (let ((other-window-scroll-buffer (marker-buffer org-pos)))
+ (scroll-other-window N)))
+
+(defun org-table-fedit-scroll-down (N)
+ (interactive "p")
+ (org-table-fedit-scroll (- N)))
+
+(defvar org-table-rectangle-overlays nil)
+
+(defun org-table-add-rectangle-overlay (beg end &optional face)
+ "Add a new overlay."
+ (let ((ov (org-make-overlay beg end)))
+ (org-overlay-put ov 'face (or face 'secondary-selection))
+ (push ov org-table-rectangle-overlays)))
+
+(defun org-table-highlight-rectangle (&optional beg end face)
+ "Highlight rectangular region in a table."
+ (setq beg (or beg (point)) end (or end (point)))
+ (let ((b (min beg end))
+ (e (max beg end))
+ l1 c1 l2 c2 tmp)
+ (and (boundp 'org-show-positions)
+ (setq org-show-positions (cons b (cons e org-show-positions))))
+ (goto-char (min beg end))
+ (setq l1 (org-current-line)
+ c1 (org-table-current-column))
+ (goto-char (max beg end))
+ (setq l2 (org-current-line)
+ c2 (org-table-current-column))
+ (if (> c1 c2) (setq tmp c1 c1 c2 c2 tmp))
+ (goto-line l1)
+ (beginning-of-line 1)
+ (loop for line from l1 to l2 do
+ (when (looking-at org-table-dataline-regexp)
+ (org-table-goto-column c1)
+ (skip-chars-backward "^|\n") (setq beg (point))
+ (org-table-goto-column c2)
+ (skip-chars-forward "^|\n") (setq end (point))
+ (org-table-add-rectangle-overlay beg end face))
+ (beginning-of-line 2))
+ (goto-char b))
+ (add-hook 'before-change-functions 'org-table-remove-rectangle-highlight))
+
+(defun org-table-remove-rectangle-highlight (&rest ignore)
+ "Remove the rectangle overlays."
+ (unless org-inhibit-highlight-removal
+ (remove-hook 'before-change-functions 'org-table-remove-rectangle-highlight)
+ (mapc 'org-delete-overlay org-table-rectangle-overlays)
+ (setq org-table-rectangle-overlays nil)))
+
+(defvar org-table-coordinate-overlays nil
+ "Collects the cooordinate grid overlays, so that they can be removed.")
+(make-variable-buffer-local 'org-table-coordinate-overlays)
+
+(defun org-table-overlay-coordinates ()
+ "Add overlays to the table at point, to show row/column coordinates."
+ (interactive)
+ (mapc 'org-delete-overlay org-table-coordinate-overlays)
+ (setq org-table-coordinate-overlays nil)
+ (save-excursion
+ (let ((id 0) (ih 0) hline eol s1 s2 str ic ov beg)
+ (goto-char (org-table-begin))
+ (while (org-at-table-p)
+ (setq eol (point-at-eol))
+ (setq ov (org-make-overlay (point-at-bol) (1+ (point-at-bol))))
+ (push ov org-table-coordinate-overlays)
+ (setq hline (looking-at org-table-hline-regexp))
+ (setq str (if hline (format "I*%-2d" (setq ih (1+ ih)))
+ (format "%4d" (setq id (1+ id)))))
+ (org-overlay-before-string ov str 'org-special-keyword 'evaporate)
+ (when hline
+ (setq ic 0)
+ (while (re-search-forward "[+|]\\(-+\\)" eol t)
+ (setq beg (1+ (match-beginning 0))
+ ic (1+ ic)
+ s1 (concat "$" (int-to-string ic))
+ s2 (org-number-to-letters ic)
+ str (if (eq org-table-use-standard-references t) s2 s1))
+ (setq ov (org-make-overlay beg (+ beg (length str))))
+ (push ov org-table-coordinate-overlays)
+ (org-overlay-display ov str 'org-special-keyword 'evaporate)))
+ (beginning-of-line 2)))))
+
+(defun org-table-toggle-coordinate-overlays ()
+ "Toggle the display of Row/Column numbers in tables."
+ (interactive)
+ (setq org-table-overlay-coordinates (not org-table-overlay-coordinates))
+ (message "Row/Column number display turned %s"
+ (if org-table-overlay-coordinates "on" "off"))
+ (if (and (org-at-table-p) org-table-overlay-coordinates)
+ (org-table-align))
+ (unless org-table-overlay-coordinates
+ (mapc 'org-delete-overlay org-table-coordinate-overlays)
+ (setq org-table-coordinate-overlays nil)))
+
+(defun org-table-toggle-formula-debugger ()
+ "Toggle the formula debugger in tables."
+ (interactive)
+ (setq org-table-formula-debug (not org-table-formula-debug))
+ (message "Formula debugging has been turned %s"
+ (if org-table-formula-debug "on" "off")))
+
+;;; The orgtbl minor mode
+
+;; Define a minor mode which can be used in other modes in order to
+;; integrate the org-mode table editor.
+
+;; This is really a hack, because the org-mode table editor uses several
+;; keys which normally belong to the major mode, for example the TAB and
+;; RET keys. Here is how it works: The minor mode defines all the keys
+;; necessary to operate the table editor, but wraps the commands into a
+;; function which tests if the cursor is currently inside a table. If that
+;; is the case, the table editor command is executed. However, when any of
+;; those keys is used outside a table, the function uses `key-binding' to
+;; look up if the key has an associated command in another currently active
+;; keymap (minor modes, major mode, global), and executes that command.
+;; There might be problems if any of the keys used by the table editor is
+;; otherwise used as a prefix key.
+
+;; Another challenge is that the key binding for TAB can be tab or \C-i,
+;; likewise the binding for RET can be return or \C-m. Orgtbl-mode
+;; addresses this by checking explicitly for both bindings.
+
+;; The optimized version (see variable `orgtbl-optimized') takes over
+;; all keys which are bound to `self-insert-command' in the *global map*.
+;; Some modes bind other commands to simple characters, for example
+;; AUCTeX binds the double quote to `Tex-insert-quote'. With orgtbl-mode
+;; active, this binding is ignored inside tables and replaced with a
+;; modified self-insert.
+
+(defvar orgtbl-mode nil
+ "Variable controlling `orgtbl-mode', a minor mode enabling the `org-mode'
+table editor in arbitrary modes.")
+(make-variable-buffer-local 'orgtbl-mode)
+
+(defvar orgtbl-mode-map (make-keymap)
+ "Keymap for `orgtbl-mode'.")
+
+;;;###autoload
+(defun turn-on-orgtbl ()
+ "Unconditionally turn on `orgtbl-mode'."
+ (orgtbl-mode 1))
+
+(defvar org-old-auto-fill-inhibit-regexp nil
+ "Local variable used by `orgtbl-mode'")
+
+(defconst orgtbl-line-start-regexp "[ \t]*\\(|\\|#\\+\\(TBLFM\\|ORGTBL\\):\\)"
+ "Matches a line belonging to an orgtbl.")
+
+(defconst orgtbl-extra-font-lock-keywords
+ (list (list (concat "^" orgtbl-line-start-regexp ".*")
+ 0 (quote 'org-table) 'prepend))
+ "Extra font-lock-keywords to be added when orgtbl-mode is active.")
+
+;;;###autoload
+(defun orgtbl-mode (&optional arg)
+ "The `org-mode' table editor as a minor mode for use in other modes."
+ (interactive)
+ (if (org-mode-p)
+ ;; Exit without error, in case some hook functions calls this
+ ;; by accident in org-mode.
+ (message "Orgtbl-mode is not useful in org-mode, command ignored")
+ (setq orgtbl-mode
+ (if arg (> (prefix-numeric-value arg) 0) (not orgtbl-mode)))
+ (if orgtbl-mode
+ (progn
+ (and (orgtbl-setup) (defun orgtbl-setup () nil))
+ ;; Make sure we are first in minor-mode-map-alist
+ (let ((c (assq 'orgtbl-mode minor-mode-map-alist)))
+ (and c (setq minor-mode-map-alist
+ (cons c (delq c minor-mode-map-alist)))))
+ (org-set-local (quote org-table-may-need-update) t)
+ (org-add-hook 'before-change-functions 'org-before-change-function
+ nil 'local)
+ (org-set-local 'org-old-auto-fill-inhibit-regexp
+ auto-fill-inhibit-regexp)
+ (org-set-local 'auto-fill-inhibit-regexp
+ (if auto-fill-inhibit-regexp
+ (concat orgtbl-line-start-regexp "\\|"
+ auto-fill-inhibit-regexp)
+ orgtbl-line-start-regexp))
+ (org-add-to-invisibility-spec '(org-cwidth))
+ (when (fboundp 'font-lock-add-keywords)
+ (font-lock-add-keywords nil orgtbl-extra-font-lock-keywords)
+ (org-restart-font-lock))
+ (easy-menu-add orgtbl-mode-menu)
+ (run-hooks 'orgtbl-mode-hook))
+ (setq auto-fill-inhibit-regexp org-old-auto-fill-inhibit-regexp)
+ (org-cleanup-narrow-column-properties)
+ (org-remove-from-invisibility-spec '(org-cwidth))
+ (remove-hook 'before-change-functions 'org-before-change-function t)
+ (when (fboundp 'font-lock-remove-keywords)
+ (font-lock-remove-keywords nil orgtbl-extra-font-lock-keywords)
+ (org-restart-font-lock))
+ (easy-menu-remove orgtbl-mode-menu)
+ (force-mode-line-update 'all))))
+
+(defun org-cleanup-narrow-column-properties ()
+ "Remove all properties related to narrow-column invisibility."
+ (let ((s 1))
+ (while (setq s (text-property-any s (point-max)
+ 'display org-narrow-column-arrow))
+ (remove-text-properties s (1+ s) '(display t)))
+ (setq s 1)
+ (while (setq s (text-property-any s (point-max) 'org-cwidth 1))
+ (remove-text-properties s (1+ s) '(org-cwidth t)))
+ (setq s 1)
+ (while (setq s (text-property-any s (point-max) 'invisible 'org-cwidth))
+ (remove-text-properties s (1+ s) '(invisible t)))))
+
+;; Install it as a minor mode.
+(put 'orgtbl-mode :included t)
+(put 'orgtbl-mode :menu-tag "Org Table Mode")
+(add-minor-mode 'orgtbl-mode " OrgTbl" orgtbl-mode-map)
+
+(defun orgtbl-make-binding (fun n &rest keys)
+ "Create a function for binding in the table minor mode.
+FUN is the command to call inside a table. N is used to create a unique
+command name. KEYS are keys that should be checked in for a command
+to execute outside of tables."
+ (eval
+ (list 'defun
+ (intern (concat "orgtbl-hijacker-command-" (int-to-string n)))
+ '(arg)
+ (concat "In tables, run `" (symbol-name fun) "'.\n"
+ "Outside of tables, run the binding of `"
+ (mapconcat (lambda (x) (format "%s" x)) keys "' or `")
+ "'.")
+ '(interactive "p")
+ (list 'if
+ '(org-at-table-p)
+ (list 'call-interactively (list 'quote fun))
+ (list 'let '(orgtbl-mode)
+ (list 'call-interactively
+ (append '(or)
+ (mapcar (lambda (k)
+ (list 'key-binding k))
+ keys)
+ '('orgtbl-error))))))))
+
+(defun orgtbl-error ()
+ "Error when there is no default binding for a table key."
+ (interactive)
+ (error "This key has no function outside tables"))
+
+(defun orgtbl-setup ()
+ "Setup orgtbl keymaps."
+ (let ((nfunc 0)
+ (bindings
+ (list
+ '([(meta shift left)] org-table-delete-column)
+ '([(meta left)] org-table-move-column-left)
+ '([(meta right)] org-table-move-column-right)
+ '([(meta shift right)] org-table-insert-column)
+ '([(meta shift up)] org-table-kill-row)
+ '([(meta shift down)] org-table-insert-row)
+ '([(meta up)] org-table-move-row-up)
+ '([(meta down)] org-table-move-row-down)
+ '("\C-c\C-w" org-table-cut-region)
+ '("\C-c\M-w" org-table-copy-region)
+ '("\C-c\C-y" org-table-paste-rectangle)
+ '("\C-c-" org-table-insert-hline)
+ '("\C-c}" org-table-toggle-coordinate-overlays)
+ '("\C-c{" org-table-toggle-formula-debugger)
+ '("\C-m" org-table-next-row)
+ '([(shift return)] org-table-copy-down)
+ '("\C-c\C-q" org-table-wrap-region)
+ '("\C-c?" org-table-field-info)
+ '("\C-c " org-table-blank-field)
+ '("\C-c+" org-table-sum)
+ '("\C-c=" org-table-eval-formula)
+ '("\C-c'" org-table-edit-formulas)
+ '("\C-c`" org-table-edit-field)
+ '("\C-c*" org-table-recalculate)
+ '("\C-c|" org-table-create-or-convert-from-region)
+ '("\C-c^" org-table-sort-lines)
+ '([(control ?#)] org-table-rotate-recalc-marks)))
+ elt key fun cmd)
+ (while (setq elt (pop bindings))
+ (setq nfunc (1+ nfunc))
+ (setq key (org-key (car elt))
+ fun (nth 1 elt)
+ cmd (orgtbl-make-binding fun nfunc key))
+ (org-defkey orgtbl-mode-map key cmd))
+
+ ;; Special treatment needed for TAB and RET
+ (org-defkey orgtbl-mode-map [(return)]
+ (orgtbl-make-binding 'orgtbl-ret 100 [(return)] "\C-m"))
+ (org-defkey orgtbl-mode-map "\C-m"
+ (orgtbl-make-binding 'orgtbl-ret 101 "\C-m" [(return)]))
+
+ (org-defkey orgtbl-mode-map [(tab)]
+ (orgtbl-make-binding 'orgtbl-tab 102 [(tab)] "\C-i"))
+ (org-defkey orgtbl-mode-map "\C-i"
+ (orgtbl-make-binding 'orgtbl-tab 103 "\C-i" [(tab)]))
+
+ (org-defkey orgtbl-mode-map [(shift tab)]
+ (orgtbl-make-binding 'org-table-previous-field 104
+ [(shift tab)] [(tab)] "\C-i"))
+
+ (org-defkey orgtbl-mode-map "\M-\C-m"
+ (orgtbl-make-binding 'org-table-wrap-region 105
+ "\M-\C-m" [(meta return)]))
+ (org-defkey orgtbl-mode-map [(meta return)]
+ (orgtbl-make-binding 'org-table-wrap-region 106
+ [(meta return)] "\M-\C-m"))
+
+ (org-defkey orgtbl-mode-map "\C-c\C-c" 'orgtbl-ctrl-c-ctrl-c)
+ (when orgtbl-optimized
+ ;; If the user wants maximum table support, we need to hijack
+ ;; some standard editing functions
+ (org-remap orgtbl-mode-map
+ 'self-insert-command 'orgtbl-self-insert-command
+ 'delete-char 'org-delete-char
+ 'delete-backward-char 'org-delete-backward-char)
+ (org-defkey orgtbl-mode-map "|" 'org-force-self-insert))
+ (easy-menu-define orgtbl-mode-menu orgtbl-mode-map "OrgTbl menu"
+ '("OrgTbl"
+ ["Align" org-ctrl-c-ctrl-c :active (org-at-table-p) :keys "C-c C-c"]
+ ["Next Field" org-cycle :active (org-at-table-p) :keys "TAB"]
+ ["Previous Field" org-shifttab :active (org-at-table-p) :keys "S-TAB"]
+ ["Next Row" org-return :active (org-at-table-p) :keys "RET"]
+ "--"
+ ["Blank Field" org-table-blank-field :active (org-at-table-p) :keys "C-c SPC"]
+ ["Edit Field" org-table-edit-field :active (org-at-table-p) :keys "C-c ` "]
+ ["Copy Field from Above"
+ org-table-copy-down :active (org-at-table-p) :keys "S-RET"]
+ "--"
+ ("Column"
+ ["Move Column Left" org-metaleft :active (org-at-table-p) :keys "M-<left>"]
+ ["Move Column Right" org-metaright :active (org-at-table-p) :keys "M-<right>"]
+ ["Delete Column" org-shiftmetaleft :active (org-at-table-p) :keys "M-S-<left>"]
+ ["Insert Column" org-shiftmetaright :active (org-at-table-p) :keys "M-S-<right>"])
+ ("Row"
+ ["Move Row Up" org-metaup :active (org-at-table-p) :keys "M-<up>"]
+ ["Move Row Down" org-metadown :active (org-at-table-p) :keys "M-<down>"]
+ ["Delete Row" org-shiftmetaup :active (org-at-table-p) :keys "M-S-<up>"]
+ ["Insert Row" org-shiftmetadown :active (org-at-table-p) :keys "M-S-<down>"]
+ ["Sort lines in region" org-table-sort-lines (org-at-table-p) :keys "C-c ^"]
+ "--"
+ ["Insert Hline" org-table-insert-hline :active (org-at-table-p) :keys "C-c -"])
+ ("Rectangle"
+ ["Copy Rectangle" org-copy-special :active (org-at-table-p)]
+ ["Cut Rectangle" org-cut-special :active (org-at-table-p)]
+ ["Paste Rectangle" org-paste-special :active (org-at-table-p)]
+ ["Fill Rectangle" org-table-wrap-region :active (org-at-table-p)])
+ "--"
+ ("Radio tables"
+ ["Insert table template" orgtbl-insert-radio-table
+ (assq major-mode orgtbl-radio-table-templates)]
+ ["Comment/uncomment table" orgtbl-toggle-comment t])
+ "--"
+ ["Set Column Formula" org-table-eval-formula :active (org-at-table-p) :keys "C-c ="]
+ ["Set Field Formula" (org-table-eval-formula '(4)) :active (org-at-table-p) :keys "C-u C-c ="]
+ ["Edit Formulas" org-table-edit-formulas :active (org-at-table-p) :keys "C-c '"]
+ ["Recalculate line" org-table-recalculate :active (org-at-table-p) :keys "C-c *"]
+ ["Recalculate all" (org-table-recalculate '(4)) :active (org-at-table-p) :keys "C-u C-c *"]
+ ["Iterate all" (org-table-recalculate '(16)) :active (org-at-table-p) :keys "C-u C-u C-c *"]
+ ["Toggle Recalculate Mark" org-table-rotate-recalc-marks :active (org-at-table-p) :keys "C-c #"]
+ ["Sum Column/Rectangle" org-table-sum
+ :active (or (org-at-table-p) (org-region-active-p)) :keys "C-c +"]
+ ["Which Column?" org-table-current-column :active (org-at-table-p) :keys "C-c ?"]
+ ["Debug Formulas"
+ org-table-toggle-formula-debugger :active (org-at-table-p)
+ :keys "C-c {"
+ :style toggle :selected org-table-formula-debug]
+ ["Show Col/Row Numbers"
+ org-table-toggle-coordinate-overlays :active (org-at-table-p)
+ :keys "C-c }"
+ :style toggle :selected org-table-overlay-coordinates]
+ ))
+ t))
+
+(defun orgtbl-ctrl-c-ctrl-c (arg)
+ "If the cursor is inside a table, realign the table.
+It it is a table to be sent away to a receiver, do it.
+With prefix arg, also recompute table."
+ (interactive "P")
+ (let ((pos (point)) action)
+ (save-excursion
+ (beginning-of-line 1)
+ (setq action (cond ((looking-at "#\\+ORGTBL:.*\n[ \t]*|") (match-end 0))
+ ((looking-at "[ \t]*|") pos)
+ ((looking-at "#\\+TBLFM:") 'recalc))))
+ (cond
+ ((integerp action)
+ (goto-char action)
+ (org-table-maybe-eval-formula)
+ (if arg
+ (call-interactively 'org-table-recalculate)
+ (org-table-maybe-recalculate-line))
+ (call-interactively 'org-table-align)
+ (orgtbl-send-table 'maybe))
+ ((eq action 'recalc)
+ (save-excursion
+ (beginning-of-line 1)
+ (skip-chars-backward " \r\n\t")
+ (if (org-at-table-p)
+ (org-call-with-arg 'org-table-recalculate t))))
+ (t (let (orgtbl-mode)
+ (call-interactively (key-binding "\C-c\C-c")))))))
+
+(defun orgtbl-tab (arg)
+ "Justification and field motion for `orgtbl-mode'."
+ (interactive "P")
+ (if arg (org-table-edit-field t)
+ (org-table-justify-field-maybe)
+ (org-table-next-field)))
+
+(defun orgtbl-ret ()
+ "Justification and field motion for `orgtbl-mode'."
+ (interactive)
+ (org-table-justify-field-maybe)
+ (org-table-next-row))
+
+(defun orgtbl-self-insert-command (N)
+ "Like `self-insert-command', use overwrite-mode for whitespace in tables.
+If the cursor is in a table looking at whitespace, the whitespace is
+overwritten, and the table is not marked as requiring realignment."
+ (interactive "p")
+ (if (and (org-at-table-p)
+ (or
+ (and org-table-auto-blank-field
+ (member last-command
+ '(orgtbl-hijacker-command-100
+ orgtbl-hijacker-command-101
+ orgtbl-hijacker-command-102
+ orgtbl-hijacker-command-103
+ orgtbl-hijacker-command-104
+ orgtbl-hijacker-command-105))
+ (org-table-blank-field))
+ t)
+ (eq N 1)
+ (looking-at "[^|\n]* +|"))
+ (let (org-table-may-need-update)
+ (goto-char (1- (match-end 0)))
+ (delete-backward-char 1)
+ (goto-char (match-beginning 0))
+ (self-insert-command N))
+ (setq org-table-may-need-update t)
+ (let (orgtbl-mode)
+ (call-interactively (key-binding (vector last-input-event))))))
+
+(defun org-force-self-insert (N)
+ "Needed to enforce self-insert under remapping."
+ (interactive "p")
+ (self-insert-command N))
+
+(defvar orgtbl-exp-regexp "^\\([-+]?[0-9][0-9.]*\\)[eE]\\([-+]?[0-9]+\\)$"
+ "Regula expression matching exponentials as produced by calc.")
+
+(defvar org-table-clean-did-remove-column nil)
+
+(defun orgtbl-export (table target)
+ (let ((func (intern (concat "orgtbl-to-" (symbol-name target))))
+ (lines (org-split-string table "[ \t]*\n[ \t]*"))
+ org-table-last-alignment org-table-last-column-widths
+ maxcol column)
+ (if (not (fboundp func))
+ (error "Cannot export orgtbl table to %s" target))
+ (setq lines (org-table-clean-before-export lines))
+ (setq table
+ (mapcar
+ (lambda (x)
+ (if (string-match org-table-hline-regexp x)
+ 'hline
+ (org-split-string (org-trim x) "\\s-*|\\s-*")))
+ lines))
+ (setq maxcol (apply 'max (mapcar (lambda (x) (if (listp x) (length x) 0))
+ table)))
+ (loop for i from (1- maxcol) downto 0 do
+ (setq column (mapcar (lambda (x) (if (listp x) (nth i x) nil)) table))
+ (setq column (delq nil column))
+ (push (apply 'max (mapcar 'string-width column)) org-table-last-column-widths)
+ (push (> (/ (apply '+ (mapcar (lambda (x) (if (string-match org-table-number-regexp x) 1 0)) column)) maxcol) org-table-number-fraction) org-table-last-alignment))
+ (funcall func table nil)))
+
+(defun orgtbl-send-table (&optional maybe)
+ "Send a tranformed version of this table to the receiver position.
+With argument MAYBE, fail quietly if no transformation is defined for
+this table."
+ (interactive)
+ (catch 'exit
+ (unless (org-at-table-p) (error "Not at a table"))
+ ;; when non-interactive, we assume align has just happened.
+ (when (interactive-p) (org-table-align))
+ (save-excursion
+ (goto-char (org-table-begin))
+ (beginning-of-line 0)
+ (unless (looking-at "#\\+ORGTBL: *SEND +\\([a-zA-Z0-9_]+\\) +\\([^ \t\r\n]+\\)\\( +.*\\)?")
+ (if maybe
+ (throw 'exit nil)
+ (error "Don't know how to transform this table."))))
+ (let* ((name (match-string 1))
+ beg
+ (transform (intern (match-string 2)))
+ (params (if (match-end 3) (read (concat "(" (match-string 3) ")"))))
+ (skip (plist-get params :skip))
+ (skipcols (plist-get params :skipcols))
+ (txt (buffer-substring-no-properties
+ (org-table-begin) (org-table-end)))
+ (lines (nthcdr (or skip 0) (org-split-string txt "[ \t]*\n[ \t]*")))
+ (lines (org-table-clean-before-export lines))
+ (i0 (if org-table-clean-did-remove-column 2 1))
+ (table (mapcar
+ (lambda (x)
+ (if (string-match org-table-hline-regexp x)
+ 'hline
+ (org-remove-by-index
+ (org-split-string (org-trim x) "\\s-*|\\s-*")
+ skipcols i0)))
+ lines))
+ (fun (if (= i0 2) 'cdr 'identity))
+ (org-table-last-alignment
+ (org-remove-by-index (funcall fun org-table-last-alignment)
+ skipcols i0))
+ (org-table-last-column-widths
+ (org-remove-by-index (funcall fun org-table-last-column-widths)
+ skipcols i0)))
+
+ (unless (fboundp transform)
+ (error "No such transformation function %s" transform))
+ (setq txt (funcall transform table params))
+ ;; Find the insertion place
+ (save-excursion
+ (goto-char (point-min))
+ (unless (re-search-forward
+ (concat "BEGIN RECEIVE ORGTBL +" name "\\([ \t]\\|$\\)") nil t)
+ (error "Don't know where to insert translated table"))
+ (goto-char (match-beginning 0))
+ (beginning-of-line 2)
+ (setq beg (point))
+ (unless (re-search-forward (concat "END RECEIVE ORGTBL +" name) nil t)
+ (error "Cannot find end of insertion region"))
+ (beginning-of-line 1)
+ (delete-region beg (point))
+ (goto-char beg)
+ (insert txt "\n"))
+ (message "Table converted and installed at receiver location"))))
+
+(defun org-remove-by-index (list indices &optional i0)
+ "Remove the elements in LIST with indices in INDICES.
+First element has index 0, or I0 if given."
+ (if (not indices)
+ list
+ (if (integerp indices) (setq indices (list indices)))
+ (setq i0 (1- (or i0 0)))
+ (delq :rm (mapcar (lambda (x)
+ (setq i0 (1+ i0))
+ (if (memq i0 indices) :rm x))
+ list))))
+
+(defun orgtbl-toggle-comment ()
+ "Comment or uncomment the orgtbl at point."
+ (interactive)
+ (let* ((re1 (concat "^" (regexp-quote comment-start) orgtbl-line-start-regexp))
+ (re2 (concat "^" orgtbl-line-start-regexp))
+ (commented (save-excursion (beginning-of-line 1)
+ (cond ((looking-at re1) t)
+ ((looking-at re2) nil)
+ (t (error "Not at an org table")))))
+ (re (if commented re1 re2))
+ beg end)
+ (save-excursion
+ (beginning-of-line 1)
+ (while (looking-at re) (beginning-of-line 0))
+ (beginning-of-line 2)
+ (setq beg (point))
+ (while (looking-at re) (beginning-of-line 2))
+ (setq end (point)))
+ (comment-region beg end (if commented '(4) nil))))
+
+(defun orgtbl-insert-radio-table ()
+ "Insert a radio table template appropriate for this major mode."
+ (interactive)
+ (let* ((e (assq major-mode orgtbl-radio-table-templates))
+ (txt (nth 1 e))
+ name pos)
+ (unless e (error "No radio table setup defined for %s" major-mode))
+ (setq name (read-string "Table name: "))
+ (while (string-match "%n" txt)
+ (setq txt (replace-match name t t txt)))
+ (or (bolp) (insert "\n"))
+ (setq pos (point))
+ (insert txt)
+ (goto-char pos)))
+
+(defun org-get-param (params header i sym &optional hsym)
+ "Get parameter value for symbol SYM.
+If this is a header line, actually get the value for the symbol with an
+additional \"h\" inserted after the colon.
+If the value is a protperty list, get the element for the current column.
+Assumes variables VAL, PARAMS, HEAD and I to be scoped into the function."
+ (let ((val (plist-get params sym)))
+ (and hsym header (setq val (or (plist-get params hsym) val)))
+ (if (consp val) (plist-get val i) val)))
+
+(defun orgtbl-to-generic (table params)
+ "Convert the orgtbl-mode TABLE to some other format.
+This generic routine can be used for many standard cases.
+TABLE is a list, each entry either the symbol `hline' for a horizontal
+separator line, or a list of fields for that line.
+PARAMS is a property list of parameters that can influence the conversion.
+For the generic converter, some parameters are obligatory: You need to
+specify either :lfmt, or all of (:lstart :lend :sep). If you do not use
+:splice, you must have :tstart and :tend.
+
+Valid parameters are
+
+:tstart String to start the table. Ignored when :splice is t.
+:tend String to end the table. Ignored when :splice is t.
+
+:splice When set to t, return only table body lines, don't wrap
+ them into :tstart and :tend. Default is nil.
+
+:hline String to be inserted on horizontal separation lines.
+ May be nil to ignore hlines.
+
+:lstart String to start a new table line.
+:lend String to end a table line
+:sep Separator between two fields
+:lfmt Format for entire line, with enough %s to capture all fields.
+ If this is present, :lstart, :lend, and :sep are ignored.
+:fmt A format to be used to wrap the field, should contain
+ %s for the original field value. For example, to wrap
+ everything in dollars, you could use :fmt \"$%s$\".
+ This may also be a property list with column numbers and
+ formats. for example :fmt (2 \"$%s$\" 4 \"%s%%\")
+
+:hlstart :hlend :hlsep :hlfmt :hfmt
+ Same as above, specific for the header lines in the table.
+ All lines before the first hline are treated as header.
+ If any of these is not present, the data line value is used.
+
+:efmt Use this format to print numbers with exponentials.
+ The format should have %s twice for inserting mantissa
+ and exponent, for example \"%s\\\\times10^{%s}\". This
+ may also be a property list with column numbers and
+ formats. :fmt will still be applied after :efmt.
+
+In addition to this, the parameters :skip and :skipcols are always handled
+directly by `orgtbl-send-table'. See manual."
+ (interactive)
+ (let* ((p params)
+ (splicep (plist-get p :splice))
+ (hline (plist-get p :hline))
+ rtn line i fm efm lfmt h)
+
+ ;; Do we have a header?
+ (if (and (not splicep) (listp (car table)) (memq 'hline table))
+ (setq h t))
+
+ ;; Put header
+ (unless splicep
+ (push (or (plist-get p :tstart) "ERROR: no :tstart") rtn))
+
+ ;; Now loop over all lines
+ (while (setq line (pop table))
+ (if (eq line 'hline)
+ ;; A horizontal separator line
+ (progn (if hline (push hline rtn))
+ (setq h nil)) ; no longer in header
+ ;; A normal line. Convert the fields, push line onto the result list
+ (setq i 0)
+ (setq line
+ (mapcar
+ (lambda (f)
+ (setq i (1+ i)
+ fm (org-get-param p h i :fmt :hfmt)
+ efm (org-get-param p h i :efmt))
+ (if (and efm (string-match orgtbl-exp-regexp f))
+ (setq f (format
+ efm (match-string 1 f) (match-string 2 f))))
+ (if fm (setq f (format fm f)))
+ f)
+ line))
+ (if (setq lfmt (org-get-param p h i :lfmt :hlfmt))
+ (push (apply 'format lfmt line) rtn)
+ (push (concat
+ (org-get-param p h i :lstart :hlstart)
+ (mapconcat 'identity line (org-get-param p h i :sep :hsep))
+ (org-get-param p h i :lend :hlend))
+ rtn))))
+
+ (unless splicep
+ (push (or (plist-get p :tend) "ERROR: no :tend") rtn))
+
+ (mapconcat 'identity (nreverse rtn) "\n")))
+
+(defun orgtbl-to-latex (table params)
+ "Convert the orgtbl-mode TABLE to LaTeX.
+TABLE is a list, each entry either the symbol `hline' for a horizontal
+separator line, or a list of fields for that line.
+PARAMS is a property list of parameters that can influence the conversion.
+Supports all parameters from `orgtbl-to-generic'. Most important for
+LaTeX are:
+
+:splice When set to t, return only table body lines, don't wrap
+ them into a tabular environment. Default is nil.
+
+:fmt A format to be used to wrap the field, should contain %s for the
+ original field value. For example, to wrap everything in dollars,
+ use :fmt \"$%s$\". This may also be a property list with column
+ numbers and formats. for example :fmt (2 \"$%s$\" 4 \"%s%%\")
+
+:efmt Format for transforming numbers with exponentials. The format
+ should have %s twice for inserting mantissa and exponent, for
+ example \"%s\\\\times10^{%s}\". LaTeX default is \"%s\\\\,(%s)\".
+ This may also be a property list with column numbers and formats.
+
+The general parameters :skip and :skipcols have already been applied when
+this function is called."
+ (let* ((alignment (mapconcat (lambda (x) (if x "r" "l"))
+ org-table-last-alignment ""))
+ (params2
+ (list
+ :tstart (concat "\\begin{tabular}{" alignment "}")
+ :tend "\\end{tabular}"
+ :lstart "" :lend " \\\\" :sep " & "
+ :efmt "%s\\,(%s)" :hline "\\hline")))
+ (orgtbl-to-generic table (org-combine-plists params2 params))))
+
+(defun orgtbl-to-html (table params)
+ "Convert the orgtbl-mode TABLE to LaTeX.
+TABLE is a list, each entry either the symbol `hline' for a horizontal
+separator line, or a list of fields for that line.
+PARAMS is a property list of parameters that can influence the conversion.
+Currently this function recognizes the following parameters:
+
+:splice When set to t, return only table body lines, don't wrap
+ them into a <table> environment. Default is nil.
+
+The general parameters :skip and :skipcols have already been applied when
+this function is called. The function does *not* use `orgtbl-to-generic',
+so you cannot specify parameters for it."
+ (let* ((splicep (plist-get params :splice))
+ html)
+ ;; Just call the formatter we already have
+ ;; We need to make text lines for it, so put the fields back together.
+ (setq html (org-format-org-table-html
+ (mapcar
+ (lambda (x)
+ (if (eq x 'hline)
+ "|----+----|"
+ (concat "| " (mapconcat 'identity x " | ") " |")))
+ table)
+ splicep))
+ (if (string-match "\n+\\'" html)
+ (setq html (replace-match "" t t html)))
+ html))
+
+(defun orgtbl-to-texinfo (table params)
+ "Convert the orgtbl-mode TABLE to TeXInfo.
+TABLE is a list, each entry either the symbol `hline' for a horizontal
+separator line, or a list of fields for that line.
+PARAMS is a property list of parameters that can influence the conversion.
+Supports all parameters from `orgtbl-to-generic'. Most important for
+TeXInfo are:
+
+:splice nil/t When set to t, return only table body lines, don't wrap
+ them into a multitable environment. Default is nil.
+
+:fmt fmt A format to be used to wrap the field, should contain
+ %s for the original field value. For example, to wrap
+ everything in @kbd{}, you could use :fmt \"@kbd{%s}\".
+ This may also be a property list with column numbers and
+ formats. for example :fmt (2 \"@kbd{%s}\" 4 \"@code{%s}\").
+
+:cf \"f1 f2..\" The column fractions for the table. Bye default these
+ are computed automatically from the width of the columns
+ under org-mode.
+
+The general parameters :skip and :skipcols have already been applied when
+this function is called."
+ (let* ((total (float (apply '+ org-table-last-column-widths)))
+ (colfrac (or (plist-get params :cf)
+ (mapconcat
+ (lambda (x) (format "%.3f" (/ (float x) total)))
+ org-table-last-column-widths " ")))
+ (params2
+ (list
+ :tstart (concat "@multitable @columnfractions " colfrac)
+ :tend "@end multitable"
+ :lstart "@item " :lend "" :sep " @tab "
+ :hlstart "@headitem ")))
+ (orgtbl-to-generic table (org-combine-plists params2 params))))
+
+;;;; Link Stuff
+
+;;; Link abbreviations
+
+(defun org-link-expand-abbrev (link)
+ "Apply replacements as defined in `org-link-abbrev-alist."
+ (if (string-match "^\\([a-zA-Z][-_a-zA-Z0-9]*\\)\\(::?\\(.*\\)\\)?$" link)
+ (let* ((key (match-string 1 link))
+ (as (or (assoc key org-link-abbrev-alist-local)
+ (assoc key org-link-abbrev-alist)))
+ (tag (and (match-end 2) (match-string 3 link)))
+ rpl)
+ (if (not as)
+ link
+ (setq rpl (cdr as))
+ (cond
+ ((symbolp rpl) (funcall rpl tag))
+ ((string-match "%s" rpl) (replace-match (or tag "") t t rpl))
+ (t (concat rpl tag)))))
+ link))
+
+;;; Storing and inserting links
+
+(defvar org-insert-link-history nil
+ "Minibuffer history for links inserted with `org-insert-link'.")
+
+(defvar org-stored-links nil
+ "Contains the links stored with `org-store-link'.")
+
+(defvar org-store-link-plist nil
+ "Plist with info about the most recently link created with `org-store-link'.")
+
+(defvar org-link-protocols nil
+ "Link protocols added to Org-mode using `org-add-link-type'.")
+
+(defvar org-store-link-functions nil
+ "List of functions that are called to create and store a link.
+Each function will be called in turn until one returns a non-nil
+value. Each function should check if it is responsible for creating
+this link (for example by looking at the major mode).
+If not, it must exit and return nil.
+If yes, it should return a non-nil value after a calling
+`org-store-link-props' with a list of properties and values.
+Special properties are:
+
+:type The link prefix. like \"http\". This must be given.
+:link The link, like \"http://www.astro.uva.nl/~dominik\".
+ This is obligatory as well.
+:description Optional default description for the second pair
+ of brackets in an Org-mode link. The user can still change
+ this when inserting this link into an Org-mode buffer.
+
+In addition to these, any additional properties can be specified
+and then used in remember templates.")
+
+(defun org-add-link-type (type &optional follow publish)
+ "Add TYPE to the list of `org-link-types'.
+Re-compute all regular expressions depending on `org-link-types'
+FOLLOW and PUBLISH are two functions. Both take the link path as
+an argument.
+FOLLOW should do whatever is necessary to follow the link, for example
+to find a file or display a mail message.
+
+PUBLISH takes the path and retuns the string that should be used when
+this document is published. FIMXE: This is actually not yet implemented."
+ (add-to-list 'org-link-types type t)
+ (org-make-link-regexps)
+ (add-to-list 'org-link-protocols
+ (list type follow publish)))
+
+(defun org-add-agenda-custom-command (entry)
+ "Replace or add a command in `org-agenda-custom-commands'.
+This is mostly for hacking and trying a new command - once the command
+works you probably want to add it to `org-agenda-custom-commands' for good."
+ (let ((ass (assoc (car entry) org-agenda-custom-commands)))
+ (if ass
+ (setcdr ass (cdr entry))
+ (push entry org-agenda-custom-commands))))
+
+;;;###autoload
+(defun org-store-link (arg)
+ "\\<org-mode-map>Store an org-link to the current location.
+This link can later be inserted into an org-buffer with
+\\[org-insert-link].
+For some link types, a prefix arg is interpreted:
+For links to usenet articles, arg negates `org-usenet-links-prefer-google'.
+For file links, arg negates `org-context-in-file-links'."
+ (interactive "P")
+ (setq org-store-link-plist nil) ; reset
+ (let (link cpltxt desc description search txt)
+ (cond
+
+ ((run-hook-with-args-until-success 'org-store-link-functions)
+ (setq link (plist-get org-store-link-plist :link)
+ desc (or (plist-get org-store-link-plist :description) link)))
+
+ ((eq major-mode 'bbdb-mode)
+ (let ((name (bbdb-record-name (bbdb-current-record)))
+ (company (bbdb-record-getprop (bbdb-current-record) 'company)))
+ (setq cpltxt (concat "bbdb:" (or name company))
+ link (org-make-link cpltxt))
+ (org-store-link-props :type "bbdb" :name name :company company)))
+
+ ((eq major-mode 'Info-mode)
+ (setq link (org-make-link "info:"
+ (file-name-nondirectory Info-current-file)
+ ":" Info-current-node))
+ (setq cpltxt (concat (file-name-nondirectory Info-current-file)
+ ":" Info-current-node))
+ (org-store-link-props :type "info" :file Info-current-file
+ :node Info-current-node))
+
+ ((eq major-mode 'calendar-mode)
+ (let ((cd (calendar-cursor-to-date)))
+ (setq link
+ (format-time-string
+ (car org-time-stamp-formats)
+ (apply 'encode-time
+ (list 0 0 0 (nth 1 cd) (nth 0 cd) (nth 2 cd)
+ nil nil nil))))
+ (org-store-link-props :type "calendar" :date cd)))
+
+ ((or (eq major-mode 'vm-summary-mode)
+ (eq major-mode 'vm-presentation-mode))
+ (and (eq major-mode 'vm-presentation-mode) (vm-summarize))
+ (vm-follow-summary-cursor)
+ (save-excursion
+ (vm-select-folder-buffer)
+ (let* ((message (car vm-message-pointer))
+ (folder buffer-file-name)
+ (subject (vm-su-subject message))
+ (to (vm-get-header-contents message "To"))
+ (from (vm-get-header-contents message "From"))
+ (message-id (vm-su-message-id message)))
+ (org-store-link-props :type "vm" :from from :to to :subject subject
+ :message-id message-id)
+ (setq message-id (org-remove-angle-brackets message-id))
+ (setq folder (abbreviate-file-name folder))
+ (if (string-match (concat "^" (regexp-quote vm-folder-directory))
+ folder)
+ (setq folder (replace-match "" t t folder)))
+ (setq cpltxt (org-email-link-description))
+ (setq link (org-make-link "vm:" folder "#" message-id)))))
+
+ ((eq major-mode 'wl-summary-mode)
+ (let* ((msgnum (wl-summary-message-number))
+ (message-id (elmo-message-field wl-summary-buffer-elmo-folder
+ msgnum 'message-id))
+ (wl-message-entity
+ (if (fboundp 'elmo-message-entity)
+ (elmo-message-entity
+ wl-summary-buffer-elmo-folder msgnum)
+ (elmo-msgdb-overview-get-entity
+ msgnum (wl-summary-buffer-msgdb))))
+ (from (wl-summary-line-from))
+ (to (car (elmo-message-entity-field wl-message-entity 'to)))
+ (subject (let (wl-thr-indent-string wl-parent-message-entity)
+ (wl-summary-line-subject))))
+ (org-store-link-props :type "wl" :from from :to to
+ :subject subject :message-id message-id)
+ (setq message-id (org-remove-angle-brackets message-id))
+ (setq cpltxt (org-email-link-description))
+ (setq link (org-make-link "wl:" wl-summary-buffer-folder-name
+ "#" message-id))))
+
+ ((or (equal major-mode 'mh-folder-mode)
+ (equal major-mode 'mh-show-mode))
+ (let ((from (org-mhe-get-header "From:"))
+ (to (org-mhe-get-header "To:"))
+ (message-id (org-mhe-get-header "Message-Id:"))
+ (subject (org-mhe-get-header "Subject:")))
+ (org-store-link-props :type "mh" :from from :to to
+ :subject subject :message-id message-id)
+ (setq cpltxt (org-email-link-description))
+ (setq link (org-make-link "mhe:" (org-mhe-get-message-real-folder) "#"
+ (org-remove-angle-brackets message-id)))))
+
+ ((eq major-mode 'rmail-mode)
+ (save-excursion
+ (save-restriction
+ (rmail-narrow-to-non-pruned-header)
+ (let ((folder buffer-file-name)
+ (message-id (mail-fetch-field "message-id"))
+ (from (mail-fetch-field "from"))
+ (to (mail-fetch-field "to"))
+ (subject (mail-fetch-field "subject")))
+ (org-store-link-props
+ :type "rmail" :from from :to to
+ :subject subject :message-id message-id)
+ (setq message-id (org-remove-angle-brackets message-id))
+ (setq cpltxt (org-email-link-description))
+ (setq link (org-make-link "rmail:" folder "#" message-id))))))
+
+ ((eq major-mode 'gnus-group-mode)
+ (let ((group (cond ((fboundp 'gnus-group-group-name) ; depending on Gnus
+ (gnus-group-group-name)) ; version
+ ((fboundp 'gnus-group-name)
+ (gnus-group-name))
+ (t "???"))))
+ (unless group (error "Not on a group"))
+ (org-store-link-props :type "gnus" :group group)
+ (setq cpltxt (concat
+ (if (org-xor arg org-usenet-links-prefer-google)
+ "http://groups.google.com/groups?group="
+ "gnus:")
+ group)
+ link (org-make-link cpltxt))))
+
+ ((memq major-mode '(gnus-summary-mode gnus-article-mode))
+ (and (eq major-mode 'gnus-article-mode) (gnus-article-show-summary))
+ (let* ((group gnus-newsgroup-name)
+ (article (gnus-summary-article-number))
+ (header (gnus-summary-article-header article))
+ (from (mail-header-from header))
+ (message-id (mail-header-id header))
+ (date (mail-header-date header))
+ (subject (gnus-summary-subject-string)))
+ (org-store-link-props :type "gnus" :from from :subject subject
+ :message-id message-id :group group)
+ (setq cpltxt (org-email-link-description))
+ (if (org-xor arg org-usenet-links-prefer-google)
+ (setq link
+ (concat
+ cpltxt "\n "
+ (format "http://groups.google.com/groups?as_umsgid=%s"
+ (org-fixup-message-id-for-http message-id))))
+ (setq link (org-make-link "gnus:" group
+ "#" (number-to-string article))))))
+
+ ((eq major-mode 'w3-mode)
+ (setq cpltxt (url-view-url t)
+ link (org-make-link cpltxt))
+ (org-store-link-props :type "w3" :url (url-view-url t)))
+
+ ((eq major-mode 'w3m-mode)
+ (setq cpltxt (or w3m-current-title w3m-current-url)
+ link (org-make-link w3m-current-url))
+ (org-store-link-props :type "w3m" :url (url-view-url t)))
+
+ ((setq search (run-hook-with-args-until-success
+ 'org-create-file-search-functions))
+ (setq link (concat "file:" (abbreviate-file-name buffer-file-name)
+ "::" search))
+ (setq cpltxt (or description link)))
+
+ ((eq major-mode 'image-mode)
+ (setq cpltxt (concat "file:"
+ (abbreviate-file-name buffer-file-name))
+ link (org-make-link cpltxt))
+ (org-store-link-props :type "image" :file buffer-file-name))
+
+ ((eq major-mode 'dired-mode)
+ ;; link to the file in the current line
+ (setq cpltxt (concat "file:"
+ (abbreviate-file-name
+ (expand-file-name
+ (dired-get-filename nil t))))
+ link (org-make-link cpltxt)))
+
+ ((and buffer-file-name (org-mode-p))
+ ;; Just link to current headline
+ (setq cpltxt (concat "file:"
+ (abbreviate-file-name buffer-file-name)))
+ ;; Add a context search string
+ (when (org-xor org-context-in-file-links arg)
+ ;; Check if we are on a target
+ (if (org-in-regexp "<<\\(.*?\\)>>")
+ (setq cpltxt (concat cpltxt "::" (match-string 1)))
+ (setq txt (cond
+ ((org-on-heading-p) nil)
+ ((org-region-active-p)
+ (buffer-substring (region-beginning) (region-end)))
+ (t (buffer-substring (point-at-bol) (point-at-eol)))))
+ (when (or (null txt) (string-match "\\S-" txt))
+ (setq cpltxt
+ (concat cpltxt "::" (org-make-org-heading-search-string txt))
+ desc "NONE"))))
+ (if (string-match "::\\'" cpltxt)
+ (setq cpltxt (substring cpltxt 0 -2)))
+ (setq link (org-make-link cpltxt)))
+
+ ((buffer-file-name (buffer-base-buffer))
+ ;; Just link to this file here.
+ (setq cpltxt (concat "file:"
+ (abbreviate-file-name
+ (buffer-file-name (buffer-base-buffer)))))
+ ;; Add a context string
+ (when (org-xor org-context-in-file-links arg)
+ (setq txt (if (org-region-active-p)
+ (buffer-substring (region-beginning) (region-end))
+ (buffer-substring (point-at-bol) (point-at-eol))))
+ ;; Only use search option if there is some text.
+ (when (string-match "\\S-" txt)
+ (setq cpltxt
+ (concat cpltxt "::" (org-make-org-heading-search-string txt))
+ desc "NONE")))
+ (setq link (org-make-link cpltxt)))
+
+ ((interactive-p)
+ (error "Cannot link to a buffer which is not visiting a file"))
+
+ (t (setq link nil)))
+
+ (if (consp link) (setq cpltxt (car link) link (cdr link)))
+ (setq link (or link cpltxt)
+ desc (or desc cpltxt))
+ (if (equal desc "NONE") (setq desc nil))
+
+ (if (and (interactive-p) link)
+ (progn
+ (setq org-stored-links
+ (cons (list link desc) org-stored-links))
+ (message "Stored: %s" (or desc link)))
+ (and link (org-make-link-string link desc)))))
+
+(defun org-store-link-props (&rest plist)
+ "Store link properties, extract names and addresses."
+ (let (x adr)
+ (when (setq x (plist-get plist :from))
+ (setq adr (mail-extract-address-components x))
+ (plist-put plist :fromname (car adr))
+ (plist-put plist :fromaddress (nth 1 adr)))
+ (when (setq x (plist-get plist :to))
+ (setq adr (mail-extract-address-components x))
+ (plist-put plist :toname (car adr))
+ (plist-put plist :toaddress (nth 1 adr))))
+ (let ((from (plist-get plist :from))
+ (to (plist-get plist :to)))
+ (when (and from to org-from-is-user-regexp)
+ (plist-put plist :fromto
+ (if (string-match org-from-is-user-regexp from)
+ (concat "to %t")
+ (concat "from %f")))))
+ (setq org-store-link-plist plist))
+
+(defun org-email-link-description (&optional fmt)
+ "Return the description part of an email link.
+This takes information from `org-store-link-plist' and formats it
+according to FMT (default from `org-email-link-description-format')."
+ (setq fmt (or fmt org-email-link-description-format))
+ (let* ((p org-store-link-plist)
+ (to (plist-get p :toaddress))
+ (from (plist-get p :fromaddress))
+ (table
+ (list
+ (cons "%c" (plist-get p :fromto))
+ (cons "%F" (plist-get p :from))
+ (cons "%f" (or (plist-get p :fromname) (plist-get p :fromaddress) "?"))
+ (cons "%T" (plist-get p :to))
+ (cons "%t" (or (plist-get p :toname) (plist-get p :toaddress) "?"))
+ (cons "%s" (plist-get p :subject))
+ (cons "%m" (plist-get p :message-id)))))
+ (when (string-match "%c" fmt)
+ ;; Check if the user wrote this message
+ (if (and org-from-is-user-regexp from to
+ (save-match-data (string-match org-from-is-user-regexp from)))
+ (setq fmt (replace-match "to %t" t t fmt))
+ (setq fmt (replace-match "from %f" t t fmt))))
+ (org-replace-escapes fmt table)))
+
+(defun org-make-org-heading-search-string (&optional string heading)
+ "Make search string for STRING or current headline."
+ (interactive)
+ (let ((s (or string (org-get-heading))))
+ (unless (and string (not heading))
+ ;; We are using a headline, clean up garbage in there.
+ (if (string-match org-todo-regexp s)
+ (setq s (replace-match "" t t s)))
+ (if (string-match (org-re ":[[:alnum:]_@:]+:[ \t]*$") s)
+ (setq s (replace-match "" t t s)))
+ (setq s (org-trim s))
+ (if (string-match (concat "^\\(" org-quote-string "\\|"
+ org-comment-string "\\)") s)
+ (setq s (replace-match "" t t s)))
+ (while (string-match org-ts-regexp s)
+ (setq s (replace-match "" t t s))))
+ (while (string-match "[^a-zA-Z_0-9 \t]+" s)
+ (setq s (replace-match " " t t s)))
+ (or string (setq s (concat "*" s))) ; Add * for headlines
+ (mapconcat 'identity (org-split-string s "[ \t]+") " ")))
+
+(defun org-make-link (&rest strings)
+ "Concatenate STRINGS."
+ (apply 'concat strings))
+
+(defun org-make-link-string (link &optional description)
+ "Make a link with brackets, consisting of LINK and DESCRIPTION."
+ (unless (string-match "\\S-" link)
+ (error "Empty link"))
+ (when (stringp description)
+ ;; Remove brackets from the description, they are fatal.
+ (while (string-match "\\[" description)
+ (setq description (replace-match "{" t t description)))
+ (while (string-match "\\]" description)
+ (setq description (replace-match "}" t t description))))
+ (when (equal (org-link-escape link) description)
+ ;; No description needed, it is identical
+ (setq description nil))
+ (when (and (not description)
+ (not (equal link (org-link-escape link))))
+ (setq description link))
+ (concat "[[" (org-link-escape link) "]"
+ (if description (concat "[" description "]") "")
+ "]"))
+
+(defconst org-link-escape-chars
+ '((?\ . "%20")
+ (?\[ . "%5B")
+ (?\] . "%5D")
+ (?\340 . "%E0") ; `a
+ (?\342 . "%E2") ; ^a
+ (?\347 . "%E7") ; ,c
+ (?\350 . "%E8") ; `e
+ (?\351 . "%E9") ; 'e
+ (?\352 . "%EA") ; ^e
+ (?\356 . "%EE") ; ^i
+ (?\364 . "%F4") ; ^o
+ (?\371 . "%F9") ; `u
+ (?\373 . "%FB") ; ^u
+ (?\; . "%3B")
+ (?? . "%3F")
+ (?= . "%3D")
+ (?+ . "%2B")
+ )
+ "Association list of escapes for some characters problematic in links.
+This is the list that is used for internal purposes.")
+
+(defconst org-link-escape-chars-browser
+ '((?\ . "%20")) ; 32 for the SPC char
+ "Association list of escapes for some characters problematic in links.
+This is the list that is used before handing over to the browser.")
+
+(defun org-link-escape (text &optional table)
+ "Escape charaters in TEXT that are problematic for links."
+ (setq table (or table org-link-escape-chars))
+ (when text
+ (let ((re (mapconcat (lambda (x) (regexp-quote
+ (char-to-string (car x))))
+ table "\\|")))
+ (while (string-match re text)
+ (setq text
+ (replace-match
+ (cdr (assoc (string-to-char (match-string 0 text))
+ table))
+ t t text)))
+ text)))
+
+(defun org-link-unescape (text &optional table)
+ "Reverse the action of `org-link-escape'."
+ (setq table (or table org-link-escape-chars))
+ (when text
+ (let ((re (mapconcat (lambda (x) (regexp-quote (cdr x)))
+ table "\\|")))
+ (while (string-match re text)
+ (setq text
+ (replace-match
+ (char-to-string (car (rassoc (match-string 0 text) table)))
+ t t text)))
+ text)))
+
+(defun org-xor (a b)
+ "Exclusive or."
+ (if a (not b) b))
+
+(defun org-get-header (header)
+ "Find a header field in the current buffer."
+ (save-excursion
+ (goto-char (point-min))
+ (let ((case-fold-search t) s)
+ (cond
+ ((eq header 'from)
+ (if (re-search-forward "^From:\\s-+\\(.*\\)" nil t)
+ (setq s (match-string 1)))
+ (while (string-match "\"" s)
+ (setq s (replace-match "" t t s)))
+ (if (string-match "[<(].*" s)
+ (setq s (replace-match "" t t s))))
+ ((eq header 'message-id)
+ (if (re-search-forward "^message-id:\\s-+\\(.*\\)" nil t)
+ (setq s (match-string 1))))
+ ((eq header 'subject)
+ (if (re-search-forward "^subject:\\s-+\\(.*\\)" nil t)
+ (setq s (match-string 1)))))
+ (if (string-match "\\`[ \t\]+" s) (setq s (replace-match "" t t s)))
+ (if (string-match "[ \t\]+\\'" s) (setq s (replace-match "" t t s)))
+ s)))
+
+
+(defun org-fixup-message-id-for-http (s)
+ "Replace special characters in a message id, so it can be used in an http query."
+ (while (string-match "<" s)
+ (setq s (replace-match "%3C" t t s)))
+ (while (string-match ">" s)
+ (setq s (replace-match "%3E" t t s)))
+ (while (string-match "@" s)
+ (setq s (replace-match "%40" t t s)))
+ s)
+
+;;;###autoload
+(defun org-insert-link-global ()
+ "Insert a link like Org-mode does.
+This command can be called in any mode to insert a link in Org-mode syntax."
+ (interactive)
+ (org-run-like-in-org-mode 'org-insert-link))
+
+(defun org-insert-link (&optional complete-file)
+ "Insert a link. At the prompt, enter the link.
+
+Completion can be used to select a link previously stored with
+`org-store-link'. When the empty string is entered (i.e. if you just
+press RET at the prompt), the link defaults to the most recently
+stored link. As SPC triggers completion in the minibuffer, you need to
+use M-SPC or C-q SPC to force the insertion of a space character.
+
+You will also be prompted for a description, and if one is given, it will
+be displayed in the buffer instead of the link.
+
+If there is already a link at point, this command will allow you to edit link
+and description parts.
+
+With a \\[universal-argument] prefix, prompts for a file to link to. The file name can be
+selected using completion. The path to the file will be relative to
+the current directory if the file is in the current directory or a
+subdirectory. Otherwise, the link will be the absolute path as
+completed in the minibuffer (i.e. normally ~/path/to/file).
+
+With two \\[universal-argument] prefixes, enforce an absolute path even if the file
+is in the current directory or below.
+With three \\[universal-argument] prefixes, negate the meaning of
+`org-keep-stored-link-after-insertion'."
+ (interactive "P")
+ (let* ((wcf (current-window-configuration))
+ (region (if (org-region-active-p)
+ (buffer-substring (region-beginning) (region-end))))
+ (remove (and region (list (region-beginning) (region-end))))
+ (desc region)
+ tmphist ; byte-compile incorrectly complains about this
+ link entry file)
+ (cond
+ ((org-in-regexp org-bracket-link-regexp 1)
+ ;; We do have a link at point, and we are going to edit it.
+ (setq remove (list (match-beginning 0) (match-end 0)))
+ (setq desc (if (match-end 3) (org-match-string-no-properties 3)))
+ (setq link (read-string "Link: "
+ (org-link-unescape
+ (org-match-string-no-properties 1)))))
+ ((or (org-in-regexp org-angle-link-re)
+ (org-in-regexp org-plain-link-re))
+ ;; Convert to bracket link
+ (setq remove (list (match-beginning 0) (match-end 0))
+ link (read-string "Link: "
+ (org-remove-angle-brackets (match-string 0)))))
+ ((equal complete-file '(4))
+ ;; Completing read for file names.
+ (setq file (read-file-name "File: "))
+ (let ((pwd (file-name-as-directory (expand-file-name ".")))
+ (pwd1 (file-name-as-directory (abbreviate-file-name
+ (expand-file-name ".")))))
+ (cond
+ ((equal complete-file '(16))
+ (setq link (org-make-link
+ "file:"
+ (abbreviate-file-name (expand-file-name file)))))
+ ((string-match (concat "^" (regexp-quote pwd1) "\\(.+\\)") file)
+ (setq link (org-make-link "file:" (match-string 1 file))))
+ ((string-match (concat "^" (regexp-quote pwd) "\\(.+\\)")
+ (expand-file-name file))
+ (setq link (org-make-link
+ "file:" (match-string 1 (expand-file-name file)))))
+ (t (setq link (org-make-link "file:" file))))))
+ (t
+ ;; Read link, with completion for stored links.
+ (with-output-to-temp-buffer "*Org Links*"
+ (princ "Insert a link. Use TAB to complete valid link prefixes.\n")
+ (when org-stored-links
+ (princ "\nStored links are available with <up>/<down> or M-p/n (most recent with RET):\n\n")
+ (princ (mapconcat
+ (lambda (x)
+ (if (nth 1 x) (concat (car x) " (" (nth 1 x) ")") (car x)))
+ (reverse org-stored-links) "\n"))))
+ (let ((cw (selected-window)))
+ (select-window (get-buffer-window "*Org Links*"))
+ (shrink-window-if-larger-than-buffer)
+ (setq truncate-lines t)
+ (select-window cw))
+ ;; Fake a link history, containing the stored links.
+ (setq tmphist (append (mapcar 'car org-stored-links)
+ org-insert-link-history))
+ (unwind-protect
+ (setq link (org-completing-read
+ "Link: "
+ (append
+ (mapcar (lambda (x) (list (concat (car x) ":")))
+ (append org-link-abbrev-alist-local org-link-abbrev-alist))
+ (mapcar (lambda (x) (list (concat x ":")))
+ org-link-types))
+ nil nil nil
+ 'tmphist
+ (or (car (car org-stored-links)))))
+ (set-window-configuration wcf)
+ (kill-buffer "*Org Links*"))
+ (setq entry (assoc link org-stored-links))
+ (or entry (push link org-insert-link-history))
+ (if (funcall (if (equal complete-file '(64)) 'not 'identity)
+ (not org-keep-stored-link-after-insertion))
+ (setq org-stored-links (delq (assoc link org-stored-links)
+ org-stored-links)))
+ (setq desc (or desc (nth 1 entry)))))
+
+ (if (string-match org-plain-link-re link)
+ ;; URL-like link, normalize the use of angular brackets.
+ (setq link (org-make-link (org-remove-angle-brackets link))))
+
+ ;; Check if we are linking to the current file with a search option
+ ;; If yes, simplify the link by using only the search option.
+ (when (and buffer-file-name
+ (string-match "\\<file:\\(.+?\\)::\\([^>]+\\)" link))
+ (let* ((path (match-string 1 link))
+ (case-fold-search nil)
+ (search (match-string 2 link)))
+ (save-match-data
+ (if (equal (file-truename buffer-file-name) (file-truename path))
+ ;; We are linking to this same file, with a search option
+ (setq link search)))))
+
+ ;; Check if we can/should use a relative path. If yes, simplify the link
+ (when (string-match "\\<file:\\(.*\\)" link)
+ (let* ((path (match-string 1 link))
+ (origpath path)
+ (desc-is-link (equal link desc))
+ (case-fold-search nil))
+ (cond
+ ((eq org-link-file-path-type 'absolute)
+ (setq path (abbreviate-file-name (expand-file-name path))))
+ ((eq org-link-file-path-type 'noabbrev)
+ (setq path (expand-file-name path)))
+ ((eq org-link-file-path-type 'relative)
+ (setq path (file-relative-name path)))
+ (t
+ (save-match-data
+ (if (string-match (concat "^" (regexp-quote
+ (file-name-as-directory
+ (expand-file-name "."))))
+ (expand-file-name path))
+ ;; We are linking a file with relative path name.
+ (setq path (substring (expand-file-name path)
+ (match-end 0)))))))
+ (setq link (concat "file:" path))
+ (if (equal desc origpath)
+ (setq desc path))))
+
+ (setq desc (read-string "Description: " desc))
+ (unless (string-match "\\S-" desc) (setq desc nil))
+ (if remove (apply 'delete-region remove))
+ (insert (org-make-link-string link desc))))
+
+(defun org-completing-read (&rest args)
+ (let ((minibuffer-local-completion-map
+ (copy-keymap minibuffer-local-completion-map)))
+ (org-defkey minibuffer-local-completion-map " " 'self-insert-command)
+ (apply 'completing-read args)))
+
+;;; Opening/following a link
+(defvar org-link-search-failed nil)
+
+(defun org-next-link ()
+ "Move forward to the next link.
+If the link is in hidden text, expose it."
+ (interactive)
+ (when (and org-link-search-failed (eq this-command last-command))
+ (goto-char (point-min))
+ (message "Link search wrapped back to beginning of buffer"))
+ (setq org-link-search-failed nil)
+ (let* ((pos (point))
+ (ct (org-context))
+ (a (assoc :link ct)))
+ (if a (goto-char (nth 2 a)))
+ (if (re-search-forward org-any-link-re nil t)
+ (progn
+ (goto-char (match-beginning 0))
+ (if (org-invisible-p) (org-show-context)))
+ (goto-char pos)
+ (setq org-link-search-failed t)
+ (error "No further link found"))))
+
+(defun org-previous-link ()
+ "Move backward to the previous link.
+If the link is in hidden text, expose it."
+ (interactive)
+ (when (and org-link-search-failed (eq this-command last-command))
+ (goto-char (point-max))
+ (message "Link search wrapped back to end of buffer"))
+ (setq org-link-search-failed nil)
+ (let* ((pos (point))
+ (ct (org-context))
+ (a (assoc :link ct)))
+ (if a (goto-char (nth 1 a)))
+ (if (re-search-backward org-any-link-re nil t)
+ (progn
+ (goto-char (match-beginning 0))
+ (if (org-invisible-p) (org-show-context)))
+ (goto-char pos)
+ (setq org-link-search-failed t)
+ (error "No further link found"))))
+
+(defun org-find-file-at-mouse (ev)
+ "Open file link or URL at mouse."
+ (interactive "e")
+ (mouse-set-point ev)
+ (org-open-at-point 'in-emacs))
+
+(defun org-open-at-mouse (ev)
+ "Open file link or URL at mouse."
+ (interactive "e")
+ (mouse-set-point ev)
+ (org-open-at-point))
+
+(defvar org-window-config-before-follow-link nil
+ "The window configuration before following a link.
+This is saved in case the need arises to restore it.")
+
+(defvar org-open-link-marker (make-marker)
+ "Marker pointing to the location where `org-open-at-point; was called.")
+
+;;;###autoload
+(defun org-open-at-point-global ()
+ "Follow a link like Org-mode does.
+This command can be called in any mode to follow a link that has
+Org-mode syntax."
+ (interactive)
+ (org-run-like-in-org-mode 'org-open-at-point))
+
+(defun org-open-at-point (&optional in-emacs)
+ "Open link at or after point.
+If there is no link at point, this function will search forward up to
+the end of the current subtree.
+Normally, files will be opened by an appropriate application. If the
+optional argument IN-EMACS is non-nil, Emacs will visit the file."
+ (interactive "P")
+ (catch 'abort
+ (move-marker org-open-link-marker (point))
+ (setq org-window-config-before-follow-link (current-window-configuration))
+ (org-remove-occur-highlights nil nil t)
+ (if (org-at-timestamp-p t)
+ (org-follow-timestamp-link)
+ (let (type path link line search (pos (point)))
+ (catch 'match
+ (save-excursion
+ (skip-chars-forward "^]\n\r")
+ (when (org-in-regexp org-bracket-link-regexp)
+ (setq link (org-link-unescape (org-match-string-no-properties 1)))
+ (while (string-match " *\n *" link)
+ (setq link (replace-match " " t t link)))
+ (setq link (org-link-expand-abbrev link))
+ (if (string-match org-link-re-with-space2 link)
+ (setq type (match-string 1 link) path (match-string 2 link))
+ (setq type "thisfile" path link))
+ (throw 'match t)))
+
+ (when (get-text-property (point) 'org-linked-text)
+ (setq type "thisfile"
+ pos (if (get-text-property (1+ (point)) 'org-linked-text)
+ (1+ (point)) (point))
+ path (buffer-substring
+ (previous-single-property-change pos 'org-linked-text)
+ (next-single-property-change pos 'org-linked-text)))
+ (throw 'match t))
+
+ (save-excursion
+ (when (or (org-in-regexp org-angle-link-re)
+ (org-in-regexp org-plain-link-re))
+ (setq type (match-string 1) path (match-string 2))
+ (throw 'match t)))
+ (when (org-in-regexp "\\<\\([^><\n]+\\)\\>")
+ (setq type "tree-match"
+ path (match-string 1))
+ (throw 'match t))
+ (save-excursion
+ (when (org-in-regexp (org-re "\\(:[[:alnum:]_@:]+\\):[ \t]*$"))
+ (setq type "tags"
+ path (match-string 1))
+ (while (string-match ":" path)
+ (setq path (replace-match "+" t t path)))
+ (throw 'match t))))
+ (unless path
+ (error "No link found"))
+ ;; Remove any trailing spaces in path
+ (if (string-match " +\\'" path)
+ (setq path (replace-match "" t t path)))
+
+ (cond
+
+ ((assoc type org-link-protocols)
+ (funcall (nth 1 (assoc type org-link-protocols)) path))
+
+ ((equal type "mailto")
+ (let ((cmd (car org-link-mailto-program))
+ (args (cdr org-link-mailto-program)) args1
+ (address path) (subject "") a)
+ (if (string-match "\\(.*\\)::\\(.*\\)" path)
+ (setq address (match-string 1 path)
+ subject (org-link-escape (match-string 2 path))))
+ (while args
+ (cond
+ ((not (stringp (car args))) (push (pop args) args1))
+ (t (setq a (pop args))
+ (if (string-match "%a" a)
+ (setq a (replace-match address t t a)))
+ (if (string-match "%s" a)
+ (setq a (replace-match subject t t a)))
+ (push a args1))))
+ (apply cmd (nreverse args1))))
+
+ ((member type '("http" "https" "ftp" "news"))
+ (browse-url (concat type ":" (org-link-escape
+ path org-link-escape-chars-browser))))
+
+ ((string= type "tags")
+ (org-tags-view in-emacs path))
+ ((string= type "thisfile")
+ (if in-emacs
+ (switch-to-buffer-other-window
+ (org-get-buffer-for-internal-link (current-buffer)))
+ (org-mark-ring-push))
+ (let ((cmd `(org-link-search
+ ,path
+ ,(cond ((equal in-emacs '(4)) 'occur)
+ ((equal in-emacs '(16)) 'org-occur)
+ (t nil))
+ ,pos)))
+ (condition-case nil (eval cmd)
+ (error (progn (widen) (eval cmd))))))
+
+ ((string= type "tree-match")
+ (org-occur (concat "\\[" (regexp-quote path) "\\]")))
+
+ ((string= type "file")
+ (if (string-match "::\\([0-9]+\\)\\'" path)
+ (setq line (string-to-number (match-string 1 path))
+ path (substring path 0 (match-beginning 0)))
+ (if (string-match "::\\(.+\\)\\'" path)
+ (setq search (match-string 1 path)
+ path (substring path 0 (match-beginning 0)))))
+ (if (string-match "[*?{]" (file-name-nondirectory path))
+ (dired path)
+ (org-open-file path in-emacs line search)))
+
+ ((string= type "news")
+ (org-follow-gnus-link path))
+
+ ((string= type "bbdb")
+ (org-follow-bbdb-link path))
+
+ ((string= type "info")
+ (org-follow-info-link path))
+
+ ((string= type "gnus")
+ (let (group article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in Gnus link"))
+ (setq group (match-string 1 path)
+ article (match-string 3 path))
+ (org-follow-gnus-link group article)))
+
+ ((string= type "vm")
+ (let (folder article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in VM link"))
+ (setq folder (match-string 1 path)
+ article (match-string 3 path))
+ ;; in-emacs is the prefix arg, will be interpreted as read-only
+ (org-follow-vm-link folder article in-emacs)))
+
+ ((string= type "wl")
+ (let (folder article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in Wanderlust link"))
+ (setq folder (match-string 1 path)
+ article (match-string 3 path))
+ (org-follow-wl-link folder article)))
+
+ ((string= type "mhe")
+ (let (folder article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in MHE link"))
+ (setq folder (match-string 1 path)
+ article (match-string 3 path))
+ (org-follow-mhe-link folder article)))
+
+ ((string= type "rmail")
+ (let (folder article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in RMAIL link"))
+ (setq folder (match-string 1 path)
+ article (match-string 3 path))
+ (org-follow-rmail-link folder article)))
+
+ ((string= type "shell")
+ (let ((cmd path))
+ (if (or (not org-confirm-shell-link-function)
+ (funcall org-confirm-shell-link-function
+ (format "Execute \"%s\" in shell? "
+ (org-add-props cmd nil
+ 'face 'org-warning))))
+ (progn
+ (message "Executing %s" cmd)
+ (shell-command cmd))
+ (error "Abort"))))
+
+ ((string= type "elisp")
+ (let ((cmd path))
+ (if (or (not org-confirm-elisp-link-function)
+ (funcall org-confirm-elisp-link-function
+ (format "Execute \"%s\" as elisp? "
+ (org-add-props cmd nil
+ 'face 'org-warning))))
+ (message "%s => %s" cmd (eval (read cmd)))
+ (error "Abort"))))
+
+ (t
+ (browse-url-at-point)))))
+ (move-marker org-open-link-marker nil)))
+
+;;; File search
+
+(defvar org-create-file-search-functions nil
+ "List of functions to construct the right search string for a file link.
+These functions are called in turn with point at the location to
+which the link should point.
+
+A function in the hook should first test if it would like to
+handle this file type, for example by checking the major-mode or
+the file extension. If it decides not to handle this file, it
+should just return nil to give other functions a chance. If it
+does handle the file, it must return the search string to be used
+when following the link. The search string will be part of the
+file link, given after a double colon, and `org-open-at-point'
+will automatically search for it. If special measures must be
+taken to make the search successful, another function should be
+added to the companion hook `org-execute-file-search-functions',
+which see.
+
+A function in this hook may also use `setq' to set the variable
+`description' to provide a suggestion for the descriptive text to
+be used for this link when it gets inserted into an Org-mode
+buffer with \\[org-insert-link].")
+
+(defvar org-execute-file-search-functions nil
+ "List of functions to execute a file search triggered by a link.
+
+Functions added to this hook must accept a single argument, the
+search string that was part of the file link, the part after the
+double colon. The function must first check if it would like to
+handle this search, for example by checking the major-mode or the
+file extension. If it decides not to handle this search, it
+should just return nil to give other functions a chance. If it
+does handle the search, it must return a non-nil value to keep
+other functions from trying.
+
+Each function can access the current prefix argument through the
+variable `current-prefix-argument'. Note that a single prefix is
+used to force opening a link in Emacs, so it may be good to only
+use a numeric or double prefix to guide the search function.
+
+In case this is needed, a function in this hook can also restore
+the window configuration before `org-open-at-point' was called using:
+
+ (set-window-configuration org-window-config-before-follow-link)")
+
+(defun org-link-search (s &optional type avoid-pos)
+ "Search for a link search option.
+If S is surrounded by forward slashes, it is interpreted as a
+regular expression. In org-mode files, this will create an `org-occur'
+sparse tree. In ordinary files, `occur' will be used to list matches.
+If the current buffer is in `dired-mode', grep will be used to search
+in all files. If AVOID-POS is given, ignore matches near that position."
+ (let ((case-fold-search t)
+ (s0 (mapconcat 'identity (org-split-string s "[ \t\r\n]+") " "))
+ (markers (concat "\\(?:" (mapconcat (lambda (x) (regexp-quote (car x)))
+ (append '(("") (" ") ("\t") ("\n"))
+ org-emphasis-alist)
+ "\\|") "\\)"))
+ (pos (point))
+ (pre "") (post "")
+ words re0 re1 re2 re3 re4 re5 re2a reall)
+ (cond
+ ;; First check if there are any special
+ ((run-hook-with-args-until-success 'org-execute-file-search-functions s))
+ ;; Now try the builtin stuff
+ ((save-excursion
+ (goto-char (point-min))
+ (and
+ (re-search-forward
+ (concat "<<" (regexp-quote s0) ">>") nil t)
+ (setq pos (match-beginning 0))))
+ ;; There is an exact target for this
+ (goto-char pos))
+ ((string-match "^/\\(.*\\)/$" s)
+ ;; A regular expression
+ (cond
+ ((org-mode-p)
+ (org-occur (match-string 1 s)))
+ ;;((eq major-mode 'dired-mode)
+ ;; (grep (concat "grep -n -e '" (match-string 1 s) "' *")))
+ (t (org-do-occur (match-string 1 s)))))
+ (t
+ ;; A normal search strings
+ (when (equal (string-to-char s) ?*)
+ ;; Anchor on headlines, post may include tags.
+ (setq pre "^\\*+[ \t]+\\(?:\\sw+\\)?[ \t]*"
+ post (org-re "[ \t]*\\(?:[ \t]+:[[:alnum:]_@:+]:[ \t]*\\)?$")
+ s (substring s 1)))
+ (remove-text-properties
+ 0 (length s)
+ '(face nil mouse-face nil keymap nil fontified nil) s)
+ ;; Make a series of regular expressions to find a match
+ (setq words (org-split-string s "[ \n\r\t]+")
+ re0 (concat "\\(<<" (regexp-quote s0) ">>\\)")
+ re2 (concat markers "\\(" (mapconcat 'downcase words "[ \t]+")
+ "\\)" markers)
+ re2a (concat "[ \t\r\n]\\(" (mapconcat 'downcase words "[ \t\r\n]+") "\\)[ \t\r\n]")
+ re4 (concat "[^a-zA-Z_]\\(" (mapconcat 'downcase words "[^a-zA-Z_\r\n]+") "\\)[^a-zA-Z_]")
+ re1 (concat pre re2 post)
+ re3 (concat pre re4 post)
+ re5 (concat pre ".*" re4)
+ re2 (concat pre re2)
+ re2a (concat pre re2a)
+ re4 (concat pre re4)
+ reall (concat "\\(" re0 "\\)\\|\\(" re1 "\\)\\|\\(" re2
+ "\\)\\|\\(" re3 "\\)\\|\\(" re4 "\\)\\|\\("
+ re5 "\\)"
+ ))
+ (cond
+ ((eq type 'org-occur) (org-occur reall))
+ ((eq type 'occur) (org-do-occur (downcase reall) 'cleanup))
+ (t (goto-char (point-min))
+ (if (or (org-search-not-self 1 re0 nil t)
+ (org-search-not-self 1 re1 nil t)
+ (org-search-not-self 1 re2 nil t)
+ (org-search-not-self 1 re2a nil t)
+ (org-search-not-self 1 re3 nil t)
+ (org-search-not-self 1 re4 nil t)
+ (org-search-not-self 1 re5 nil t)
+ )
+ (goto-char (match-beginning 1))
+ (goto-char pos)
+ (error "No match")))))
+ (t
+ ;; Normal string-search
+ (goto-char (point-min))
+ (if (search-forward s nil t)
+ (goto-char (match-beginning 0))
+ (error "No match"))))
+ (and (org-mode-p) (org-show-context 'link-search))))
+
+(defun org-search-not-self (group &rest args)
+ "Execute `re-search-forward', but only accept matches that do not
+enclose the position of `org-open-link-marker'."
+ (let ((m org-open-link-marker))
+ (catch 'exit
+ (while (apply 're-search-forward args)
+ (unless (get-text-property (match-end group) 'intangible) ; Emacs 21
+ (goto-char (match-end group))
+ (if (and (or (not (eq (marker-buffer m) (current-buffer)))
+ (> (match-beginning 0) (marker-position m))
+ (< (match-end 0) (marker-position m)))
+ (save-match-data
+ (or (not (org-in-regexp
+ org-bracket-link-analytic-regexp 1))
+ (not (match-end 4)) ; no description
+ (and (<= (match-beginning 4) (point))
+ (>= (match-end 4) (point))))))
+ (throw 'exit (point))))))))
+
+(defun org-get-buffer-for-internal-link (buffer)
+ "Return a buffer to be used for displaying the link target of internal links."
+ (cond
+ ((not org-display-internal-link-with-indirect-buffer)
+ buffer)
+ ((string-match "(Clone)$" (buffer-name buffer))
+ (message "Buffer is already a clone, not making another one")
+ ;; we also do not modify visibility in this case
+ buffer)
+ (t ; make a new indirect buffer for displaying the link
+ (let* ((bn (buffer-name buffer))
+ (ibn (concat bn "(Clone)"))
+ (ib (or (get-buffer ibn) (make-indirect-buffer buffer ibn 'clone))))
+ (with-current-buffer ib (org-overview))
+ ib))))
+
+(defun org-do-occur (regexp &optional cleanup)
+ "Call the Emacs command `occur'.
+If CLEANUP is non-nil, remove the printout of the regular expression
+in the *Occur* buffer. This is useful if the regex is long and not useful
+to read."
+ (occur regexp)
+ (when cleanup
+ (let ((cwin (selected-window)) win beg end)
+ (when (setq win (get-buffer-window "*Occur*"))
+ (select-window win))
+ (goto-char (point-min))
+ (when (re-search-forward "match[a-z]+" nil t)
+ (setq beg (match-end 0))
+ (if (re-search-forward "^[ \t]*[0-9]+" nil t)
+ (setq end (1- (match-beginning 0)))))
+ (and beg end (let ((inhibit-read-only t)) (delete-region beg end)))
+ (goto-char (point-min))
+ (select-window cwin))))
+
+;;; The mark ring for links jumps
+
+(defvar org-mark-ring nil
+ "Mark ring for positions before jumps in Org-mode.")
+(defvar org-mark-ring-last-goto nil
+ "Last position in the mark ring used to go back.")
+;; Fill and close the ring
+(setq org-mark-ring nil org-mark-ring-last-goto nil) ;; in case file is reloaded
+(loop for i from 1 to org-mark-ring-length do
+ (push (make-marker) org-mark-ring))
+(setcdr (nthcdr (1- org-mark-ring-length) org-mark-ring)
+ org-mark-ring)
+
+(defun org-mark-ring-push (&optional pos buffer)
+ "Put the current position or POS into the mark ring and rotate it."
+ (interactive)
+ (setq pos (or pos (point)))
+ (setq org-mark-ring (nthcdr (1- org-mark-ring-length) org-mark-ring))
+ (move-marker (car org-mark-ring)
+ (or pos (point))
+ (or buffer (current-buffer)))
+ (message "%s"
+ (substitute-command-keys
+ "Position saved to mark ring, go back with \\[org-mark-ring-goto].")))
+
+(defun org-mark-ring-goto (&optional n)
+ "Jump to the previous position in the mark ring.
+With prefix arg N, jump back that many stored positions. When
+called several times in succession, walk through the entire ring.
+Org-mode commands jumping to a different position in the current file,
+or to another Org-mode file, automatically push the old position
+onto the ring."
+ (interactive "p")
+ (let (p m)
+ (if (eq last-command this-command)
+ (setq p (nthcdr n (or org-mark-ring-last-goto org-mark-ring)))
+ (setq p org-mark-ring))
+ (setq org-mark-ring-last-goto p)
+ (setq m (car p))
+ (switch-to-buffer (marker-buffer m))
+ (goto-char m)
+ (if (or (org-invisible-p) (org-invisible-p2)) (org-show-context 'mark-goto))))
+
+(defun org-remove-angle-brackets (s)
+ (if (equal (substring s 0 1) "<") (setq s (substring s 1)))
+ (if (equal (substring s -1) ">") (setq s (substring s 0 -1)))
+ s)
+(defun org-add-angle-brackets (s)
+ (if (equal (substring s 0 1) "<") nil (setq s (concat "<" s)))
+ (if (equal (substring s -1) ">") nil (setq s (concat s ">")))
+ s)
+
+;;; Following specific links
+
+(defun org-follow-timestamp-link ()
+ (cond
+ ((org-at-date-range-p t)
+ (let ((org-agenda-start-on-weekday)
+ (t1 (match-string 1))
+ (t2 (match-string 2)))
+ (setq t1 (time-to-days (org-time-string-to-time t1))
+ t2 (time-to-days (org-time-string-to-time t2)))
+ (org-agenda-list nil t1 (1+ (- t2 t1)))))
+ ((org-at-timestamp-p t)
+ (org-agenda-list nil (time-to-days (org-time-string-to-time
+ (substring (match-string 1) 0 10)))
+ 1))
+ (t (error "This should not happen"))))
+
+
+(defun org-follow-bbdb-link (name)
+ "Follow a BBDB link to NAME."
+ (require 'bbdb)
+ (let ((inhibit-redisplay (not debug-on-error))
+ (bbdb-electric-p nil))
+ (catch 'exit
+ ;; Exact match on name
+ (bbdb-name (concat "\\`" name "\\'") nil)
+ (if (< 0 (buffer-size (get-buffer "*BBDB*"))) (throw 'exit nil))
+ ;; Exact match on name
+ (bbdb-company (concat "\\`" name "\\'") nil)
+ (if (< 0 (buffer-size (get-buffer "*BBDB*"))) (throw 'exit nil))
+ ;; Partial match on name
+ (bbdb-name name nil)
+ (if (< 0 (buffer-size (get-buffer "*BBDB*"))) (throw 'exit nil))
+ ;; Partial match on company
+ (bbdb-company name nil)
+ (if (< 0 (buffer-size (get-buffer "*BBDB*"))) (throw 'exit nil))
+ ;; General match including network address and notes
+ (bbdb name nil)
+ (when (= 0 (buffer-size (get-buffer "*BBDB*")))
+ (delete-window (get-buffer-window "*BBDB*"))
+ (error "No matching BBDB record")))))
+
+(defun org-follow-info-link (name)
+ "Follow an info file & node link to NAME."
+ (if (or (string-match "\\(.*\\)::?\\(.*\\)" name)
+ (string-match "\\(.*\\)" name))
+ (progn
+ (require 'info)
+ (if (match-string 2 name) ; If there isn't a node, choose "Top"
+ (Info-find-node (match-string 1 name) (match-string 2 name))
+ (Info-find-node (match-string 1 name) "Top")))
+ (message "Could not open: %s" name)))
+
+(defun org-follow-gnus-link (&optional group article)
+ "Follow a Gnus link to GROUP and ARTICLE."
+ (require 'gnus)
+ (funcall (cdr (assq 'gnus org-link-frame-setup)))
+ (if gnus-other-frame-object (select-frame gnus-other-frame-object))
+ (cond ((and group article)
+ (gnus-group-read-group 1 nil group)
+ (gnus-summary-goto-article (string-to-number article) nil t))
+ (group (gnus-group-jump-to-group group))))
+
+(defun org-follow-vm-link (&optional folder article readonly)
+ "Follow a VM link to FOLDER and ARTICLE."
+ (require 'vm)
+ (setq article (org-add-angle-brackets article))
+ (if (string-match "^//\\([a-zA-Z]+@\\)?\\([^:]+\\):\\(.*\\)" folder)
+ ;; ange-ftp or efs or tramp access
+ (let ((user (or (match-string 1 folder) (user-login-name)))
+ (host (match-string 2 folder))
+ (file (match-string 3 folder)))
+ (cond
+ ((featurep 'tramp)
+ ;; use tramp to access the file
+ (if (featurep 'xemacs)
+ (setq folder (format "[%s@%s]%s" user host file))
+ (setq folder (format "/%s@%s:%s" user host file))))
+ (t
+ ;; use ange-ftp or efs
+ (require (if (featurep 'xemacs) 'efs 'ange-ftp))
+ (setq folder (format "/%s@%s:%s" user host file))))))
+ (when folder
+ (funcall (cdr (assq 'vm org-link-frame-setup)) folder readonly)
+ (sit-for 0.1)
+ (when article
+ (vm-select-folder-buffer)
+ (widen)
+ (let ((case-fold-search t))
+ (goto-char (point-min))
+ (if (not (re-search-forward
+ (concat "^" "message-id: *" (regexp-quote article))))
+ (error "Could not find the specified message in this folder"))
+ (vm-isearch-update)
+ (vm-isearch-narrow)
+ (vm-beginning-of-message)
+ (vm-summarize)))))
+
+(defun org-follow-wl-link (folder article)
+ "Follow a Wanderlust link to FOLDER and ARTICLE."
+ (if (and (string= folder "%")
+ article
+ (string-match "^\\([^#]+\\)\\(#\\(.*\\)\\)?" article))
+ ;; XXX: imap-uw supports folders starting with '#' such as "#mh/inbox".
+ ;; Thus, we recompose folder and article ids.
+ (setq folder (format "%s#%s" folder (match-string 1 article))
+ article (match-string 3 article)))
+ (if (not (elmo-folder-exists-p (wl-folder-get-elmo-folder folder)))
+ (error "No such folder: %s" folder))
+ (wl-summary-goto-folder-subr folder 'no-sync t nil t nil nil)
+ (and article
+ (wl-summary-jump-to-msg-by-message-id (org-add-angle-brackets article))
+ (wl-summary-redisplay)))
+
+(defun org-follow-rmail-link (folder article)
+ "Follow an RMAIL link to FOLDER and ARTICLE."
+ (setq article (org-add-angle-brackets article))
+ (let (message-number)
+ (save-excursion
+ (save-window-excursion
+ (rmail (if (string= folder "RMAIL") rmail-file-name folder))
+ (setq message-number
+ (save-restriction
+ (widen)
+ (goto-char (point-max))
+ (if (re-search-backward
+ (concat "^Message-ID:\\s-+" (regexp-quote
+ (or article "")))
+ nil t)
+ (rmail-what-message))))))
+ (if message-number
+ (progn
+ (rmail (if (string= folder "RMAIL") rmail-file-name folder))
+ (rmail-show-message message-number)
+ message-number)
+ (error "Message not found"))))
+
+;;; mh-e integration based on planner-mode
+(defun org-mhe-get-message-real-folder ()
+ "Return the name of the current message real folder, so if you use
+sequences, it will now work."
+ (save-excursion
+ (let* ((folder
+ (if (equal major-mode 'mh-folder-mode)
+ mh-current-folder
+ ;; Refer to the show buffer
+ mh-show-folder-buffer))
+ (end-index
+ (if (boundp 'mh-index-folder)
+ (min (length mh-index-folder) (length folder))))
+ )
+ ;; a simple test on mh-index-data does not work, because
+ ;; mh-index-data is always nil in a show buffer.
+ (if (and (boundp 'mh-index-folder)
+ (string= mh-index-folder (substring folder 0 end-index)))
+ (if (equal major-mode 'mh-show-mode)
+ (save-window-excursion
+ (let (pop-up-frames)
+ (when (buffer-live-p (get-buffer folder))
+ (progn
+ (pop-to-buffer folder)
+ (org-mhe-get-message-folder-from-index)
+ )
+ )))
+ (org-mhe-get-message-folder-from-index)
+ )
+ folder
+ )
+ )))
+
+(defun org-mhe-get-message-folder-from-index ()
+ "Returns the name of the message folder in a index folder buffer."
+ (save-excursion
+ (mh-index-previous-folder)
+ (re-search-forward "^\\(+.*\\)$" nil t)
+ (message "%s" (match-string 1))))
+
+(defun org-mhe-get-message-folder ()
+ "Return the name of the current message folder. Be careful if you
+use sequences."
+ (save-excursion
+ (if (equal major-mode 'mh-folder-mode)
+ mh-current-folder
+ ;; Refer to the show buffer
+ mh-show-folder-buffer)))
+
+(defun org-mhe-get-message-num ()
+ "Return the number of the current message. Be careful if you
+use sequences."
+ (save-excursion
+ (if (equal major-mode 'mh-folder-mode)
+ (mh-get-msg-num nil)
+ ;; Refer to the show buffer
+ (mh-show-buffer-message-number))))
+
+(defun org-mhe-get-header (header)
+ "Return a header of the message in folder mode. This will create a
+show buffer for the corresponding message. If you have a more clever
+idea..."
+ (let* ((folder (org-mhe-get-message-folder))
+ (num (org-mhe-get-message-num))
+ (buffer (get-buffer-create (concat "show-" folder)))
+ (header-field))
+ (with-current-buffer buffer
+ (mh-display-msg num folder)
+ (if (equal major-mode 'mh-folder-mode)
+ (mh-header-display)
+ (mh-show-header-display))
+ (set-buffer buffer)
+ (setq header-field (mh-get-header-field header))
+ (if (equal major-mode 'mh-folder-mode)
+ (mh-show)
+ (mh-show-show))
+ header-field)))
+
+(defun org-follow-mhe-link (folder article)
+ "Follow an MHE link to FOLDER and ARTICLE.
+If ARTICLE is nil FOLDER is shown. If the configuration variable
+`org-mhe-search-all-folders' is t and `mh-searcher' is pick,
+ARTICLE is searched in all folders. Indexed searches (swish++,
+namazu, and others supported by MH-E) will always search in all
+folders."
+ (require 'mh-e)
+ (require 'mh-search)
+ (require 'mh-utils)
+ (mh-find-path)
+ (if (not article)
+ (mh-visit-folder (mh-normalize-folder-name folder))
+ (setq article (org-add-angle-brackets article))
+ (mh-search-choose)
+ (if (equal mh-searcher 'pick)
+ (progn
+ (mh-search folder (list "--message-id" article))
+ (when (and org-mhe-search-all-folders
+ (not (org-mhe-get-message-real-folder)))
+ (kill-this-buffer)
+ (mh-search "+" (list "--message-id" article))))
+ (mh-search "+" article))
+ (if (org-mhe-get-message-real-folder)
+ (mh-show-msg 1)
+ (kill-this-buffer)
+ (error "Message not found"))))
+
+;;; BibTeX links
+
+;; Use the custom search meachnism to construct and use search strings for
+;; file links to BibTeX database entries.
+
+(defun org-create-file-search-in-bibtex ()
+ "Create the search string and description for a BibTeX database entry."
+ (when (eq major-mode 'bibtex-mode)
+ ;; yes, we want to construct this search string.
+ ;; Make a good description for this entry, using names, year and the title
+ ;; Put it into the `description' variable which is dynamically scoped.
+ (let ((bibtex-autokey-names 1)
+ (bibtex-autokey-names-stretch 1)
+ (bibtex-autokey-name-case-convert-function 'identity)
+ (bibtex-autokey-name-separator " & ")
+ (bibtex-autokey-additional-names " et al.")
+ (bibtex-autokey-year-length 4)
+ (bibtex-autokey-name-year-separator " ")
+ (bibtex-autokey-titlewords 3)
+ (bibtex-autokey-titleword-separator " ")
+ (bibtex-autokey-titleword-case-convert-function 'identity)
+ (bibtex-autokey-titleword-length 'infty)
+ (bibtex-autokey-year-title-separator ": "))
+ (setq description (bibtex-generate-autokey)))
+ ;; Now parse the entry, get the key and return it.
+ (save-excursion
+ (bibtex-beginning-of-entry)
+ (cdr (assoc "=key=" (bibtex-parse-entry))))))
+
+(defun org-execute-file-search-in-bibtex (s)
+ "Find the link search string S as a key for a database entry."
+ (when (eq major-mode 'bibtex-mode)
+ ;; Yes, we want to do the search in this file.
+ ;; We construct a regexp that searches for "@entrytype{" followed by the key
+ (goto-char (point-min))
+ (and (re-search-forward (concat "@[a-zA-Z]+[ \t\n]*{[ \t\n]*"
+ (regexp-quote s) "[ \t\n]*,") nil t)
+ (goto-char (match-beginning 0)))
+ (if (and (match-beginning 0) (equal current-prefix-arg '(16)))
+ ;; Use double prefix to indicate that any web link should be browsed
+ (let ((b (current-buffer)) (p (point)))
+ ;; Restore the window configuration because we just use the web link
+ (set-window-configuration org-window-config-before-follow-link)
+ (save-excursion (set-buffer b) (goto-char p)
+ (bibtex-url)))
+ (recenter 0)) ; Move entry start to beginning of window
+ ;; return t to indicate that the search is done.
+ t))
+
+;; Finally add the functions to the right hooks.
+(add-hook 'org-create-file-search-functions 'org-create-file-search-in-bibtex)
+(add-hook 'org-execute-file-search-functions 'org-execute-file-search-in-bibtex)
+
+;; end of Bibtex link setup
+
+;;; Following file links
+
+(defun org-open-file (path &optional in-emacs line search)
+ "Open the file at PATH.
+First, this expands any special file name abbreviations. Then the
+configuration variable `org-file-apps' is checked if it contains an
+entry for this file type, and if yes, the corresponding command is launched.
+If no application is found, Emacs simply visits the file.
+With optional argument IN-EMACS, Emacs will visit the file.
+Optional LINE specifies a line to go to, optional SEARCH a string to
+search for. If LINE or SEARCH is given, the file will always be
+opened in Emacs.
+If the file does not exist, an error is thrown."
+ (setq in-emacs (or in-emacs line search))
+ (let* ((file (if (equal path "")
+ buffer-file-name
+ (substitute-in-file-name (expand-file-name path))))
+ (apps (append org-file-apps (org-default-apps)))
+ (remp (and (assq 'remote apps) (org-file-remote-p file)))
+ (dirp (if remp nil (file-directory-p file)))
+ (dfile (downcase file))
+ (old-buffer (current-buffer))
+ (old-pos (point))
+ (old-mode major-mode)
+ ext cmd)
+ (if (string-match "^.*\\.\\([a-zA-Z0-9]+\\.gz\\)$" dfile)
+ (setq ext (match-string 1 dfile))
+ (if (string-match "^.*\\.\\([a-zA-Z0-9]+\\)$" dfile)
+ (setq ext (match-string 1 dfile))))
+ (if in-emacs
+ (setq cmd 'emacs)
+ (setq cmd (or (and remp (cdr (assoc 'remote apps)))
+ (and dirp (cdr (assoc 'directory apps)))
+ (cdr (assoc ext apps))
+ (cdr (assoc t apps)))))
+ (when (eq cmd 'mailcap)
+ (require 'mailcap)
+ (mailcap-parse-mailcaps)
+ (let* ((mime-type (mailcap-extension-to-mime (or ext "")))
+ (command (mailcap-mime-info mime-type)))
+ (if (stringp command)
+ (setq cmd command)
+ (setq cmd 'emacs))))
+ (if (and (not (eq cmd 'emacs)) ; Emacs has no problems with non-ex files
+ (not (file-exists-p file))
+ (not org-open-non-existing-files))
+ (error "No such file: %s" file))
+ (cond
+ ((and (stringp cmd) (not (string-match "^\\s-*$" cmd)))
+ ;; Remove quotes around the file name - we'll use shell-quote-argument.
+ (while (string-match "['\"]%s['\"]" cmd)
+ (setq cmd (replace-match "%s" t t cmd)))
+ (while (string-match "%s" cmd)
+ (setq cmd (replace-match (shell-quote-argument file) t t cmd)))
+ (save-window-excursion
+ (start-process-shell-command cmd nil cmd)))
+ ((or (stringp cmd)
+ (eq cmd 'emacs))
+ (funcall (cdr (assq 'file org-link-frame-setup)) file)
+ (widen)
+ (if line (goto-line line)
+ (if search (org-link-search search))))
+ ((consp cmd)
+ (eval cmd))
+ (t (funcall (cdr (assq 'file org-link-frame-setup)) file)))
+ (and (org-mode-p) (eq old-mode 'org-mode)
+ (or (not (equal old-buffer (current-buffer)))
+ (not (equal old-pos (point))))
+ (org-mark-ring-push old-pos old-buffer))))
+
+(defun org-default-apps ()
+ "Return the default applications for this operating system."
+ (cond
+ ((eq system-type 'darwin)
+ org-file-apps-defaults-macosx)
+ ((eq system-type 'windows-nt)
+ org-file-apps-defaults-windowsnt)
+ (t org-file-apps-defaults-gnu)))
+
+(defvar ange-ftp-name-format) ; to silence the XEmacs compiler.
+(defun org-file-remote-p (file)
+ "Test whether FILE specifies a location on a remote system.
+Return non-nil if the location is indeed remote.
+
+For example, the filename \"/user@host:/foo\" specifies a location
+on the system \"/user@host:\"."
+ (cond ((fboundp 'file-remote-p)
+ (file-remote-p file))
+ ((fboundp 'tramp-handle-file-remote-p)
+ (tramp-handle-file-remote-p file))
+ ((and (boundp 'ange-ftp-name-format)
+ (string-match (car ange-ftp-name-format) file))
+ t)
+ (t nil)))
+
+
+;;;; Hooks for remember.el, and refiling
+
+(defvar annotation) ; from remember.el, dynamically scoped in `remember-mode'
+(defvar initial) ; from remember.el, dynamically scoped in `remember-mode'
+
+;;;###autoload
+(defun org-remember-insinuate ()
+ "Setup remember.el for use wiht Org-mode."
+ (require 'remember)
+ (setq remember-annotation-functions '(org-remember-annotation))
+ (setq remember-handler-functions '(org-remember-handler))
+ (add-hook 'remember-mode-hook 'org-remember-apply-template))
+
+;;;###autoload
+(defun org-remember-annotation ()
+ "Return a link to the current location as an annotation for remember.el.
+If you are using Org-mode files as target for data storage with
+remember.el, then the annotations should include a link compatible with the
+conventions in Org-mode. This function returns such a link."
+ (org-store-link nil))
+
+(defconst org-remember-help
+"Select a destination location for the note.
+UP/DOWN=headline TAB=cycle visibility [Q]uit RET/<left>/<right>=Store
+RET on headline -> Store as sublevel entry to current headline
+RET at beg-of-buf -> Append to file as level 2 headline
+<left>/<right> -> before/after current headline, same headings level")
+
+(defvar org-remember-previous-location nil)
+(defvar org-force-remember-template-char) ;; dynamically scoped
+
+(defun org-select-remember-template (&optional use-char)
+ (when org-remember-templates
+ (let* ((templates (mapcar (lambda (x)
+ (if (stringp (car x))
+ (append (list (nth 1 x) (car x)) (cddr x))
+ (append (list (car x) "") (cdr x))))
+ org-remember-templates))
+ (char (or use-char
+ (cond
+ ((= (length templates) 1)
+ (caar templates))
+ ((and (boundp 'org-force-remember-template-char)
+ org-force-remember-template-char)
+ (if (stringp org-force-remember-template-char)
+ (string-to-char org-force-remember-template-char)
+ org-force-remember-template-char))
+ (t
+ (message "Select template: %s"
+ (mapconcat
+ (lambda (x)
+ (cond
+ ((not (string-match "\\S-" (nth 1 x)))
+ (format "[%c]" (car x)))
+ ((equal (downcase (car x))
+ (downcase (aref (nth 1 x) 0)))
+ (format "[%c]%s" (car x)
+ (substring (nth 1 x) 1)))
+ (t (format "[%c]%s" (car x) (nth 1 x)))))
+ templates " "))
+ (let ((inhibit-quit t) (char0 (read-char-exclusive)))
+ (when (equal char0 ?\C-g)
+ (jump-to-register remember-register)
+ (kill-buffer remember-buffer))
+ char0))))))
+ (cddr (assoc char templates)))))
+
+(defvar x-last-selected-text)
+(defvar x-last-selected-text-primary)
+
+;;;###autoload
+(defun org-remember-apply-template (&optional use-char skip-interactive)
+ "Initialize *remember* buffer with template, invoke `org-mode'.
+This function should be placed into `remember-mode-hook' and in fact requires
+to be run from that hook to function properly."
+ (unless (fboundp 'remember-finalize)
+ (defalias 'remember-finalize 'remember-buffer))
+ (if org-remember-templates
+ (let* ((entry (org-select-remember-template use-char))
+ (tpl (car entry))
+ (plist-p (if org-store-link-plist t nil))
+ (file (if (and (nth 1 entry) (stringp (nth 1 entry))
+ (string-match "\\S-" (nth 1 entry)))
+ (nth 1 entry)
+ org-default-notes-file))
+ (headline (nth 2 entry))
+ (v-c (or (and (eq window-system 'x)
+ (fboundp 'x-cut-buffer-or-selection-value)
+ (x-cut-buffer-or-selection-value))
+ (org-bound-and-true-p x-last-selected-text)
+ (org-bound-and-true-p x-last-selected-text-primary)
+ (and (> (length kill-ring) 0) (current-kill 0))))
+ (v-t (format-time-string (car org-time-stamp-formats) (org-current-time)))
+ (v-T (format-time-string (cdr org-time-stamp-formats) (org-current-time)))
+ (v-u (concat "[" (substring v-t 1 -1) "]"))
+ (v-U (concat "[" (substring v-T 1 -1) "]"))
+ ;; `initial' and `annotation' are bound in `remember'
+ (v-i (if (boundp 'initial) initial))
+ (v-a (if (and (boundp 'annotation) annotation)
+ (if (equal annotation "[[]]") "" annotation)
+ ""))
+ (v-A (if (and v-a
+ (string-match "\\[\\(\\[.*?\\]\\)\\(\\[.*?\\]\\)?\\]" v-a))
+ (replace-match "[\\1[%^{Link description}]]" nil nil v-a)
+ v-a))
+ (v-n user-full-name)
+ (org-startup-folded nil)
+ org-time-was-given org-end-time-was-given x
+ prompt completions char time pos default histvar)
+ (setq org-store-link-plist
+ (append (list :annotation v-a :initial v-i)
+ org-store-link-plist))
+ (unless tpl (setq tpl "") (message "No template") (ding) (sit-for 1))
+ (erase-buffer)
+ (insert (substitute-command-keys
+ (format
+"## Filing location: Select interactively, default, or last used:
+## %s to select file and header location interactively.
+## %s \"%s\" -> \"* %s\"
+## C-u C-u C-c C-c \"%s\" -> \"* %s\"
+## To switch templates, use `\\[org-remember]'. To abort use `C-c C-k'.\n\n"
+ (if org-remember-store-without-prompt " C-u C-c C-c" " C-c C-c")
+ (if org-remember-store-without-prompt " C-c C-c" " C-u C-c C-c")
+ (abbreviate-file-name (or file org-default-notes-file))
+ (or headline "")
+ (or (car org-remember-previous-location) "???")
+ (or (cdr org-remember-previous-location) "???"))))
+ (insert tpl) (goto-char (point-min))
+ ;; Simple %-escapes
+ (while (re-search-forward "%\\([tTuUaiAc]\\)" nil t)
+ (when (and initial (equal (match-string 0) "%i"))
+ (save-match-data
+ (let* ((lead (buffer-substring
+ (point-at-bol) (match-beginning 0))))
+ (setq v-i (mapconcat 'identity
+ (org-split-string initial "\n")
+ (concat "\n" lead))))))
+ (replace-match
+ (or (eval (intern (concat "v-" (match-string 1)))) "")
+ t t))
+
+ ;; %[] Insert contents of a file.
+ (goto-char (point-min))
+ (while (re-search-forward "%\\[\\(.+\\)\\]" nil t)
+ (let ((start (match-beginning 0))
+ (end (match-end 0))
+ (filename (expand-file-name (match-string 1))))
+ (goto-char start)
+ (delete-region start end)
+ (condition-case error
+ (insert-file-contents filename)
+ (error (insert (format "%%![Couldn't insert %s: %s]"
+ filename error))))))
+ ;; %() embedded elisp
+ (goto-char (point-min))
+ (while (re-search-forward "%\\((.+)\\)" nil t)
+ (goto-char (match-beginning 0))
+ (let ((template-start (point)))
+ (forward-char 1)
+ (let ((result
+ (condition-case error
+ (eval (read (current-buffer)))
+ (error (format "%%![Error: %s]" error)))))
+ (delete-region template-start (point))
+ (insert result))))
+
+ ;; From the property list
+ (when plist-p
+ (goto-char (point-min))
+ (while (re-search-forward "%\\(:[-a-zA-Z]+\\)" nil t)
+ (and (setq x (or (plist-get org-store-link-plist
+ (intern (match-string 1))) ""))
+ (replace-match x t t))))
+
+ ;; Turn on org-mode in the remember buffer, set local variables
+ (org-mode)
+ (org-set-local 'org-finish-function 'remember-finalize)
+ (if (and file (string-match "\\S-" file) (not (file-directory-p file)))
+ (org-set-local 'org-default-notes-file file))
+ (if (and headline (stringp headline) (string-match "\\S-" headline))
+ (org-set-local 'org-remember-default-headline headline))
+ ;; Interactive template entries
+ (goto-char (point-min))
+ (while (re-search-forward "%^\\({\\([^}]*\\)}\\)?\\([guUtT]\\)?" nil t)
+ (setq char (if (match-end 3) (match-string 3))
+ prompt (if (match-end 2) (match-string 2)))
+ (goto-char (match-beginning 0))
+ (replace-match "")
+ (setq completions nil default nil)
+ (when prompt
+ (setq completions (org-split-string prompt "|")
+ prompt (pop completions)
+ default (car completions)
+ histvar (intern (concat
+ "org-remember-template-prompt-history::"
+ (or prompt "")))
+ completions (mapcar 'list completions)))
+ (cond
+ ((member char '("G" "g"))
+ (let* ((org-last-tags-completion-table
+ (org-global-tags-completion-table
+ (if (equal char "G") (org-agenda-files) (and file (list file)))))
+ (org-add-colon-after-tag-completion t)
+ (ins (completing-read
+ (if prompt (concat prompt ": ") "Tags: ")
+ 'org-tags-completion-function nil nil nil
+ 'org-tags-history)))
+ (setq ins (mapconcat 'identity
+ (org-split-string ins (org-re "[^[:alnum:]]+"))
+ ":"))
+ (when (string-match "\\S-" ins)
+ (or (equal (char-before) ?:) (insert ":"))
+ (insert ins)
+ (or (equal (char-after) ?:) (insert ":")))))
+ (char
+ (setq org-time-was-given (equal (upcase char) char))
+ (setq time (org-read-date (equal (upcase char) "U") t nil
+ prompt))
+ (org-insert-time-stamp time org-time-was-given
+ (member char '("u" "U"))
+ nil nil (list org-end-time-was-given)))
+ (t
+ (insert (org-completing-read
+ (concat (if prompt prompt "Enter string")
+ (if default (concat " [" default "]"))
+ ": ")
+ completions nil nil nil histvar default)))))
+ (goto-char (point-min))
+ (if (re-search-forward "%\\?" nil t)
+ (replace-match "")
+ (and (re-search-forward "^[^#\n]" nil t) (backward-char 1))))
+ (org-mode)
+ (org-set-local 'org-finish-function 'remember-finalize))
+ (when (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "%!" nil t))
+ (replace-match "")
+ (add-hook 'post-command-hook 'org-remember-finish-immediately 'append)))
+
+(defun org-remember-finish-immediately ()
+ "File remember note immediately.
+This should be run in `post-command-hook' and will remove itself
+from that hook."
+ (remove-hook 'post-command-hook 'org-remember-finish-immediately)
+ (when org-finish-function
+ (funcall org-finish-function)))
+
+
+;;;###autoload
+(defun org-remember (&optional goto org-force-remember-template-char)
+ "Call `remember'. If this is already a remember buffer, re-apply template.
+If there is an active region, make sure remember uses it as initial content
+of the remember buffer.
+
+When called interactively with a `C-u' prefix argument GOTO, don't remember
+anything, just go to the file/headline where the selected templated usually
+stores its notes. With a double prefix arg `C-u C-u', got to the last
+note stored by remember.
+
+Lisp programs can set ORG-FORCE-REMEMBER-TEMPLATE-CHAR to a character
+associated with a template in `org-remember-tempates'."
+ (interactive "P")
+ (cond
+ ((equal goto '(4)) (org-go-to-remember-target))
+ ((equal goto '(16)) (org-remember-goto-last-stored))
+ (t
+ (if (memq org-finish-function '(remember-buffer remember-finalize))
+ (progn
+ (when (< (length org-remember-templates) 2)
+ (error "No other template available"))
+ (erase-buffer)
+ (let ((annotation (plist-get org-store-link-plist :annotation))
+ (initial (plist-get org-store-link-plist :initial)))
+ (org-remember-apply-template))
+ (message "Press C-c C-c to remember data"))
+ (if (org-region-active-p)
+ (remember (buffer-substring (point) (mark)))
+ (call-interactively 'remember))))))
+
+(defun org-remember-goto-last-stored ()
+ "Go to the location where the last remember note was stored."
+ (interactive)
+ (bookmark-jump "org-remember-last-stored")
+ (message "This is the last note stored by remember"))
+
+(defun org-go-to-remember-target (&optional template-key)
+ "Go to the target location of a remember template.
+The user is queried for the template."
+ (interactive)
+ (let* ((entry (org-select-remember-template template-key))
+ (file (nth 1 entry))
+ (heading (nth 2 entry))
+ visiting)
+ (unless (and file (stringp file) (string-match "\\S-" file))
+ (setq file org-default-notes-file))
+ (unless (and heading (stringp heading) (string-match "\\S-" heading))
+ (setq heading org-remember-default-headline))
+ (setq visiting (org-find-base-buffer-visiting file))
+ (if (not visiting) (find-file-noselect file))
+ (switch-to-buffer (or visiting (get-file-buffer file)))
+ (widen)
+ (goto-char (point-min))
+ (if (re-search-forward
+ (concat "^\\*+[ \t]+" (regexp-quote heading)
+ (org-re "\\([ \t]+:[[:alnum:]@_:]*\\)?[ \t]*$"))
+ nil t)
+ (goto-char (match-beginning 0))
+ (error "Target headline not found: %s" heading))))
+
+(defvar org-note-abort nil) ; dynamically scoped
+
+;;;###autoload
+(defun org-remember-handler ()
+ "Store stuff from remember.el into an org file.
+First prompts for an org file. If the user just presses return, the value
+of `org-default-notes-file' is used.
+Then the command offers the headings tree of the selected file in order to
+file the text at a specific location.
+You can either immediately press RET to get the note appended to the
+file, or you can use vertical cursor motion and visibility cycling (TAB) to
+find a better place. Then press RET or <left> or <right> in insert the note.
+
+Key Cursor position Note gets inserted
+-----------------------------------------------------------------------------
+RET buffer-start as level 1 heading at end of file
+RET on headline as sublevel of the heading at cursor
+RET no heading at cursor position, level taken from context.
+ Or use prefix arg to specify level manually.
+<left> on headline as same level, before current heading
+<right> on headline as same level, after current heading
+
+So the fastest way to store the note is to press RET RET to append it to
+the default file. This way your current train of thought is not
+interrupted, in accordance with the principles of remember.el.
+You can also get the fast execution without prompting by using
+C-u C-c C-c to exit the remember buffer. See also the variable
+`org-remember-store-without-prompt'.
+
+Before being stored away, the function ensures that the text has a
+headline, i.e. a first line that starts with a \"*\". If not, a headline
+is constructed from the current date and some additional data.
+
+If the variable `org-adapt-indentation' is non-nil, the entire text is
+also indented so that it starts in the same column as the headline
+\(i.e. after the stars).
+
+See also the variable `org-reverse-note-order'."
+ (goto-char (point-min))
+ (while (looking-at "^[ \t]*\n\\|^##.*\n")
+ (replace-match ""))
+ (goto-char (point-max))
+ (beginning-of-line 1)
+ (while (looking-at "[ \t]*$\\|##.*")
+ (delete-region (1- (point)) (point-max))
+ (beginning-of-line 1))
+ (catch 'quit
+ (if org-note-abort (throw 'quit nil))
+ (let* ((txt (buffer-substring (point-min) (point-max)))
+ (fastp (org-xor (equal current-prefix-arg '(4))
+ org-remember-store-without-prompt))
+ (file (if fastp org-default-notes-file (org-get-org-file)))
+ (heading org-remember-default-headline)
+ (visiting (org-find-base-buffer-visiting file))
+ (org-startup-folded nil)
+ (org-startup-align-all-tables nil)
+ (org-goto-start-pos 1)
+ spos exitcmd level indent reversed)
+ (if (and (equal current-prefix-arg '(16)) org-remember-previous-location)
+ (setq file (car org-remember-previous-location)
+ heading (cdr org-remember-previous-location)))
+ (setq current-prefix-arg nil)
+ (if (string-match "[ \t\n]+\\'" txt)
+ (setq txt (replace-match "" t t txt)))
+ ;; Modify text so that it becomes a nice subtree which can be inserted
+ ;; into an org tree.
+ (let* ((lines (split-string txt "\n"))
+ first)
+ (setq first (car lines) lines (cdr lines))
+ (if (string-match "^\\*+ " first)
+ ;; Is already a headline
+ (setq indent nil)
+ ;; We need to add a headline: Use time and first buffer line
+ (setq lines (cons first lines)
+ first (concat "* " (current-time-string)
+ " (" (remember-buffer-desc) ")")
+ indent " "))
+ (if (and org-adapt-indentation indent)
+ (setq lines (mapcar
+ (lambda (x)
+ (if (string-match "\\S-" x)
+ (concat indent x) x))
+ lines)))
+ (setq txt (concat first "\n"
+ (mapconcat 'identity lines "\n"))))
+ (if (string-match "\n[ \t]*\n[ \t\n]*\\'" txt)
+ (setq txt (replace-match "\n\n" t t txt))
+ (if (string-match "[ \t\n]*\\'" txt)
+ (setq txt (replace-match "\n" t t txt))))
+ ;; Find the file
+ (if (not visiting) (find-file-noselect file))
+ (with-current-buffer (or visiting (get-file-buffer file))
+ (unless (org-mode-p)
+ (error "Target files for remember notes must be in Org-mode"))
+ (save-excursion
+ (save-restriction
+ (widen)
+ (and (goto-char (point-min))
+ (not (re-search-forward "^\\* " nil t))
+ (insert "\n* " (or heading "Notes") "\n"))
+ (setq reversed (org-notes-order-reversed-p))
+
+ ;; Find the default location
+ (when (and heading (stringp heading) (string-match "\\S-" heading))
+ (goto-char (point-min))
+ (if (re-search-forward
+ (concat "^\\*+[ \t]+" (regexp-quote heading)
+ (org-re "\\([ \t]+:[[:alnum:]@_:]*\\)?[ \t]*$"))
+ nil t)
+ (setq org-goto-start-pos (match-beginning 0))
+ (when fastp
+ (goto-char (point-max))
+ (unless (bolp) (newline))
+ (insert "* " heading "\n")
+ (setq org-goto-start-pos (point-at-bol 0)))))
+
+ ;; Ask the User for a location
+ (if fastp
+ (setq spos org-goto-start-pos
+ exitcmd 'return)
+ (setq spos (org-get-location (current-buffer) org-remember-help)
+ exitcmd (cdr spos)
+ spos (car spos)))
+ (if (not spos) (throw 'quit nil)) ; return nil to show we did
+ ; not handle this note
+ (goto-char spos)
+ (cond ((org-on-heading-p t)
+ (org-back-to-heading t)
+ (setq level (funcall outline-level))
+ (cond
+ ((eq exitcmd 'return)
+ ;; sublevel of current
+ (setq org-remember-previous-location
+ (cons (abbreviate-file-name file)
+ (org-get-heading 'notags)))
+ (if reversed
+ (outline-next-heading)
+ (org-end-of-subtree)
+ (if (not (bolp))
+ (if (looking-at "[ \t]*\n")
+ (beginning-of-line 2)
+ (end-of-line 1)
+ (insert "\n"))))
+ (bookmark-set "org-remember-last-stored")
+ (org-paste-subtree (org-get-legal-level level 1) txt))
+ ((eq exitcmd 'left)
+ ;; before current
+ (bookmark-set "org-remember-last-stored")
+ (org-paste-subtree level txt))
+ ((eq exitcmd 'right)
+ ;; after current
+ (org-end-of-subtree t)
+ (bookmark-set "org-remember-last-stored")
+ (org-paste-subtree level txt))
+ (t (error "This should not happen"))))
+
+ ((and (bobp) (not reversed))
+ ;; Put it at the end, one level below level 1
+ (save-restriction
+ (widen)
+ (goto-char (point-max))
+ (if (not (bolp)) (newline))
+ (bookmark-set "org-remember-last-stored")
+ (org-paste-subtree (org-get-legal-level 1 1) txt)))
+
+ ((and (bobp) reversed)
+ ;; Put it at the start, as level 1
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (re-search-forward "^\\*+ " nil t)
+ (beginning-of-line 1)
+ (bookmark-set "org-remember-last-stored")
+ (org-paste-subtree 1 txt)))
+ (t
+ ;; Put it right there, with automatic level determined by
+ ;; org-paste-subtree or from prefix arg
+ (bookmark-set "org-remember-last-stored")
+ (org-paste-subtree
+ (if (numberp current-prefix-arg) current-prefix-arg)
+ txt)))
+ (when remember-save-after-remembering
+ (save-buffer)
+ (if (not visiting) (kill-buffer (current-buffer)))))))))
+
+ t) ;; return t to indicate that we took care of this note.
+
+(defun org-get-org-file ()
+ "Read a filename, with default directory `org-directory'."
+ (let ((default (or org-default-notes-file remember-data-file)))
+ (read-file-name (format "File name [%s]: " default)
+ (file-name-as-directory org-directory)
+ default)))
+
+(defun org-notes-order-reversed-p ()
+ "Check if the current file should receive notes in reversed order."
+ (cond
+ ((not org-reverse-note-order) nil)
+ ((eq t org-reverse-note-order) t)
+ ((not (listp org-reverse-note-order)) nil)
+ (t (catch 'exit
+ (let ((all org-reverse-note-order)
+ entry)
+ (while (setq entry (pop all))
+ (if (string-match (car entry) buffer-file-name)
+ (throw 'exit (cdr entry))))
+ nil)))))
+
+;;; Refiling
+
+(defvar org-refile-target-table nil
+ "The list of refile targets, created by `org-refile'.")
+
+(defvar org-agenda-new-buffers nil
+ "Buffers created to visit agenda files.")
+
+(defun org-get-refile-targets ()
+ "Produce a table with refile targets."
+ (let ((entries org-refile-targets)
+ org-agenda-new-files targets txt re files f desc descre)
+ (while (setq entry (pop entries))
+ (setq files (car entry) desc (cdr entry))
+ (cond
+ ((null files) (setq files (list (current-buffer))))
+ ((eq files 'org-agenda-files)
+ (setq files (org-agenda-files 'unrestricted)))
+ ((and (symbolp files) (fboundp files))
+ (setq files (funcall files)))
+ ((and (symbolp files) (boundp files))
+ (setq files (symbol-value files))))
+ (if (stringp files) (setq files (list files)))
+ (cond
+ ((eq (car desc) :tag)
+ (setq descre (concat "^\\*+[ \t]+.*?:" (regexp-quote (cdr desc)) ":")))
+ ((eq (car desc) :todo)
+ (setq descre (concat "^\\*+[ \t]+" (regexp-quote (cdr desc)) "[ \t]")))
+ ((eq (car desc) :regexp)
+ (setq descre (cdr desc)))
+ ((eq (car desc) :level)
+ (setq descre (concat "^\\*\\{" (number-to-string
+ (if org-odd-levels-only
+ (1- (* 2 (cdr desc)))
+ (cdr desc)))
+ "\\}[ \t]")))
+ ((eq (car desc) :maxlevel)
+ (setq descre (concat "^\\*\\{1," (number-to-string
+ (if org-odd-levels-only
+ (1- (* 2 (cdr desc)))
+ (cdr desc)))
+ "\\}[ \t]")))
+ (t (error "Bad refiling target description %s" desc)))
+ (while (setq f (pop files))
+ (save-excursion
+ (set-buffer (if (bufferp f) f (org-get-agenda-file-buffer f)))
+ (if (bufferp f) (setq f (buffer-file-name (buffer-base-buffer f))))
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (while (re-search-forward descre nil t)
+ (goto-char (point-at-bol))
+ (when (looking-at org-complex-heading-regexp)
+ (setq txt (match-string 4)
+ re (concat "^" (regexp-quote
+ (buffer-substring (match-beginning 1)
+ (match-end 4)))))
+ (if (match-end 5) (setq re (concat re "[ \t]+"
+ (regexp-quote
+ (match-string 5)))))
+ (setq re (concat re "[ \t]*$"))
+ (when org-refile-use-outline-path
+ (setq txt (mapconcat 'identity
+ (append
+ (if (eq org-refile-use-outline-path 'file)
+ (list (file-name-nondirectory
+ (buffer-file-name (buffer-base-buffer))))
+ (if (eq org-refile-use-outline-path 'full-file-path)
+ (list (buffer-file-name (buffer-base-buffer)))))
+ (org-get-outline-path)
+ (list txt))
+ "/")))
+ (push (list txt f re (point)) targets))
+ (goto-char (point-at-eol))))))))
+ (org-release-buffers org-agenda-new-buffers)
+ (nreverse targets)))
+
+(defun org-get-outline-path ()
+ (let (rtn)
+ (save-excursion
+ (while (org-up-heading-safe)
+ (when (looking-at org-complex-heading-regexp)
+ (push (org-match-string-no-properties 4) rtn)))
+ rtn)))
+
+(defvar org-refile-history nil
+ "History for refiling operations.")
+
+(defun org-refile (&optional reversed-or-update)
+ "Move the entry at point to another heading.
+The list of target headings is compiled using the information in
+`org-refile-targets', which see. This list is created upon first use, and
+you can update it by calling this command with a double prefix (`C-u C-u').
+
+At the target location, the entry is filed as a subitem of the target heading.
+Depending on `org-reverse-note-order', the new subitem will either be the
+first of the last subitem. A single C-u prefix will toggle the value of this
+variable for the duration of the command."
+ (interactive "P")
+ (if (equal reversed-or-update '(16))
+ (progn
+ (setq org-refile-target-table (org-get-refile-targets))
+ (message "Refile targets updated (%d targets)"
+ (length org-refile-target-table)))
+ (when (or (not org-refile-target-table)
+ (and (= (length org-refile-targets) 1)
+ (not (caar org-refile-targets))))
+ (setq org-refile-target-table (org-get-refile-targets)))
+ (unless org-refile-target-table
+ (error "No refile targets"))
+ (let* ((cbuf (current-buffer))
+ (filename (buffer-file-name (buffer-base-buffer cbuf)))
+ (fname (and filename (file-truename filename)))
+ (tbl (mapcar
+ (lambda (x)
+ (if (not (equal fname (file-truename (nth 1 x))))
+ (cons (concat (car x) " (" (file-name-nondirectory
+ (nth 1 x)) ")")
+ (cdr x))
+ x))
+ org-refile-target-table))
+ (completion-ignore-case t)
+ pos it nbuf file re level reversed)
+ (when (setq it (completing-read "Refile to: " tbl
+ nil t nil 'org-refile-history))
+ (setq it (assoc it tbl)
+ file (nth 1 it)
+ re (nth 2 it))
+ (org-copy-special)
+ (save-excursion
+ (set-buffer (setq nbuf (or (find-buffer-visiting file)
+ (find-file-noselect file))))
+ (setq reversed (org-notes-order-reversed-p))
+ (if (equal reversed-or-update '(16)) (setq reversed (not reversed)))
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (unless (re-search-forward re nil t)
+ (error "Cannot find target location - try again with `C-u' prefix."))
+ (goto-char (match-beginning 0))
+ (looking-at outline-regexp)
+ (setq level (org-get-legal-level (funcall outline-level) 1))
+ (goto-char (or (save-excursion
+ (if reversed
+ (outline-next-heading)
+ (outline-get-next-sibling)))
+ (point-max)))
+ (org-paste-subtree level))))
+ (org-cut-special)
+ (message "Entry refiled to \"%s\"" (car it))))))
+
+;;;; Dynamic blocks
+
+(defun org-find-dblock (name)
+ "Find the first dynamic block with name NAME in the buffer.
+If not found, stay at current position and return nil."
+ (let (pos)
+ (save-excursion
+ (goto-char (point-min))
+ (setq pos (and (re-search-forward (concat "^#\\+BEGIN:[ \t]+" name "\\>")
+ nil t)
+ (match-beginning 0))))
+ (if pos (goto-char pos))
+ pos))
+
+(defconst org-dblock-start-re
+ "^#\\+BEGIN:[ \t]+\\(\\S-+\\)\\([ \t]+\\(.*\\)\\)?"
+ "Matches the startline of a dynamic block, with parameters.")
+
+(defconst org-dblock-end-re "^#\\+END\\([: \t\r\n]\\|$\\)"
+ "Matches the end of a dyhamic block.")
+
+(defun org-create-dblock (plist)
+ "Create a dynamic block section, with parameters taken from PLIST.
+PLIST must containe a :name entry which is used as name of the block."
+ (unless (bolp) (newline))
+ (let ((name (plist-get plist :name)))
+ (insert "#+BEGIN: " name)
+ (while plist
+ (if (eq (car plist) :name)
+ (setq plist (cddr plist))
+ (insert " " (prin1-to-string (pop plist)))))
+ (insert "\n\n#+END:\n")
+ (beginning-of-line -2)))
+
+(defun org-prepare-dblock ()
+ "Prepare dynamic block for refresh.
+This empties the block, puts the cursor at the insert position and returns
+the property list including an extra property :name with the block name."
+ (unless (looking-at org-dblock-start-re)
+ (error "Not at a dynamic block"))
+ (let* ((begdel (1+ (match-end 0)))
+ (name (org-no-properties (match-string 1)))
+ (params (append (list :name name)
+ (read (concat "(" (match-string 3) ")")))))
+ (unless (re-search-forward org-dblock-end-re nil t)
+ (error "Dynamic block not terminated"))
+ (delete-region begdel (match-beginning 0))
+ (goto-char begdel)
+ (open-line 1)
+ params))
+
+(defun org-map-dblocks (&optional command)
+ "Apply COMMAND to all dynamic blocks in the current buffer.
+If COMMAND is not given, use `org-update-dblock'."
+ (let ((cmd (or command 'org-update-dblock))
+ pos)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward org-dblock-start-re nil t)
+ (goto-char (setq pos (match-beginning 0)))
+ (condition-case nil
+ (funcall cmd)
+ (error (message "Error during update of dynamic block")))
+ (goto-char pos)
+ (unless (re-search-forward org-dblock-end-re nil t)
+ (error "Dynamic block not terminated"))))))
+
+(defun org-dblock-update (&optional arg)
+ "User command for updating dynamic blocks.
+Update the dynamic block at point. With prefix ARG, update all dynamic
+blocks in the buffer."
+ (interactive "P")
+ (if arg
+ (org-update-all-dblocks)
+ (or (looking-at org-dblock-start-re)
+ (org-beginning-of-dblock))
+ (org-update-dblock)))
+
+(defun org-update-dblock ()
+ "Update the dynamic block at point
+This means to empty the block, parse for parameters and then call
+the correct writing function."
+ (save-window-excursion
+ (let* ((pos (point))
+ (line (org-current-line))
+ (params (org-prepare-dblock))
+ (name (plist-get params :name))
+ (cmd (intern (concat "org-dblock-write:" name))))
+ (message "Updating dynamic block `%s' at line %d..." name line)
+ (funcall cmd params)
+ (message "Updating dynamic block `%s' at line %d...done" name line)
+ (goto-char pos))))
+
+(defun org-beginning-of-dblock ()
+ "Find the beginning of the dynamic block at point.
+Error if there is no scuh block at point."
+ (let ((pos (point))
+ beg)
+ (end-of-line 1)
+ (if (and (re-search-backward org-dblock-start-re nil t)
+ (setq beg (match-beginning 0))
+ (re-search-forward org-dblock-end-re nil t)
+ (> (match-end 0) pos))
+ (goto-char beg)
+ (goto-char pos)
+ (error "Not in a dynamic block"))))
+
+(defun org-update-all-dblocks ()
+ "Update all dynamic blocks in the buffer.
+This function can be used in a hook."
+ (when (org-mode-p)
+ (org-map-dblocks 'org-update-dblock)))
+
+
+;;;; Completion
+
+(defconst org-additional-option-like-keywords
+ '("BEGIN_HTML" "BEGIN_LaTeX" "END_HTML" "END_LaTeX"
+ "ORGTBL" "HTML:" "LaTeX:" "BEGIN:" "END:" "DATE:" "TBLFM"
+ "BEGIN_EXAMPLE" "END_EXAMPLE"))
+
+(defun org-complete (&optional arg)
+ "Perform completion on word at point.
+At the beginning of a headline, this completes TODO keywords as given in
+`org-todo-keywords'.
+If the current word is preceded by a backslash, completes the TeX symbols
+that are supported for HTML support.
+If the current word is preceded by \"#+\", completes special words for
+setting file options.
+In the line after \"#+STARTUP:, complete valid keywords.\"
+At all other locations, this simply calls the value of
+`org-completion-fallback-command'."
+ (interactive "P")
+ (org-without-partial-completion
+ (catch 'exit
+ (let* ((end (point))
+ (beg1 (save-excursion
+ (skip-chars-backward (org-re "[:alnum:]_@"))
+ (point)))
+ (beg (save-excursion
+ (skip-chars-backward "a-zA-Z0-9_:$")
+ (point)))
+ (confirm (lambda (x) (stringp (car x))))
+ (searchhead (equal (char-before beg) ?*))
+ (tag (and (equal (char-before beg1) ?:)
+ (equal (char-after (point-at-bol)) ?*)))
+ (prop (and (equal (char-before beg1) ?:)
+ (not (equal (char-after (point-at-bol)) ?*))))
+ (texp (equal (char-before beg) ?\\))
+ (link (equal (char-before beg) ?\[))
+ (opt (equal (buffer-substring (max (point-at-bol) (- beg 2))
+ beg)
+ "#+"))
+ (startup (string-match "^#\\+STARTUP:.*"
+ (buffer-substring (point-at-bol) (point))))
+ (completion-ignore-case opt)
+ (type nil)
+ (tbl nil)
+ (table (cond
+ (opt
+ (setq type :opt)
+ (append
+ (mapcar
+ (lambda (x)
+ (string-match "^#\\+\\(\\([A-Z_]+:?\\).*\\)" x)
+ (cons (match-string 2 x) (match-string 1 x)))
+ (org-split-string (org-get-current-options) "\n"))
+ (mapcar 'list org-additional-option-like-keywords)))
+ (startup
+ (setq type :startup)
+ org-startup-options)
+ (link (append org-link-abbrev-alist-local
+ org-link-abbrev-alist))
+ (texp
+ (setq type :tex)
+ org-html-entities)
+ ((string-match "\\`\\*+[ \t]+\\'"
+ (buffer-substring (point-at-bol) beg))
+ (setq type :todo)
+ (mapcar 'list org-todo-keywords-1))
+ (searchhead
+ (setq type :searchhead)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward org-todo-line-regexp nil t)
+ (push (list
+ (org-make-org-heading-search-string
+ (match-string 3) t))
+ tbl)))
+ tbl)
+ (tag (setq type :tag beg beg1)
+ (or org-tag-alist (org-get-buffer-tags)))
+ (prop (setq type :prop beg beg1)
+ (mapcar 'list (org-buffer-property-keys)))
+ (t (progn
+ (call-interactively org-completion-fallback-command)
+ (throw 'exit nil)))))
+ (pattern (buffer-substring-no-properties beg end))
+ (completion (try-completion pattern table confirm)))
+ (cond ((eq completion t)
+ (if (not (assoc (upcase pattern) table))
+ (message "Already complete")
+ (if (equal type :opt)
+ (insert (substring (cdr (assoc (upcase pattern) table))
+ (length pattern)))
+ (if (memq type '(:tag :prop)) (insert ":")))))
+ ((null completion)
+ (message "Can't find completion for \"%s\"" pattern)
+ (ding))
+ ((not (string= pattern completion))
+ (delete-region beg end)
+ (if (string-match " +$" completion)
+ (setq completion (replace-match "" t t completion)))
+ (insert completion)
+ (if (get-buffer-window "*Completions*")
+ (delete-window (get-buffer-window "*Completions*")))
+ (if (assoc completion table)
+ (if (eq type :todo) (insert " ")
+ (if (memq type '(:tag :prop)) (insert ":"))))
+ (if (and (equal type :opt) (assoc completion table))
+ (message "%s" (substitute-command-keys
+ "Press \\[org-complete] again to insert example settings"))))
+ (t
+ (message "Making completion list...")
+ (let ((list (sort (all-completions pattern table confirm)
+ 'string<)))
+ (with-output-to-temp-buffer "*Completions*"
+ (condition-case nil
+ ;; Protection needed for XEmacs and emacs 21
+ (display-completion-list list pattern)
+ (error (display-completion-list list)))))
+ (message "Making completion list...%s" "done")))))))
+
+;;;; TODO, DEADLINE, Comments
+
+(defun org-toggle-comment ()
+ "Change the COMMENT state of an entry."
+ (interactive)
+ (save-excursion
+ (org-back-to-heading)
+ (let (case-fold-search)
+ (if (looking-at (concat outline-regexp
+ "\\( *\\<" org-comment-string "\\>[ \t]*\\)"))
+ (replace-match "" t t nil 1)
+ (if (looking-at outline-regexp)
+ (progn
+ (goto-char (match-end 0))
+ (insert org-comment-string " ")))))))
+
+(defvar org-last-todo-state-is-todo nil
+ "This is non-nil when the last TODO state change led to a TODO state.
+If the last change removed the TODO tag or switched to DONE, then
+this is nil.")
+
+(defvar org-setting-tags nil) ; dynamically skiped
+
+;; FIXME: better place
+(defun org-property-or-variable-value (var &optional inherit)
+ "Check if there is a property fixing the value of VAR.
+If yes, return this value. If not, return the current value of the variable."
+ (let ((prop (org-entry-get nil (symbol-name var) inherit)))
+ (if (and prop (stringp prop) (string-match "\\S-" prop))
+ (read prop)
+ (symbol-value var))))
+
+(defun org-parse-local-options (string var)
+ "Parse STRING for startup setting relevant for variable VAR."
+ (let ((rtn (symbol-value var))
+ e opts)
+ (save-match-data
+ (if (or (not string) (not (string-match "\\S-" string)))
+ rtn
+ (setq opts (delq nil (mapcar (lambda (x)
+ (setq e (assoc x org-startup-options))
+ (if (eq (nth 1 e) var) e nil))
+ (org-split-string string "[ \t]+"))))
+ (if (not opts)
+ rtn
+ (setq rtn nil)
+ (while (setq e (pop opts))
+ (if (not (nth 3 e))
+ (setq rtn (nth 2 e))
+ (if (not (listp rtn)) (setq rtn nil))
+ (push (nth 2 e) rtn)))
+ rtn)))))
+
+(defvar org-blocker-hook nil
+ "Hook for functions that are allowed to block a state change.
+
+Each function gets as its single argument a property list, see
+`org-trigger-hook' for more information about this list.
+
+If any of the functions in this hook returns nil, the state change
+is blocked.")
+
+(defvar org-trigger-hook nil
+ "Hook for functions that are triggered by a state change.
+
+Each function gets as its single argument a property list with at least
+the following elements:
+
+ (:type type-of-change :position pos-at-entry-start
+ :from old-state :to new-state)
+
+Depending on the type, more properties may be present.
+
+This mechanism is currently implemented for:
+
+TODO state changes
+------------------
+:type todo-state-change
+:from previous state (keyword as a string), or nil
+:to new state (keyword as a string), or nil")
+
+
+(defun org-todo (&optional arg)
+ "Change the TODO state of an item.
+The state of an item is given by a keyword at the start of the heading,
+like
+ *** TODO Write paper
+ *** DONE Call mom
+
+The different keywords are specified in the variable `org-todo-keywords'.
+By default the available states are \"TODO\" and \"DONE\".
+So for this example: when the item starts with TODO, it is changed to DONE.
+When it starts with DONE, the DONE is removed. And when neither TODO nor
+DONE are present, add TODO at the beginning of the heading.
+
+With C-u prefix arg, use completion to determine the new state.
+With numeric prefix arg, switch to that state.
+
+For calling through lisp, arg is also interpreted in the following way:
+'none -> empty state
+\"\"(empty string) -> switch to empty state
+'done -> switch to DONE
+'nextset -> switch to the next set of keywords
+'previousset -> switch to the previous set of keywords
+\"WAITING\" -> switch to the specified keyword, but only if it
+ really is a member of `org-todo-keywords'."
+ (interactive "P")
+ (save-excursion
+ (catch 'exit
+ (org-back-to-heading)
+ (if (looking-at outline-regexp) (goto-char (1- (match-end 0))))
+ (or (looking-at (concat " +" org-todo-regexp " *"))
+ (looking-at " *"))
+ (let* ((match-data (match-data))
+ (startpos (point-at-bol))
+ (logging (save-match-data (org-entry-get nil "LOGGING" t)))
+ (org-log-done (org-parse-local-options logging 'org-log-done))
+ (org-log-repeat (org-parse-local-options logging 'org-log-repeat))
+ (this (match-string 1))
+ (hl-pos (match-beginning 0))
+ (head (org-get-todo-sequence-head this))
+ (ass (assoc head org-todo-kwd-alist))
+ (interpret (nth 1 ass))
+ (done-word (nth 3 ass))
+ (final-done-word (nth 4 ass))
+ (last-state (or this ""))
+ (completion-ignore-case t)
+ (member (member this org-todo-keywords-1))
+ (tail (cdr member))
+ (state (cond
+ ((and org-todo-key-trigger
+ (or (and (equal arg '(4)) (eq org-use-fast-todo-selection 'prefix))
+ (and (not arg) org-use-fast-todo-selection
+ (not (eq org-use-fast-todo-selection 'prefix)))))
+ ;; Use fast selection
+ (org-fast-todo-selection))
+ ((and (equal arg '(4))
+ (or (not org-use-fast-todo-selection)
+ (not org-todo-key-trigger)))
+ ;; Read a state with completion
+ (completing-read "State: " (mapcar (lambda(x) (list x))
+ org-todo-keywords-1)
+ nil t))
+ ((eq arg 'right)
+ (if this
+ (if tail (car tail) nil)
+ (car org-todo-keywords-1)))
+ ((eq arg 'left)
+ (if (equal member org-todo-keywords-1)
+ nil
+ (if this
+ (nth (- (length org-todo-keywords-1) (length tail) 2)
+ org-todo-keywords-1)
+ (org-last org-todo-keywords-1))))
+ ((and (eq org-use-fast-todo-selection t) (equal arg '(4))
+ (setq arg nil))) ; hack to fall back to cycling
+ (arg
+ ;; user or caller requests a specific state
+ (cond
+ ((equal arg "") nil)
+ ((eq arg 'none) nil)
+ ((eq arg 'done) (or done-word (car org-done-keywords)))
+ ((eq arg 'nextset)
+ (or (car (cdr (member head org-todo-heads)))
+ (car org-todo-heads)))
+ ((eq arg 'previousset)
+ (let ((org-todo-heads (reverse org-todo-heads)))
+ (or (car (cdr (member head org-todo-heads)))
+ (car org-todo-heads))))
+ ((car (member arg org-todo-keywords-1)))
+ ((nth (1- (prefix-numeric-value arg))
+ org-todo-keywords-1))))
+ ((null member) (or head (car org-todo-keywords-1)))
+ ((equal this final-done-word) nil) ;; -> make empty
+ ((null tail) nil) ;; -> first entry
+ ((eq interpret 'sequence)
+ (car tail))
+ ((memq interpret '(type priority))
+ (if (eq this-command last-command)
+ (car tail)
+ (if (> (length tail) 0)
+ (or done-word (car org-done-keywords))
+ nil)))
+ (t nil)))
+ (next (if state (concat " " state " ") " "))
+ (change-plist (list :type 'todo-state-change :from this :to state
+ :position startpos))
+ dostates)
+ (when org-blocker-hook
+ (unless (save-excursion
+ (save-match-data
+ (run-hook-with-args-until-failure
+ 'org-blocker-hook change-plist)))
+ (if (interactive-p)
+ (error "TODO state change from %s to %s blocked" this state)
+ ;; fail silently
+ (message "TODO state change from %s to %s blocked" this state)
+ (throw 'exit nil))))
+ (store-match-data match-data)
+ (replace-match next t t)
+ (unless (pos-visible-in-window-p hl-pos)
+ (message "TODO state changed to %s" (org-trim next)))
+ (unless head
+ (setq head (org-get-todo-sequence-head state)
+ ass (assoc head org-todo-kwd-alist)
+ interpret (nth 1 ass)
+ done-word (nth 3 ass)
+ final-done-word (nth 4 ass)))
+ (when (memq arg '(nextset previousset))
+ (message "Keyword-Set %d/%d: %s"
+ (- (length org-todo-sets) -1
+ (length (memq (assoc state org-todo-sets) org-todo-sets)))
+ (length org-todo-sets)
+ (mapconcat 'identity (assoc state org-todo-sets) " ")))
+ (setq org-last-todo-state-is-todo
+ (not (member state org-done-keywords)))
+ (when (and org-log-done (not (memq arg '(nextset previousset))))
+ (setq dostates (and (listp org-log-done) (memq 'state org-log-done)
+ (or (not org-todo-log-states)
+ (member state org-todo-log-states))))
+
+ (cond
+ ((and state (member state org-not-done-keywords)
+ (not (member this org-not-done-keywords)))
+ ;; This is now a todo state and was not one before
+ ;; Remove any CLOSED timestamp, and possibly log the state change
+ (org-add-planning-info nil nil 'closed)
+ (and dostates (org-add-log-maybe 'state state 'findpos)))
+ ((and state dostates)
+ ;; This is a non-nil state, and we need to log it
+ (org-add-log-maybe 'state state 'findpos))
+ ((and (member state org-done-keywords)
+ (not (member this org-done-keywords)))
+ ;; It is now done, and it was not done before
+ (org-add-planning-info 'closed (org-current-time))
+ (org-add-log-maybe 'done state 'findpos))))
+ ;; Fixup tag positioning
+ (and org-auto-align-tags (not org-setting-tags) (org-set-tags nil t))
+ (run-hooks 'org-after-todo-state-change-hook)
+ (and (member state org-done-keywords) (org-auto-repeat-maybe))
+ (if (and arg (not (member state org-done-keywords)))
+ (setq head (org-get-todo-sequence-head state)))
+ (put-text-property (point-at-bol) (point-at-eol) 'org-todo-head head)
+ ;; Fixup cursor location if close to the keyword
+ (if (and (outline-on-heading-p)
+ (not (bolp))
+ (save-excursion (beginning-of-line 1)
+ (looking-at org-todo-line-regexp))
+ (< (point) (+ 2 (or (match-end 2) (match-end 1)))))
+ (progn
+ (goto-char (or (match-end 2) (match-end 1)))
+ (just-one-space)))
+ (when org-trigger-hook
+ (save-excursion
+ (run-hook-with-args 'org-trigger-hook change-plist)))))))
+
+(defun org-get-todo-sequence-head (kwd)
+ "Return the head of the TODO sequence to which KWD belongs.
+If KWD is not set, check if there is a text property remembering the
+right sequence."
+ (let (p)
+ (cond
+ ((not kwd)
+ (or (get-text-property (point-at-bol) 'org-todo-head)
+ (progn
+ (setq p (next-single-property-change (point-at-bol) 'org-todo-head
+ nil (point-at-eol)))
+ (get-text-property p 'org-todo-head))))
+ ((not (member kwd org-todo-keywords-1))
+ (car org-todo-keywords-1))
+ (t (nth 2 (assoc kwd org-todo-kwd-alist))))))
+
+(defun org-fast-todo-selection ()
+ "Fast TODO keyword selection with single keys.
+Returns the new TODO keyword, or nil if no state change should occur."
+ (let* ((fulltable org-todo-key-alist)
+ (done-keywords org-done-keywords) ;; needed for the faces.
+ (maxlen (apply 'max (mapcar
+ (lambda (x)
+ (if (stringp (car x)) (string-width (car x)) 0))
+ fulltable)))
+ (expert nil)
+ (fwidth (+ maxlen 3 1 3))
+ (ncol (/ (- (window-width) 4) fwidth))
+ tg cnt e c tbl
+ groups ingroup)
+ (save-window-excursion
+ (if expert
+ (set-buffer (get-buffer-create " *Org todo*"))
+ (org-switch-to-buffer-other-window (get-buffer-create " *Org todo*")))
+ (erase-buffer)
+ (org-set-local 'org-done-keywords done-keywords)
+ (setq tbl fulltable cnt 0)
+ (while (setq e (pop tbl))
+ (cond
+ ((equal e '(:startgroup))
+ (push '() groups) (setq ingroup t)
+ (when (not (= cnt 0))
+ (setq cnt 0)
+ (insert "\n"))
+ (insert "{ "))
+ ((equal e '(:endgroup))
+ (setq ingroup nil cnt 0)
+ (insert "}\n"))
+ (t
+ (setq tg (car e) c (cdr e))
+ (if ingroup (push tg (car groups)))
+ (setq tg (org-add-props tg nil 'face
+ (org-get-todo-face tg)))
+ (if (and (= cnt 0) (not ingroup)) (insert " "))
+ (insert "[" c "] " tg (make-string
+ (- fwidth 4 (length tg)) ?\ ))
+ (when (= (setq cnt (1+ cnt)) ncol)
+ (insert "\n")
+ (if ingroup (insert " "))
+ (setq cnt 0)))))
+ (insert "\n")
+ (goto-char (point-min))
+ (if (and (not expert) (fboundp 'fit-window-to-buffer))
+ (fit-window-to-buffer))
+ (message "[a-z..]:Set [SPC]:clear")
+ (setq c (let ((inhibit-quit t)) (read-char-exclusive)))
+ (cond
+ ((or (= c ?\C-g)
+ (and (= c ?q) (not (rassoc c fulltable))))
+ (setq quit-flag t))
+ ((= c ?\ ) nil)
+ ((setq e (rassoc c fulltable) tg (car e))
+ tg)
+ (t (setq quit-flag t))))))
+
+(defun org-get-repeat ()
+ "Check if tere is a deadline/schedule with repeater in this entry."
+ (save-match-data
+ (save-excursion
+ (org-back-to-heading t)
+ (if (re-search-forward
+ org-repeat-re (save-excursion (outline-next-heading) (point)) t)
+ (match-string 1)))))
+
+(defvar org-last-changed-timestamp)
+(defvar org-log-post-message)
+(defun org-auto-repeat-maybe ()
+ "Check if the current headline contains a repeated deadline/schedule.
+If yes, set TODO state back to what it was and change the base date
+of repeating deadline/scheduled time stamps to new date.
+This function should be run in the `org-after-todo-state-change-hook'."
+ ;; last-state is dynamically scoped into this function
+ (let* ((repeat (org-get-repeat))
+ (aa (assoc last-state org-todo-kwd-alist))
+ (interpret (nth 1 aa))
+ (head (nth 2 aa))
+ (done-word (nth 3 aa))
+ (whata '(("d" . day) ("m" . month) ("y" . year)))
+ (msg "Entry repeats: ")
+ (org-log-done)
+ re type n what ts)
+ (when repeat
+ (org-todo (if (eq interpret 'type) last-state head))
+ (when (and org-log-repeat
+ (not (memq 'org-add-log-note
+ (default-value 'post-command-hook))))
+ ;; Make sure a note is taken
+ (let ((org-log-done '(done)))
+ (org-add-log-maybe 'done (or done-word (car org-done-keywords))
+ 'findpos)))
+ (org-back-to-heading t)
+ (org-add-planning-info nil nil 'closed)
+ (setq re (concat "\\(" org-scheduled-time-regexp "\\)\\|\\("
+ org-deadline-time-regexp "\\)"))
+ (while (re-search-forward
+ re (save-excursion (outline-next-heading) (point)) t)
+ (setq type (if (match-end 1) org-scheduled-string org-deadline-string)
+ ts (match-string (if (match-end 2) 2 4)))
+ (when (string-match "\\([-+]?[0-9]+\\)\\([dwmy]\\)" ts)
+ (setq n (string-to-number (match-string 1 ts))
+ what (match-string 2 ts))
+ (if (equal what "w") (setq n (* n 7) what "d"))
+ (org-timestamp-change n (cdr (assoc what whata))))
+ (setq msg (concat msg type org-last-changed-timestamp " ")))
+ (setq org-log-post-message msg)
+ (message "%s" msg))))
+
+(defun org-show-todo-tree (arg)
+ "Make a compact tree which shows all headlines marked with TODO.
+The tree will show the lines where the regexp matches, and all higher
+headlines above the match.
+With \\[universal-argument] prefix, also show the DONE entries.
+With a numeric prefix N, construct a sparse tree for the Nth element
+of `org-todo-keywords-1'."
+ (interactive "P")
+ (let ((case-fold-search nil)
+ (kwd-re
+ (cond ((null arg) org-not-done-regexp)
+ ((equal arg '(4))
+ (let ((kwd (completing-read "Keyword (or KWD1|KWD2|...): "
+ (mapcar 'list org-todo-keywords-1))))
+ (concat "\\("
+ (mapconcat 'identity (org-split-string kwd "|") "\\|")
+ "\\)\\>")))
+ ((<= (prefix-numeric-value arg) (length org-todo-keywords-1))
+ (regexp-quote (nth (1- (prefix-numeric-value arg))
+ org-todo-keywords-1)))
+ (t (error "Invalid prefix argument: %s" arg)))))
+ (message "%d TODO entries found"
+ (org-occur (concat "^" outline-regexp " *" kwd-re )))))
+
+(defun org-deadline (&optional remove)
+ "Insert the \"DEADLINE:\" string with a timestamp to make a deadline.
+With argument REMOVE, remove any deadline from the item."
+ (interactive "P")
+ (if remove
+ (progn
+ (org-add-planning-info nil nil 'deadline)
+ (message "Item no longer has a deadline."))
+ (org-add-planning-info 'deadline nil 'closed)))
+
+(defun org-schedule (&optional remove)
+ "Insert the SCHEDULED: string with a timestamp to schedule a TODO item.
+With argument REMOVE, remove any scheduling date from the item."
+ (interactive "P")
+ (if remove
+ (progn
+ (org-add-planning-info nil nil 'scheduled)
+ (message "Item is no longer scheduled."))
+ (org-add-planning-info 'scheduled nil 'closed)))
+
+(defun org-add-planning-info (what &optional time &rest remove)
+ "Insert new timestamp with keyword in the line directly after the headline.
+WHAT indicates what kind of time stamp to add. TIME indicated the time to use.
+If non is given, the user is prompted for a date.
+REMOVE indicates what kind of entries to remove. An old WHAT entry will also
+be removed."
+ (interactive)
+ (let (org-time-was-given org-end-time-was-given)
+ (when what (setq time (or time (org-read-date nil 'to-time))))
+ (when (and org-insert-labeled-timestamps-at-point
+ (member what '(scheduled deadline)))
+ (insert
+ (if (eq what 'scheduled) org-scheduled-string org-deadline-string) " ")
+ (org-insert-time-stamp time org-time-was-given
+ nil nil nil (list org-end-time-was-given))
+ (setq what nil))
+ (save-excursion
+ (save-restriction
+ (let (col list elt ts buffer-invisibility-spec)
+ (org-back-to-heading t)
+ (looking-at (concat outline-regexp "\\( *\\)[^\r\n]*"))
+ (goto-char (match-end 1))
+ (setq col (current-column))
+ (goto-char (match-end 0))
+ (if (eobp) (insert "\n") (forward-char 1))
+ (if (and (not (looking-at outline-regexp))
+ (looking-at (concat "[^\r\n]*?" org-keyword-time-regexp
+ "[^\r\n]*"))
+ (not (equal (match-string 1) org-clock-string)))
+ (narrow-to-region (match-beginning 0) (match-end 0))
+ (insert-before-markers "\n")
+ (backward-char 1)
+ (narrow-to-region (point) (point))
+ (indent-to-column col))
+ ;; Check if we have to remove something.
+ (setq list (cons what remove))
+ (while list
+ (setq elt (pop list))
+ (goto-char (point-min))
+ (when (or (and (eq elt 'scheduled)
+ (re-search-forward org-scheduled-time-regexp nil t))
+ (and (eq elt 'deadline)
+ (re-search-forward org-deadline-time-regexp nil t))
+ (and (eq elt 'closed)
+ (re-search-forward org-closed-time-regexp nil t)))
+ (replace-match "")
+ (if (looking-at "--+<[^>]+>") (replace-match ""))
+ (if (looking-at " +") (replace-match ""))))
+ (goto-char (point-max))
+ (when what
+ (insert
+ (if (not (equal (char-before) ?\ )) " " "")
+ (cond ((eq what 'scheduled) org-scheduled-string)
+ ((eq what 'deadline) org-deadline-string)
+ ((eq what 'closed) org-closed-string))
+ " ")
+ (setq ts (org-insert-time-stamp
+ time
+ (or org-time-was-given
+ (and (eq what 'closed) org-log-done-with-time))
+ (eq what 'closed)
+ nil nil (list org-end-time-was-given)))
+ (end-of-line 1))
+ (goto-char (point-min))
+ (widen)
+ (if (looking-at "[ \t]+\r?\n")
+ (replace-match ""))
+ ts)))))
+
+(defvar org-log-note-marker (make-marker))
+(defvar org-log-note-purpose nil)
+(defvar org-log-note-state nil)
+(defvar org-log-note-window-configuration nil)
+(defvar org-log-note-return-to (make-marker))
+(defvar org-log-post-message nil
+ "Message to be displayed after a log note has been stored.
+The auto-repeater uses this.")
+
+(defun org-add-log-maybe (&optional purpose state findpos)
+ "Set up the post command hook to take a note."
+ (save-excursion
+ (when (and (listp org-log-done)
+ (memq purpose org-log-done))
+ (when findpos
+ (org-back-to-heading t)
+ (looking-at (concat outline-regexp "\\( *\\)[^\r\n]*"
+ "\\(\n[^\r\n]*?" org-keyword-time-not-clock-regexp
+ "[^\r\n]*\\)?"))
+ (goto-char (match-end 0))
+ (unless org-log-states-order-reversed
+ (and (= (char-after) ?\n) (forward-char 1))
+ (org-skip-over-state-notes)
+ (skip-chars-backward " \t\n\r")))
+ (move-marker org-log-note-marker (point))
+ (setq org-log-note-purpose purpose)
+ (setq org-log-note-state state)
+ (add-hook 'post-command-hook 'org-add-log-note 'append))))
+
+(defun org-skip-over-state-notes ()
+ "Skip past the list of State notes in an entry."
+ (if (looking-at "\n[ \t]*- State") (forward-char 1))
+ (while (looking-at "[ \t]*- State")
+ (condition-case nil
+ (org-next-item)
+ (error (org-end-of-item)))))
+
+(defun org-add-log-note (&optional purpose)
+ "Pop up a window for taking a note, and add this note later at point."
+ (remove-hook 'post-command-hook 'org-add-log-note)
+ (setq org-log-note-window-configuration (current-window-configuration))
+ (delete-other-windows)
+ (move-marker org-log-note-return-to (point))
+ (switch-to-buffer (marker-buffer org-log-note-marker))
+ (goto-char org-log-note-marker)
+ (org-switch-to-buffer-other-window "*Org Note*")
+ (erase-buffer)
+ (let ((org-inhibit-startup t)) (org-mode))
+ (insert (format "# Insert note for %s.
+# Finish with C-c C-c, or cancel with C-c C-k.\n\n"
+ (cond
+ ((eq org-log-note-purpose 'clock-out) "stopped clock")
+ ((eq org-log-note-purpose 'done) "closed todo item")
+ ((eq org-log-note-purpose 'state)
+ (format "state change to \"%s\"" org-log-note-state))
+ (t (error "This should not happen")))))
+ (org-set-local 'org-finish-function 'org-store-log-note))
+
+(defun org-store-log-note ()
+ "Finish taking a log note, and insert it to where it belongs."
+ (let ((txt (buffer-string))
+ (note (cdr (assq org-log-note-purpose org-log-note-headings)))
+ lines ind)
+ (kill-buffer (current-buffer))
+ (while (string-match "\\`#.*\n[ \t\n]*" txt)
+ (setq txt (replace-match "" t t txt)))
+ (if (string-match "\\s-+\\'" txt)
+ (setq txt (replace-match "" t t txt)))
+ (setq lines (org-split-string txt "\n"))
+ (when (and note (string-match "\\S-" note))
+ (setq note
+ (org-replace-escapes
+ note
+ (list (cons "%u" (user-login-name))
+ (cons "%U" user-full-name)
+ (cons "%t" (format-time-string
+ (org-time-stamp-format 'long 'inactive)
+ (current-time)))
+ (cons "%s" (if org-log-note-state
+ (concat "\"" org-log-note-state "\"")
+ "")))))
+ (if lines (setq note (concat note " \\\\")))
+ (push note lines))
+ (when (or current-prefix-arg org-note-abort) (setq lines nil))
+ (when lines
+ (save-excursion
+ (set-buffer (marker-buffer org-log-note-marker))
+ (save-excursion
+ (goto-char org-log-note-marker)
+ (move-marker org-log-note-marker nil)
+ (end-of-line 1)
+ (if (not (bolp)) (let ((inhibit-read-only t)) (insert "\n")))
+ (indent-relative nil)
+ (insert "- " (pop lines))
+ (org-indent-line-function)
+ (beginning-of-line 1)
+ (looking-at "[ \t]*")
+ (setq ind (concat (match-string 0) " "))
+ (end-of-line 1)
+ (while lines (insert "\n" ind (pop lines)))))))
+ (set-window-configuration org-log-note-window-configuration)
+ (with-current-buffer (marker-buffer org-log-note-return-to)
+ (goto-char org-log-note-return-to))
+ (move-marker org-log-note-return-to nil)
+ (and org-log-post-message (message "%s" org-log-post-message)))
+
+;; FIXME: what else would be useful?
+;; - priority
+;; - date
+
+(defun org-sparse-tree (&optional arg)
+ "Create a sparse tree, prompt for the details.
+This command can create sparse trees. You first need to select the type
+of match used to create the tree:
+
+t Show entries with a specific TODO keyword.
+T Show entries selected by a tags match.
+p Enter a property name and its value (both with completion on existing
+ names/values) and show entries with that property.
+r Show entries matching a regular expression
+d Show deadlines due within `org-deadline-warning-days'."
+ (interactive "P")
+ (let (ans kwd value)
+ (message "Sparse tree: [/]regexp [t]odo-kwd [T]ag [p]roperty [d]eadlines [b]efore-date")
+ (setq ans (read-char-exclusive))
+ (cond
+ ((equal ans ?d)
+ (call-interactively 'org-check-deadlines))
+ ((equal ans ?b)
+ (call-interactively 'org-check-before-date))
+ ((equal ans ?t)
+ (org-show-todo-tree '(4)))
+ ((equal ans ?T)
+ (call-interactively 'org-tags-sparse-tree))
+ ((member ans '(?p ?P))
+ (setq kwd (completing-read "Property: "
+ (mapcar 'list (org-buffer-property-keys))))
+ (setq value (completing-read "Value: "
+ (mapcar 'list (org-property-values kwd))))
+ (unless (string-match "\\`{.*}\\'" value)
+ (setq value (concat "\"" value "\"")))
+ (org-tags-sparse-tree arg (concat kwd "=" value)))
+ ((member ans '(?r ?R ?/))
+ (call-interactively 'org-occur))
+ (t (error "No such sparse tree command \"%c\"" ans)))))
+
+(defvar org-occur-highlights nil)
+(make-variable-buffer-local 'org-occur-highlights)
+
+(defun org-occur (regexp &optional keep-previous callback)
+ "Make a compact tree which shows all matches of REGEXP.
+The tree will show the lines where the regexp matches, and all higher
+headlines above the match. It will also show the heading after the match,
+to make sure editing the matching entry is easy.
+If KEEP-PREVIOUS is non-nil, highlighting and exposing done by a previous
+call to `org-occur' will be kept, to allow stacking of calls to this
+command.
+If CALLBACK is non-nil, it is a function which is called to confirm
+that the match should indeed be shown."
+ (interactive "sRegexp: \nP")
+ (or keep-previous (org-remove-occur-highlights nil nil t))
+ (let ((cnt 0))
+ (save-excursion
+ (goto-char (point-min))
+ (if (or (not keep-previous) ; do not want to keep
+ (not org-occur-highlights)) ; no previous matches
+ ;; hide everything
+ (org-overview))
+ (while (re-search-forward regexp nil t)
+ (when (or (not callback)
+ (save-match-data (funcall callback)))
+ (setq cnt (1+ cnt))
+ (when org-highlight-sparse-tree-matches
+ (org-highlight-new-match (match-beginning 0) (match-end 0)))
+ (org-show-context 'occur-tree))))
+ (when org-remove-highlights-with-change
+ (org-add-hook 'before-change-functions 'org-remove-occur-highlights
+ nil 'local))
+ (unless org-sparse-tree-open-archived-trees
+ (org-hide-archived-subtrees (point-min) (point-max)))
+ (run-hooks 'org-occur-hook)
+ (if (interactive-p)
+ (message "%d match(es) for regexp %s" cnt regexp))
+ cnt))
+
+(defun org-show-context (&optional key)
+ "Make sure point and context and visible.
+How much context is shown depends upon the variables
+`org-show-hierarchy-above', `org-show-following-heading'. and
+`org-show-siblings'."
+ (let ((heading-p (org-on-heading-p t))
+ (hierarchy-p (org-get-alist-option org-show-hierarchy-above key))
+ (following-p (org-get-alist-option org-show-following-heading key))
+ (entry-p (org-get-alist-option org-show-entry-below key))
+ (siblings-p (org-get-alist-option org-show-siblings key)))
+ (catch 'exit
+ ;; Show heading or entry text
+ (if (and heading-p (not entry-p))
+ (org-flag-heading nil) ; only show the heading
+ (and (or entry-p (org-invisible-p) (org-invisible-p2))
+ (org-show-hidden-entry))) ; show entire entry
+ (when following-p
+ ;; Show next sibling, or heading below text
+ (save-excursion
+ (and (if heading-p (org-goto-sibling) (outline-next-heading))
+ (org-flag-heading nil))))
+ (when siblings-p (org-show-siblings))
+ (when hierarchy-p
+ ;; show all higher headings, possibly with siblings
+ (save-excursion
+ (while (and (condition-case nil
+ (progn (org-up-heading-all 1) t)
+ (error nil))
+ (not (bobp)))
+ (org-flag-heading nil)
+ (when siblings-p (org-show-siblings))))))))
+
+(defun org-reveal (&optional siblings)
+ "Show current entry, hierarchy above it, and the following headline.
+This can be used to show a consistent set of context around locations
+exposed with `org-show-hierarchy-above' or `org-show-following-heading'
+not t for the search context.
+
+With optional argument SIBLINGS, on each level of the hierarchy all
+siblings are shown. This repairs the tree structure to what it would
+look like when opened with hierarchical calls to `org-cycle'."
+ (interactive "P")
+ (let ((org-show-hierarchy-above t)
+ (org-show-following-heading t)
+ (org-show-siblings (if siblings t org-show-siblings)))
+ (org-show-context nil)))
+
+(defun org-highlight-new-match (beg end)
+ "Highlight from BEG to END and mark the highlight is an occur headline."
+ (let ((ov (org-make-overlay beg end)))
+ (org-overlay-put ov 'face 'secondary-selection)
+ (push ov org-occur-highlights)))
+
+(defun org-remove-occur-highlights (&optional beg end noremove)
+ "Remove the occur highlights from the buffer.
+BEG and END are ignored. If NOREMOVE is nil, remove this function
+from the `before-change-functions' in the current buffer."
+ (interactive)
+ (unless org-inhibit-highlight-removal
+ (mapc 'org-delete-overlay org-occur-highlights)
+ (setq org-occur-highlights nil)
+ (unless noremove
+ (remove-hook 'before-change-functions
+ 'org-remove-occur-highlights 'local))))
+
+;;;; Priorities
+
+(defvar org-priority-regexp ".*?\\(\\[#\\([A-Z0-9]\\)\\] ?\\)"
+ "Regular expression matching the priority indicator.")
+
+(defvar org-remove-priority-next-time nil)
+
+(defun org-priority-up ()
+ "Increase the priority of the current item."
+ (interactive)
+ (org-priority 'up))
+
+(defun org-priority-down ()
+ "Decrease the priority of the current item."
+ (interactive)
+ (org-priority 'down))
+
+(defun org-priority (&optional action)
+ "Change the priority of an item by ARG.
+ACTION can be `set', `up', `down', or a character."
+ (interactive)
+ (setq action (or action 'set))
+ (let (current new news have remove)
+ (save-excursion
+ (org-back-to-heading)
+ (if (looking-at org-priority-regexp)
+ (setq current (string-to-char (match-string 2))
+ have t)
+ (setq current org-default-priority))
+ (cond
+ ((or (eq action 'set) (integerp action))
+ (if (integerp action)
+ (setq new action)
+ (message "Priority %c-%c, SPC to remove: " org-highest-priority org-lowest-priority)
+ (setq new (read-char-exclusive)))
+ (if (and (= (upcase org-highest-priority) org-highest-priority)
+ (= (upcase org-lowest-priority) org-lowest-priority))
+ (setq new (upcase new)))
+ (cond ((equal new ?\ ) (setq remove t))
+ ((or (< (upcase new) org-highest-priority) (> (upcase new) org-lowest-priority))
+ (error "Priority must be between `%c' and `%c'"
+ org-highest-priority org-lowest-priority))))
+ ((eq action 'up)
+ (if (and (not have) (eq last-command this-command))
+ (setq new org-lowest-priority)
+ (setq new (if (and org-priority-start-cycle-with-default (not have))
+ org-default-priority (1- current)))))
+ ((eq action 'down)
+ (if (and (not have) (eq last-command this-command))
+ (setq new org-highest-priority)
+ (setq new (if (and org-priority-start-cycle-with-default (not have))
+ org-default-priority (1+ current)))))
+ (t (error "Invalid action")))
+ (if (or (< (upcase new) org-highest-priority)
+ (> (upcase new) org-lowest-priority))
+ (setq remove t))
+ (setq news (format "%c" new))
+ (if have
+ (if remove
+ (replace-match "" t t nil 1)
+ (replace-match news t t nil 2))
+ (if remove
+ (error "No priority cookie found in line")
+ (looking-at org-todo-line-regexp)
+ (if (match-end 2)
+ (progn
+ (goto-char (match-end 2))
+ (insert " [#" news "]"))
+ (goto-char (match-beginning 3))
+ (insert "[#" news "] ")))))
+ (org-preserve-lc (org-set-tags nil 'align))
+ (if remove
+ (message "Priority removed")
+ (message "Priority of current item set to %s" news))))
+
+
+(defun org-get-priority (s)
+ "Find priority cookie and return priority."
+ (save-match-data
+ (if (not (string-match org-priority-regexp s))
+ (* 1000 (- org-lowest-priority org-default-priority))
+ (* 1000 (- org-lowest-priority
+ (string-to-char (match-string 2 s)))))))
+
+;;;; Tags
+
+(defun org-scan-tags (action matcher &optional todo-only)
+ "Scan headline tags with inheritance and produce output ACTION.
+ACTION can be `sparse-tree' or `agenda'. MATCHER is a Lisp form to be
+evaluated, testing if a given set of tags qualifies a headline for
+inclusion. When TODO-ONLY is non-nil, only lines with a TODO keyword
+are included in the output."
+ (let* ((re (concat "[\n\r]" outline-regexp " *\\(\\<\\("
+ (mapconcat 'regexp-quote org-todo-keywords-1 "\\|")
+ (org-re
+ "\\>\\)\\)? *\\(.*?\\)\\(:[[:alnum:]_@:]+:\\)?[ \t]*$")))
+ (props (list 'face nil
+ 'done-face 'org-done
+ 'undone-face nil
+ 'mouse-face 'highlight
+ 'org-not-done-regexp org-not-done-regexp
+ 'org-todo-regexp org-todo-regexp
+ 'keymap org-agenda-keymap
+ 'help-echo
+ (format "mouse-2 or RET jump to org file %s"
+ (abbreviate-file-name
+ (or (buffer-file-name (buffer-base-buffer))
+ (buffer-name (buffer-base-buffer)))))))
+ (case-fold-search nil)
+ lspos
+ tags tags-list tags-alist (llast 0) rtn level category i txt
+ todo marker entry priority)
+ (save-excursion
+ (goto-char (point-min))
+ (when (eq action 'sparse-tree)
+ (org-overview)
+ (org-remove-occur-highlights))
+ (while (re-search-forward re nil t)
+ (catch :skip
+ (setq todo (if (match-end 1) (match-string 2))
+ tags (if (match-end 4) (match-string 4)))
+ (goto-char (setq lspos (1+ (match-beginning 0))))
+ (setq level (org-reduced-level (funcall outline-level))
+ category (org-get-category))
+ (setq i llast llast level)
+ ;; remove tag lists from same and sublevels
+ (while (>= i level)
+ (when (setq entry (assoc i tags-alist))
+ (setq tags-alist (delete entry tags-alist)))
+ (setq i (1- i)))
+ ;; add the nex tags
+ (when tags
+ (setq tags (mapcar 'downcase (org-split-string tags ":"))
+ tags-alist
+ (cons (cons level tags) tags-alist)))
+ ;; compile tags for current headline
+ (setq tags-list
+ (if org-use-tag-inheritance
+ (apply 'append (mapcar 'cdr tags-alist))
+ tags))
+ (when (and (or (not todo-only) (member todo org-not-done-keywords))
+ (eval matcher)
+ (or (not org-agenda-skip-archived-trees)
+ (not (member org-archive-tag tags-list))))
+ (and (eq action 'agenda) (org-agenda-skip))
+ ;; list this headline
+
+ (if (eq action 'sparse-tree)
+ (progn
+ (and org-highlight-sparse-tree-matches
+ (org-get-heading) (match-end 0)
+ (org-highlight-new-match
+ (match-beginning 0) (match-beginning 1)))
+ (org-show-context 'tags-tree))
+ (setq txt (org-format-agenda-item
+ ""
+ (concat
+ (if org-tags-match-list-sublevels
+ (make-string (1- level) ?.) "")
+ (org-get-heading))
+ category tags-list)
+ priority (org-get-priority txt))
+ (goto-char lspos)
+ (setq marker (org-agenda-new-marker))
+ (org-add-props txt props
+ 'org-marker marker 'org-hd-marker marker 'org-category category
+ 'priority priority 'type "tagsmatch")
+ (push txt rtn))
+ ;; if we are to skip sublevels, jump to end of subtree
+ (or org-tags-match-list-sublevels (org-end-of-subtree t))))))
+ (when (and (eq action 'sparse-tree)
+ (not org-sparse-tree-open-archived-trees))
+ (org-hide-archived-subtrees (point-min) (point-max)))
+ (nreverse rtn)))
+
+(defvar todo-only) ;; dynamically scoped
+
+(defun org-tags-sparse-tree (&optional todo-only match)
+ "Create a sparse tree according to tags string MATCH.
+MATCH can contain positive and negative selection of tags, like
+\"+WORK+URGENT-WITHBOSS\".
+If optional argument TODO_ONLY is non-nil, only select lines that are
+also TODO lines."
+ (interactive "P")
+ (org-prepare-agenda-buffers (list (current-buffer)))
+ (org-scan-tags 'sparse-tree (cdr (org-make-tags-matcher match)) todo-only))
+
+(defvar org-cached-props nil)
+(defun org-cached-entry-get (pom property)
+ (if (or (eq t org-use-property-inheritance)
+ (member property org-use-property-inheritance))
+ ;; Caching is not possible, check it directly
+ (org-entry-get pom property 'inherit)
+ ;; Get all properties, so that we can do complicated checks easily
+ (cdr (assoc property (or org-cached-props
+ (setq org-cached-props
+ (org-entry-properties pom)))))))
+
+(defun org-global-tags-completion-table (&optional files)
+ "Return the list of all tags in all agenda buffer/files."
+ (save-excursion
+ (org-uniquify
+ (apply 'append
+ (mapcar
+ (lambda (file)
+ (set-buffer (find-file-noselect file))
+ (org-get-buffer-tags))
+ (if (and files (car files))
+ files
+ (org-agenda-files)))))))
+
+(defun org-make-tags-matcher (match)
+ "Create the TAGS//TODO matcher form for the selection string MATCH."
+ ;; todo-only is scoped dynamically into this function, and the function
+ ;; may change it it the matcher asksk for it.
+ (unless match
+ ;; Get a new match request, with completion
+ (let ((org-last-tags-completion-table
+ (org-global-tags-completion-table)))
+ (setq match (completing-read
+ "Match: " 'org-tags-completion-function nil nil
+ org-agenda-query-string
+ 'org-tags-history))))
+
+ ;; Parse the string and create a lisp form
+ (let ((match0 match)
+ (re (org-re "^&?\\([-+:]\\)?\\({[^}]+}\\|LEVEL=\\([0-9]+\\)\\|\\([[:alnum:]_]+\\)=\\({[^}]+}\\|\"[^\"]+\"\\)\\|[[:alnum:]_@]+\\)"))
+ minus tag mm
+ tagsmatch todomatch tagsmatcher todomatcher kwd matcher
+ orterms term orlist re-p level-p prop-p pn pv cat-p gv)
+ (if (string-match "/+" match)
+ ;; match contains also a todo-matching request
+ (progn
+ (setq tagsmatch (substring match 0 (match-beginning 0))
+ todomatch (substring match (match-end 0)))
+ (if (string-match "^!" todomatch)
+ (setq todo-only t todomatch (substring todomatch 1)))
+ (if (string-match "^\\s-*$" todomatch)
+ (setq todomatch nil)))
+ ;; only matching tags
+ (setq tagsmatch match todomatch nil))
+
+ ;; Make the tags matcher
+ (if (or (not tagsmatch) (not (string-match "\\S-" tagsmatch)))
+ (setq tagsmatcher t)
+ (setq orterms (org-split-string tagsmatch "|") orlist nil)
+ (while (setq term (pop orterms))
+ (while (and (equal (substring term -1) "\\") orterms)
+ (setq term (concat term "|" (pop orterms)))) ; repair bad split
+ (while (string-match re term)
+ (setq minus (and (match-end 1)
+ (equal (match-string 1 term) "-"))
+ tag (match-string 2 term)
+ re-p (equal (string-to-char tag) ?{)
+ level-p (match-end 3)
+ prop-p (match-end 4)
+ mm (cond
+ (re-p `(org-match-any-p ,(substring tag 1 -1) tags-list))
+ (level-p `(= level ,(string-to-number
+ (match-string 3 term))))
+ (prop-p
+ (setq pn (match-string 4 term)
+ pv (match-string 5 term)
+ cat-p (equal pn "CATEGORY")
+ re-p (equal (string-to-char pv) ?{)
+ pv (substring pv 1 -1))
+ (if (equal pn "CATEGORY")
+ (setq gv '(get-text-property (point) 'org-category))
+ (setq gv `(org-cached-entry-get nil ,pn)))
+ (if re-p
+ `(string-match ,pv (or ,gv ""))
+ `(equal ,pv ,gv)))
+ (t `(member ,(downcase tag) tags-list)))
+ mm (if minus (list 'not mm) mm)
+ term (substring term (match-end 0)))
+ (push mm tagsmatcher))
+ (push (if (> (length tagsmatcher) 1)
+ (cons 'and tagsmatcher)
+ (car tagsmatcher))
+ orlist)
+ (setq tagsmatcher nil))
+ (setq tagsmatcher (if (> (length orlist) 1) (cons 'or orlist) (car orlist)))
+ (setq tagsmatcher
+ (list 'progn '(setq org-cached-props nil) tagsmatcher)))
+
+ ;; Make the todo matcher
+ (if (or (not todomatch) (not (string-match "\\S-" todomatch)))
+ (setq todomatcher t)
+ (setq orterms (org-split-string todomatch "|") orlist nil)
+ (while (setq term (pop orterms))
+ (while (string-match re term)
+ (setq minus (and (match-end 1)
+ (equal (match-string 1 term) "-"))
+ kwd (match-string 2 term)
+ re-p (equal (string-to-char kwd) ?{)
+ term (substring term (match-end 0))
+ mm (if re-p
+ `(string-match ,(substring kwd 1 -1) todo)
+ (list 'equal 'todo kwd))
+ mm (if minus (list 'not mm) mm))
+ (push mm todomatcher))
+ (push (if (> (length todomatcher) 1)
+ (cons 'and todomatcher)
+ (car todomatcher))
+ orlist)
+ (setq todomatcher nil))
+ (setq todomatcher (if (> (length orlist) 1)
+ (cons 'or orlist) (car orlist))))
+
+ ;; Return the string and lisp forms of the matcher
+ (setq matcher (if todomatcher
+ (list 'and tagsmatcher todomatcher)
+ tagsmatcher))
+ (cons match0 matcher)))
+
+(defun org-match-any-p (re list)
+ "Does re match any element of list?"
+ (setq list (mapcar (lambda (x) (string-match re x)) list))
+ (delq nil list))
+
+(defvar org-add-colon-after-tag-completion nil) ;; dynamically skoped param
+(defvar org-tags-overlay (org-make-overlay 1 1))
+(org-detach-overlay org-tags-overlay)
+
+(defun org-align-tags-here (to-col)
+ ;; Assumes that this is a headline
+ (let ((pos (point)) (col (current-column)) tags)
+ (beginning-of-line 1)
+ (if (and (looking-at (org-re ".*?\\([ \t]+\\)\\(:[[:alnum:]_@:]+:\\)[ \t]*$"))
+ (< pos (match-beginning 2)))
+ (progn
+ (setq tags (match-string 2))
+ (goto-char (match-beginning 1))
+ (insert " ")
+ (delete-region (point) (1+ (match-end 0)))
+ (backward-char 1)
+ (move-to-column
+ (max (1+ (current-column))
+ (1+ col)
+ (if (> to-col 0)
+ to-col
+ (- (abs to-col) (length tags))))
+ t)
+ (insert tags)
+ (move-to-column (min (current-column) col) t))
+ (goto-char pos))))
+
+(defun org-set-tags (&optional arg just-align)
+ "Set the tags for the current headline.
+With prefix ARG, realign all tags in headings in the current buffer."
+ (interactive "P")
+ (let* ((re (concat "^" outline-regexp))
+ (current (org-get-tags-string))
+ (col (current-column))
+ (org-setting-tags t)
+ table current-tags inherited-tags ; computed below when needed
+ tags p0 c0 c1 rpl)
+ (if arg
+ (save-excursion
+ (goto-char (point-min))
+ (let ((buffer-invisibility-spec (org-inhibit-invisibility)))
+ (while (re-search-forward re nil t)
+ (org-set-tags nil t)
+ (end-of-line 1)))
+ (message "All tags realigned to column %d" org-tags-column))
+ (if just-align
+ (setq tags current)
+ ;; Get a new set of tags from the user
+ (save-excursion
+ (setq table (or org-tag-alist (org-get-buffer-tags))
+ org-last-tags-completion-table table
+ current-tags (org-split-string current ":")
+ inherited-tags (nreverse
+ (nthcdr (length current-tags)
+ (nreverse (org-get-tags-at))))
+ tags
+ (if (or (eq t org-use-fast-tag-selection)
+ (and org-use-fast-tag-selection
+ (delq nil (mapcar 'cdr table))))
+ (org-fast-tag-selection
+ current-tags inherited-tags table
+ (if org-fast-tag-selection-include-todo org-todo-key-alist))
+ (let ((org-add-colon-after-tag-completion t))
+ (org-trim
+ (org-without-partial-completion
+ (completing-read "Tags: " 'org-tags-completion-function
+ nil nil current 'org-tags-history)))))))
+ (while (string-match "[-+&]+" tags)
+ ;; No boolean logic, just a list
+ (setq tags (replace-match ":" t t tags))))
+
+ (if (string-match "\\`[\t ]*\\'" tags)
+ (setq tags "")
+ (unless (string-match ":$" tags) (setq tags (concat tags ":")))
+ (unless (string-match "^:" tags) (setq tags (concat ":" tags))))
+
+ ;; Insert new tags at the correct column
+ (beginning-of-line 1)
+ (cond
+ ((and (equal current "") (equal tags "")))
+ ((re-search-forward
+ (concat "\\([ \t]*" (regexp-quote current) "\\)[ \t]*$")
+ (point-at-eol) t)
+ (if (equal tags "")
+ (setq rpl "")
+ (goto-char (match-beginning 0))
+ (setq c0 (current-column) p0 (point)
+ c1 (max (1+ c0) (if (> org-tags-column 0)
+ org-tags-column
+ (- (- org-tags-column) (length tags))))
+ rpl (concat (make-string (max 0 (- c1 c0)) ?\ ) tags)))
+ (replace-match rpl t t)
+ (and (not (featurep 'xemacs)) c0 (tabify p0 (point)))
+ tags)
+ (t (error "Tags alignment failed")))
+ (move-to-column col)
+ (unless just-align
+ (run-hooks 'org-after-tags-change-hook)))))
+
+(defun org-change-tag-in-region (beg end tag off)
+ "Add or remove TAG for each entry in the region.
+This works in the agenda, and also in an org-mode buffer."
+ (interactive
+ (list (region-beginning) (region-end)
+ (let ((org-last-tags-completion-table
+ (if (org-mode-p)
+ (org-get-buffer-tags)
+ (org-global-tags-completion-table))))
+ (completing-read
+ "Tag: " 'org-tags-completion-function nil nil nil
+ 'org-tags-history))
+ (progn
+ (message "[s]et or [r]emove? ")
+ (equal (read-char-exclusive) ?r))))
+ (if (fboundp 'deactivate-mark) (deactivate-mark))
+ (let ((agendap (equal major-mode 'org-agenda-mode))
+ l1 l2 m buf pos newhead (cnt 0))
+ (goto-char end)
+ (setq l2 (1- (org-current-line)))
+ (goto-char beg)
+ (setq l1 (org-current-line))
+ (loop for l from l1 to l2 do
+ (goto-line l)
+ (setq m (get-text-property (point) 'org-hd-marker))
+ (when (or (and (org-mode-p) (org-on-heading-p))
+ (and agendap m))
+ (setq buf (if agendap (marker-buffer m) (current-buffer))
+ pos (if agendap m (point)))
+ (with-current-buffer buf
+ (save-excursion
+ (save-restriction
+ (goto-char pos)
+ (setq cnt (1+ cnt))
+ (org-toggle-tag tag (if off 'off 'on))
+ (setq newhead (org-get-heading)))))
+ (and agendap (org-agenda-change-all-lines newhead m))))
+ (message "Tag :%s: %s in %d headings" tag (if off "removed" "set") cnt)))
+
+(defun org-tags-completion-function (string predicate &optional flag)
+ (let (s1 s2 rtn (ctable org-last-tags-completion-table)
+ (confirm (lambda (x) (stringp (car x)))))
+ (if (string-match "^\\(.*[-+:&|]\\)\\([^-+:&|]*\\)$" string)
+ (setq s1 (match-string 1 string)
+ s2 (match-string 2 string))
+ (setq s1 "" s2 string))
+ (cond
+ ((eq flag nil)
+ ;; try completion
+ (setq rtn (try-completion s2 ctable confirm))
+ (if (stringp rtn)
+ (setq rtn
+ (concat s1 s2 (substring rtn (length s2))
+ (if (and org-add-colon-after-tag-completion
+ (assoc rtn ctable))
+ ":" ""))))
+ rtn)
+ ((eq flag t)
+ ;; all-completions
+ (all-completions s2 ctable confirm)
+ )
+ ((eq flag 'lambda)
+ ;; exact match?
+ (assoc s2 ctable)))
+ ))
+
+(defun org-fast-tag-insert (kwd tags face &optional end)
+ "Insert KDW, and the TAGS, the latter with face FACE. Also inser END."
+ (insert (format "%-12s" (concat kwd ":"))
+ (org-add-props (mapconcat 'identity tags " ") nil 'face face)
+ (or end "")))
+
+(defun org-fast-tag-show-exit (flag)
+ (save-excursion
+ (goto-line 3)
+ (if (re-search-forward "[ \t]+Next change exits" (point-at-eol) t)
+ (replace-match ""))
+ (when flag
+ (end-of-line 1)
+ (move-to-column (- (window-width) 19) t)
+ (insert (org-add-props " Next change exits" nil 'face 'org-warning)))))
+
+(defun org-set-current-tags-overlay (current prefix)
+ (let ((s (concat ":" (mapconcat 'identity current ":") ":")))
+ (if (featurep 'xemacs)
+ (org-overlay-display org-tags-overlay (concat prefix s)
+ 'secondary-selection)
+ (put-text-property 0 (length s) 'face '(secondary-selection org-tag) s)
+ (org-overlay-display org-tags-overlay (concat prefix s)))))
+
+(defun org-fast-tag-selection (current inherited table &optional todo-table)
+ "Fast tag selection with single keys.
+CURRENT is the current list of tags in the headline, INHERITED is the
+list of inherited tags, and TABLE is an alist of tags and corresponding keys,
+possibly with grouping information. TODO-TABLE is a similar table with
+TODO keywords, should these have keys assigned to them.
+If the keys are nil, a-z are automatically assigned.
+Returns the new tags string, or nil to not change the current settings."
+ (let* ((fulltable (append table todo-table))
+ (maxlen (apply 'max (mapcar
+ (lambda (x)
+ (if (stringp (car x)) (string-width (car x)) 0))
+ fulltable)))
+ (buf (current-buffer))
+ (expert (eq org-fast-tag-selection-single-key 'expert))
+ (buffer-tags nil)
+ (fwidth (+ maxlen 3 1 3))
+ (ncol (/ (- (window-width) 4) fwidth))
+ (i-face 'org-done)
+ (c-face 'org-todo)
+ tg cnt e c char c1 c2 ntable tbl rtn
+ ov-start ov-end ov-prefix
+ (exit-after-next org-fast-tag-selection-single-key)
+ (done-keywords org-done-keywords)
+ groups ingroup)
+ (save-excursion
+ (beginning-of-line 1)
+ (if (looking-at
+ (org-re ".*[ \t]\\(:[[:alnum:]_@:]+:\\)[ \t]*$"))
+ (setq ov-start (match-beginning 1)
+ ov-end (match-end 1)
+ ov-prefix "")
+ (setq ov-start (1- (point-at-eol))
+ ov-end (1+ ov-start))
+ (skip-chars-forward "^\n\r")
+ (setq ov-prefix
+ (concat
+ (buffer-substring (1- (point)) (point))
+ (if (> (current-column) org-tags-column)
+ " "
+ (make-string (- org-tags-column (current-column)) ?\ ))))))
+ (org-move-overlay org-tags-overlay ov-start ov-end)
+ (save-window-excursion
+ (if expert
+ (set-buffer (get-buffer-create " *Org tags*"))
+ (delete-other-windows)
+ (split-window-vertically)
+ (org-switch-to-buffer-other-window (get-buffer-create " *Org tags*")))
+ (erase-buffer)
+ (org-set-local 'org-done-keywords done-keywords)
+ (org-fast-tag-insert "Inherited" inherited i-face "\n")
+ (org-fast-tag-insert "Current" current c-face "\n\n")
+ (org-fast-tag-show-exit exit-after-next)
+ (org-set-current-tags-overlay current ov-prefix)
+ (setq tbl fulltable char ?a cnt 0)
+ (while (setq e (pop tbl))
+ (cond
+ ((equal e '(:startgroup))
+ (push '() groups) (setq ingroup t)
+ (when (not (= cnt 0))
+ (setq cnt 0)
+ (insert "\n"))
+ (insert "{ "))
+ ((equal e '(:endgroup))
+ (setq ingroup nil cnt 0)
+ (insert "}\n"))
+ (t
+ (setq tg (car e) c2 nil)
+ (if (cdr e)
+ (setq c (cdr e))
+ ;; automatically assign a character.
+ (setq c1 (string-to-char
+ (downcase (substring
+ tg (if (= (string-to-char tg) ?@) 1 0)))))
+ (if (or (rassoc c1 ntable) (rassoc c1 table))
+ (while (or (rassoc char ntable) (rassoc char table))
+ (setq char (1+ char)))
+ (setq c2 c1))
+ (setq c (or c2 char)))
+ (if ingroup (push tg (car groups)))
+ (setq tg (org-add-props tg nil 'face
+ (cond
+ ((not (assoc tg table))
+ (org-get-todo-face tg))
+ ((member tg current) c-face)
+ ((member tg inherited) i-face)
+ (t nil))))
+ (if (and (= cnt 0) (not ingroup)) (insert " "))
+ (insert "[" c "] " tg (make-string
+ (- fwidth 4 (length tg)) ?\ ))
+ (push (cons tg c) ntable)
+ (when (= (setq cnt (1+ cnt)) ncol)
+ (insert "\n")
+ (if ingroup (insert " "))
+ (setq cnt 0)))))
+ (setq ntable (nreverse ntable))
+ (insert "\n")
+ (goto-char (point-min))
+ (if (and (not expert) (fboundp 'fit-window-to-buffer))
+ (fit-window-to-buffer))
+ (setq rtn
+ (catch 'exit
+ (while t
+ (message "[a-z..]:Toggle [SPC]:clear [RET]:accept [TAB]:free%s%s"
+ (if groups " [!] no groups" " [!]groups")
+ (if expert " [C-c]:window" (if exit-after-next " [C-c]:single" " [C-c]:multi")))
+ (setq c (let ((inhibit-quit t)) (read-char-exclusive)))
+ (cond
+ ((= c ?\r) (throw 'exit t))
+ ((= c ?!)
+ (setq groups (not groups))
+ (goto-char (point-min))
+ (while (re-search-forward "[{}]" nil t) (replace-match " ")))
+ ((= c ?\C-c)
+ (if (not expert)
+ (org-fast-tag-show-exit
+ (setq exit-after-next (not exit-after-next)))
+ (setq expert nil)
+ (delete-other-windows)
+ (split-window-vertically)
+ (org-switch-to-buffer-other-window " *Org tags*")
+ (and (fboundp 'fit-window-to-buffer)
+ (fit-window-to-buffer))))
+ ((or (= c ?\C-g)
+ (and (= c ?q) (not (rassoc c ntable))))
+ (org-detach-overlay org-tags-overlay)
+ (setq quit-flag t))
+ ((= c ?\ )
+ (setq current nil)
+ (if exit-after-next (setq exit-after-next 'now)))
+ ((= c ?\t)
+ (condition-case nil
+ (setq tg (completing-read
+ "Tag: "
+ (or buffer-tags
+ (with-current-buffer buf
+ (org-get-buffer-tags)))))
+ (quit (setq tg "")))
+ (when (string-match "\\S-" tg)
+ (add-to-list 'buffer-tags (list tg))
+ (if (member tg current)
+ (setq current (delete tg current))
+ (push tg current)))
+ (if exit-after-next (setq exit-after-next 'now)))
+ ((setq e (rassoc c todo-table) tg (car e))
+ (with-current-buffer buf
+ (save-excursion (org-todo tg)))
+ (if exit-after-next (setq exit-after-next 'now)))
+ ((setq e (rassoc c ntable) tg (car e))
+ (if (member tg current)
+ (setq current (delete tg current))
+ (loop for g in groups do
+ (if (member tg g)
+ (mapc (lambda (x)
+ (setq current (delete x current)))
+ g)))
+ (push tg current))
+ (if exit-after-next (setq exit-after-next 'now))))
+
+ ;; Create a sorted list
+ (setq current
+ (sort current
+ (lambda (a b)
+ (assoc b (cdr (memq (assoc a ntable) ntable))))))
+ (if (eq exit-after-next 'now) (throw 'exit t))
+ (goto-char (point-min))
+ (beginning-of-line 2)
+ (delete-region (point) (point-at-eol))
+ (org-fast-tag-insert "Current" current c-face)
+ (org-set-current-tags-overlay current ov-prefix)
+ (while (re-search-forward
+ (org-re "\\[.\\] \\([[:alnum:]_@]+\\)") nil t)
+ (setq tg (match-string 1))
+ (add-text-properties
+ (match-beginning 1) (match-end 1)
+ (list 'face
+ (cond
+ ((member tg current) c-face)
+ ((member tg inherited) i-face)
+ (t (get-text-property (match-beginning 1) 'face))))))
+ (goto-char (point-min)))))
+ (org-detach-overlay org-tags-overlay)
+ (if rtn
+ (mapconcat 'identity current ":")
+ nil))))
+
+(defun org-get-tags-string ()
+ "Get the TAGS string in the current headline."
+ (unless (org-on-heading-p t)
+ (error "Not on a heading"))
+ (save-excursion
+ (beginning-of-line 1)
+ (if (looking-at (org-re ".*[ \t]\\(:[[:alnum:]_@:]+:\\)[ \t]*$"))
+ (org-match-string-no-properties 1)
+ "")))
+
+(defun org-get-tags ()
+ "Get the list of tags specified in the current headline."
+ (org-split-string (org-get-tags-string) ":"))
+
+(defun org-get-buffer-tags ()
+ "Get a table of all tags used in the buffer, for completion."
+ (let (tags)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward
+ (org-re "[ \t]:\\([[:alnum:]_@:]+\\):[ \t\r\n]") nil t)
+ (when (equal (char-after (point-at-bol 0)) ?*)
+ (mapc (lambda (x) (add-to-list 'tags x))
+ (org-split-string (org-match-string-no-properties 1) ":")))))
+ (mapcar 'list tags)))
+
+
+;;;; Properties
+
+;;; Setting and retrieving properties
+
+(defconst org-special-properties
+ '("TODO" "TAGS" "ALLTAGS" "DEADLINE" "SCHEDULED" "CLOCK" "PRIORITY"
+ "TIMESTAMP" "TIMESTAMP_IA")
+ "The special properties valid in Org-mode.
+
+These are properties that are not defined in the property drawer,
+but in some other way.")
+
+(defconst org-default-properties
+ '("ARCHIVE" "CATEGORY" "SUMMARY" "DESCRIPTION"
+ "LOCATION" "LOGGING" "COLUMNS")
+ "Some properties that are used by Org-mode for various purposes.
+Being in this list makes sure that they are offered for completion.")
+
+(defconst org-property-start-re "^[ \t]*:PROPERTIES:[ \t]*$"
+ "Regular expression matching the first line of a property drawer.")
+
+(defconst org-property-end-re "^[ \t]*:END:[ \t]*$"
+ "Regular expression matching the first line of a property drawer.")
+
+(defun org-property-action ()
+ "Do an action on properties."
+ (interactive)
+ (let (c)
+ (org-at-property-p)
+ (message "Property Action: [s]et [d]elete [D]elete globally [c]ompute")
+ (setq c (read-char-exclusive))
+ (cond
+ ((equal c ?s)
+ (call-interactively 'org-set-property))
+ ((equal c ?d)
+ (call-interactively 'org-delete-property))
+ ((equal c ?D)
+ (call-interactively 'org-delete-property-globally))
+ ((equal c ?c)
+ (call-interactively 'org-compute-property-at-point))
+ (t (error "No such property action %c" c)))))
+
+(defun org-at-property-p ()
+ "Is the cursor in a property line?"
+ ;; FIXME: Does not check if we are actually in the drawer.
+ ;; FIXME: also returns true on any drawers.....
+ ;; This is used by C-c C-c for property action.
+ (save-excursion
+ (beginning-of-line 1)
+ (looking-at (org-re "^[ \t]*\\(:\\([[:alpha:]][[:alnum:]_-]*\\):\\)[ \t]*\\(.*\\)"))))
+
+(defmacro org-with-point-at (pom &rest body)
+ "Move to buffer and point of point-or-marker POM for the duration of BODY."
+ (declare (indent 1) (debug t))
+ `(save-excursion
+ (if (markerp pom) (set-buffer (marker-buffer pom)))
+ (save-excursion
+ (goto-char (or pom (point)))
+ ,@body)))
+
+(defun org-get-property-block (&optional beg end force)
+ "Return the (beg . end) range of the body of the property drawer.
+BEG and END can be beginning and end of subtree, if not given
+they will be found.
+If the drawer does not exist and FORCE is non-nil, create the drawer."
+ (catch 'exit
+ (save-excursion
+ (let* ((beg (or beg (progn (org-back-to-heading t) (point))))
+ (end (or end (progn (outline-next-heading) (point)))))
+ (goto-char beg)
+ (if (re-search-forward org-property-start-re end t)
+ (setq beg (1+ (match-end 0)))
+ (if force
+ (save-excursion
+ (org-insert-property-drawer)
+ (setq end (progn (outline-next-heading) (point))))
+ (throw 'exit nil))
+ (goto-char beg)
+ (if (re-search-forward org-property-start-re end t)
+ (setq beg (1+ (match-end 0)))))
+ (if (re-search-forward org-property-end-re end t)
+ (setq end (match-beginning 0))
+ (or force (throw 'exit nil))
+ (goto-char beg)
+ (setq end beg)
+ (org-indent-line-function)
+ (insert ":END:\n"))
+ (cons beg end)))))
+
+(defun org-entry-properties (&optional pom which)
+ "Get all properties of the entry at point-or-marker POM.
+This includes the TODO keyword, the tags, time strings for deadline,
+scheduled, and clocking, and any additional properties defined in the
+entry. The return value is an alist, keys may occur multiple times
+if the property key was used several times.
+POM may also be nil, in which case the current entry is used.
+If WHICH is nil or `all', get all properties. If WHICH is
+`special' or `standard', only get that subclass."
+ (setq which (or which 'all))
+ (org-with-point-at pom
+ (let ((clockstr (substring org-clock-string 0 -1))
+ (excluded '("TODO" "TAGS" "ALLTAGS" "PRIORITY"))
+ beg end range props sum-props key value string)
+ (save-excursion
+ (when (condition-case nil (org-back-to-heading t) (error nil))
+ (setq beg (point))
+ (setq sum-props (get-text-property (point) 'org-summaries))
+ (outline-next-heading)
+ (setq end (point))
+ (when (memq which '(all special))
+ ;; Get the special properties, like TODO and tags
+ (goto-char beg)
+ (when (and (looking-at org-todo-line-regexp) (match-end 2))
+ (push (cons "TODO" (org-match-string-no-properties 2)) props))
+ (when (looking-at org-priority-regexp)
+ (push (cons "PRIORITY" (org-match-string-no-properties 2)) props))
+ (when (and (setq value (org-get-tags-string))
+ (string-match "\\S-" value))
+ (push (cons "TAGS" value) props))
+ (when (setq value (org-get-tags-at))
+ (push (cons "ALLTAGS" (concat ":" (mapconcat 'identity value ":") ":"))
+ props))
+ (while (re-search-forward org-maybe-keyword-time-regexp end t)
+ (setq key (if (match-end 1) (substring (org-match-string-no-properties 1) 0 -1))
+ string (if (equal key clockstr)
+ (org-no-properties
+ (org-trim
+ (buffer-substring
+ (match-beginning 3) (goto-char (point-at-eol)))))
+ (substring (org-match-string-no-properties 3) 1 -1)))
+ (unless key
+ (if (= (char-after (match-beginning 3)) ?\[)
+ (setq key "TIMESTAMP_IA")
+ (setq key "TIMESTAMP")))
+ (when (or (equal key clockstr) (not (assoc key props)))
+ (push (cons key string) props)))
+
+ )
+
+ (when (memq which '(all standard))
+ ;; Get the standard properties, like :PORP: ...
+ (setq range (org-get-property-block beg end))
+ (when range
+ (goto-char (car range))
+ (while (re-search-forward
+ (org-re "^[ \t]*:\\([[:alpha:]][[:alnum:]_-]*\\):[ \t]*\\(\\S-.*\\)?")
+ (cdr range) t)
+ (setq key (org-match-string-no-properties 1)
+ value (org-trim (or (org-match-string-no-properties 2) "")))
+ (unless (member key excluded)
+ (push (cons key (or value "")) props)))))
+ (append sum-props (nreverse props)))))))
+
+(defun org-entry-get (pom property &optional inherit)
+ "Get value of PROPERTY for entry at point-or-marker POM.
+If INHERIT is non-nil and the entry does not have the property,
+then also check higher levels of the hierarchy.
+If the property is present but empty, the return value is the empty string.
+If the property is not present at all, nil is returned."
+ (org-with-point-at pom
+ (if inherit
+ (org-entry-get-with-inheritance property)
+ (if (member property org-special-properties)
+ ;; We need a special property. Use brute force, get all properties.
+ (cdr (assoc property (org-entry-properties nil 'special)))
+ (let ((range (org-get-property-block)))
+ (if (and range
+ (goto-char (car range))
+ (re-search-forward
+ (concat "^[ \t]*:" property ":[ \t]*\\(.*\\S-\\)?")
+ (cdr range) t))
+ ;; Found the property, return it.
+ (if (match-end 1)
+ (org-match-string-no-properties 1)
+ "")))))))
+
+(defun org-entry-delete (pom property)
+ "Delete the property PROPERTY from entry at point-or-marker POM."
+ (org-with-point-at pom
+ (if (member property org-special-properties)
+ nil ; cannot delete these properties.
+ (let ((range (org-get-property-block)))
+ (if (and range
+ (goto-char (car range))
+ (re-search-forward
+ (concat "^[ \t]*:" property ":[ \t]*\\(.*\\S-\\)")
+ (cdr range) t))
+ (progn
+ (delete-region (match-beginning 0) (1+ (point-at-eol)))
+ t)
+ nil)))))
+
+;; Multi-values properties are properties that contain multiple values
+;; These values are assumed to be single words, separated by whitespace.
+(defun org-entry-add-to-multivalued-property (pom property value)
+ "Add VALUE to the words in the PROPERTY in entry at point-or-marker POM."
+ (let* ((old (org-entry-get pom property))
+ (values (and old (org-split-string old "[ \t]"))))
+ (unless (member value values)
+ (setq values (cons value values))
+ (org-entry-put pom property
+ (mapconcat 'identity values " ")))))
+
+(defun org-entry-remove-from-multivalued-property (pom property value)
+ "Remove VALUE from words in the PROPERTY in entry at point-or-marker POM."
+ (let* ((old (org-entry-get pom property))
+ (values (and old (org-split-string old "[ \t]"))))
+ (when (member value values)
+ (setq values (delete value values))
+ (org-entry-put pom property
+ (mapconcat 'identity values " ")))))
+
+(defun org-entry-member-in-multivalued-property (pom property value)
+ "Is VALUE one of the words in the PROPERTY in entry at point-or-marker POM?"
+ (let* ((old (org-entry-get pom property))
+ (values (and old (org-split-string old "[ \t]"))))
+ (member value values)))
+
+(defvar org-entry-property-inherited-from (make-marker))
+
+(defun org-entry-get-with-inheritance (property)
+ "Get entry property, and search higher levels if not present."
+ (let (tmp)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (catch 'ex
+ (while t
+ (when (setq tmp (org-entry-get nil property))
+ (org-back-to-heading t)
+ (move-marker org-entry-property-inherited-from (point))
+ (throw 'ex tmp))
+ (or (org-up-heading-safe) (throw 'ex nil)))))
+ (or tmp (cdr (assoc property org-local-properties))
+ (cdr (assoc property org-global-properties))))))
+
+(defun org-entry-put (pom property value)
+ "Set PROPERTY to VALUE for entry at point-or-marker POM."
+ (org-with-point-at pom
+ (org-back-to-heading t)
+ (let ((beg (point)) (end (save-excursion (outline-next-heading) (point)))
+ range)
+ (cond
+ ((equal property "TODO")
+ (when (and (stringp value) (string-match "\\S-" value)
+ (not (member value org-todo-keywords-1)))
+ (error "\"%s\" is not a valid TODO state" value))
+ (if (or (not value)
+ (not (string-match "\\S-" value)))
+ (setq value 'none))
+ (org-todo value)
+ (org-set-tags nil 'align))
+ ((equal property "PRIORITY")
+ (org-priority (if (and value (stringp value) (string-match "\\S-" value))
+ (string-to-char value) ?\ ))
+ (org-set-tags nil 'align))
+ ((equal property "SCHEDULED")
+ (if (re-search-forward org-scheduled-time-regexp end t)
+ (cond
+ ((eq value 'earlier) (org-timestamp-change -1 'day))
+ ((eq value 'later) (org-timestamp-change 1 'day))
+ (t (call-interactively 'org-schedule)))
+ (call-interactively 'org-schedule)))
+ ((equal property "DEADLINE")
+ (if (re-search-forward org-deadline-time-regexp end t)
+ (cond
+ ((eq value 'earlier) (org-timestamp-change -1 'day))
+ ((eq value 'later) (org-timestamp-change 1 'day))
+ (t (call-interactively 'org-deadline)))
+ (call-interactively 'org-deadline)))
+ ((member property org-special-properties)
+ (error "The %s property can not yet be set with `org-entry-put'"
+ property))
+ (t ; a non-special property
+ (let ((buffer-invisibility-spec (org-inhibit-invisibility))) ; Emacs 21
+ (setq range (org-get-property-block beg end 'force))
+ (goto-char (car range))
+ (if (re-search-forward
+ (concat "^[ \t]*:" property ":\\(.*\\)") (cdr range) t)
+ (progn
+ (delete-region (match-beginning 1) (match-end 1))
+ (goto-char (match-beginning 1)))
+ (goto-char (cdr range))
+ (insert "\n")
+ (backward-char 1)
+ (org-indent-line-function)
+ (insert ":" property ":"))
+ (and value (insert " " value))
+ (org-indent-line-function)))))))
+
+(defun org-buffer-property-keys (&optional include-specials include-defaults)
+ "Get all property keys in the current buffer.
+With INCLUDE-SPECIALS, also list the special properties that relect things
+like tags and TODO state.
+With INCLUDE-DEFAULTS, also include properties that has special meaning
+internally: ARCHIVE, CATEGORY, SUMMARY, DESCRIPTION, LOCATION, and LOGGING."
+ (let (rtn range)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (while (re-search-forward org-property-start-re nil t)
+ (setq range (org-get-property-block))
+ (goto-char (car range))
+ (while (re-search-forward
+ (org-re "^[ \t]*:\\([[:alnum:]_-]+\\):")
+ (cdr range) t)
+ (add-to-list 'rtn (org-match-string-no-properties 1)))
+ (outline-next-heading))))
+
+ (when include-specials
+ (setq rtn (append org-special-properties rtn)))
+
+ (when include-defaults
+ (mapc (lambda (x) (add-to-list 'rtn x)) org-default-properties))
+
+ (sort rtn (lambda (a b) (string< (upcase a) (upcase b))))))
+
+(defun org-property-values (key)
+ "Return a list of all values of property KEY."
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (let ((re (concat "^[ \t]*:" key ":[ \t]*\\(\\S-.*\\)"))
+ values)
+ (while (re-search-forward re nil t)
+ (add-to-list 'values (org-trim (match-string 1))))
+ (delete "" values)))))
+
+(defun org-insert-property-drawer ()
+ "Insert a property drawer into the current entry."
+ (interactive)
+ (org-back-to-heading t)
+ (looking-at outline-regexp)
+ (let ((indent (- (match-end 0)(match-beginning 0)))
+ (beg (point))
+ (re (concat "^[ \t]*" org-keyword-time-regexp))
+ end hiddenp)
+ (outline-next-heading)
+ (setq end (point))
+ (goto-char beg)
+ (while (re-search-forward re end t))
+ (setq hiddenp (org-invisible-p))
+ (end-of-line 1)
+ (and (equal (char-after) ?\n) (forward-char 1))
+ (org-skip-over-state-notes)
+ (skip-chars-backward " \t\n\r")
+ (if (eq (char-before) ?*) (forward-char 1))
+ (let ((inhibit-read-only t)) (insert "\n:PROPERTIES:\n:END:"))
+ (beginning-of-line 0)
+ (indent-to-column indent)
+ (beginning-of-line 2)
+ (indent-to-column indent)
+ (beginning-of-line 0)
+ (if hiddenp
+ (save-excursion
+ (org-back-to-heading t)
+ (hide-entry))
+ (org-flag-drawer t))))
+
+(defun org-set-property (property value)
+ "In the current entry, set PROPERTY to VALUE.
+When called interactively, this will prompt for a property name, offering
+completion on existing and default properties. And then it will prompt
+for a value, offering competion either on allowed values (via an inherited
+xxx_ALL property) or on existing values in other instances of this property
+in the current file."
+ (interactive
+ (let* ((prop (completing-read
+ "Property: " (mapcar 'list (org-buffer-property-keys nil t))))
+ (cur (org-entry-get nil prop))
+ (allowed (org-property-get-allowed-values nil prop 'table))
+ (existing (mapcar 'list (org-property-values prop)))
+ (val (if allowed
+ (completing-read "Value: " allowed nil 'req-match)
+ (completing-read
+ (concat "Value" (if (and cur (string-match "\\S-" cur))
+ (concat "[" cur "]") "")
+ ": ")
+ existing nil nil "" nil cur))))
+ (list prop (if (equal val "") cur val))))
+ (unless (equal (org-entry-get nil property) value)
+ (org-entry-put nil property value)))
+
+(defun org-delete-property (property)
+ "In the current entry, delete PROPERTY."
+ (interactive
+ (let* ((prop (completing-read
+ "Property: " (org-entry-properties nil 'standard))))
+ (list prop)))
+ (message "Property %s %s" property
+ (if (org-entry-delete nil property)
+ "deleted"
+ "was not present in the entry")))
+
+(defun org-delete-property-globally (property)
+ "Remove PROPERTY globally, from all entries."
+ (interactive
+ (let* ((prop (completing-read
+ "Globally remove property: "
+ (mapcar 'list (org-buffer-property-keys)))))
+ (list prop)))
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (let ((cnt 0))
+ (while (re-search-forward
+ (concat "^[ \t]*:" (regexp-quote property) ":.*\n?")
+ nil t)
+ (setq cnt (1+ cnt))
+ (replace-match ""))
+ (message "Property \"%s\" removed from %d entries" property cnt)))))
+
+(defvar org-columns-current-fmt-compiled) ; defined below
+
+(defun org-compute-property-at-point ()
+ "Compute the property at point.
+This looks for an enclosing column format, extracts the operator and
+then applies it to the proerty in the column format's scope."
+ (interactive)
+ (unless (org-at-property-p)
+ (error "Not at a property"))
+ (let ((prop (org-match-string-no-properties 2)))
+ (org-columns-get-format-and-top-level)
+ (unless (nth 3 (assoc prop org-columns-current-fmt-compiled))
+ (error "No operator defined for property %s" prop))
+ (org-columns-compute prop)))
+
+(defun org-property-get-allowed-values (pom property &optional table)
+ "Get allowed values for the property PROPERTY.
+When TABLE is non-nil, return an alist that can directly be used for
+completion."
+ (let (vals)
+ (cond
+ ((equal property "TODO")
+ (setq vals (org-with-point-at pom
+ (append org-todo-keywords-1 '("")))))
+ ((equal property "PRIORITY")
+ (let ((n org-lowest-priority))
+ (while (>= n org-highest-priority)
+ (push (char-to-string n) vals)
+ (setq n (1- n)))))
+ ((member property org-special-properties))
+ (t
+ (setq vals (org-entry-get pom (concat property "_ALL") 'inherit))
+
+ (when (and vals (string-match "\\S-" vals))
+ (setq vals (car (read-from-string (concat "(" vals ")"))))
+ (setq vals (mapcar (lambda (x)
+ (cond ((stringp x) x)
+ ((numberp x) (number-to-string x))
+ ((symbolp x) (symbol-name x))
+ (t "???")))
+ vals)))))
+ (if table (mapcar 'list vals) vals)))
+
+(defun org-property-previous-allowed-value (&optional previous)
+ "Switch to the next allowed value for this property."
+ (interactive)
+ (org-property-next-allowed-value t))
+
+(defun org-property-next-allowed-value (&optional previous)
+ "Switch to the next allowed value for this property."
+ (interactive)
+ (unless (org-at-property-p)
+ (error "Not at a property"))
+ (let* ((key (match-string 2))
+ (value (match-string 3))
+ (allowed (or (org-property-get-allowed-values (point) key)
+ (and (member value '("[ ]" "[-]" "[X]"))
+ '("[ ]" "[X]"))))
+ nval)
+ (unless allowed
+ (error "Allowed values for this property have not been defined"))
+ (if previous (setq allowed (reverse allowed)))
+ (if (member value allowed)
+ (setq nval (car (cdr (member value allowed)))))
+ (setq nval (or nval (car allowed)))
+ (if (equal nval value)
+ (error "Only one allowed value for this property"))
+ (org-at-property-p)
+ (replace-match (concat " :" key ": " nval) t t)
+ (org-indent-line-function)
+ (beginning-of-line 1)
+ (skip-chars-forward " \t")))
+
+(defun org-find-entry-with-id (ident)
+ "Locate the entry that contains the ID property with exact value IDENT.
+IDENT can be a string, a symbol or a number, this function will search for
+the string representation of it.
+Return the position where this entry starts, or nil if there is no such entry."
+ (let ((id (cond
+ ((stringp ident) ident)
+ ((symbol-name ident) (symbol-name ident))
+ ((numberp ident) (number-to-string ident))
+ (t (error "IDENT %s must be a string, symbol or number" ident))))
+ (case-fold-search nil))
+ (save-excursion
+ (save-restriction
+ (goto-char (point-min))
+ (when (re-search-forward
+ (concat "^[ \t]*:ID:[ \t]+" (regexp-quote id) "[ \t]*$")
+ nil t)
+ (org-back-to-heading)
+ (point))))))
+
+;;; Column View
+
+(defvar org-columns-overlays nil
+ "Holds the list of current column overlays.")
+
+(defvar org-columns-current-fmt nil
+ "Local variable, holds the currently active column format.")
+(defvar org-columns-current-fmt-compiled nil
+ "Local variable, holds the currently active column format.
+This is the compiled version of the format.")
+(defvar org-columns-current-widths nil
+ "Loval variable, holds the currently widths of fields.")
+(defvar org-columns-current-maxwidths nil
+ "Loval variable, holds the currently active maximum column widths.")
+(defvar org-columns-begin-marker (make-marker)
+ "Points to the position where last a column creation command was called.")
+(defvar org-columns-top-level-marker (make-marker)
+ "Points to the position where current columns region starts.")
+
+(defvar org-columns-map (make-sparse-keymap)
+ "The keymap valid in column display.")
+
+(defun org-columns-content ()
+ "Switch to contents view while in columns view."
+ (interactive)
+ (org-overview)
+ (org-content))
+
+(org-defkey org-columns-map "c" 'org-columns-content)
+(org-defkey org-columns-map "o" 'org-overview)
+(org-defkey org-columns-map "e" 'org-columns-edit-value)
+(org-defkey org-columns-map "\C-c\C-t" 'org-columns-todo)
+(org-defkey org-columns-map "\C-c\C-c" 'org-columns-set-tags-or-toggle)
+(org-defkey org-columns-map "\C-c\C-o" 'org-columns-open-link)
+(org-defkey org-columns-map "v" 'org-columns-show-value)
+(org-defkey org-columns-map "q" 'org-columns-quit)
+(org-defkey org-columns-map "r" 'org-columns-redo)
+(org-defkey org-columns-map [left] 'backward-char)
+(org-defkey org-columns-map "\M-b" 'backward-char)
+(org-defkey org-columns-map "a" 'org-columns-edit-allowed)
+(org-defkey org-columns-map "s" 'org-columns-edit-attributes)
+(org-defkey org-columns-map "\M-f" (lambda () (interactive) (goto-char (1+ (point)))))
+(org-defkey org-columns-map [right] (lambda () (interactive) (goto-char (1+ (point)))))
+(org-defkey org-columns-map [(shift right)] 'org-columns-next-allowed-value)
+(org-defkey org-columns-map "n" 'org-columns-next-allowed-value)
+(org-defkey org-columns-map [(shift left)] 'org-columns-previous-allowed-value)
+(org-defkey org-columns-map "p" 'org-columns-previous-allowed-value)
+(org-defkey org-columns-map "<" 'org-columns-narrow)
+(org-defkey org-columns-map ">" 'org-columns-widen)
+(org-defkey org-columns-map [(meta right)] 'org-columns-move-right)
+(org-defkey org-columns-map [(meta left)] 'org-columns-move-left)
+(org-defkey org-columns-map [(shift meta right)] 'org-columns-new)
+(org-defkey org-columns-map [(shift meta left)] 'org-columns-delete)
+
+(easy-menu-define org-columns-menu org-columns-map "Org Column Menu"
+ '("Column"
+ ["Edit property" org-columns-edit-value t]
+ ["Next allowed value" org-columns-next-allowed-value t]
+ ["Previous allowed value" org-columns-previous-allowed-value t]
+ ["Show full value" org-columns-show-value t]
+ ["Edit allowed values" org-columns-edit-allowed t]
+ "--"
+ ["Edit column attributes" org-columns-edit-attributes t]
+ ["Increase column width" org-columns-widen t]
+ ["Decrease column width" org-columns-narrow t]
+ "--"
+ ["Move column right" org-columns-move-right t]
+ ["Move column left" org-columns-move-left t]
+ ["Add column" org-columns-new t]
+ ["Delete column" org-columns-delete t]
+ "--"
+ ["CONTENTS" org-columns-content t]
+ ["OVERVIEW" org-overview t]
+ ["Refresh columns display" org-columns-redo t]
+ "--"
+ ["Open link" org-columns-open-link t]
+ "--"
+ ["Quit" org-columns-quit t]))
+
+(defun org-columns-new-overlay (beg end &optional string face)
+ "Create a new column overlay and add it to the list."
+ (let ((ov (org-make-overlay beg end)))
+ (org-overlay-put ov 'face (or face 'secondary-selection))
+ (org-overlay-display ov string face)
+ (push ov org-columns-overlays)
+ ov))
+
+(defun org-columns-display-here (&optional props)
+ "Overlay the current line with column display."
+ (interactive)
+ (let* ((fmt org-columns-current-fmt-compiled)
+ (beg (point-at-bol))
+ (level-face (save-excursion
+ (beginning-of-line 1)
+ (and (looking-at "\\(\\**\\)\\(\\* \\)")
+ (org-get-level-face 2))))
+ (color (list :foreground
+ (face-attribute (or level-face 'default) :foreground)))
+ props pom property ass width f string ov column val modval)
+ ;; Check if the entry is in another buffer.
+ (unless props
+ (if (eq major-mode 'org-agenda-mode)
+ (setq pom (or (get-text-property (point) 'org-hd-marker)
+ (get-text-property (point) 'org-marker))
+ props (if pom (org-entry-properties pom) nil))
+ (setq props (org-entry-properties nil))))
+ ;; Walk the format
+ (while (setq column (pop fmt))
+ (setq property (car column)
+ ass (if (equal property "ITEM")
+ (cons "ITEM"
+ (save-match-data
+ (org-no-properties
+ (org-remove-tabs
+ (buffer-substring-no-properties
+ (point-at-bol) (point-at-eol))))))
+ (assoc property props))
+ width (or (cdr (assoc property org-columns-current-maxwidths))
+ (nth 2 column)
+ (length property))
+ f (format "%%-%d.%ds | " width width)
+ val (or (cdr ass) "")
+ modval (if (equal property "ITEM")
+ (org-columns-cleanup-item val org-columns-current-fmt-compiled))
+ string (format f (or modval val)))
+ ;; Create the overlay
+ (org-unmodified
+ (setq ov (org-columns-new-overlay
+ beg (setq beg (1+ beg)) string
+ (list color 'org-column)))
+;;; (list (get-text-property (point-at-bol) 'face) 'org-column)))
+ (org-overlay-put ov 'keymap org-columns-map)
+ (org-overlay-put ov 'org-columns-key property)
+ (org-overlay-put ov 'org-columns-value (cdr ass))
+ (org-overlay-put ov 'org-columns-value-modified modval)
+ (org-overlay-put ov 'org-columns-pom pom)
+ (org-overlay-put ov 'org-columns-format f))
+ (if (or (not (char-after beg))
+ (equal (char-after beg) ?\n))
+ (let ((inhibit-read-only t))
+ (save-excursion
+ (goto-char beg)
+ (org-unmodified (insert " ")))))) ;; FIXME: add props and remove later?
+ ;; Make the rest of the line disappear.
+ (org-unmodified
+ (setq ov (org-columns-new-overlay beg (point-at-eol)))
+ (org-overlay-put ov 'invisible t)
+ (org-overlay-put ov 'keymap org-columns-map)
+ (org-overlay-put ov 'intangible t)
+ (push ov org-columns-overlays)
+ (setq ov (org-make-overlay (1- (point-at-eol)) (1+ (point-at-eol))))
+ (org-overlay-put ov 'keymap org-columns-map)
+ (push ov org-columns-overlays)
+ (let ((inhibit-read-only t))
+ (put-text-property (max (point-min) (1- (point-at-bol)))
+ (min (point-max) (1+ (point-at-eol)))
+ 'read-only "Type `e' to edit property")))))
+
+(defvar org-previous-header-line-format nil
+ "The header line format before column view was turned on.")
+(defvar org-columns-inhibit-recalculation nil
+ "Inhibit recomputing of columns on column view startup.")
+
+
+(defvar header-line-format)
+(defun org-columns-display-here-title ()
+ "Overlay the newline before the current line with the table title."
+ (interactive)
+ (let ((fmt org-columns-current-fmt-compiled)
+ string (title "")
+ property width f column str widths)
+ (while (setq column (pop fmt))
+ (setq property (car column)
+ str (or (nth 1 column) property)
+ width (or (cdr (assoc property org-columns-current-maxwidths))
+ (nth 2 column)
+ (length str))
+ widths (push width widths)
+ f (format "%%-%d.%ds | " width width)
+ string (format f str)
+ title (concat title string)))
+ (setq title (concat
+ (org-add-props " " nil 'display '(space :align-to 0))
+ (org-add-props title nil 'face '(:weight bold :underline t))))
+ (org-set-local 'org-previous-header-line-format header-line-format)
+ (org-set-local 'org-columns-current-widths (nreverse widths))
+ (setq header-line-format title)))
+
+(defun org-columns-remove-overlays ()
+ "Remove all currently active column overlays."
+ (interactive)
+ (when (marker-buffer org-columns-begin-marker)
+ (with-current-buffer (marker-buffer org-columns-begin-marker)
+ (when (local-variable-p 'org-previous-header-line-format)
+ (setq header-line-format org-previous-header-line-format)
+ (kill-local-variable 'org-previous-header-line-format))
+ (move-marker org-columns-begin-marker nil)
+ (move-marker org-columns-top-level-marker nil)
+ (org-unmodified
+ (mapc 'org-delete-overlay org-columns-overlays)
+ (setq org-columns-overlays nil)
+ (let ((inhibit-read-only t))
+ (remove-text-properties (point-min) (point-max) '(read-only t)))))))
+
+(defun org-columns-cleanup-item (item fmt)
+ "Remove from ITEM what is a column in the format FMT."
+ (if (not org-complex-heading-regexp)
+ item
+ (when (string-match org-complex-heading-regexp item)
+ (concat
+ (org-add-props (concat (match-string 1 item) " ") nil
+ 'org-whitespace (* 2 (1- (org-reduced-level (- (match-end 1) (match-beginning 1))))))
+ (and (match-end 2) (not (assoc "TODO" fmt)) (concat " " (match-string 2 item)))
+ (and (match-end 3) (not (assoc "PRIORITY" fmt)) (concat " " (match-string 3 item)))
+ " " (match-string 4 item)
+ (and (match-end 5) (not (assoc "TAGS" fmt)) (concat " " (match-string 5 item)))))))
+
+(defun org-columns-show-value ()
+ "Show the full value of the property."
+ (interactive)
+ (let ((value (get-char-property (point) 'org-columns-value)))
+ (message "Value is: %s" (or value ""))))
+
+(defun org-columns-quit ()
+ "Remove the column overlays and in this way exit column editing."
+ (interactive)
+ (org-unmodified
+ (org-columns-remove-overlays)
+ (let ((inhibit-read-only t))
+ (remove-text-properties (point-min) (point-max) '(read-only t))))
+ (when (eq major-mode 'org-agenda-mode)
+ (message
+ "Modification not yet reflected in Agenda buffer, use `r' to refresh")))
+
+(defun org-columns-check-computed ()
+ "Check if this column value is computed.
+If yes, throw an error indicating that changing it does not make sense."
+ (let ((val (get-char-property (point) 'org-columns-value)))
+ (when (and (stringp val)
+ (get-char-property 0 'org-computed val))
+ (error "This value is computed from the entry's children"))))
+
+(defun org-columns-todo (&optional arg)
+ "Change the TODO state during column view."
+ (interactive "P")
+ (org-columns-edit-value "TODO"))
+
+(defun org-columns-set-tags-or-toggle (&optional arg)
+ "Toggle checkbox at point, or set tags for current headline."
+ (interactive "P")
+ (if (string-match "\\`\\[[ xX-]\\]\\'"
+ (get-char-property (point) 'org-columns-value))
+ (org-columns-next-allowed-value)
+ (org-columns-edit-value "TAGS")))
+
+(defun org-columns-edit-value (&optional key)
+ "Edit the value of the property at point in column view.
+Where possible, use the standard interface for changing this line."
+ (interactive)
+ (org-columns-check-computed)
+ (let* ((external-key key)
+ (col (current-column))
+ (key (or key (get-char-property (point) 'org-columns-key)))
+ (value (get-char-property (point) 'org-columns-value))
+ (bol (point-at-bol)) (eol (point-at-eol))
+ (pom (or (get-text-property bol 'org-hd-marker)
+ (point))) ; keep despite of compiler waring
+ (line-overlays
+ (delq nil (mapcar (lambda (x)
+ (and (eq (overlay-buffer x) (current-buffer))
+ (>= (overlay-start x) bol)
+ (<= (overlay-start x) eol)
+ x))
+ org-columns-overlays)))
+ nval eval allowed)
+ (cond
+ ((equal key "ITEM")
+ (setq eval '(org-with-point-at pom
+ (org-edit-headline))))
+ ((equal key "TODO")
+ (setq eval '(org-with-point-at pom
+ (let ((current-prefix-arg
+ (if external-key current-prefix-arg '(4))))
+ (call-interactively 'org-todo)))))
+ ((equal key "PRIORITY")
+ (setq eval '(org-with-point-at pom
+ (call-interactively 'org-priority))))
+ ((equal key "TAGS")
+ (setq eval '(org-with-point-at pom
+ (let ((org-fast-tag-selection-single-key
+ (if (eq org-fast-tag-selection-single-key 'expert)
+ t org-fast-tag-selection-single-key)))
+ (call-interactively 'org-set-tags)))))
+ ((equal key "DEADLINE")
+ (setq eval '(org-with-point-at pom
+ (call-interactively 'org-deadline))))
+ ((equal key "SCHEDULED")
+ (setq eval '(org-with-point-at pom
+ (call-interactively 'org-schedule))))
+ (t
+ (setq allowed (org-property-get-allowed-values pom key 'table))
+ (if allowed
+ (setq nval (completing-read "Value: " allowed nil t))
+ (setq nval (read-string "Edit: " value)))
+ (setq nval (org-trim nval))
+ (when (not (equal nval value))
+ (setq eval '(org-entry-put pom key nval)))))
+ (when eval
+ (let ((inhibit-read-only t))
+ (remove-text-properties (max (point-min) (1- bol)) eol '(read-only t))
+ (unwind-protect
+ (progn
+ (setq org-columns-overlays
+ (org-delete-all line-overlays org-columns-overlays))
+ (mapc 'org-delete-overlay line-overlays)
+ (org-columns-eval eval))
+ (org-columns-display-here))))
+ (move-to-column col)
+ (if (nth 3 (assoc key org-columns-current-fmt-compiled))
+ (org-columns-update key))))
+
+(defun org-edit-headline () ; FIXME: this is not columns specific
+ "Edit the current headline, the part without TODO keyword, TAGS."
+ (org-back-to-heading)
+ (when (looking-at org-todo-line-regexp)
+ (let ((pre (buffer-substring (match-beginning 0) (match-beginning 3)))
+ (txt (match-string 3))
+ (post "")
+ txt2)
+ (if (string-match (org-re "[ \t]+:[[:alnum:]:_@]+:[ \t]*$") txt)
+ (setq post (match-string 0 txt)
+ txt (substring txt 0 (match-beginning 0))))
+ (setq txt2 (read-string "Edit: " txt))
+ (when (not (equal txt txt2))
+ (beginning-of-line 1)
+ (insert pre txt2 post)
+ (delete-region (point) (point-at-eol))
+ (org-set-tags nil t)))))
+
+(defun org-columns-edit-allowed ()
+ "Edit the list of allowed values for the current property."
+ (interactive)
+ (let* ((key (get-char-property (point) 'org-columns-key))
+ (key1 (concat key "_ALL"))
+ (allowed (org-entry-get (point) key1 t))
+ nval)
+ ;; FIXME: Cover editing TODO, TAGS etc in-buffer settings.????
+ (setq nval (read-string "Allowed: " allowed))
+ (org-entry-put
+ (cond ((marker-position org-entry-property-inherited-from)
+ org-entry-property-inherited-from)
+ ((marker-position org-columns-top-level-marker)
+ org-columns-top-level-marker))
+ key1 nval)))
+
+(defmacro org-no-warnings (&rest body)
+ (cons (if (fboundp 'with-no-warnings) 'with-no-warnings 'progn) body))
+
+(defun org-columns-eval (form)
+ (let (hidep)
+ (save-excursion
+ (beginning-of-line 1)
+ ;; `next-line' is needed here, because it skips invisible line.
+ (condition-case nil (org-no-warnings (next-line 1)) (error nil))
+ (setq hidep (org-on-heading-p 1)))
+ (eval form)
+ (and hidep (hide-entry))))
+
+(defun org-columns-previous-allowed-value ()
+ "Switch to the previous allowed value for this column."
+ (interactive)
+ (org-columns-next-allowed-value t))
+
+(defun org-columns-next-allowed-value (&optional previous)
+ "Switch to the next allowed value for this column."
+ (interactive)
+ (org-columns-check-computed)
+ (let* ((col (current-column))
+ (key (get-char-property (point) 'org-columns-key))
+ (value (get-char-property (point) 'org-columns-value))
+ (bol (point-at-bol)) (eol (point-at-eol))
+ (pom (or (get-text-property bol 'org-hd-marker)
+ (point))) ; keep despite of compiler waring
+ (line-overlays
+ (delq nil (mapcar (lambda (x)
+ (and (eq (overlay-buffer x) (current-buffer))
+ (>= (overlay-start x) bol)
+ (<= (overlay-start x) eol)
+ x))
+ org-columns-overlays)))
+ (allowed (or (org-property-get-allowed-values pom key)
+ (and (equal
+ (nth 4 (assoc key org-columns-current-fmt-compiled))
+ 'checkbox) '("[ ]" "[X]"))))
+ nval)
+ (when (equal key "ITEM")
+ (error "Cannot edit item headline from here"))
+ (unless (or allowed (member key '("SCHEDULED" "DEADLINE")))
+ (error "Allowed values for this property have not been defined"))
+ (if (member key '("SCHEDULED" "DEADLINE"))
+ (setq nval (if previous 'earlier 'later))
+ (if previous (setq allowed (reverse allowed)))
+ (if (member value allowed)
+ (setq nval (car (cdr (member value allowed)))))
+ (setq nval (or nval (car allowed)))
+ (if (equal nval value)
+ (error "Only one allowed value for this property")))
+ (let ((inhibit-read-only t))
+ (remove-text-properties (1- bol) eol '(read-only t))
+ (unwind-protect
+ (progn
+ (setq org-columns-overlays
+ (org-delete-all line-overlays org-columns-overlays))
+ (mapc 'org-delete-overlay line-overlays)
+ (org-columns-eval '(org-entry-put pom key nval)))
+ (org-columns-display-here)))
+ (move-to-column col)
+ (if (nth 3 (assoc key org-columns-current-fmt-compiled))
+ (org-columns-update key))))
+
+(defun org-verify-version (task)
+ (cond
+ ((eq task 'columns)
+ (if (or (featurep 'xemacs)
+ (< emacs-major-version 22))
+ (error "Emacs 22 is required for the columns feature")))))
+
+(defun org-columns-open-link (&optional arg)
+ (interactive "P")
+ (let ((key (get-char-property (point) 'org-columns-key))
+ (value (get-char-property (point) 'org-columns-value)))
+ (org-open-link-from-string arg)))
+
+(defun org-open-link-from-string (s &optional arg)
+ "Open a link in the string S, as if it was in Org-mode."
+ (interactive)
+ (with-temp-buffer
+ (let ((org-inhibit-startup t))
+ (org-mode)
+ (insert s)
+ (goto-char (point-min))
+ (org-open-at-point arg))))
+
+(defun org-columns-get-format-and-top-level ()
+ (let (fmt)
+ (when (condition-case nil (org-back-to-heading) (error nil))
+ (move-marker org-entry-property-inherited-from nil)
+ (setq fmt (org-entry-get nil "COLUMNS" t)))
+ (setq fmt (or fmt org-columns-default-format))
+ (org-set-local 'org-columns-current-fmt fmt)
+ (org-columns-compile-format fmt)
+ (if (marker-position org-entry-property-inherited-from)
+ (move-marker org-columns-top-level-marker
+ org-entry-property-inherited-from)
+ (move-marker org-columns-top-level-marker (point)))
+ fmt))
+
+(defun org-columns ()
+ "Turn on column view on an org-mode file."
+ (interactive)
+ (org-verify-version 'columns)
+ (org-columns-remove-overlays)
+ (move-marker org-columns-begin-marker (point))
+ (let (beg end fmt cache maxwidths)
+ (setq fmt (org-columns-get-format-and-top-level))
+ (save-excursion
+ (goto-char org-columns-top-level-marker)
+ (setq beg (point))
+ (unless org-columns-inhibit-recalculation
+ (org-columns-compute-all))
+ (setq end (or (condition-case nil (org-end-of-subtree t t) (error nil))
+ (point-max)))
+ (goto-char beg)
+ ;; Get and cache the properties
+ (while (re-search-forward (concat "^" outline-regexp) end t)
+ (push (cons (org-current-line) (org-entry-properties)) cache))
+ (when cache
+ (setq maxwidths (org-columns-get-autowidth-alist fmt cache))
+ (org-set-local 'org-columns-current-maxwidths maxwidths)
+ (org-columns-display-here-title)
+ (mapc (lambda (x)
+ (goto-line (car x))
+ (org-columns-display-here (cdr x)))
+ cache)))))
+
+(defun org-columns-new (&optional prop title width op fmt)
+ "Insert a new column, to the leeft o the current column."
+ (interactive)
+ (let ((editp (and prop (assoc prop org-columns-current-fmt-compiled)))
+ cell)
+ (setq prop (completing-read
+ "Property: " (mapcar 'list (org-buffer-property-keys t))
+ nil nil prop))
+ (setq title (read-string (concat "Column title [" prop "]: ") (or title prop)))
+ (setq width (read-string "Column width: " (if width (number-to-string width))))
+ (if (string-match "\\S-" width)
+ (setq width (string-to-number width))
+ (setq width nil))
+ (setq fmt (completing-read "Summary [none]: "
+ '(("none") ("add_numbers") ("currency") ("add_times") ("checkbox"))
+ nil t))
+ (if (string-match "\\S-" fmt)
+ (setq fmt (intern fmt))
+ (setq fmt nil))
+ (if (eq fmt 'none) (setq fmt nil))
+ (if editp
+ (progn
+ (setcar editp prop)
+ (setcdr editp (list title width nil fmt)))
+ (setq cell (nthcdr (1- (current-column))
+ org-columns-current-fmt-compiled))
+ (setcdr cell (cons (list prop title width nil fmt)
+ (cdr cell))))
+ (org-columns-store-format)
+ (org-columns-redo)))
+
+(defun org-columns-delete ()
+ "Delete the column at point from columns view."
+ (interactive)
+ (let* ((n (current-column))
+ (title (nth 1 (nth n org-columns-current-fmt-compiled))))
+ (when (y-or-n-p
+ (format "Are you sure you want to remove column \"%s\"? " title))
+ (setq org-columns-current-fmt-compiled
+ (delq (nth n org-columns-current-fmt-compiled)
+ org-columns-current-fmt-compiled))
+ (org-columns-store-format)
+ (org-columns-redo)
+ (if (>= (current-column) (length org-columns-current-fmt-compiled))
+ (backward-char 1)))))
+
+(defun org-columns-edit-attributes ()
+ "Edit the attributes of the current column."
+ (interactive)
+ (let* ((n (current-column))
+ (info (nth n org-columns-current-fmt-compiled)))
+ (apply 'org-columns-new info)))
+
+(defun org-columns-widen (arg)
+ "Make the column wider by ARG characters."
+ (interactive "p")
+ (let* ((n (current-column))
+ (entry (nth n org-columns-current-fmt-compiled))
+ (width (or (nth 2 entry)
+ (cdr (assoc (car entry) org-columns-current-maxwidths)))))
+ (setq width (max 1 (+ width arg)))
+ (setcar (nthcdr 2 entry) width)
+ (org-columns-store-format)
+ (org-columns-redo)))
+
+(defun org-columns-narrow (arg)
+ "Make the column nrrower by ARG characters."
+ (interactive "p")
+ (org-columns-widen (- arg)))
+
+(defun org-columns-move-right ()
+ "Swap this column with the one to the right."
+ (interactive)
+ (let* ((n (current-column))
+ (cell (nthcdr n org-columns-current-fmt-compiled))
+ e)
+ (when (>= n (1- (length org-columns-current-fmt-compiled)))
+ (error "Cannot shift this column further to the right"))
+ (setq e (car cell))
+ (setcar cell (car (cdr cell)))
+ (setcdr cell (cons e (cdr (cdr cell))))
+ (org-columns-store-format)
+ (org-columns-redo)
+ (forward-char 1)))
+
+(defun org-columns-move-left ()
+ "Swap this column with the one to the left."
+ (interactive)
+ (let* ((n (current-column)))
+ (when (= n 0)
+ (error "Cannot shift this column further to the left"))
+ (backward-char 1)
+ (org-columns-move-right)
+ (backward-char 1)))
+
+(defun org-columns-store-format ()
+ "Store the text version of the current columns format in appropriate place.
+This is either in the COLUMNS property of the node starting the current column
+display, or in the #+COLUMNS line of the current buffer."
+ (let (fmt (cnt 0))
+ (setq fmt (org-columns-uncompile-format org-columns-current-fmt-compiled))
+ (org-set-local 'org-columns-current-fmt fmt)
+ (if (marker-position org-columns-top-level-marker)
+ (save-excursion
+ (goto-char org-columns-top-level-marker)
+ (if (and (org-at-heading-p)
+ (org-entry-get nil "COLUMNS"))
+ (org-entry-put nil "COLUMNS" fmt)
+ (goto-char (point-min))
+ ;; Overwrite all #+COLUMNS lines....
+ (while (re-search-forward "^#\\+COLUMNS:.*" nil t)
+ (setq cnt (1+ cnt))
+ (replace-match (concat "#+COLUMNS: " fmt) t t))
+ (unless (> cnt 0)
+ (goto-char (point-min))
+ (or (org-on-heading-p t) (outline-next-heading))
+ (let ((inhibit-read-only t))
+ (insert-before-markers "#+COLUMNS: " fmt "\n")))
+ (org-set-local 'org-columns-default-format fmt))))))
+
+(defvar org-overriding-columns-format nil
+ "When set, overrides any other definition.")
+(defvar org-agenda-view-columns-initially nil
+ "When set, switch to columns view immediately after creating the agenda.")
+
+(defun org-agenda-columns ()
+ "Turn on column view in the agenda."
+ (interactive)
+ (org-verify-version 'columns)
+ (org-columns-remove-overlays)
+ (move-marker org-columns-begin-marker (point))
+ (let (fmt cache maxwidths m)
+ (cond
+ ((and (local-variable-p 'org-overriding-columns-format)
+ org-overriding-columns-format)
+ (setq fmt org-overriding-columns-format))
+ ((setq m (get-text-property (point-at-bol) 'org-hd-marker))
+ (setq fmt (org-entry-get m "COLUMNS" t)))
+ ((and (boundp 'org-columns-current-fmt)
+ (local-variable-p 'org-columns-current-fmt)
+ org-columns-current-fmt)
+ (setq fmt org-columns-current-fmt))
+ ((setq m (next-single-property-change (point-min) 'org-hd-marker))
+ (setq m (get-text-property m 'org-hd-marker))
+ (setq fmt (org-entry-get m "COLUMNS" t))))
+ (setq fmt (or fmt org-columns-default-format))
+ (org-set-local 'org-columns-current-fmt fmt)
+ (org-columns-compile-format fmt)
+ (save-excursion
+ ;; Get and cache the properties
+ (goto-char (point-min))
+ (while (not (eobp))
+ (when (setq m (or (get-text-property (point) 'org-hd-marker)
+ (get-text-property (point) 'org-marker)))
+ (push (cons (org-current-line) (org-entry-properties m)) cache))
+ (beginning-of-line 2))
+ (when cache
+ (setq maxwidths (org-columns-get-autowidth-alist fmt cache))
+ (org-set-local 'org-columns-current-maxwidths maxwidths)
+ (org-columns-display-here-title)
+ (mapc (lambda (x)
+ (goto-line (car x))
+ (org-columns-display-here (cdr x)))
+ cache)))))
+
+(defun org-columns-get-autowidth-alist (s cache)
+ "Derive the maximum column widths from the format and the cache."
+ (let ((start 0) rtn)
+ (while (string-match (org-re "%\\([[:alpha:]]\\S-*\\)") s start)
+ (push (cons (match-string 1 s) 1) rtn)
+ (setq start (match-end 0)))
+ (mapc (lambda (x)
+ (setcdr x (apply 'max
+ (mapcar
+ (lambda (y)
+ (length (or (cdr (assoc (car x) (cdr y))) " ")))
+ cache))))
+ rtn)
+ rtn))
+
+(defun org-columns-compute-all ()
+ "Compute all columns that have operators defined."
+ (org-unmodified
+ (remove-text-properties (point-min) (point-max) '(org-summaries t)))
+ (let ((columns org-columns-current-fmt-compiled) col)
+ (while (setq col (pop columns))
+ (when (nth 3 col)
+ (save-excursion
+ (org-columns-compute (car col)))))))
+
+(defun org-columns-update (property)
+ "Recompute PROPERTY, and update the columns display for it."
+ (org-columns-compute property)
+ (let (fmt val pos)
+ (save-excursion
+ (mapc (lambda (ov)
+ (when (equal (org-overlay-get ov 'org-columns-key) property)
+ (setq pos (org-overlay-start ov))
+ (goto-char pos)
+ (when (setq val (cdr (assoc property
+ (get-text-property
+ (point-at-bol) 'org-summaries))))
+ (setq fmt (org-overlay-get ov 'org-columns-format))
+ (org-overlay-put ov 'org-columns-value val)
+ (org-overlay-put ov 'display (format fmt val)))))
+ org-columns-overlays))))
+
+(defun org-columns-compute (property)
+ "Sum the values of property PROPERTY hierarchically, for the entire buffer."
+ (interactive)
+ (let* ((re (concat "^" outline-regexp))
+ (lmax 30) ; Does anyone use deeper levels???
+ (lsum (make-vector lmax 0))
+ (lflag (make-vector lmax nil))
+ (level 0)
+ (ass (assoc property org-columns-current-fmt-compiled))
+ (format (nth 4 ass))
+ (printf (nth 5 ass))
+ (beg org-columns-top-level-marker)
+ last-level val valflag flag end sumpos sum-alist sum str str1 useval)
+ (save-excursion
+ ;; Find the region to compute
+ (goto-char beg)
+ (setq end (condition-case nil (org-end-of-subtree t) (error (point-max))))
+ (goto-char end)
+ ;; Walk the tree from the back and do the computations
+ (while (re-search-backward re beg t)
+ (setq sumpos (match-beginning 0)
+ last-level level
+ level (org-outline-level)
+ val (org-entry-get nil property)
+ valflag (and val (string-match "\\S-" val)))
+ (cond
+ ((< level last-level)
+ ;; put the sum of lower levels here as a property
+ (setq sum (aref lsum last-level) ; current sum
+ flag (aref lflag last-level) ; any valid entries from children?
+ str (org-column-number-to-string sum format printf)
+ str1 (org-add-props (copy-sequence str) nil 'org-computed t 'face 'bold)
+ useval (if flag str1 (if valflag val ""))
+ sum-alist (get-text-property sumpos 'org-summaries))
+ (if (assoc property sum-alist)
+ (setcdr (assoc property sum-alist) useval)
+ (push (cons property useval) sum-alist)
+ (org-unmodified
+ (add-text-properties sumpos (1+ sumpos)
+ (list 'org-summaries sum-alist))))
+ (when val
+ (org-entry-put nil property (if flag str val)))
+ ;; add current to current level accumulator
+ (when (or flag valflag)
+ (aset lsum level (+ (aref lsum level)
+ (if flag sum (org-column-string-to-number
+ (if flag str val) format))))
+ (aset lflag level t))
+ ;; clear accumulators for deeper levels
+ (loop for l from (1+ level) to (1- lmax) do
+ (aset lsum l 0)
+ (aset lflag l nil)))
+ ((>= level last-level)
+ ;; add what we have here to the accumulator for this level
+ (aset lsum level (+ (aref lsum level)
+ (org-column-string-to-number (or val "0") format)))
+ (and valflag (aset lflag level t)))
+ (t (error "This should not happen")))))))
+
+(defun org-columns-redo ()
+ "Construct the column display again."
+ (interactive)
+ (message "Recomputing columns...")
+ (save-excursion
+ (if (marker-position org-columns-begin-marker)
+ (goto-char org-columns-begin-marker))
+ (org-columns-remove-overlays)
+ (if (org-mode-p)
+ (call-interactively 'org-columns)
+ (call-interactively 'org-agenda-columns)))
+ (message "Recomputing columns...done"))
+
+(defun org-columns-not-in-agenda ()
+ (if (eq major-mode 'org-agenda-mode)
+ (error "This command is only allowed in Org-mode buffers")))
+
+
+(defun org-string-to-number (s)
+ "Convert string to number, and interpret hh:mm:ss."
+ (if (not (string-match ":" s))
+ (string-to-number s)
+ (let ((l (nreverse (org-split-string s ":"))) (sum 0.0))
+ (while l
+ (setq sum (+ (string-to-number (pop l)) (/ sum 60))))
+ sum)))
+
+(defun org-column-number-to-string (n fmt printf)
+ "Convert a computed column number to a string value, according to FMT."
+ (cond
+ ((eq fmt 'add_times)
+ (let* ((h (floor n)) (m (floor (+ 0.5 (* 60 (- n h))))))
+ (format "%d:%02d" h m)))
+ ((eq fmt 'checkbox)
+ (cond ((= n (floor n)) "[X]")
+ ((> n 1.) "[-]")
+ (t "[ ]")))
+ (printf (format printf n))
+ ((eq fmt 'currency)
+ (format "%.2f" n))
+ (t (number-to-string n))))
+
+(defun org-column-string-to-number (s fmt)
+ "Convert a column value to a number that can be used for column computing."
+ (cond
+ ((string-match ":" s)
+ (let ((l (nreverse (org-split-string s ":"))) (sum 0.0))
+ (while l
+ (setq sum (+ (string-to-number (pop l)) (/ sum 60))))
+ sum))
+ ((eq fmt 'checkbox)
+ (if (equal s "[X]") 1. 0.000001))
+ (t (string-to-number s))))
+
+(defun org-columns-uncompile-format (cfmt)
+ "Turn the compiled columns format back into a string representation."
+ (let ((rtn "") e s prop title op width fmt printf)
+ (while (setq e (pop cfmt))
+ (setq prop (car e)
+ title (nth 1 e)
+ width (nth 2 e)
+ op (nth 3 e)
+ fmt (nth 4 e)
+ printf (nth 5 e))
+ (cond
+ ((eq fmt 'add_times) (setq op ":"))
+ ((eq fmt 'checkbox) (setq op "X"))
+ ((eq fmt 'add_numbers) (setq op "+"))
+ ((eq fmt 'currency) (setq op "$")))
+ (if (and op printf) (setq op (concat op ";" printf)))
+ (if (equal title prop) (setq title nil))
+ (setq s (concat "%" (if width (number-to-string width))
+ prop
+ (if title (concat "(" title ")"))
+ (if op (concat "{" op "}"))))
+ (setq rtn (concat rtn " " s)))
+ (org-trim rtn)))
+
+(defun org-columns-compile-format (fmt)
+ "Turn a column format string into an alist of specifications.
+The alist has one entry for each column in the format. The elements of
+that list are:
+property the property
+title the title field for the columns
+width the column width in characters, can be nil for automatic
+operator the operator if any
+format the output format for computed results, derived from operator
+printf a printf format for computed values"
+ (let ((start 0) width prop title op f printf)
+ (setq org-columns-current-fmt-compiled nil)
+ (while (string-match
+ (org-re "%\\([0-9]+\\)?\\([[:alnum:]_-]+\\)\\(?:(\\([^)]+\\))\\)?\\(?:{\\([^}]+\\)}\\)?\\s-*")
+ fmt start)
+ (setq start (match-end 0)
+ width (match-string 1 fmt)
+ prop (match-string 2 fmt)
+ title (or (match-string 3 fmt) prop)
+ op (match-string 4 fmt)
+ f nil
+ printf nil)
+ (if width (setq width (string-to-number width)))
+ (when (and op (string-match ";" op))
+ (setq printf (substring op (match-end 0))
+ op (substring op 0 (match-beginning 0))))
+ (cond
+ ((equal op "+") (setq f 'add_numbers))
+ ((equal op "$") (setq f 'currency))
+ ((equal op ":") (setq f 'add_times))
+ ((equal op "X") (setq f 'checkbox)))
+ (push (list prop title width op f printf) org-columns-current-fmt-compiled))
+ (setq org-columns-current-fmt-compiled
+ (nreverse org-columns-current-fmt-compiled))))
+
+
+;;; Dynamic block for Column view
+
+(defun org-columns-capture-view ()
+ "Get the column view of the current buffer and return it as a list.
+The list will contains the title row and all other rows. Each row is
+a list of fields."
+ (save-excursion
+ (let* ((title (mapcar 'cadr org-columns-current-fmt-compiled))
+ (n (length title)) row tbl)
+ (goto-char (point-min))
+ (while (re-search-forward "^\\*+ " nil t)
+ (when (get-char-property (match-beginning 0) 'org-columns-key)
+ (setq row nil)
+ (loop for i from 0 to (1- n) do
+ (push (or (get-char-property (+ (match-beginning 0) i) 'org-columns-value-modified)
+ (get-char-property (+ (match-beginning 0) i) 'org-columns-value)
+ "")
+ row))
+ (setq row (nreverse row))
+ (push row tbl)))
+ (append (list title 'hline) (nreverse tbl)))))
+
+(defun org-dblock-write:columnview (params)
+ "Write the column view table.
+PARAMS is a property list of parameters:
+
+:width enforce same column widths with <N> specifiers.
+:id the :ID: property of the entry where the columns view
+ should be built, as a string. When `local', call locally.
+ When `global' call column view with the cursor at the beginning
+ of the buffer (usually this means that the whole buffer switches
+ to column view).
+:hlines When t, insert a hline before each item. When a number, insert
+ a hline before each level <= that number.
+:vlines When t, make each column a colgroup to enforce vertical lines."
+ (let ((pos (move-marker (make-marker) (point)))
+ (hlines (plist-get params :hlines))
+ (vlines (plist-get params :vlines))
+ tbl id idpos nfields tmp)
+ (save-excursion
+ (save-restriction
+ (when (setq id (plist-get params :id))
+ (cond ((not id) nil)
+ ((eq id 'global) (goto-char (point-min)))
+ ((eq id 'local) nil)
+ ((setq idpos (org-find-entry-with-id id))
+ (goto-char idpos))
+ (t (error "Cannot find entry with :ID: %s" id))))
+ (org-columns)
+ (setq tbl (org-columns-capture-view))
+ (setq nfields (length (car tbl)))
+ (org-columns-quit)))
+ (goto-char pos)
+ (move-marker pos nil)
+ (when tbl
+ (when (plist-get params :hlines)
+ (setq tmp nil)
+ (while tbl
+ (if (eq (car tbl) 'hline)
+ (push (pop tbl) tmp)
+ (if (string-match "\\` *\\(\\*+\\)" (caar tbl))
+ (if (and (not (eq (car tmp) 'hline))
+ (or (eq hlines t)
+ (and (numberp hlines) (<= (- (match-end 1) (match-beginning 1)) hlines))))
+ (push 'hline tmp)))
+ (push (pop tbl) tmp)))
+ (setq tbl (nreverse tmp)))
+ (when vlines
+ (setq tbl (mapcar (lambda (x)
+ (if (eq 'hline x) x (cons "" x)))
+ tbl))
+ (setq tbl (append tbl (list (cons "/" (make-list nfields "<>"))))))
+ (setq pos (point))
+ (insert (org-listtable-to-string tbl))
+ (when (plist-get params :width)
+ (insert "\n|" (mapconcat (lambda (x) (format "<%d>" (max 3 x)))
+ org-columns-current-widths "|")))
+ (goto-char pos)
+ (org-table-align))))
+
+(defun org-listtable-to-string (tbl)
+ "Convert a listtable TBL to a string that contains the Org-mode table.
+The table still need to be alligned. The resulting string has no leading
+and tailing newline characters."
+ (mapconcat
+ (lambda (x)
+ (cond
+ ((listp x)
+ (concat "|" (mapconcat 'identity x "|") "|"))
+ ((eq x 'hline) "|-|")
+ (t (error "Garbage in listtable: %s" x))))
+ tbl "\n"))
+
+(defun org-insert-columns-dblock ()
+ "Create a dynamic block capturing a column view table."
+ (interactive)
+ (let ((defaults '(:name "columnview" :hlines 1))
+ (id (completing-read
+ "Capture columns (local, global, entry with :ID: property) [local]: "
+ (append '(("global") ("local"))
+ (mapcar 'list (org-property-values "ID"))))))
+ (if (equal id "") (setq id 'local))
+ (if (equal id "global") (setq id 'global))
+ (setq defaults (append defaults (list :id id)))
+ (org-create-dblock defaults)
+ (org-update-dblock)))
+
+;;;; Timestamps
+
+(defvar org-last-changed-timestamp nil)
+(defvar org-time-was-given) ; dynamically scoped parameter
+(defvar org-end-time-was-given) ; dynamically scoped parameter
+(defvar org-ts-what) ; dynamically scoped parameter
+
+(defun org-time-stamp (arg)
+ "Prompt for a date/time and insert a time stamp.
+If the user specifies a time like HH:MM, or if this command is called
+with a prefix argument, the time stamp will contain date and time.
+Otherwise, only the date will be included. All parts of a date not
+specified by the user will be filled in from the current date/time.
+So if you press just return without typing anything, the time stamp
+will represent the current date/time. If there is already a timestamp
+at the cursor, it will be modified."
+ (interactive "P")
+ (let* ((ts nil)
+ (default-time
+ ;; Default time is either today, or, when entering a range,
+ ;; the range start.
+ (if (or (and (org-at-timestamp-p t) (setq ts (match-string 0)))
+ (save-excursion
+ (re-search-backward
+ (concat org-ts-regexp "--?-?\\=") ; 1-3 minuses
+ (- (point) 20) t)))
+ (apply 'encode-time (org-parse-time-string (match-string 1)))
+ (current-time)))
+ (default-input (and ts (org-get-compact-tod ts)))
+ org-time-was-given org-end-time-was-given time)
+ (cond
+ ((and (org-at-timestamp-p)
+ (eq last-command 'org-time-stamp)
+ (eq this-command 'org-time-stamp))
+ (insert "--")
+ (setq time (let ((this-command this-command))
+ (org-read-date arg 'totime nil nil default-time default-input)))
+ (org-insert-time-stamp time (or org-time-was-given arg)))
+ ((org-at-timestamp-p)
+ (setq time (let ((this-command this-command))
+ (org-read-date arg 'totime nil nil default-time default-input)))
+ (when (org-at-timestamp-p) ; just to get the match data
+ (replace-match "")
+ (setq org-last-changed-timestamp
+ (org-insert-time-stamp
+ time (or org-time-was-given arg)
+ nil nil nil (list org-end-time-was-given))))
+ (message "Timestamp updated"))
+ (t
+ (setq time (let ((this-command this-command))
+ (org-read-date arg 'totime nil nil default-time default-input)))
+ (org-insert-time-stamp time (or org-time-was-given arg)
+ nil nil nil (list org-end-time-was-given))))))
+
+;; FIXME: can we use this for something else????
+;; like computing time differences?????
+(defun org-get-compact-tod (s)
+ (when (string-match "\\(\\([012]?[0-9]\\):\\([0-5][0-9]\\)\\)\\(-\\(\\([012]?[0-9]\\):\\([0-5][0-9]\\)\\)\\)?" s)
+ (let* ((t1 (match-string 1 s))
+ (h1 (string-to-number (match-string 2 s)))
+ (m1 (string-to-number (match-string 3 s)))
+ (t2 (and (match-end 4) (match-string 5 s)))
+ (h2 (and t2 (string-to-number (match-string 6 s))))
+ (m2 (and t2 (string-to-number (match-string 7 s))))
+ dh dm)
+ (if (not t2)
+ t1
+ (setq dh (- h2 h1) dm (- m2 m1))
+ (if (< dm 0) (setq dm (+ dm 60) dh (1- dh)))
+ (concat t1 "+" (number-to-string dh)
+ (if (/= 0 dm) (concat ":" (number-to-string dm))))))))
+
+(defun org-time-stamp-inactive (&optional arg)
+ "Insert an inactive time stamp.
+An inactive time stamp is enclosed in square brackets instead of angle
+brackets. It is inactive in the sense that it does not trigger agenda entries,
+does not link to the calendar and cannot be changed with the S-cursor keys.
+So these are more for recording a certain time/date."
+ (interactive "P")
+ (let (org-time-was-given org-end-time-was-given time)
+ (setq time (org-read-date arg 'totime))
+ (org-insert-time-stamp time (or org-time-was-given arg) 'inactive
+ nil nil (list org-end-time-was-given))))
+
+(defvar org-date-ovl (org-make-overlay 1 1))
+(org-overlay-put org-date-ovl 'face 'org-warning)
+(org-detach-overlay org-date-ovl)
+
+(defvar org-ans1) ; dynamically scoped parameter
+(defvar org-ans2) ; dynamically scoped parameter
+
+(defvar org-plain-time-of-day-regexp) ; defined below
+
+(defvar org-read-date-overlay nil)
+(defvar org-dcst nil) ; dynamically scoped
+
+(defun org-read-date (&optional with-time to-time from-string prompt
+ default-time default-input)
+ "Read a date, possibly a time, and make things smooth for the user.
+The prompt will suggest to enter an ISO date, but you can also enter anything
+which will at least partially be understood by `parse-time-string'.
+Unrecognized parts of the date will default to the current day, month, year,
+hour and minute. If this command is called to replace a timestamp at point,
+of to enter the second timestamp of a range, the default time is taken from the
+existing stamp. For example,
+ 3-2-5 --> 2003-02-05
+ feb 15 --> currentyear-02-15
+ sep 12 9 --> 2009-09-12
+ 12:45 --> today 12:45
+ 22 sept 0:34 --> currentyear-09-22 0:34
+ 12 --> currentyear-currentmonth-12
+ Fri --> nearest Friday (today or later)
+ etc.
+
+Furthermore you can specify a relative date by giving, as the *first* thing
+in the input: a plus/minus sign, a number and a letter [dwmy] to indicate
+change in days weeks, months, years.
+With a single plus or minus, the date is relative to today. With a double
+plus or minus, it is relative to the date in DEFAULT-TIME. E.g.
+ +4d --> four days from today
+ +4 --> same as above
+ +2w --> two weeks from today
+ ++5 --> five days from default date
+
+The function understands only English month and weekday abbreviations,
+but this can be configured with the variables `parse-time-months' and
+`parse-time-weekdays'.
+
+While prompting, a calendar is popped up - you can also select the
+date with the mouse (button 1). The calendar shows a period of three
+months. To scroll it to other months, use the keys `>' and `<'.
+If you don't like the calendar, turn it off with
+ \(setq org-read-date-popup-calendar nil)
+
+With optional argument TO-TIME, the date will immediately be converted
+to an internal time.
+With an optional argument WITH-TIME, the prompt will suggest to also
+insert a time. Note that when WITH-TIME is not set, you can still
+enter a time, and this function will inform the calling routine about
+this change. The calling routine may then choose to change the format
+used to insert the time stamp into the buffer to include the time.
+With optional argument FROM-STRING, read from this string instead from
+the user. PROMPT can overwrite the default prompt. DEFAULT-TIME is
+the time/date that is used for everything that is not specified by the
+user."
+ (require 'parse-time)
+ (let* ((org-time-stamp-rounding-minutes
+ (if (equal with-time '(16)) 0 org-time-stamp-rounding-minutes))
+ (org-dcst org-display-custom-times)
+ (ct (org-current-time))
+ (def (or default-time ct))
+ (defdecode (decode-time def))
+ (dummy (progn
+ (when (< (nth 2 defdecode) org-extend-today-until)
+ (setcar (nthcdr 2 defdecode) -1)
+ (setcar (nthcdr 1 defdecode) 59)
+ (setq def (apply 'encode-time defdecode)
+ defdecode (decode-time def)))))
+ (calendar-move-hook nil)
+ (view-diary-entries-initially nil)
+ (view-calendar-holidays-initially nil)
+ (timestr (format-time-string
+ (if with-time "%Y-%m-%d %H:%M" "%Y-%m-%d") def))
+ (prompt (concat (if prompt (concat prompt " ") "")
+ (format "Date+time [%s]: " timestr)))
+ ans (org-ans0 "") org-ans1 org-ans2 final)
+
+ (cond
+ (from-string (setq ans from-string))
+ (org-read-date-popup-calendar
+ (save-excursion
+ (save-window-excursion
+ (calendar)
+ (calendar-forward-day (- (time-to-days def)
+ (calendar-absolute-from-gregorian
+ (calendar-current-date))))
+ (org-eval-in-calendar nil t)
+ (let* ((old-map (current-local-map))
+ (map (copy-keymap calendar-mode-map))
+ (minibuffer-local-map (copy-keymap minibuffer-local-map)))
+ (org-defkey map (kbd "RET") 'org-calendar-select)
+ (org-defkey map (if (featurep 'xemacs) [button1] [mouse-1])
+ 'org-calendar-select-mouse)
+ (org-defkey map (if (featurep 'xemacs) [button2] [mouse-2])
+ 'org-calendar-select-mouse)
+ (org-defkey minibuffer-local-map [(meta shift left)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-backward-month 1))))
+ (org-defkey minibuffer-local-map [(meta shift right)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-forward-month 1))))
+ (org-defkey minibuffer-local-map [(meta shift up)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-backward-year 1))))
+ (org-defkey minibuffer-local-map [(meta shift down)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-forward-year 1))))
+ (org-defkey minibuffer-local-map [(shift up)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-backward-week 1))))
+ (org-defkey minibuffer-local-map [(shift down)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-forward-week 1))))
+ (org-defkey minibuffer-local-map [(shift left)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-backward-day 1))))
+ (org-defkey minibuffer-local-map [(shift right)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-forward-day 1))))
+ (org-defkey minibuffer-local-map ">"
+ (lambda () (interactive)
+ (org-eval-in-calendar '(scroll-calendar-left 1))))
+ (org-defkey minibuffer-local-map "<"
+ (lambda () (interactive)
+ (org-eval-in-calendar '(scroll-calendar-right 1))))
+ (unwind-protect
+ (progn
+ (use-local-map map)
+ (add-hook 'post-command-hook 'org-read-date-display)
+ (setq org-ans0 (read-string prompt default-input nil nil))
+ ;; org-ans0: from prompt
+ ;; org-ans1: from mouse click
+ ;; org-ans2: from calendar motion
+ (setq ans (concat org-ans0 " " (or org-ans1 org-ans2))))
+ (remove-hook 'post-command-hook 'org-read-date-display)
+ (use-local-map old-map)
+ (when org-read-date-overlay
+ (org-delete-overlay org-read-date-overlay)
+ (setq org-read-date-overlay nil)))))))
+
+ (t ; Naked prompt only
+ (unwind-protect
+ (setq ans (read-string prompt default-input nil timestr))
+ (when org-read-date-overlay
+ (org-delete-overlay org-read-date-overlay)
+ (setq org-read-date-overlay nil)))))
+
+ (setq final (org-read-date-analyze ans def defdecode))
+
+ (if to-time
+ (apply 'encode-time final)
+ (if (and (boundp 'org-time-was-given) org-time-was-given)
+ (format "%04d-%02d-%02d %02d:%02d"
+ (nth 5 final) (nth 4 final) (nth 3 final)
+ (nth 2 final) (nth 1 final))
+ (format "%04d-%02d-%02d" (nth 5 final) (nth 4 final) (nth 3 final))))))
+(defvar def)
+(defvar defdecode)
+(defvar with-time)
+(defun org-read-date-display ()
+ "Display the currrent date prompt interpretation in the minibuffer."
+ (when org-read-date-display-live
+ (when org-read-date-overlay
+ (org-delete-overlay org-read-date-overlay))
+ (let ((p (point)))
+ (end-of-line 1)
+ (while (not (equal (buffer-substring
+ (max (point-min) (- (point) 4)) (point))
+ " "))
+ (insert " "))
+ (goto-char p))
+ (let* ((ans (concat (buffer-substring (point-at-bol) (point-max))
+ " " (or org-ans1 org-ans2)))
+ (org-end-time-was-given nil)
+ (f (org-read-date-analyze ans def defdecode))
+ (fmts (if org-dcst
+ org-time-stamp-custom-formats
+ org-time-stamp-formats))
+ (fmt (if (or with-time
+ (and (boundp 'org-time-was-given) org-time-was-given))
+ (cdr fmts)
+ (car fmts)))
+ (txt (concat "=> " (format-time-string fmt (apply 'encode-time f)))))
+ (when (and org-end-time-was-given
+ (string-match org-plain-time-of-day-regexp txt))
+ (setq txt (concat (substring txt 0 (match-end 0)) "-"
+ org-end-time-was-given
+ (substring txt (match-end 0)))))
+ (setq org-read-date-overlay
+ (make-overlay (1- (point-at-eol)) (point-at-eol)))
+ (org-overlay-display org-read-date-overlay txt 'secondary-selection))))
+
+(defun org-read-date-analyze (ans def defdecode)
+ "Analyze the combined answer of the date prompt."
+ ;; FIXME: cleanup and comment
+ (let (delta deltan deltaw deltadef year month day
+ hour minute second wday pm h2 m2 tl wday1)
+
+ (when (setq delta (org-read-date-get-relative ans (current-time) def))
+ (setq ans (replace-match "" t t ans)
+ deltan (car delta)
+ deltaw (nth 1 delta)
+ deltadef (nth 2 delta)))
+
+ ;; Help matching ISO dates with single digit month ot day, like 2006-8-11.
+ (when (string-match
+ "^ *\\(\\([0-9]+\\)-\\)?\\([0-1]?[0-9]\\)-\\([0-3]?[0-9]\\)\\([^-0-9]\\|$\\)" ans)
+ (setq year (if (match-end 2)
+ (string-to-number (match-string 2 ans))
+ (string-to-number (format-time-string "%Y")))
+ month (string-to-number (match-string 3 ans))
+ day (string-to-number (match-string 4 ans)))
+ (if (< year 100) (setq year (+ 2000 year)))
+ (setq ans (replace-match (format "%04d-%02d-%02d\\5" year month day)
+ t nil ans)))
+ ;; Help matching am/pm times, because `parse-time-string' does not do that.
+ ;; If there is a time with am/pm, and *no* time without it, we convert
+ ;; so that matching will be successful.
+ (loop for i from 1 to 2 do ; twice, for end time as well
+ (when (and (not (string-match "\\(\\`\\|[^+]\\)[012]?[0-9]:[0-9][0-9]\\([ \t\n]\\|$\\)" ans))
+ (string-match "\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\(am\\|AM\\|pm\\|PM\\)\\>" ans))
+ (setq hour (string-to-number (match-string 1 ans))
+ minute (if (match-end 3)
+ (string-to-number (match-string 3 ans))
+ 0)
+ pm (equal ?p
+ (string-to-char (downcase (match-string 4 ans)))))
+ (if (and (= hour 12) (not pm))
+ (setq hour 0)
+ (if (and pm (< hour 12)) (setq hour (+ 12 hour))))
+ (setq ans (replace-match (format "%02d:%02d" hour minute)
+ t t ans))))
+
+ ;; Check if a time range is given as a duration
+ (when (string-match "\\([012]?[0-9]\\):\\([0-6][0-9]\\)\\+\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?" ans)
+ (setq hour (string-to-number (match-string 1 ans))
+ h2 (+ hour (string-to-number (match-string 3 ans)))
+ minute (string-to-number (match-string 2 ans))
+ m2 (+ minute (if (match-end 5) (string-to-number (match-string 5 ans))0)))
+ (if (>= m2 60) (setq h2 (1+ h2) m2 (- m2 60)))
+ (setq ans (replace-match (format "%02d:%02d-%02d:%02d" hour minute h2 m2) t t ans)))
+
+ ;; Check if there is a time range
+ (when (boundp 'org-end-time-was-given)
+ (setq org-time-was-given nil)
+ (when (and (string-match org-plain-time-of-day-regexp ans)
+ (match-end 8))
+ (setq org-end-time-was-given (match-string 8 ans))
+ (setq ans (concat (substring ans 0 (match-beginning 7))
+ (substring ans (match-end 7))))))
+
+ (setq tl (parse-time-string ans)
+ day (or (nth 3 tl) (nth 3 defdecode))
+ month (or (nth 4 tl)
+ (if (and org-read-date-prefer-future
+ (nth 3 tl) (< (nth 3 tl) (nth 3 defdecode)))
+ (1+ (nth 4 defdecode))
+ (nth 4 defdecode)))
+ year (or (nth 5 tl)
+ (if (and org-read-date-prefer-future
+ (nth 4 tl) (< (nth 4 tl) (nth 4 defdecode)))
+ (1+ (nth 5 defdecode))
+ (nth 5 defdecode)))
+ hour (or (nth 2 tl) (nth 2 defdecode))
+ minute (or (nth 1 tl) (nth 1 defdecode))
+ second (or (nth 0 tl) 0)
+ wday (nth 6 tl))
+ (when deltan
+ (unless deltadef
+ (let ((now (decode-time (current-time))))
+ (setq day (nth 3 now) month (nth 4 now) year (nth 5 now))))
+ (cond ((member deltaw '("d" "")) (setq day (+ day deltan)))
+ ((equal deltaw "w") (setq day (+ day (* 7 deltan))))
+ ((equal deltaw "m") (setq month (+ month deltan)))
+ ((equal deltaw "y") (setq year (+ year deltan)))))
+ (when (and wday (not (nth 3 tl)))
+ ;; Weekday was given, but no day, so pick that day in the week
+ ;; on or after the derived date.
+ (setq wday1 (nth 6 (decode-time (encode-time 0 0 0 day month year))))
+ (unless (equal wday wday1)
+ (setq day (+ day (% (- wday wday1 -7) 7)))))
+ (if (and (boundp 'org-time-was-given)
+ (nth 2 tl))
+ (setq org-time-was-given t))
+ (if (< year 100) (setq year (+ 2000 year)))
+ (if (< year 1970) (setq year (nth 5 defdecode))) ; not representable
+ (list second minute hour day month year)))
+
+(defvar parse-time-weekdays)
+
+(defun org-read-date-get-relative (s today default)
+ "Check string S for special relative date string.
+TODAY and DEFAULT are internal times, for today and for a default.
+Return shift list (N what def-flag)
+WHAT is \"d\", \"w\", \"m\", or \"y\" for day. week, month, year.
+N is the number if WHATs to shift
+DEF-FLAG is t when a double ++ or -- indicates shift relative to
+ the DEFAULT date rather than TODAY."
+ (when (string-match
+ (concat
+ "\\`[ \t]*\\([-+]\\{1,2\\}\\)"
+ "\\([0-9]+\\)?"
+ "\\([dwmy]\\|\\(" (mapconcat 'car parse-time-weekdays "\\|") "\\)\\)?"
+ "\\([ \t]\\|$\\)") s)
+ (let* ((dir (if (match-end 1)
+ (string-to-char (substring (match-string 1 s) -1))
+ ?+))
+ (rel (and (match-end 1) (= 2 (- (match-end 1) (match-beginning 1)))))
+ (n (if (match-end 2) (string-to-number (match-string 2 s)) 1))
+ (what (if (match-end 3) (match-string 3 s) "d"))
+ (wday1 (cdr (assoc (downcase what) parse-time-weekdays)))
+ (date (if rel default today))
+ (wday (nth 6 (decode-time date)))
+ delta)
+ (if wday1
+ (progn
+ (setq delta (mod (+ 7 (- wday1 wday)) 7))
+ (if (= dir ?-) (setq delta (- delta 7)))
+ (if (> n 1) (setq delta (+ delta (* (1- n) (if (= dir ?-) -7 7)))))
+ (list delta "d" rel))
+ (list (* n (if (= dir ?-) -1 1)) what rel)))))
+
+(defun org-eval-in-calendar (form &optional keepdate)
+ "Eval FORM in the calendar window and return to current window.
+Also, store the cursor date in variable org-ans2."
+ (let ((sw (selected-window)))
+ (select-window (get-buffer-window "*Calendar*"))
+ (eval form)
+ (when (and (not keepdate) (calendar-cursor-to-date))
+ (let* ((date (calendar-cursor-to-date))
+ (time (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date))))
+ (setq org-ans2 (format-time-string "%Y-%m-%d" time))))
+ (org-move-overlay org-date-ovl (1- (point)) (1+ (point)) (current-buffer))
+ (select-window sw)))
+
+; ;; Update the prompt to show new default date
+; (save-excursion
+; (goto-char (point-min))
+; (when (and org-ans2
+; (re-search-forward "\\[[-0-9]+\\]" nil t)
+; (get-text-property (match-end 0) 'field))
+; (let ((inhibit-read-only t))
+; (replace-match (concat "[" org-ans2 "]") t t)
+; (add-text-properties (point-min) (1+ (match-end 0))
+; (text-properties-at (1+ (point-min)))))))))
+
+(defun org-calendar-select ()
+ "Return to `org-read-date' with the date currently selected.
+This is used by `org-read-date' in a temporary keymap for the calendar buffer."
+ (interactive)
+ (when (calendar-cursor-to-date)
+ (let* ((date (calendar-cursor-to-date))
+ (time (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date))))
+ (setq org-ans1 (format-time-string "%Y-%m-%d" time)))
+ (if (active-minibuffer-window) (exit-minibuffer))))
+
+(defun org-insert-time-stamp (time &optional with-hm inactive pre post extra)
+ "Insert a date stamp for the date given by the internal TIME.
+WITH-HM means, use the stamp format that includes the time of the day.
+INACTIVE means use square brackets instead of angular ones, so that the
+stamp will not contribute to the agenda.
+PRE and POST are optional strings to be inserted before and after the
+stamp.
+The command returns the inserted time stamp."
+ (let ((fmt (funcall (if with-hm 'cdr 'car) org-time-stamp-formats))
+ stamp)
+ (if inactive (setq fmt (concat "[" (substring fmt 1 -1) "]")))
+ (insert-before-markers (or pre ""))
+ (insert-before-markers (setq stamp (format-time-string fmt time)))
+ (when (listp extra)
+ (setq extra (car extra))
+ (if (and (stringp extra)
+ (string-match "\\([0-9]+\\):\\([0-9]+\\)" extra))
+ (setq extra (format "-%02d:%02d"
+ (string-to-number (match-string 1 extra))
+ (string-to-number (match-string 2 extra))))
+ (setq extra nil)))
+ (when extra
+ (backward-char 1)
+ (insert-before-markers extra)
+ (forward-char 1))
+ (insert-before-markers (or post ""))
+ stamp))
+
+(defun org-toggle-time-stamp-overlays ()
+ "Toggle the use of custom time stamp formats."
+ (interactive)
+ (setq org-display-custom-times (not org-display-custom-times))
+ (unless org-display-custom-times
+ (let ((p (point-min)) (bmp (buffer-modified-p)))
+ (while (setq p (next-single-property-change p 'display))
+ (if (and (get-text-property p 'display)
+ (eq (get-text-property p 'face) 'org-date))
+ (remove-text-properties
+ p (setq p (next-single-property-change p 'display))
+ '(display t))))
+ (set-buffer-modified-p bmp)))
+ (if (featurep 'xemacs)
+ (remove-text-properties (point-min) (point-max) '(end-glyph t)))
+ (org-restart-font-lock)
+ (setq org-table-may-need-update t)
+ (if org-display-custom-times
+ (message "Time stamps are overlayed with custom format")
+ (message "Time stamp overlays removed")))
+
+(defun org-display-custom-time (beg end)
+ "Overlay modified time stamp format over timestamp between BED and END."
+ (let* ((ts (buffer-substring beg end))
+ t1 w1 with-hm tf time str w2 (off 0))
+ (save-match-data
+ (setq t1 (org-parse-time-string ts t))
+ (if (string-match "\\(-[0-9]+:[0-9]+\\)?\\( \\+[0-9]+[dwmy]\\)?\\'" ts)
+ (setq off (- (match-end 0) (match-beginning 0)))))
+ (setq end (- end off))
+ (setq w1 (- end beg)
+ with-hm (and (nth 1 t1) (nth 2 t1))
+ tf (funcall (if with-hm 'cdr 'car) org-time-stamp-custom-formats)
+ time (org-fix-decoded-time t1)
+ str (org-add-props
+ (format-time-string
+ (substring tf 1 -1) (apply 'encode-time time))
+ nil 'mouse-face 'highlight)
+ w2 (length str))
+ (if (not (= w2 w1))
+ (add-text-properties (1+ beg) (+ 2 beg)
+ (list 'org-dwidth t 'org-dwidth-n (- w1 w2))))
+ (if (featurep 'xemacs)
+ (progn
+ (put-text-property beg end 'invisible t)
+ (put-text-property beg end 'end-glyph (make-glyph str)))
+ (put-text-property beg end 'display str))))
+
+(defun org-translate-time (string)
+ "Translate all timestamps in STRING to custom format.
+But do this only if the variable `org-display-custom-times' is set."
+ (when org-display-custom-times
+ (save-match-data
+ (let* ((start 0)
+ (re org-ts-regexp-both)
+ t1 with-hm inactive tf time str beg end)
+ (while (setq start (string-match re string start))
+ (setq beg (match-beginning 0)
+ end (match-end 0)
+ t1 (save-match-data
+ (org-parse-time-string (substring string beg end) t))
+ with-hm (and (nth 1 t1) (nth 2 t1))
+ inactive (equal (substring string beg (1+ beg)) "[")
+ tf (funcall (if with-hm 'cdr 'car)
+ org-time-stamp-custom-formats)
+ time (org-fix-decoded-time t1)
+ str (format-time-string
+ (concat
+ (if inactive "[" "<") (substring tf 1 -1)
+ (if inactive "]" ">"))
+ (apply 'encode-time time))
+ string (replace-match str t t string)
+ start (+ start (length str)))))))
+ string)
+
+(defun org-fix-decoded-time (time)
+ "Set 0 instead of nil for the first 6 elements of time.
+Don't touch the rest."
+ (let ((n 0))
+ (mapcar (lambda (x) (if (< (setq n (1+ n)) 7) (or x 0) x)) time)))
+
+(defun org-days-to-time (timestamp-string)
+ "Difference between TIMESTAMP-STRING and now in days."
+ (- (time-to-days (org-time-string-to-time timestamp-string))
+ (time-to-days (current-time))))
+
+(defun org-deadline-close (timestamp-string &optional ndays)
+ "Is the time in TIMESTAMP-STRING close to the current date?"
+ (setq ndays (or ndays (org-get-wdays timestamp-string)))
+ (and (< (org-days-to-time timestamp-string) ndays)
+ (not (org-entry-is-done-p))))
+
+(defun org-get-wdays (ts)
+ "Get the deadline lead time appropriate for timestring TS."
+ (cond
+ ((<= org-deadline-warning-days 0)
+ ;; 0 or negative, enforce this value no matter what
+ (- org-deadline-warning-days))
+ ((string-match "-\\([0-9]+\\)\\([dwmy]\\)\\(\\'\\|>\\)" ts)
+ ;; lead time is specified.
+ (floor (* (string-to-number (match-string 1 ts))
+ (cdr (assoc (match-string 2 ts)
+ '(("d" . 1) ("w" . 7)
+ ("m" . 30.4) ("y" . 365.25)))))))
+ ;; go for the default.
+ (t org-deadline-warning-days)))
+
+(defun org-calendar-select-mouse (ev)
+ "Return to `org-read-date' with the date currently selected.
+This is used by `org-read-date' in a temporary keymap for the calendar buffer."
+ (interactive "e")
+ (mouse-set-point ev)
+ (when (calendar-cursor-to-date)
+ (let* ((date (calendar-cursor-to-date))
+ (time (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date))))
+ (setq org-ans1 (format-time-string "%Y-%m-%d" time)))
+ (if (active-minibuffer-window) (exit-minibuffer))))
+
+(defun org-check-deadlines (ndays)
+ "Check if there are any deadlines due or past due.
+A deadline is considered due if it happens within `org-deadline-warning-days'
+days from today's date. If the deadline appears in an entry marked DONE,
+it is not shown. The prefix arg NDAYS can be used to test that many
+days. If the prefix is a raw \\[universal-argument] prefix, all deadlines are shown."
+ (interactive "P")
+ (let* ((org-warn-days
+ (cond
+ ((equal ndays '(4)) 100000)
+ (ndays (prefix-numeric-value ndays))
+ (t (abs org-deadline-warning-days))))
+ (case-fold-search nil)
+ (regexp (concat "\\<" org-deadline-string " *<\\([^>]+\\)>"))
+ (callback
+ (lambda () (org-deadline-close (match-string 1) org-warn-days))))
+
+ (message "%d deadlines past-due or due within %d days"
+ (org-occur regexp nil callback)
+ org-warn-days)))
+
+(defun org-check-before-date (date)
+ "Check if there are deadlines or scheduled entries before DATE."
+ (interactive (list (org-read-date)))
+ (let ((case-fold-search nil)
+ (regexp (concat "\\<\\(" org-deadline-string
+ "\\|" org-scheduled-string
+ "\\) *<\\([^>]+\\)>"))
+ (callback
+ (lambda () (time-less-p
+ (org-time-string-to-time (match-string 2))
+ (org-time-string-to-time date)))))
+ (message "%d entries before %s"
+ (org-occur regexp nil callback) date)))
+
+(defun org-evaluate-time-range (&optional to-buffer)
+ "Evaluate a time range by computing the difference between start and end.
+Normally the result is just printed in the echo area, but with prefix arg
+TO-BUFFER, the result is inserted just after the date stamp into the buffer.
+If the time range is actually in a table, the result is inserted into the
+next column.
+For time difference computation, a year is assumed to be exactly 365
+days in order to avoid rounding problems."
+ (interactive "P")
+ (or
+ (org-clock-update-time-maybe)
+ (save-excursion
+ (unless (org-at-date-range-p t)
+ (goto-char (point-at-bol))
+ (re-search-forward org-tr-regexp-both (point-at-eol) t))
+ (if (not (org-at-date-range-p t))
+ (error "Not at a time-stamp range, and none found in current line")))
+ (let* ((ts1 (match-string 1))
+ (ts2 (match-string 2))
+ (havetime (or (> (length ts1) 15) (> (length ts2) 15)))
+ (match-end (match-end 0))
+ (time1 (org-time-string-to-time ts1))
+ (time2 (org-time-string-to-time ts2))
+ (t1 (time-to-seconds time1))
+ (t2 (time-to-seconds time2))
+ (diff (abs (- t2 t1)))
+ (negative (< (- t2 t1) 0))
+ ;; (ys (floor (* 365 24 60 60)))
+ (ds (* 24 60 60))
+ (hs (* 60 60))
+ (fy "%dy %dd %02d:%02d")
+ (fy1 "%dy %dd")
+ (fd "%dd %02d:%02d")
+ (fd1 "%dd")
+ (fh "%02d:%02d")
+ y d h m align)
+ (if havetime
+ (setq ; y (floor (/ diff ys)) diff (mod diff ys)
+ y 0
+ d (floor (/ diff ds)) diff (mod diff ds)
+ h (floor (/ diff hs)) diff (mod diff hs)
+ m (floor (/ diff 60)))
+ (setq ; y (floor (/ diff ys)) diff (mod diff ys)
+ y 0
+ d (floor (+ (/ diff ds) 0.5))
+ h 0 m 0))
+ (if (not to-buffer)
+ (message "%s" (org-make-tdiff-string y d h m))
+ (if (org-at-table-p)
+ (progn
+ (goto-char match-end)
+ (setq align t)
+ (and (looking-at " *|") (goto-char (match-end 0))))
+ (goto-char match-end))
+ (if (looking-at
+ "\\( *-? *[0-9]+y\\)?\\( *[0-9]+d\\)? *[0-9][0-9]:[0-9][0-9]")
+ (replace-match ""))
+ (if negative (insert " -"))
+ (if (> y 0) (insert " " (format (if havetime fy fy1) y d h m))
+ (if (> d 0) (insert " " (format (if havetime fd fd1) d h m))
+ (insert " " (format fh h m))))
+ (if align (org-table-align))
+ (message "Time difference inserted")))))
+
+(defun org-make-tdiff-string (y d h m)
+ (let ((fmt "")
+ (l nil))
+ (if (> y 0) (setq fmt (concat fmt "%d year" (if (> y 1) "s" "") " ")
+ l (push y l)))
+ (if (> d 0) (setq fmt (concat fmt "%d day" (if (> d 1) "s" "") " ")
+ l (push d l)))
+ (if (> h 0) (setq fmt (concat fmt "%d hour" (if (> h 1) "s" "") " ")
+ l (push h l)))
+ (if (> m 0) (setq fmt (concat fmt "%d minute" (if (> m 1) "s" "") " ")
+ l (push m l)))
+ (apply 'format fmt (nreverse l))))
+
+(defun org-time-string-to-time (s)
+ (apply 'encode-time (org-parse-time-string s)))
+
+(defun org-time-string-to-absolute (s &optional daynr)
+ "Convert a time stamp to an absolute day number.
+If there is a specifyer for a cyclic time stamp, get the closest date to
+DAYNR."
+ (cond
+ ((and daynr (string-match "\\`%%\\((.*)\\)" s))
+ (if (org-diary-sexp-entry (match-string 1 s) "" date)
+ daynr
+ (+ daynr 1000)))
+ ((and daynr (string-match "\\+[0-9]+[dwmy]" s))
+ (org-closest-date s (if (and (boundp 'daynr) (integerp daynr)) daynr
+ (time-to-days (current-time))) (match-string 0 s)))
+ (t (time-to-days (apply 'encode-time (org-parse-time-string s))))))
+
+(defun org-time-from-absolute (d)
+ "Return the time corresponding to date D.
+D may be an absolute day number, or a calendar-type list (month day year)."
+ (if (numberp d) (setq d (calendar-gregorian-from-absolute d)))
+ (encode-time 0 0 0 (nth 1 d) (car d) (nth 2 d)))
+
+(defun org-calendar-holiday ()
+ "List of holidays, for Diary display in Org-mode."
+ (require 'holidays)
+ (let ((hl (funcall
+ (if (fboundp 'calendar-check-holidays)
+ 'calendar-check-holidays 'check-calendar-holidays) date)))
+ (if hl (mapconcat 'identity hl "; "))))
+
+(defun org-diary-sexp-entry (sexp entry date)
+ "Process a SEXP diary ENTRY for DATE."
+ (require 'diary-lib)
+ (let ((result (if calendar-debug-sexp
+ (let ((stack-trace-on-error t))
+ (eval (car (read-from-string sexp))))
+ (condition-case nil
+ (eval (car (read-from-string sexp)))
+ (error
+ (beep)
+ (message "Bad sexp at line %d in %s: %s"
+ (org-current-line)
+ (buffer-file-name) sexp)
+ (sleep-for 2))))))
+ (cond ((stringp result) result)
+ ((and (consp result)
+ (stringp (cdr result))) (cdr result))
+ (result entry)
+ (t nil))))
+
+(defun org-diary-to-ical-string (frombuf)
+ "Get iCalendar entries from diary entries in buffer FROMBUF.
+This uses the icalendar.el library."
+ (let* ((tmpdir (if (featurep 'xemacs)
+ (temp-directory)
+ temporary-file-directory))
+ (tmpfile (make-temp-name
+ (expand-file-name "orgics" tmpdir)))
+ buf rtn b e)
+ (save-excursion
+ (set-buffer frombuf)
+ (icalendar-export-region (point-min) (point-max) tmpfile)
+ (setq buf (find-buffer-visiting tmpfile))
+ (set-buffer buf)
+ (goto-char (point-min))
+ (if (re-search-forward "^BEGIN:VEVENT" nil t)
+ (setq b (match-beginning 0)))
+ (goto-char (point-max))
+ (if (re-search-backward "^END:VEVENT" nil t)
+ (setq e (match-end 0)))
+ (setq rtn (if (and b e) (concat (buffer-substring b e) "\n") "")))
+ (kill-buffer buf)
+ (kill-buffer frombuf)
+ (delete-file tmpfile)
+ rtn))
+
+(defun org-closest-date (start current change)
+ "Find the date closest to CURRENT that is consistent with START and CHANGE."
+ ;; Make the proper lists from the dates
+ (catch 'exit
+ (let ((a1 '(("d" . day) ("w" . week) ("m" . month) ("y" . year)))
+ dn dw sday cday n1 n2
+ d m y y1 y2 date1 date2 nmonths nm ny m2)
+
+ (setq start (org-date-to-gregorian start)
+ current (org-date-to-gregorian
+ (if org-agenda-repeating-timestamp-show-all
+ current
+ (time-to-days (current-time))))
+ sday (calendar-absolute-from-gregorian start)
+ cday (calendar-absolute-from-gregorian current))
+
+ (if (<= cday sday) (throw 'exit sday))
+
+ (if (string-match "\\(\\+[0-9]+\\)\\([dwmy]\\)" change)
+ (setq dn (string-to-number (match-string 1 change))
+ dw (cdr (assoc (match-string 2 change) a1)))
+ (error "Invalid change specifyer: %s" change))
+ (if (eq dw 'week) (setq dw 'day dn (* 7 dn)))
+ (cond
+ ((eq dw 'day)
+ (setq n1 (+ sday (* dn (floor (/ (- cday sday) dn))))
+ n2 (+ n1 dn)))
+ ((eq dw 'year)
+ (setq d (nth 1 start) m (car start) y1 (nth 2 start) y2 (nth 2 current))
+ (setq y1 (+ (* (floor (/ (- y2 y1) dn)) dn) y1))
+ (setq date1 (list m d y1)
+ n1 (calendar-absolute-from-gregorian date1)
+ date2 (list m d (+ y1 (* (if (< n1 cday) 1 -1) dn)))
+ n2 (calendar-absolute-from-gregorian date2)))
+ ((eq dw 'month)
+ ;; approx number of month between the tow dates
+ (setq nmonths (floor (/ (- cday sday) 30.436875)))
+ ;; How often does dn fit in there?
+ (setq d (nth 1 start) m (car start) y (nth 2 start)
+ nm (* dn (max 0 (1- (floor (/ nmonths dn)))))
+ m (+ m nm)
+ ny (floor (/ m 12))
+ y (+ y ny)
+ m (- m (* ny 12)))
+ (while (> m 12) (setq m (- m 12) y (1+ y)))
+ (setq n1 (calendar-absolute-from-gregorian (list m d y)))
+ (setq m2 (+ m dn) y2 y)
+ (if (> m2 12) (setq y2 (1+ y2) m2 (- m2 12)))
+ (setq n2 (calendar-absolute-from-gregorian (list m2 d y2)))
+ (while (< n2 cday)
+ (setq n1 n2 m m2 y y2)
+ (setq m2 (+ m dn) y2 y)
+ (if (> m2 12) (setq y2 (1+ y2) m2 (- m2 12)))
+ (setq n2 (calendar-absolute-from-gregorian (list m2 d y2))))))
+
+ (if org-agenda-repeating-timestamp-show-all
+ (if (> (abs (- cday n1)) (abs (- cday n2))) n2 n1)
+ (if (= cday n1) n1 n2)))))
+
+(defun org-date-to-gregorian (date)
+ "Turn any specification of DATE into a gregorian date for the calendar."
+ (cond ((integerp date) (calendar-gregorian-from-absolute date))
+ ((and (listp date) (= (length date) 3)) date)
+ ((stringp date)
+ (setq date (org-parse-time-string date))
+ (list (nth 4 date) (nth 3 date) (nth 5 date)))
+ ((listp date)
+ (list (nth 4 date) (nth 3 date) (nth 5 date)))))
+
+(defun org-parse-time-string (s &optional nodefault)
+ "Parse the standard Org-mode time string.
+This should be a lot faster than the normal `parse-time-string'.
+If time is not given, defaults to 0:00. However, with optional NODEFAULT,
+hour and minute fields will be nil if not given."
+ (if (string-match org-ts-regexp0 s)
+ (list 0
+ (if (or (match-beginning 8) (not nodefault))
+ (string-to-number (or (match-string 8 s) "0")))
+ (if (or (match-beginning 7) (not nodefault))
+ (string-to-number (or (match-string 7 s) "0")))
+ (string-to-number (match-string 4 s))
+ (string-to-number (match-string 3 s))
+ (string-to-number (match-string 2 s))
+ nil nil nil)
+ (make-list 9 0)))
+
+(defun org-timestamp-up (&optional arg)
+ "Increase the date item at the cursor by one.
+If the cursor is on the year, change the year. If it is on the month or
+the day, change that.
+With prefix ARG, change by that many units."
+ (interactive "p")
+ (org-timestamp-change (prefix-numeric-value arg)))
+
+(defun org-timestamp-down (&optional arg)
+ "Decrease the date item at the cursor by one.
+If the cursor is on the year, change the year. If it is on the month or
+the day, change that.
+With prefix ARG, change by that many units."
+ (interactive "p")
+ (org-timestamp-change (- (prefix-numeric-value arg))))
+
+(defun org-timestamp-up-day (&optional arg)
+ "Increase the date in the time stamp by one day.
+With prefix ARG, change that many days."
+ (interactive "p")
+ (if (and (not (org-at-timestamp-p t))
+ (org-on-heading-p))
+ (org-todo 'up)
+ (org-timestamp-change (prefix-numeric-value arg) 'day)))
+
+(defun org-timestamp-down-day (&optional arg)
+ "Decrease the date in the time stamp by one day.
+With prefix ARG, change that many days."
+ (interactive "p")
+ (if (and (not (org-at-timestamp-p t))
+ (org-on-heading-p))
+ (org-todo 'down)
+ (org-timestamp-change (- (prefix-numeric-value arg)) 'day)))
+
+(defsubst org-pos-in-match-range (pos n)
+ (and (match-beginning n)
+ (<= (match-beginning n) pos)
+ (>= (match-end n) pos)))
+
+(defun org-at-timestamp-p (&optional inactive-ok)
+ "Determine if the cursor is in or at a timestamp."
+ (interactive)
+ (let* ((tsr (if inactive-ok org-ts-regexp3 org-ts-regexp2))
+ (pos (point))
+ (ans (or (looking-at tsr)
+ (save-excursion
+ (skip-chars-backward "^[<\n\r\t")
+ (if (> (point) (point-min)) (backward-char 1))
+ (and (looking-at tsr)
+ (> (- (match-end 0) pos) -1))))))
+ (and ans
+ (boundp 'org-ts-what)
+ (setq org-ts-what
+ (cond
+ ((= pos (match-beginning 0)) 'bracket)
+ ((= pos (1- (match-end 0))) 'bracket)
+ ((org-pos-in-match-range pos 2) 'year)
+ ((org-pos-in-match-range pos 3) 'month)
+ ((org-pos-in-match-range pos 7) 'hour)
+ ((org-pos-in-match-range pos 8) 'minute)
+ ((or (org-pos-in-match-range pos 4)
+ (org-pos-in-match-range pos 5)) 'day)
+ ((and (> pos (or (match-end 8) (match-end 5)))
+ (< pos (match-end 0)))
+ (- pos (or (match-end 8) (match-end 5))))
+ (t 'day))))
+ ans))
+
+(defun org-toggle-timestamp-type ()
+ ""
+ (interactive)
+ (when (org-at-timestamp-p t)
+ (save-excursion
+ (goto-char (match-beginning 0))
+ (insert (if (equal (char-after) ?<) "[" "<")) (delete-char 1)
+ (goto-char (1- (match-end 0)))
+ (insert (if (equal (char-after) ?>) "]" ">")) (delete-char 1))
+ (message "Timestamp is now %sactive"
+ (if (equal (char-before) ?>) "in" ""))))
+
+(defun org-timestamp-change (n &optional what)
+ "Change the date in the time stamp at point.
+The date will be changed by N times WHAT. WHAT can be `day', `month',
+`year', `minute', `second'. If WHAT is not given, the cursor position
+in the timestamp determines what will be changed."
+ (let ((pos (point))
+ with-hm inactive
+ org-ts-what
+ extra
+ ts time time0)
+ (if (not (org-at-timestamp-p t))
+ (error "Not at a timestamp"))
+ (if (and (not what) (eq org-ts-what 'bracket))
+ (org-toggle-timestamp-type)
+ (if (and (not what) (not (eq org-ts-what 'day))
+ org-display-custom-times
+ (get-text-property (point) 'display)
+ (not (get-text-property (1- (point)) 'display)))
+ (setq org-ts-what 'day))
+ (setq org-ts-what (or what org-ts-what)
+ inactive (= (char-after (match-beginning 0)) ?\[)
+ ts (match-string 0))
+ (replace-match "")
+ (if (string-match
+ "\\(\\(-[012][0-9]:[0-5][0-9]\\)?\\( [-+][0-9]+[dwmy]\\)*\\)[]>]"
+ ts)
+ (setq extra (match-string 1 ts)))
+ (if (string-match "^.\\{10\\}.*?[0-9]+:[0-9][0-9]" ts)
+ (setq with-hm t))
+ (setq time0 (org-parse-time-string ts))
+ (setq time
+ (encode-time (or (car time0) 0)
+ (+ (if (eq org-ts-what 'minute) n 0) (nth 1 time0))
+ (+ (if (eq org-ts-what 'hour) n 0) (nth 2 time0))
+ (+ (if (eq org-ts-what 'day) n 0) (nth 3 time0))
+ (+ (if (eq org-ts-what 'month) n 0) (nth 4 time0))
+ (+ (if (eq org-ts-what 'year) n 0) (nth 5 time0))
+ (nthcdr 6 time0)))
+ (when (integerp org-ts-what)
+ (setq extra (org-modify-ts-extra extra org-ts-what n)))
+ (if (eq what 'calendar)
+ (let ((cal-date (org-get-date-from-calendar)))
+ (setcar (nthcdr 4 time0) (nth 0 cal-date)) ; month
+ (setcar (nthcdr 3 time0) (nth 1 cal-date)) ; day
+ (setcar (nthcdr 5 time0) (nth 2 cal-date)) ; year
+ (setcar time0 (or (car time0) 0))
+ (setcar (nthcdr 1 time0) (or (nth 1 time0) 0))
+ (setcar (nthcdr 2 time0) (or (nth 2 time0) 0))
+ (setq time (apply 'encode-time time0))))
+ (setq org-last-changed-timestamp
+ (org-insert-time-stamp time with-hm inactive nil nil extra))
+ (org-clock-update-time-maybe)
+ (goto-char pos)
+ ;; Try to recenter the calendar window, if any
+ (if (and org-calendar-follow-timestamp-change
+ (get-buffer-window "*Calendar*" t)
+ (memq org-ts-what '(day month year)))
+ (org-recenter-calendar (time-to-days time))))))
+
+;; FIXME: does not yet work for lead times
+(defun org-modify-ts-extra (s pos n)
+ "Change the different parts of the lead-time and repeat fields in timestamp."
+ (let ((idx '(("d" . 0) ("w" . 1) ("m" . 2) ("y" . 3) ("d" . -1) ("y" . 4)))
+ ng h m new)
+ (when (string-match "\\(-\\([012][0-9]\\):\\([0-5][0-9]\\)\\)?\\( \\+\\([0-9]+\\)\\([dmwy]\\)\\)?" s)
+ (cond
+ ((or (org-pos-in-match-range pos 2)
+ (org-pos-in-match-range pos 3))
+ (setq m (string-to-number (match-string 3 s))
+ h (string-to-number (match-string 2 s)))
+ (if (org-pos-in-match-range pos 2)
+ (setq h (+ h n))
+ (setq m (+ m n)))
+ (if (< m 0) (setq m (+ m 60) h (1- h)))
+ (if (> m 59) (setq m (- m 60) h (1+ h)))
+ (setq h (min 24 (max 0 h)))
+ (setq ng 1 new (format "-%02d:%02d" h m)))
+ ((org-pos-in-match-range pos 6)
+ (setq ng 6 new (car (rassoc (+ n (cdr (assoc (match-string 6 s) idx))) idx))))
+ ((org-pos-in-match-range pos 5)
+ (setq ng 5 new (format "%d" (max 1 (+ n (string-to-number (match-string 5 s))))))))
+
+ (when ng
+ (setq s (concat
+ (substring s 0 (match-beginning ng))
+ new
+ (substring s (match-end ng))))))
+ s))
+
+(defun org-recenter-calendar (date)
+ "If the calendar is visible, recenter it to DATE."
+ (let* ((win (selected-window))
+ (cwin (get-buffer-window "*Calendar*" t))
+ (calendar-move-hook nil))
+ (when cwin
+ (select-window cwin)
+ (calendar-goto-date (if (listp date) date
+ (calendar-gregorian-from-absolute date)))
+ (select-window win))))
+
+(defun org-goto-calendar (&optional arg)
+ "Go to the Emacs calendar at the current date.
+If there is a time stamp in the current line, go to that date.
+A prefix ARG can be used to force the current date."
+ (interactive "P")
+ (let ((tsr org-ts-regexp) diff
+ (calendar-move-hook nil)
+ (view-calendar-holidays-initially nil)
+ (view-diary-entries-initially nil))
+ (if (or (org-at-timestamp-p)
+ (save-excursion
+ (beginning-of-line 1)
+ (looking-at (concat ".*" tsr))))
+ (let ((d1 (time-to-days (current-time)))
+ (d2 (time-to-days
+ (org-time-string-to-time (match-string 1)))))
+ (setq diff (- d2 d1))))
+ (calendar)
+ (calendar-goto-today)
+ (if (and diff (not arg)) (calendar-forward-day diff))))
+
+(defun org-get-date-from-calendar ()
+ "Return a list (month day year) of date at point in calendar."
+ (with-current-buffer "*Calendar*"
+ (save-match-data
+ (calendar-cursor-to-date))))
+
+(defun org-date-from-calendar ()
+ "Insert time stamp corresponding to cursor date in *Calendar* buffer.
+If there is already a time stamp at the cursor position, update it."
+ (interactive)
+ (if (org-at-timestamp-p t)
+ (org-timestamp-change 0 'calendar)
+ (let ((cal-date (org-get-date-from-calendar)))
+ (org-insert-time-stamp
+ (encode-time 0 0 0 (nth 1 cal-date) (car cal-date) (nth 2 cal-date))))))
+
+;; Make appt aware of appointments from the agenda
+;;;###autoload
+(defun org-agenda-to-appt (&optional filter)
+ "Activate appointments found in `org-agenda-files'.
+When prefixed, prompt for a regular expression and use it as a
+filter: only add entries if they match this regular expression.
+
+FILTER can be a string. In this case, use this string as a
+regular expression to filter results.
+
+FILTER can also be an alist, with the car of each cell being
+either 'headline or 'category. For example:
+
+ '((headline \"IMPORTANT\")
+ (category \"Work\"))
+
+will only add headlines containing IMPORTANT or headlines
+belonging to the category \"Work\"."
+ (interactive "P")
+ (require 'calendar)
+ (if (equal filter '(4))
+ (setq filter (read-from-minibuffer "Regexp filter: ")))
+ (let* ((cnt 0) ; count added events
+ (org-agenda-new-buffers nil)
+ (today (org-date-to-gregorian
+ (time-to-days (current-time))))
+ (files (org-agenda-files)) entries file)
+ ;; Get all entries which may contain an appt
+ (while (setq file (pop files))
+ (setq entries
+ (append entries
+ (org-agenda-get-day-entries
+ file today
+ :timestamp :scheduled :deadline))))
+ (setq entries (delq nil entries))
+ ;; Map thru entries and find if they pass thru the filter
+ (mapc
+ (lambda(x)
+ (let* ((evt (org-trim (get-text-property 1 'txt x)))
+ (cat (get-text-property 1 'org-category x))
+ (tod (get-text-property 1 'time-of-day x))
+ (ok (or (null filter)
+ (and (stringp filter) (string-match filter evt))
+ (and (listp filter)
+ (or (string-match
+ (cadr (assoc 'category filter)) cat)
+ (string-match
+ (cadr (assoc 'headline filter)) evt))))))
+ ;; FIXME: Shall we remove text-properties for the appt text?
+ ;; (setq evt (set-text-properties 0 (length evt) nil evt))
+ (when (and ok tod)
+ (setq tod (number-to-string tod)
+ tod (when (string-match
+ "\\([0-9]\\{1,2\\}\\)\\([0-9]\\{2\\}\\)" tod)
+ (concat (match-string 1 tod) ":"
+ (match-string 2 tod))))
+ (appt-add tod evt)
+ (setq cnt (1+ cnt))))) entries)
+ (org-release-buffers org-agenda-new-buffers)
+ (message "Added %d event%s for today" cnt (if (> cnt 1) "s" ""))))
+
+;;; The clock for measuring work time.
+
+(defvar org-mode-line-string "")
+(put 'org-mode-line-string 'risky-local-variable t)
+
+(defvar org-mode-line-timer nil)
+(defvar org-clock-heading "")
+(defvar org-clock-start-time "")
+
+(defun org-update-mode-line ()
+ (let* ((delta (- (time-to-seconds (current-time))
+ (time-to-seconds org-clock-start-time)))
+ (h (floor delta 3600))
+ (m (floor (- delta (* 3600 h)) 60)))
+ (setq org-mode-line-string
+ (propertize (format "-[%d:%02d (%s)]" h m org-clock-heading)
+ 'help-echo "Org-mode clock is running"))
+ (force-mode-line-update)))
+
+(defvar org-clock-marker (make-marker)
+ "Marker recording the last clock-in.")
+(defvar org-clock-mode-line-entry nil
+ "Information for the modeline about the running clock.")
+
+(defun org-clock-in ()
+ "Start the clock on the current item.
+If necessary, clock-out of the currently active clock."
+ (interactive)
+ (org-clock-out t)
+ (let (ts)
+ (save-excursion
+ (org-back-to-heading t)
+ (when (and org-clock-in-switch-to-state
+ (not (looking-at (concat outline-regexp "[ \t]*"
+ org-clock-in-switch-to-state
+ "\\>"))))
+ (org-todo org-clock-in-switch-to-state))
+ (if (and org-clock-heading-function
+ (functionp org-clock-heading-function))
+ (setq org-clock-heading (funcall org-clock-heading-function))
+ (if (looking-at org-complex-heading-regexp)
+ (setq org-clock-heading (match-string 4))
+ (setq org-clock-heading "???")))
+ (setq org-clock-heading (propertize org-clock-heading 'face nil))
+ (org-clock-find-position)
+
+ (insert "\n") (backward-char 1)
+ (indent-relative)
+ (insert org-clock-string " ")
+ (setq org-clock-start-time (current-time))
+ (setq ts (org-insert-time-stamp (current-time) 'with-hm 'inactive))
+ (move-marker org-clock-marker (point) (buffer-base-buffer))
+ (or global-mode-string (setq global-mode-string '("")))
+ (or (memq 'org-mode-line-string global-mode-string)
+ (setq global-mode-string
+ (append global-mode-string '(org-mode-line-string))))
+ (org-update-mode-line)
+ (setq org-mode-line-timer (run-with-timer 60 60 'org-update-mode-line))
+ (message "Clock started at %s" ts))))
+
+(defun org-clock-find-position ()
+ "Find the location where the next clock line should be inserted."
+ (org-back-to-heading t)
+ (catch 'exit
+ (let ((beg (point-at-bol 2)) (end (progn (outline-next-heading) (point)))
+ (re (concat "^[ \t]*" org-clock-string))
+ (cnt 0)
+ first last)
+ (goto-char beg)
+ (when (eobp) (newline) (setq end (max (point) end)))
+ (when (re-search-forward "^[ \t]*:CLOCK:" end t)
+ ;; we seem to have a CLOCK drawer, so go there.
+ (beginning-of-line 2)
+ (throw 'exit t))
+ ;; Lets count the CLOCK lines
+ (goto-char beg)
+ (while (re-search-forward re end t)
+ (setq first (or first (match-beginning 0))
+ last (match-beginning 0)
+ cnt (1+ cnt)))
+ (when (and (integerp org-clock-into-drawer)
+ (>= (1+ cnt) org-clock-into-drawer))
+ ;; Wrap current entries into a new drawer
+ (goto-char last)
+ (beginning-of-line 2)
+ (if (org-at-item-p) (org-end-of-item))
+ (insert ":END:\n")
+ (beginning-of-line 0)
+ (org-indent-line-function)
+ (goto-char first)
+ (insert ":CLOCK:\n")
+ (beginning-of-line 0)
+ (org-indent-line-function)
+ (org-flag-drawer t)
+ (beginning-of-line 2)
+ (throw 'exit nil))
+
+ (goto-char beg)
+ (while (and (looking-at (concat "[ \t]*" org-keyword-time-regexp))
+ (not (equal (match-string 1) org-clock-string)))
+ ;; Planning info, skip to after it
+ (beginning-of-line 2)
+ (or (bolp) (newline)))
+ (when (eq t org-clock-into-drawer)
+ (insert ":CLOCK:\n:END:\n")
+ (beginning-of-line -1)
+ (org-indent-line-function)
+ (org-flag-drawer t)
+ (beginning-of-line 2)
+ (org-indent-line-function)))))
+
+(defun org-clock-out (&optional fail-quietly)
+ "Stop the currently running clock.
+If there is no running clock, throw an error, unless FAIL-QUIETLY is set."
+ (interactive)
+ (catch 'exit
+ (if (not (marker-buffer org-clock-marker))
+ (if fail-quietly (throw 'exit t) (error "No active clock")))
+ (let (ts te s h m)
+ (save-excursion
+ (set-buffer (marker-buffer org-clock-marker))
+ (goto-char org-clock-marker)
+ (beginning-of-line 1)
+ (if (and (looking-at (concat "[ \t]*" org-keyword-time-regexp))
+ (equal (match-string 1) org-clock-string))
+ (setq ts (match-string 2))
+ (if fail-quietly (throw 'exit nil) (error "Clock start time is gone")))
+ (goto-char (match-end 0))
+ (delete-region (point) (point-at-eol))
+ (insert "--")
+ (setq te (org-insert-time-stamp (current-time) 'with-hm 'inactive))
+ (setq s (- (time-to-seconds (apply 'encode-time (org-parse-time-string te)))
+ (time-to-seconds (apply 'encode-time (org-parse-time-string ts))))
+ h (floor (/ s 3600))
+ s (- s (* 3600 h))
+ m (floor (/ s 60))
+ s (- s (* 60 s)))
+ (insert " => " (format "%2d:%02d" h m))
+ (move-marker org-clock-marker nil)
+ (let* ((logging (save-match-data (org-entry-get nil "LOGGING" t)))
+ (org-log-done (org-parse-local-options logging 'org-log-done))
+ (org-log-repeat (org-parse-local-options logging 'org-log-repeat)))
+ (org-add-log-maybe 'clock-out))
+ (when org-mode-line-timer
+ (cancel-timer org-mode-line-timer)
+ (setq org-mode-line-timer nil))
+ (setq global-mode-string
+ (delq 'org-mode-line-string global-mode-string))
+ (force-mode-line-update)
+ (message "Clock stopped at %s after HH:MM = %d:%02d" te h m)))))
+
+(defun org-clock-cancel ()
+ "Cancel the running clock be removing the start timestamp."
+ (interactive)
+ (if (not (marker-buffer org-clock-marker))
+ (error "No active clock"))
+ (save-excursion
+ (set-buffer (marker-buffer org-clock-marker))
+ (goto-char org-clock-marker)
+ (delete-region (1- (point-at-bol)) (point-at-eol)))
+ (setq global-mode-string
+ (delq 'org-mode-line-string global-mode-string))
+ (force-mode-line-update)
+ (message "Clock canceled"))
+
+(defun org-clock-goto (&optional delete-windows)
+ "Go to the currently clocked-in entry."
+ (interactive "P")
+ (if (not (marker-buffer org-clock-marker))
+ (error "No active clock"))
+ (switch-to-buffer-other-window
+ (marker-buffer org-clock-marker))
+ (if delete-windows (delete-other-windows))
+ (goto-char org-clock-marker)
+ (org-show-entry)
+ (org-back-to-heading)
+ (recenter))
+
+(defvar org-clock-file-total-minutes nil
+ "Holds the file total time in minutes, after a call to `org-clock-sum'.")
+ (make-variable-buffer-local 'org-clock-file-total-minutes)
+
+(defun org-clock-sum (&optional tstart tend)
+ "Sum the times for each subtree.
+Puts the resulting times in minutes as a text property on each headline."
+ (interactive)
+ (let* ((bmp (buffer-modified-p))
+ (re (concat "^\\(\\*+\\)[ \t]\\|^[ \t]*"
+ org-clock-string
+ "[ \t]*\\(?:\\(\\[.*?\\]\\)-+\\(\\[.*?\\]\\)\\|=>[ \t]+\\([0-9]+\\):\\([0-9]+\\)\\)"))
+ (lmax 30)
+ (ltimes (make-vector lmax 0))
+ (t1 0)
+ (level 0)
+ ts te dt
+ time)
+ (remove-text-properties (point-min) (point-max) '(:org-clock-minutes t))
+ (save-excursion
+ (goto-char (point-max))
+ (while (re-search-backward re nil t)
+ (cond
+ ((match-end 2)
+ ;; Two time stamps
+ (setq ts (match-string 2)
+ te (match-string 3)
+ ts (time-to-seconds
+ (apply 'encode-time (org-parse-time-string ts)))
+ te (time-to-seconds
+ (apply 'encode-time (org-parse-time-string te)))
+ ts (if tstart (max ts tstart) ts)
+ te (if tend (min te tend) te)
+ dt (- te ts)
+ t1 (if (> dt 0) (+ t1 (floor (/ dt 60))) t1)))
+ ((match-end 4)
+ ;; A naket time
+ (setq t1 (+ t1 (string-to-number (match-string 5))
+ (* 60 (string-to-number (match-string 4))))))
+ (t ;; A headline
+ (setq level (- (match-end 1) (match-beginning 1)))
+ (when (or (> t1 0) (> (aref ltimes level) 0))
+ (loop for l from 0 to level do
+ (aset ltimes l (+ (aref ltimes l) t1)))
+ (setq t1 0 time (aref ltimes level))
+ (loop for l from level to (1- lmax) do
+ (aset ltimes l 0))
+ (goto-char (match-beginning 0))
+ (put-text-property (point) (point-at-eol) :org-clock-minutes time)))))
+ (setq org-clock-file-total-minutes (aref ltimes 0)))
+ (set-buffer-modified-p bmp)))
+
+(defun org-clock-display (&optional total-only)
+ "Show subtree times in the entire buffer.
+If TOTAL-ONLY is non-nil, only show the total time for the entire file
+in the echo area."
+ (interactive)
+ (org-remove-clock-overlays)
+ (let (time h m p)
+ (org-clock-sum)
+ (unless total-only
+ (save-excursion
+ (goto-char (point-min))
+ (while (or (and (equal (setq p (point)) (point-min))
+ (get-text-property p :org-clock-minutes))
+ (setq p (next-single-property-change
+ (point) :org-clock-minutes)))
+ (goto-char p)
+ (when (setq time (get-text-property p :org-clock-minutes))
+ (org-put-clock-overlay time (funcall outline-level))))
+ (setq h (/ org-clock-file-total-minutes 60)
+ m (- org-clock-file-total-minutes (* 60 h)))
+ ;; Arrange to remove the overlays upon next change.
+ (when org-remove-highlights-with-change
+ (org-add-hook 'before-change-functions 'org-remove-clock-overlays
+ nil 'local))))
+ (message "Total file time: %d:%02d (%d hours and %d minutes)" h m h m)))
+
+(defvar org-clock-overlays nil)
+(make-variable-buffer-local 'org-clock-overlays)
+
+(defun org-put-clock-overlay (time &optional level)
+ "Put an overlays on the current line, displaying TIME.
+If LEVEL is given, prefix time with a corresponding number of stars.
+This creates a new overlay and stores it in `org-clock-overlays', so that it
+will be easy to remove."
+ (let* ((c 60) (h (floor (/ time 60))) (m (- time (* 60 h)))
+ (l (if level (org-get-legal-level level 0) 0))
+ (off 0)
+ ov tx)
+ (move-to-column c)
+ (unless (eolp) (skip-chars-backward "^ \t"))
+ (skip-chars-backward " \t")
+ (setq ov (org-make-overlay (1- (point)) (point-at-eol))
+ tx (concat (buffer-substring (1- (point)) (point))
+ (make-string (+ off (max 0 (- c (current-column)))) ?.)
+ (org-add-props (format "%s %2d:%02d%s"
+ (make-string l ?*) h m
+ (make-string (- 10 l) ?\ ))
+ '(face secondary-selection))
+ ""))
+ (if (not (featurep 'xemacs))
+ (org-overlay-put ov 'display tx)
+ (org-overlay-put ov 'invisible t)
+ (org-overlay-put ov 'end-glyph (make-glyph tx)))
+ (push ov org-clock-overlays)))
+
+(defun org-remove-clock-overlays (&optional beg end noremove)
+ "Remove the occur highlights from the buffer.
+BEG and END are ignored. If NOREMOVE is nil, remove this function
+from the `before-change-functions' in the current buffer."
+ (interactive)
+ (unless org-inhibit-highlight-removal
+ (mapc 'org-delete-overlay org-clock-overlays)
+ (setq org-clock-overlays nil)
+ (unless noremove
+ (remove-hook 'before-change-functions
+ 'org-remove-clock-overlays 'local))))
+
+(defun org-clock-out-if-current ()
+ "Clock out if the current entry contains the running clock.
+This is used to stop the clock after a TODO entry is marked DONE,
+and is only done if the variable `org-clock-out-when-done' is not nil."
+ (when (and org-clock-out-when-done
+ (member state org-done-keywords)
+ (equal (marker-buffer org-clock-marker) (current-buffer))
+ (< (point) org-clock-marker)
+ (> (save-excursion (outline-next-heading) (point))
+ org-clock-marker))
+ ;; Clock out, but don't accept a logging message for this.
+ (let ((org-log-done (if (and (listp org-log-done)
+ (member 'clock-out org-log-done))
+ '(done)
+ org-log-done)))
+ (org-clock-out))))
+
+(add-hook 'org-after-todo-state-change-hook
+ 'org-clock-out-if-current)
+
+(defun org-check-running-clock ()
+ "Check if the current buffer contains the running clock.
+If yes, offer to stop it and to save the buffer with the changes."
+ (when (and (equal (marker-buffer org-clock-marker) (current-buffer))
+ (y-or-n-p (format "Clock-out in buffer %s before killing it? "
+ (buffer-name))))
+ (org-clock-out)
+ (when (y-or-n-p "Save changed buffer?")
+ (save-buffer))))
+
+(defun org-clock-report (&optional arg)
+ "Create a table containing a report about clocked time.
+If the cursor is inside an existing clocktable block, then the table
+will be updated. If not, a new clocktable will be inserted.
+When called with a prefix argument, move to the first clock table in the
+buffer and update it."
+ (interactive "P")
+ (org-remove-clock-overlays)
+ (when arg (org-find-dblock "clocktable"))
+ (if (org-in-clocktable-p)
+ (goto-char (org-in-clocktable-p))
+ (org-create-dblock (list :name "clocktable"
+ :maxlevel 2 :scope 'file)))
+ (org-update-dblock))
+
+(defun org-in-clocktable-p ()
+ "Check if the cursor is in a clocktable."
+ (let ((pos (point)) start)
+ (save-excursion
+ (end-of-line 1)
+ (and (re-search-backward "^#\\+BEGIN:[ \t]+clocktable" nil t)
+ (setq start (match-beginning 0))
+ (re-search-forward "^#\\+END:.*" nil t)
+ (>= (match-end 0) pos)
+ start))))
+
+(defun org-clock-update-time-maybe ()
+ "If this is a CLOCK line, update it and return t.
+Otherwise, return nil."
+ (interactive)
+ (save-excursion
+ (beginning-of-line 1)
+ (skip-chars-forward " \t")
+ (when (looking-at org-clock-string)
+ (let ((re (concat "[ \t]*" org-clock-string
+ " *[[<]\\([^]>]+\\)[]>]-+[[<]\\([^]>]+\\)[]>]"
+ "\\([ \t]*=>.*\\)?"))
+ ts te h m s)
+ (if (not (looking-at re))
+ nil
+ (and (match-end 3) (delete-region (match-beginning 3) (match-end 3)))
+ (end-of-line 1)
+ (setq ts (match-string 1)
+ te (match-string 2))
+ (setq s (- (time-to-seconds
+ (apply 'encode-time (org-parse-time-string te)))
+ (time-to-seconds
+ (apply 'encode-time (org-parse-time-string ts))))
+ h (floor (/ s 3600))
+ s (- s (* 3600 h))
+ m (floor (/ s 60))
+ s (- s (* 60 s)))
+ (insert " => " (format "%2d:%02d" h m))
+ t)))))
+
+(defun org-clock-special-range (key &optional time as-strings)
+ "Return two times bordering a special time range.
+Key is a symbol specifying the range and can be one of `today', `yesterday',
+`thisweek', `lastweek', `thismonth', `lastmonth', `thisyear', `lastyear'.
+A week starts Monday 0:00 and ends Sunday 24:00.
+The range is determined relative to TIME. TIME defaults to the current time.
+The return value is a cons cell with two internal times like the ones
+returned by `current time' or `encode-time'. if AS-STRINGS is non-nil,
+the returned times will be formatted strings."
+ (let* ((tm (decode-time (or time (current-time))))
+ (s 0) (m (nth 1 tm)) (h (nth 2 tm))
+ (d (nth 3 tm)) (month (nth 4 tm)) (y (nth 5 tm))
+ (dow (nth 6 tm))
+ s1 m1 h1 d1 month1 y1 diff ts te fm)
+ (cond
+ ((eq key 'today)
+ (setq h 0 m 0 h1 24 m1 0))
+ ((eq key 'yesterday)
+ (setq d (1- d) h 0 m 0 h1 24 m1 0))
+ ((eq key 'thisweek)
+ (setq diff (if (= dow 0) 6 (1- dow))
+ m 0 h 0 d (- d diff) d1 (+ 7 d)))
+ ((eq key 'lastweek)
+ (setq diff (+ 7 (if (= dow 0) 6 (1- dow)))
+ m 0 h 0 d (- d diff) d1 (+ 7 d)))
+ ((eq key 'thismonth)
+ (setq d 1 h 0 m 0 d1 1 month1 (1+ month) h1 0 m1 0))
+ ((eq key 'lastmonth)
+ (setq d 1 h 0 m 0 d1 1 month (1- month) month1 (1+ month) h1 0 m1 0))
+ ((eq key 'thisyear)
+ (setq m 0 h 0 d 1 month 1 y1 (1+ y)))
+ ((eq key 'lastyear)
+ (setq m 0 h 0 d 1 month 1 y (1- y) y1 (1+ y)))
+ (t (error "No such time block %s" key)))
+ (setq ts (encode-time s m h d month y)
+ te (encode-time (or s1 s) (or m1 m) (or h1 h)
+ (or d1 d) (or month1 month) (or y1 y)))
+ (setq fm (cdr org-time-stamp-formats))
+ (if as-strings
+ (cons (format-time-string fm ts) (format-time-string fm te))
+ (cons ts te))))
+
+(defun org-dblock-write:clocktable (params)
+ "Write the standard clocktable."
+ (let ((hlchars '((1 . "*") (2 . "/")))
+ (emph nil)
+ (ins (make-marker))
+ (total-time nil)
+ ipos time h m p level hlc hdl maxlevel
+ ts te cc block beg end pos scope tbl tostring multifile)
+ (setq scope (plist-get params :scope)
+ tostring (plist-get params :tostring)
+ multifile (plist-get params :multifile)
+ maxlevel (or (plist-get params :maxlevel) 3)
+ emph (plist-get params :emphasize)
+ ts (plist-get params :tstart)
+ te (plist-get params :tend)
+ block (plist-get params :block))
+ (when block
+ (setq cc (org-clock-special-range block nil t)
+ ts (car cc) te (cdr cc)))
+ (if ts (setq ts (time-to-seconds
+ (apply 'encode-time (org-parse-time-string ts)))))
+ (if te (setq te (time-to-seconds
+ (apply 'encode-time (org-parse-time-string te)))))
+ (move-marker ins (point))
+ (setq ipos (point))
+
+ ;; Get the right scope
+ (setq pos (point))
+ (save-restriction
+ (cond
+ ((not scope))
+ ((eq scope 'file) (widen))
+ ((eq scope 'subtree) (org-narrow-to-subtree))
+ ((eq scope 'tree)
+ (while (org-up-heading-safe))
+ (org-narrow-to-subtree))
+ ((and (symbolp scope) (string-match "^tree\\([0-9]+\\)$"
+ (symbol-name scope)))
+ (setq level (string-to-number (match-string 1 (symbol-name scope))))
+ (catch 'exit
+ (while (org-up-heading-safe)
+ (looking-at outline-regexp)
+ (if (<= (org-reduced-level (funcall outline-level)) level)
+ (throw 'exit nil))))
+ (org-narrow-to-subtree))
+ ((or (listp scope) (eq scope 'agenda))
+ (let* ((files (if (listp scope) scope (org-agenda-files)))
+ (scope 'agenda)
+ (p1 (copy-sequence params))
+ file)
+ (plist-put p1 :tostring t)
+ (plist-put p1 :multifile t)
+ (plist-put p1 :scope 'file)
+ (org-prepare-agenda-buffers files)
+ (while (setq file (pop files))
+ (with-current-buffer (find-buffer-visiting file)
+ (push (org-clocktable-add-file
+ file (org-dblock-write:clocktable p1)) tbl)
+ (setq total-time (+ (or total-time 0)
+ org-clock-file-total-minutes)))))))
+ (goto-char pos)
+
+ (unless (eq scope 'agenda)
+ (org-clock-sum ts te)
+ (goto-char (point-min))
+ (while (setq p (next-single-property-change (point) :org-clock-minutes))
+ (goto-char p)
+ (when (setq time (get-text-property p :org-clock-minutes))
+ (save-excursion
+ (beginning-of-line 1)
+ (when (and (looking-at (org-re "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[[:alnum:]_@:]+:\\)?[ \t]*$"))
+ (setq level (org-reduced-level
+ (- (match-end 1) (match-beginning 1))))
+ (<= level maxlevel))
+ (setq hlc (if emph (or (cdr (assoc level hlchars)) "") "")
+ hdl (match-string 2)
+ h (/ time 60)
+ m (- time (* 60 h)))
+ (if (and (not multifile) (= level 1)) (push "|-" tbl))
+ (push (concat
+ "| " (int-to-string level) "|" hlc hdl hlc " |"
+ (make-string (1- level) ?|)
+ hlc (format "%d:%02d" h m) hlc
+ " |") tbl))))))
+ (setq tbl (nreverse tbl))
+ (if tostring
+ (if tbl (mapconcat 'identity tbl "\n") nil)
+ (goto-char ins)
+ (insert-before-markers
+ "Clock summary at ["
+ (substring
+ (format-time-string (cdr org-time-stamp-formats))
+ 1 -1)
+ "]."
+ (if block
+ (format " Considered range is /%s/." block)
+ "")
+ "\n\n"
+ (if (eq scope 'agenda) "|File" "")
+ "|L|Headline|Time|\n")
+ (setq total-time (or total-time org-clock-file-total-minutes)
+ h (/ total-time 60)
+ m (- total-time (* 60 h)))
+ (insert-before-markers
+ "|-\n|"
+ (if (eq scope 'agenda) "|" "")
+ "|"
+ "*Total time*| "
+ (format "*%d:%02d*" h m)
+ "|\n|-\n")
+ (setq tbl (delq nil tbl))
+ (if (and (stringp (car tbl)) (> (length (car tbl)) 1)
+ (equal (substring (car tbl) 0 2) "|-"))
+ (pop tbl))
+ (insert-before-markers (mapconcat
+ 'identity (delq nil tbl)
+ (if (eq scope 'agenda) "\n|-\n" "\n")))
+ (backward-delete-char 1)
+ (goto-char ipos)
+ (skip-chars-forward "^|")
+ (org-table-align)))))
+
+(defun org-clocktable-add-file (file table)
+ (if table
+ (let ((lines (org-split-string table "\n"))
+ (ff (file-name-nondirectory file)))
+ (mapconcat 'identity
+ (mapcar (lambda (x)
+ (if (string-match org-table-dataline-regexp x)
+ (concat "|" ff x)
+ x))
+ lines)
+ "\n"))))
+
+;; FIXME: I don't think anybody uses this, ask David
+(defun org-collect-clock-time-entries ()
+ "Return an internal list with clocking information.
+This list has one entry for each CLOCK interval.
+FIXME: describe the elements."
+ (interactive)
+ (let ((re (concat "^[ \t]*" org-clock-string
+ " *\\[\\(.*?\\)\\]--\\[\\(.*?\\)\\]"))
+ rtn beg end next cont level title total closedp leafp
+ clockpos titlepos h m donep)
+ (save-excursion
+ (org-clock-sum)
+ (goto-char (point-min))
+ (while (re-search-forward re nil t)
+ (setq clockpos (match-beginning 0)
+ beg (match-string 1) end (match-string 2)
+ cont (match-end 0))
+ (setq beg (apply 'encode-time (org-parse-time-string beg))
+ end (apply 'encode-time (org-parse-time-string end)))
+ (org-back-to-heading t)
+ (setq donep (org-entry-is-done-p))
+ (setq titlepos (point)
+ total (or (get-text-property (1+ (point)) :org-clock-minutes) 0)
+ h (/ total 60) m (- total (* 60 h))
+ total (cons h m))
+ (looking-at "\\(\\*+\\) +\\(.*\\)")
+ (setq level (- (match-end 1) (match-beginning 1))
+ title (org-match-string-no-properties 2))
+ (save-excursion (outline-next-heading) (setq next (point)))
+ (setq closedp (re-search-forward org-closed-time-regexp next t))
+ (goto-char next)
+ (setq leafp (and (looking-at "^\\*+ ")
+ (<= (- (match-end 0) (point)) level)))
+ (push (list beg end clockpos closedp donep
+ total title titlepos level leafp)
+ rtn)
+ (goto-char cont)))
+ (nreverse rtn)))
+
+;;;; Agenda, and Diary Integration
+
+;;; Define the Org-agenda-mode
+
+(defvar org-agenda-mode-map (make-sparse-keymap)
+ "Keymap for `org-agenda-mode'.")
+
+(defvar org-agenda-menu) ; defined later in this file.
+(defvar org-agenda-follow-mode nil)
+(defvar org-agenda-show-log nil)
+(defvar org-agenda-redo-command nil)
+(defvar org-agenda-query-string nil)
+(defvar org-agenda-mode-hook nil)
+(defvar org-agenda-type nil)
+(defvar org-agenda-force-single-file nil)
+
+(defun org-agenda-mode ()
+ "Mode for time-sorted view on action items in Org-mode files.
+
+The following commands are available:
+
+\\{org-agenda-mode-map}"
+ (interactive)
+ (kill-all-local-variables)
+ (setq org-agenda-undo-list nil
+ org-agenda-pending-undo-list nil)
+ (setq major-mode 'org-agenda-mode)
+ ;; Keep global-font-lock-mode from turning on font-lock-mode
+ (org-set-local 'font-lock-global-modes (list 'not major-mode))
+ (setq mode-name "Org-Agenda")
+ (use-local-map org-agenda-mode-map)
+ (easy-menu-add org-agenda-menu)
+ (if org-startup-truncated (setq truncate-lines t))
+ (org-add-hook 'post-command-hook 'org-agenda-post-command-hook nil 'local)
+ (org-add-hook 'pre-command-hook 'org-unhighlight nil 'local)
+ ;; Make sure properties are removed when copying text
+ (when (boundp 'buffer-substring-filters)
+ (org-set-local 'buffer-substring-filters
+ (cons (lambda (x)
+ (set-text-properties 0 (length x) nil x) x)
+ buffer-substring-filters)))
+ (unless org-agenda-keep-modes
+ (setq org-agenda-follow-mode org-agenda-start-with-follow-mode
+ org-agenda-show-log nil))
+ (easy-menu-change
+ '("Agenda") "Agenda Files"
+ (append
+ (list
+ (vector
+ (if (get 'org-agenda-files 'org-restrict)
+ "Restricted to single file"
+ "Edit File List")
+ '(org-edit-agenda-file-list)
+ (not (get 'org-agenda-files 'org-restrict)))
+ "--")
+ (mapcar 'org-file-menu-entry (org-agenda-files))))
+ (org-agenda-set-mode-name)
+ (apply
+ (if (fboundp 'run-mode-hooks) 'run-mode-hooks 'run-hooks)
+ (list 'org-agenda-mode-hook)))
+
+(substitute-key-definition 'undo 'org-agenda-undo
+ org-agenda-mode-map global-map)
+(org-defkey org-agenda-mode-map "\C-i" 'org-agenda-goto)
+(org-defkey org-agenda-mode-map [(tab)] 'org-agenda-goto)
+(org-defkey org-agenda-mode-map "\C-m" 'org-agenda-switch-to)
+(org-defkey org-agenda-mode-map "\C-k" 'org-agenda-kill)
+(org-defkey org-agenda-mode-map "\C-c$" 'org-agenda-archive)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-s" 'org-agenda-archive)
+(org-defkey org-agenda-mode-map "$" 'org-agenda-archive)
+(org-defkey org-agenda-mode-map "\C-c\C-o" 'org-agenda-open-link)
+(org-defkey org-agenda-mode-map " " 'org-agenda-show)
+(org-defkey org-agenda-mode-map "\C-c\C-t" 'org-agenda-todo)
+(org-defkey org-agenda-mode-map [(control shift right)] 'org-agenda-todo-nextset)
+(org-defkey org-agenda-mode-map [(control shift left)] 'org-agenda-todo-previousset)
+(org-defkey org-agenda-mode-map "\C-c\C-xb" 'org-agenda-tree-to-indirect-buffer)
+(org-defkey org-agenda-mode-map "b" 'org-agenda-tree-to-indirect-buffer)
+(org-defkey org-agenda-mode-map "o" 'delete-other-windows)
+(org-defkey org-agenda-mode-map "L" 'org-agenda-recenter)
+(org-defkey org-agenda-mode-map "t" 'org-agenda-todo)
+(org-defkey org-agenda-mode-map "a" 'org-agenda-toggle-archive-tag)
+(org-defkey org-agenda-mode-map ":" 'org-agenda-set-tags)
+(org-defkey org-agenda-mode-map "." 'org-agenda-goto-today)
+(org-defkey org-agenda-mode-map "j" 'org-agenda-goto-date)
+(org-defkey org-agenda-mode-map "d" 'org-agenda-day-view)
+(org-defkey org-agenda-mode-map "w" 'org-agenda-week-view)
+(org-defkey org-agenda-mode-map "m" 'org-agenda-month-view)
+(org-defkey org-agenda-mode-map "y" 'org-agenda-year-view)
+(org-defkey org-agenda-mode-map [(shift right)] 'org-agenda-date-later)
+(org-defkey org-agenda-mode-map [(shift left)] 'org-agenda-date-earlier)
+(org-defkey org-agenda-mode-map [?\C-c ?\C-x (right)] 'org-agenda-date-later)
+(org-defkey org-agenda-mode-map [?\C-c ?\C-x (left)] 'org-agenda-date-earlier)
+
+(org-defkey org-agenda-mode-map ">" 'org-agenda-date-prompt)
+(org-defkey org-agenda-mode-map "\C-c\C-s" 'org-agenda-schedule)
+(org-defkey org-agenda-mode-map "\C-c\C-d" 'org-agenda-deadline)
+(let ((l '(1 2 3 4 5 6 7 8 9 0)))
+ (while l (org-defkey org-agenda-mode-map
+ (int-to-string (pop l)) 'digit-argument)))
+
+(org-defkey org-agenda-mode-map "f" 'org-agenda-follow-mode)
+(org-defkey org-agenda-mode-map "l" 'org-agenda-log-mode)
+(org-defkey org-agenda-mode-map "D" 'org-agenda-toggle-diary)
+(org-defkey org-agenda-mode-map "G" 'org-agenda-toggle-time-grid)
+(org-defkey org-agenda-mode-map "r" 'org-agenda-redo)
+(org-defkey org-agenda-mode-map "g" 'org-agenda-redo)
+(org-defkey org-agenda-mode-map "e" 'org-agenda-execute)
+(org-defkey org-agenda-mode-map "q" 'org-agenda-quit)
+(org-defkey org-agenda-mode-map "x" 'org-agenda-exit)
+(org-defkey org-agenda-mode-map "\C-x\C-w" 'org-write-agenda)
+(org-defkey org-agenda-mode-map "s" 'org-save-all-org-buffers)
+(org-defkey org-agenda-mode-map "\C-x\C-s" 'org-save-all-org-buffers)
+(org-defkey org-agenda-mode-map "P" 'org-agenda-show-priority)
+(org-defkey org-agenda-mode-map "T" 'org-agenda-show-tags)
+(org-defkey org-agenda-mode-map "n" 'next-line)
+(org-defkey org-agenda-mode-map "p" 'previous-line)
+(org-defkey org-agenda-mode-map "\C-c\C-n" 'org-agenda-next-date-line)
+(org-defkey org-agenda-mode-map "\C-c\C-p" 'org-agenda-previous-date-line)
+(org-defkey org-agenda-mode-map "," 'org-agenda-priority)
+(org-defkey org-agenda-mode-map "\C-c," 'org-agenda-priority)
+(org-defkey org-agenda-mode-map "i" 'org-agenda-diary-entry)
+(org-defkey org-agenda-mode-map "c" 'org-agenda-goto-calendar)
+(eval-after-load "calendar"
+ '(org-defkey calendar-mode-map org-calendar-to-agenda-key
+ 'org-calendar-goto-agenda))
+(org-defkey org-agenda-mode-map "C" 'org-agenda-convert-date)
+(org-defkey org-agenda-mode-map "M" 'org-agenda-phases-of-moon)
+(org-defkey org-agenda-mode-map "S" 'org-agenda-sunrise-sunset)
+(org-defkey org-agenda-mode-map "h" 'org-agenda-holidays)
+(org-defkey org-agenda-mode-map "H" 'org-agenda-holidays)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-i" 'org-agenda-clock-in)
+(org-defkey org-agenda-mode-map "I" 'org-agenda-clock-in)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-o" 'org-agenda-clock-out)
+(org-defkey org-agenda-mode-map "O" 'org-agenda-clock-out)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-x" 'org-agenda-clock-cancel)
+(org-defkey org-agenda-mode-map "X" 'org-agenda-clock-cancel)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-j" 'org-clock-goto)
+(org-defkey org-agenda-mode-map "J" 'org-clock-goto)
+(org-defkey org-agenda-mode-map "+" 'org-agenda-priority-up)
+(org-defkey org-agenda-mode-map "-" 'org-agenda-priority-down)
+(org-defkey org-agenda-mode-map [(shift up)] 'org-agenda-priority-up)
+(org-defkey org-agenda-mode-map [(shift down)] 'org-agenda-priority-down)
+(org-defkey org-agenda-mode-map [?\C-c ?\C-x (up)] 'org-agenda-priority-up)
+(org-defkey org-agenda-mode-map [?\C-c ?\C-x (down)] 'org-agenda-priority-down)
+(org-defkey org-agenda-mode-map [(right)] 'org-agenda-later)
+(org-defkey org-agenda-mode-map [(left)] 'org-agenda-earlier)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-c" 'org-agenda-columns)
+(org-defkey org-agenda-mode-map "=" 'org-agenda-query-clear-cmd)
+(org-defkey org-agenda-mode-map "/" 'org-agenda-query-and-cmd)
+(org-defkey org-agenda-mode-map ";" 'org-agenda-query-or-cmd)
+(org-defkey org-agenda-mode-map "\\" 'org-agenda-query-not-cmd)
+
+(defvar org-agenda-keymap (copy-keymap org-agenda-mode-map)
+ "Local keymap for agenda entries from Org-mode.")
+
+(org-defkey org-agenda-keymap
+ (if (featurep 'xemacs) [(button2)] [(mouse-2)]) 'org-agenda-goto-mouse)
+(org-defkey org-agenda-keymap
+ (if (featurep 'xemacs) [(button3)] [(mouse-3)]) 'org-agenda-show-mouse)
+(when org-agenda-mouse-1-follows-link
+ (org-defkey org-agenda-keymap [follow-link] 'mouse-face))
+(easy-menu-define org-agenda-menu org-agenda-mode-map "Agenda menu"
+ '("Agenda"
+ ("Agenda Files")
+ "--"
+ ["Show" org-agenda-show t]
+ ["Go To (other window)" org-agenda-goto t]
+ ["Go To (this window)" org-agenda-switch-to t]
+ ["Follow Mode" org-agenda-follow-mode
+ :style toggle :selected org-agenda-follow-mode :active t]
+ ["Tree to indirect frame" org-agenda-tree-to-indirect-buffer t]
+ "--"
+ ["Cycle TODO" org-agenda-todo t]
+ ["Archive subtree" org-agenda-archive t]
+ ["Delete subtree" org-agenda-kill t]
+ "--"
+ ["Goto Today" org-agenda-goto-today (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Next Dates" org-agenda-later (org-agenda-check-type nil 'agenda)]
+ ["Previous Dates" org-agenda-earlier (org-agenda-check-type nil 'agenda)]
+ ["Jump to date" org-agenda-goto-date (org-agenda-check-type nil 'agenda)]
+ "--"
+ ("Tags and Properties"
+ ["Show all Tags" org-agenda-show-tags t]
+ ["Set Tags current line" org-agenda-set-tags (not (org-region-active-p))]
+ ["Change tag in region" org-agenda-set-tags (org-region-active-p)]
+ "--"
+ ["Column View" org-columns t])
+ ("Date/Schedule"
+ ["Schedule" org-agenda-schedule t]
+ ["Set Deadline" org-agenda-deadline t]
+ "--"
+ ["Change Date +1 day" org-agenda-date-later (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Change Date -1 day" org-agenda-date-earlier (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Change Date to ..." org-agenda-date-prompt (org-agenda-check-type nil 'agenda 'timeline)])
+ ("Clock"
+ ["Clock in" org-agenda-clock-in t]
+ ["Clock out" org-agenda-clock-out t]
+ ["Clock cancel" org-agenda-clock-cancel t]
+ ["Goto running clock" org-clock-goto t])
+ ("Priority"
+ ["Set Priority" org-agenda-priority t]
+ ["Increase Priority" org-agenda-priority-up t]
+ ["Decrease Priority" org-agenda-priority-down t]
+ ["Show Priority" org-agenda-show-priority t])
+ ("Calendar/Diary"
+ ["New Diary Entry" org-agenda-diary-entry (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Goto Calendar" org-agenda-goto-calendar (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Phases of the Moon" org-agenda-phases-of-moon (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Sunrise/Sunset" org-agenda-sunrise-sunset (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Holidays" org-agenda-holidays (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Convert" org-agenda-convert-date (org-agenda-check-type nil 'agenda 'timeline)]
+ "--"
+ ["Create iCalendar file" org-export-icalendar-combine-agenda-files t])
+ "--"
+ ("View"
+ ["Day View" org-agenda-day-view :active (org-agenda-check-type nil 'agenda)
+ :style radio :selected (equal org-agenda-ndays 1)]
+ ["Week View" org-agenda-week-view :active (org-agenda-check-type nil 'agenda)
+ :style radio :selected (equal org-agenda-ndays 7)]
+ ["Month View" org-agenda-month-view :active (org-agenda-check-type nil 'agenda)
+ :style radio :selected (member org-agenda-ndays '(28 29 30 31))]
+ ["Year View" org-agenda-year-view :active (org-agenda-check-type nil 'agenda)
+ :style radio :selected (member org-agenda-ndays '(365 366))]
+ "--"
+ ["Show Logbook entries" org-agenda-log-mode
+ :style toggle :selected org-agenda-show-log :active (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Include Diary" org-agenda-toggle-diary
+ :style toggle :selected org-agenda-include-diary :active (org-agenda-check-type nil 'agenda)]
+ ["Use Time Grid" org-agenda-toggle-time-grid
+ :style toggle :selected org-agenda-use-time-grid :active (org-agenda-check-type nil 'agenda)])
+ ["Write view to file" org-write-agenda t]
+ ["Rebuild buffer" org-agenda-redo t]
+ ["Save all Org-mode Buffers" org-save-all-org-buffers t]
+ "--"
+ ["Undo Remote Editing" org-agenda-undo org-agenda-undo-list]
+ "--"
+ ["Quit" org-agenda-quit t]
+ ["Exit and Release Buffers" org-agenda-exit t]
+ ))
+
+;;; Agenda undo
+
+(defvar org-agenda-allow-remote-undo t
+ "Non-nil means, allow remote undo from the agenda buffer.")
+(defvar org-agenda-undo-list nil
+ "List of undoable operations in the agenda since last refresh.")
+(defvar org-agenda-undo-has-started-in nil
+ "Buffers that have already seen `undo-start' in the current undo sequence.")
+(defvar org-agenda-pending-undo-list nil
+ "In a series of undo commands, this is the list of remaning undo items.")
+
+(defmacro org-if-unprotected (&rest body)
+ "Execute BODY if there is no `org-protected' text property at point."
+ (declare (debug t))
+ `(unless (get-text-property (point) 'org-protected)
+ ,@body))
+
+(defmacro org-with-remote-undo (_buffer &rest _body)
+ "Execute BODY while recording undo information in two buffers."
+ (declare (indent 1) (debug t))
+ `(let ((_cline (org-current-line))
+ (_cmd this-command)
+ (_buf1 (current-buffer))
+ (_buf2 ,_buffer)
+ (_undo1 buffer-undo-list)
+ (_undo2 (with-current-buffer ,_buffer buffer-undo-list))
+ _c1 _c2)
+ ,@_body
+ (when org-agenda-allow-remote-undo
+ (setq _c1 (org-verify-change-for-undo
+ _undo1 (with-current-buffer _buf1 buffer-undo-list))
+ _c2 (org-verify-change-for-undo
+ _undo2 (with-current-buffer _buf2 buffer-undo-list)))
+ (when (or _c1 _c2)
+ ;; make sure there are undo boundaries
+ (and _c1 (with-current-buffer _buf1 (undo-boundary)))
+ (and _c2 (with-current-buffer _buf2 (undo-boundary)))
+ ;; remember which buffer to undo
+ (push (list _cmd _cline _buf1 _c1 _buf2 _c2)
+ org-agenda-undo-list)))))
+
+(defun org-agenda-undo ()
+ "Undo a remote editing step in the agenda.
+This undoes changes both in the agenda buffer and in the remote buffer
+that have been changed along."
+ (interactive)
+ (or org-agenda-allow-remote-undo
+ (error "Check the variable `org-agenda-allow-remote-undo' to activate remote undo."))
+ (if (not (eq this-command last-command))
+ (setq org-agenda-undo-has-started-in nil
+ org-agenda-pending-undo-list org-agenda-undo-list))
+ (if (not org-agenda-pending-undo-list)
+ (error "No further undo information"))
+ (let* ((entry (pop org-agenda-pending-undo-list))
+ buf line cmd rembuf)
+ (setq cmd (pop entry) line (pop entry))
+ (setq rembuf (nth 2 entry))
+ (org-with-remote-undo rembuf
+ (while (bufferp (setq buf (pop entry)))
+ (if (pop entry)
+ (with-current-buffer buf
+ (let ((last-undo-buffer buf)
+ (inhibit-read-only t))
+ (unless (memq buf org-agenda-undo-has-started-in)
+ (push buf org-agenda-undo-has-started-in)
+ (make-local-variable 'pending-undo-list)
+ (undo-start))
+ (while (and pending-undo-list
+ (listp pending-undo-list)
+ (not (car pending-undo-list)))
+ (pop pending-undo-list))
+ (undo-more 1))))))
+ (goto-line line)
+ (message "`%s' undone (buffer %s)" cmd (buffer-name rembuf))))
+
+(defun org-verify-change-for-undo (l1 l2)
+ "Verify that a real change occurred between the undo lists L1 and L2."
+ (while (and l1 (listp l1) (null (car l1))) (pop l1))
+ (while (and l2 (listp l2) (null (car l2))) (pop l2))
+ (not (eq l1 l2)))
+
+;;; Agenda dispatch
+
+(defvar org-agenda-restrict nil)
+(defvar org-agenda-restrict-begin (make-marker))
+(defvar org-agenda-restrict-end (make-marker))
+(defvar org-agenda-last-dispatch-buffer nil)
+(defvar org-agenda-overriding-restriction nil)
+
+;;;###autoload
+(defun org-agenda (arg &optional keys restriction)
+ "Dispatch agenda commands to collect entries to the agenda buffer.
+Prompts for a command to execute. Any prefix arg will be passed
+on to the selected command. The default selections are:
+
+a Call `org-agenda-list' to display the agenda for current day or week.
+t Call `org-todo-list' to display the global todo list.
+T Call `org-todo-list' to display the global todo list, select only
+ entries with a specific TODO keyword (the user gets a prompt).
+m Call `org-tags-view' to display headlines with tags matching
+ a condition (the user is prompted for the condition).
+M Like `m', but select only TODO entries, no ordinary headlines.
+L Create a timeline for the current buffer.
+e Export views to associated files.
+
+More commands can be added by configuring the variable
+`org-agenda-custom-commands'. In particular, specific tags and TODO keyword
+searches can be pre-defined in this way.
+
+If the current buffer is in Org-mode and visiting a file, you can also
+first press `<' once to indicate that the agenda should be temporarily
+\(until the next use of \\[org-agenda]) restricted to the current file.
+Pressing `<' twice means to restrict to the current subtree or region
+\(if active)."
+ (interactive "P")
+ (catch 'exit
+ (let* ((prefix-descriptions nil)
+ (org-agenda-custom-commands-orig org-agenda-custom-commands)
+ (org-agenda-custom-commands
+ ;; normalize different versions
+ (delq nil
+ (mapcar
+ (lambda (x)
+ (cond ((stringp (cdr x))
+ (push x prefix-descriptions)
+ nil)
+ ((stringp (nth 1 x)) x)
+ ((not (nth 1 x)) (cons (car x) (cons "" (cddr x))))
+ (t (cons (car x) (cons "" (cdr x))))))
+ org-agenda-custom-commands)))
+ (buf (current-buffer))
+ (bfn (buffer-file-name (buffer-base-buffer)))
+ entry key type match lprops ans)
+ ;; Turn off restriction unless there is an overriding one
+ (unless org-agenda-overriding-restriction
+ (put 'org-agenda-files 'org-restrict nil)
+ (setq org-agenda-restrict nil)
+ (move-marker org-agenda-restrict-begin nil)
+ (move-marker org-agenda-restrict-end nil))
+ ;; Delete old local properties
+ (put 'org-agenda-redo-command 'org-lprops nil)
+ ;; Remember where this call originated
+ (setq org-agenda-last-dispatch-buffer (current-buffer))
+ (unless keys
+ (setq ans (org-agenda-get-restriction-and-command prefix-descriptions)
+ keys (car ans)
+ restriction (cdr ans)))
+ ;; Estabish the restriction, if any
+ (when (and (not org-agenda-overriding-restriction) restriction)
+ (put 'org-agenda-files 'org-restrict (list bfn))
+ (cond
+ ((eq restriction 'region)
+ (setq org-agenda-restrict t)
+ (move-marker org-agenda-restrict-begin (region-beginning))
+ (move-marker org-agenda-restrict-end (region-end)))
+ ((eq restriction 'subtree)
+ (save-excursion
+ (setq org-agenda-restrict t)
+ (org-back-to-heading t)
+ (move-marker org-agenda-restrict-begin (point))
+ (move-marker org-agenda-restrict-end
+ (progn (org-end-of-subtree t)))))))
+
+ (require 'calendar) ; FIXME: can we avoid this for some commands?
+ ;; For example the todo list should not need it (but does...)
+ (cond
+ ((setq entry (assoc keys org-agenda-custom-commands))
+ (if (or (symbolp (nth 2 entry)) (functionp (nth 2 entry)))
+ (progn
+ (setq type (nth 2 entry) match (nth 3 entry) lprops (nth 4 entry))
+ (put 'org-agenda-redo-command 'org-lprops lprops)
+ (cond
+ ((eq type 'agenda)
+ (org-let lprops '(org-agenda-list current-prefix-arg)))
+ ((eq type 'alltodo)
+ (org-let lprops '(org-todo-list current-prefix-arg)))
+ ((eq type 'stuck)
+ (org-let lprops '(org-agenda-list-stuck-projects
+ current-prefix-arg)))
+ ((eq type 'tags)
+ (org-let lprops '(org-tags-view current-prefix-arg match)))
+ ((eq type 'tags-todo)
+ (org-let lprops '(org-tags-view '(4) match)))
+ ((eq type 'todo)
+ (org-let lprops '(org-todo-list match)))
+ ((eq type 'tags-tree)
+ (org-check-for-org-mode)
+ (org-let lprops '(org-tags-sparse-tree current-prefix-arg match)))
+ ((eq type 'todo-tree)
+ (org-check-for-org-mode)
+ (org-let lprops
+ '(org-occur (concat "^" outline-regexp "[ \t]*"
+ (regexp-quote match) "\\>"))))
+ ((eq type 'occur-tree)
+ (org-check-for-org-mode)
+ (org-let lprops '(org-occur match)))
+ ((functionp type)
+ (org-let lprops '(funcall type match)))
+ ((fboundp type)
+ (org-let lprops '(funcall type match)))
+ (t (error "Invalid custom agenda command type %s" type))))
+ (org-run-agenda-series (nth 1 entry) (cddr entry))))
+ ((equal keys "C")
+ (setq org-agenda-custom-commands org-agenda-custom-commands-orig)
+ (customize-variable 'org-agenda-custom-commands))
+ ((equal keys "a") (call-interactively 'org-agenda-list))
+ ((equal keys "t") (call-interactively 'org-todo-list))
+ ((equal keys "T") (org-call-with-arg 'org-todo-list (or arg '(4))))
+ ((equal keys "m") (call-interactively 'org-tags-view))
+ ((equal keys "M") (org-call-with-arg 'org-tags-view (or arg '(4))))
+ ((equal keys "e") (call-interactively 'org-store-agenda-views))
+ ((equal keys "L")
+ (unless (org-mode-p)
+ (error "This is not an Org-mode file"))
+ (unless restriction
+ (put 'org-agenda-files 'org-restrict (list bfn))
+ (org-call-with-arg 'org-timeline arg)))
+ ((equal keys "#") (call-interactively 'org-agenda-list-stuck-projects))
+ ((equal keys "/") (call-interactively 'org-occur-in-agenda-files))
+ ((equal keys "!") (customize-variable 'org-stuck-projects))
+ (t (error "Invalid agenda key"))))))
+
+(defun org-agenda-normalize-custom-commands (cmds)
+ (delq nil
+ (mapcar
+ (lambda (x)
+ (cond ((stringp (cdr x)) nil)
+ ((stringp (nth 1 x)) x)
+ ((not (nth 1 x)) (cons (car x) (cons "" (cddr x))))
+ (t (cons (car x) (cons "" (cdr x))))))
+ cmds)))
+
+(defun org-agenda-get-restriction-and-command (prefix-descriptions)
+ "The user interface for selecting an agenda command."
+ (catch 'exit
+ (let* ((bfn (buffer-file-name (buffer-base-buffer)))
+ (restrict-ok (and bfn (org-mode-p)))
+ (region-p (org-region-active-p))
+ (custom org-agenda-custom-commands)
+ (selstring "")
+ restriction second-time
+ c entry key type match prefixes rmheader header-end custom1 desc)
+ (save-window-excursion
+ (delete-other-windows)
+ (org-switch-to-buffer-other-window " *Agenda Commands*")
+ (erase-buffer)
+ (insert (eval-when-compile
+ (let ((header
+"
+Press key for an agenda command: < Buffer,subtree/region restriction
+-------------------------------- > Remove restriction
+a Agenda for current week or day e Export agenda views
+t List of all TODO entries T Entries with special TODO kwd
+m Match a TAGS query M Like m, but only TODO entries
+L Timeline for current buffer # List stuck projects (!=configure)
+/ Multi-occur C Configure custom agenda commands
+")
+ (start 0))
+ (while (string-match
+ "\\(^\\| \\|(\\)\\(\\S-\\)\\( \\|=\\)"
+ header start)
+ (setq start (match-end 0))
+ (add-text-properties (match-beginning 2) (match-end 2)
+ '(face bold) header))
+ header)))
+ (setq header-end (move-marker (make-marker) (point)))
+ (while t
+ (setq custom1 custom)
+ (when (eq rmheader t)
+ (goto-line 1)
+ (re-search-forward ":" nil t)
+ (delete-region (match-end 0) (point-at-eol))
+ (forward-char 1)
+ (looking-at "-+")
+ (delete-region (match-end 0) (point-at-eol))
+ (move-marker header-end (match-end 0)))
+ (goto-char header-end)
+ (delete-region (point) (point-max))
+ (while (setq entry (pop custom1))
+ (setq key (car entry) desc (nth 1 entry)
+ type (nth 2 entry) match (nth 3 entry))
+ (if (> (length key) 1)
+ (add-to-list 'prefixes (string-to-char key))
+ (insert
+ (format
+ "\n%-4s%-14s: %s"
+ (org-add-props (copy-sequence key)
+ '(face bold))
+ (cond
+ ((string-match "\\S-" desc) desc)
+ ((eq type 'agenda) "Agenda for current week or day")
+ ((eq type 'alltodo) "List of all TODO entries")
+ ((eq type 'stuck) "List of stuck projects")
+ ((eq type 'todo) "TODO keyword")
+ ((eq type 'tags) "Tags query")
+ ((eq type 'tags-todo) "Tags (TODO)")
+ ((eq type 'tags-tree) "Tags tree")
+ ((eq type 'todo-tree) "TODO kwd tree")
+ ((eq type 'occur-tree) "Occur tree")
+ ((functionp type) (if (symbolp type)
+ (symbol-name type)
+ "Lambda expression"))
+ (t "???"))
+ (cond
+ ((stringp match)
+ (org-add-props match nil 'face 'org-warning))
+ (match
+ (format "set of %d commands" (length match)))
+ (t ""))))))
+ (when prefixes
+ (mapc (lambda (x)
+ (insert
+ (format "\n%s %s"
+ (org-add-props (char-to-string x)
+ nil 'face 'bold)
+ (or (cdr (assoc (concat selstring (char-to-string x))
+ prefix-descriptions))
+ "Prefix key"))))
+ prefixes))
+ (goto-char (point-min))
+ (when (fboundp 'fit-window-to-buffer)
+ (if second-time
+ (if (not (pos-visible-in-window-p (point-max)))
+ (fit-window-to-buffer))
+ (setq second-time t)
+ (fit-window-to-buffer)))
+ (message "Press key for agenda command%s:"
+ (if (or restrict-ok org-agenda-overriding-restriction)
+ (if org-agenda-overriding-restriction
+ " (restriction lock active)"
+ (if restriction
+ (format " (restricted to %s)" restriction)
+ " (unrestricted)"))
+ ""))
+ (setq c (read-char-exclusive))
+ (message "")
+ (cond
+ ((assoc (char-to-string c) custom)
+ (setq selstring (concat selstring (char-to-string c)))
+ (throw 'exit (cons selstring restriction)))
+ ((memq c prefixes)
+ (setq selstring (concat selstring (char-to-string c))
+ prefixes nil
+ rmheader (or rmheader t)
+ custom (delq nil (mapcar
+ (lambda (x)
+ (if (or (= (length (car x)) 1)
+ (/= (string-to-char (car x)) c))
+ nil
+ (cons (substring (car x) 1) (cdr x))))
+ custom))))
+ ((and (not restrict-ok) (memq c '(?1 ?0 ?<)))
+ (message "Restriction is only possible in Org-mode buffers")
+ (ding) (sit-for 1))
+ ((eq c ?1)
+ (org-agenda-remove-restriction-lock 'noupdate)
+ (setq restriction 'buffer))
+ ((eq c ?0)
+ (org-agenda-remove-restriction-lock 'noupdate)
+ (setq restriction (if region-p 'region 'subtree)))
+ ((eq c ?<)
+ (org-agenda-remove-restriction-lock 'noupdate)
+ (setq restriction
+ (cond
+ ((eq restriction 'buffer)
+ (if region-p 'region 'subtree))
+ ((memq restriction '(subtree region))
+ nil)
+ (t 'buffer))))
+ ((eq c ?>)
+ (org-agenda-remove-restriction-lock 'noupdate)
+ (setq restriction nil))
+ ((and (equal selstring "") (memq c '(?a ?t ?m ?L ?C ?e ?T ?M ?# ?! ?/)))
+ (throw 'exit (cons (setq selstring (char-to-string c)) restriction)))
+ ((and (> (length selstring) 0) (eq c ?\d))
+ (delete-window)
+ (org-agenda-get-restriction-and-command prefix-descriptions))
+
+ ((equal c ?q) (error "Abort"))
+ (t (error "Invalid key %c" c))))))))
+
+(defun org-run-agenda-series (name series)
+ (org-prepare-agenda name)
+ (let* ((org-agenda-multi t)
+ (redo (list 'org-run-agenda-series name (list 'quote series)))
+ (cmds (car series))
+ (gprops (nth 1 series))
+ match ;; The byte compiler incorrectly complains about this. Keep it!
+ cmd type lprops)
+ (while (setq cmd (pop cmds))
+ (setq type (car cmd) match (nth 1 cmd) lprops (nth 2 cmd))
+ (cond
+ ((eq type 'agenda)
+ (org-let2 gprops lprops
+ '(call-interactively 'org-agenda-list)))
+ ((eq type 'alltodo)
+ (org-let2 gprops lprops
+ '(call-interactively 'org-todo-list)))
+ ((eq type 'stuck)
+ (org-let2 gprops lprops
+ '(call-interactively 'org-agenda-list-stuck-projects)))
+ ((eq type 'tags)
+ (org-let2 gprops lprops
+ '(org-tags-view current-prefix-arg match)))
+ ((eq type 'tags-todo)
+ (org-let2 gprops lprops
+ '(org-tags-view '(4) match)))
+ ((eq type 'todo)
+ (org-let2 gprops lprops
+ '(org-todo-list match)))
+ ((fboundp type)
+ (org-let2 gprops lprops
+ '(funcall type match)))
+ (t (error "Invalid type in command series"))))
+ (widen)
+ (setq org-agenda-redo-command redo)
+ (goto-char (point-min)))
+ (org-finalize-agenda))
+
+;;;###autoload
+(defmacro org-batch-agenda (cmd-key &rest parameters)
+ "Run an agenda command in batch mode and send the result to STDOUT.
+If CMD-KEY is a string of length 1, it is used as a key in
+`org-agenda-custom-commands' and triggers this command. If it is a
+longer string is is used as a tags/todo match string.
+Paramters are alternating variable names and values that will be bound
+before running the agenda command."
+ (let (pars)
+ (while parameters
+ (push (list (pop parameters) (if parameters (pop parameters))) pars))
+ (if (> (length cmd-key) 2)
+ (eval (list 'let (nreverse pars)
+ (list 'org-tags-view nil cmd-key)))
+ (eval (list 'let (nreverse pars) (list 'org-agenda nil cmd-key))))
+ (set-buffer org-agenda-buffer-name)
+ (princ (org-encode-for-stdout (buffer-string)))))
+
+(defun org-encode-for-stdout (string)
+ (if (fboundp 'encode-coding-string)
+ (encode-coding-string string buffer-file-coding-system)
+ string))
+
+(defvar org-agenda-info nil)
+
+;;;###autoload
+(defmacro org-batch-agenda-csv (cmd-key &rest parameters)
+ "Run an agenda command in batch mode and send the result to STDOUT.
+If CMD-KEY is a string of length 1, it is used as a key in
+`org-agenda-custom-commands' and triggers this command. If it is a
+longer string is is used as a tags/todo match string.
+Paramters are alternating variable names and values that will be bound
+before running the agenda command.
+
+The output gives a line for each selected agenda item. Each
+item is a list of comma-separated values, like this:
+
+category,head,type,todo,tags,date,time,extra,priority-l,priority-n
+
+category The category of the item
+head The headline, without TODO kwd, TAGS and PRIORITY
+type The type of the agenda entry, can be
+ todo selected in TODO match
+ tagsmatch selected in tags match
+ diary imported from diary
+ deadline a deadline on given date
+ scheduled scheduled on given date
+ timestamp entry has timestamp on given date
+ closed entry was closed on given date
+ upcoming-deadline warning about deadline
+ past-scheduled forwarded scheduled item
+ block entry has date block including g. date
+todo The todo keyword, if any
+tags All tags including inherited ones, separated by colons
+date The relevant date, like 2007-2-14
+time The time, like 15:00-16:50
+extra Sting with extra planning info
+priority-l The priority letter if any was given
+priority-n The computed numerical priority
+agenda-day The day in the agenda where this is listed"
+
+ (let (pars)
+ (while parameters
+ (push (list (pop parameters) (if parameters (pop parameters))) pars))
+ (push (list 'org-agenda-remove-tags t) pars)
+ (if (> (length cmd-key) 2)
+ (eval (list 'let (nreverse pars)
+ (list 'org-tags-view nil cmd-key)))
+ (eval (list 'let (nreverse pars) (list 'org-agenda nil cmd-key))))
+ (set-buffer org-agenda-buffer-name)
+ (let* ((lines (org-split-string (buffer-string) "\n"))
+ line)
+ (while (setq line (pop lines))
+ (catch 'next
+ (if (not (get-text-property 0 'org-category line)) (throw 'next nil))
+ (setq org-agenda-info
+ (org-fix-agenda-info (text-properties-at 0 line)))
+ (princ
+ (org-encode-for-stdout
+ (mapconcat 'org-agenda-export-csv-mapper
+ '(org-category txt type todo tags date time-of-day extra
+ priority-letter priority agenda-day)
+ ",")))
+ (princ "\n"))))))
+
+(defun org-fix-agenda-info (props)
+ "Make sure all properties on an agenda item have a canonical form,
+so the the export commands caneasily use it."
+ (let (tmp re)
+ (when (setq tmp (plist-get props 'tags))
+ (setq props (plist-put props 'tags (mapconcat 'identity tmp ":"))))
+ (when (setq tmp (plist-get props 'date))
+ (if (integerp tmp) (setq tmp (calendar-gregorian-from-absolute tmp)))
+ (let ((calendar-date-display-form '(year "-" month "-" day)))
+ '((format "%4d, %9s %2s, %4s" dayname monthname day year))
+
+ (setq tmp (calendar-date-string tmp)))
+ (setq props (plist-put props 'date tmp)))
+ (when (setq tmp (plist-get props 'day))
+ (if (integerp tmp) (setq tmp (calendar-gregorian-from-absolute tmp)))
+ (let ((calendar-date-display-form '(year "-" month "-" day)))
+ (setq tmp (calendar-date-string tmp)))
+ (setq props (plist-put props 'day tmp))
+ (setq props (plist-put props 'agenda-day tmp)))
+ (when (setq tmp (plist-get props 'txt))
+ (when (string-match "\\[#\\([A-Z0-9]\\)\\] ?" tmp)
+ (plist-put props 'priority-letter (match-string 1 tmp))
+ (setq tmp (replace-match "" t t tmp)))
+ (when (and (setq re (plist-get props 'org-todo-regexp))
+ (setq re (concat "\\`\\.*" re " ?"))
+ (string-match re tmp))
+ (plist-put props 'todo (match-string 1 tmp))
+ (setq tmp (replace-match "" t t tmp)))
+ (plist-put props 'txt tmp)))
+ props)
+
+(defun org-agenda-export-csv-mapper (prop)
+ (let ((res (plist-get org-agenda-info prop)))
+ (setq res
+ (cond
+ ((not res) "")
+ ((stringp res) res)
+ (t (prin1-to-string res))))
+ (while (string-match "," res)
+ (setq res (replace-match ";" t t res)))
+ (org-trim res)))
+
+
+;;;###autoload
+(defun org-store-agenda-views (&rest parameters)
+ (interactive)
+ (eval (list 'org-batch-store-agenda-views)))
+
+;; FIXME, why is this a macro?????
+;;;###autoload
+(defmacro org-batch-store-agenda-views (&rest parameters)
+ "Run all custom agenda commands that have a file argument."
+ (let ((cmds (org-agenda-normalize-custom-commands org-agenda-custom-commands))
+ (pop-up-frames nil)
+ (dir default-directory)
+ pars cmd thiscmdkey files opts)
+ (while parameters
+ (push (list (pop parameters) (if parameters (pop parameters))) pars))
+ (setq pars (reverse pars))
+ (save-window-excursion
+ (while cmds
+ (setq cmd (pop cmds)
+ thiscmdkey (car cmd)
+ opts (nth 4 cmd)
+ files (nth 5 cmd))
+ (if (stringp files) (setq files (list files)))
+ (when files
+ (eval (list 'let (append org-agenda-exporter-settings opts pars)
+ (list 'org-agenda nil thiscmdkey)))
+ (set-buffer org-agenda-buffer-name)
+ (while files
+ (eval (list 'let (append org-agenda-exporter-settings opts pars)
+ (list 'org-write-agenda
+ (expand-file-name (pop files) dir) t))))
+ (and (get-buffer org-agenda-buffer-name)
+ (kill-buffer org-agenda-buffer-name)))))))
+
+(defun org-write-agenda (file &optional nosettings)
+ "Write the current buffer (an agenda view) as a file.
+Depending on the extension of the file name, plain text (.txt),
+HTML (.html or .htm) or Postscript (.ps) is produced.
+If NOSETTINGS is given, do not scope the settings of
+`org-agenda-exporter-settings' into the export commands. This is used when
+the settings have already been scoped and we do not wish to overrule other,
+higher priority settings."
+ (interactive "FWrite agenda to file: ")
+ (if (not (file-writable-p file))
+ (error "Cannot write agenda to file %s" file))
+ (cond
+ ((string-match "\\.html?\\'" file) (require 'htmlize))
+ ((string-match "\\.ps\\'" file) (require 'ps-print)))
+ (org-let (if nosettings nil org-agenda-exporter-settings)
+ '(save-excursion
+ (save-window-excursion
+ (cond
+ ((string-match "\\.html?\\'" file)
+ (set-buffer (htmlize-buffer (current-buffer)))
+
+ (when (and org-agenda-export-html-style
+ (string-match "<style>" org-agenda-export-html-style))
+ ;; replace <style> section with org-agenda-export-html-style
+ (goto-char (point-min))
+ (kill-region (- (search-forward "<style") 6)
+ (search-forward "</style>"))
+ (insert org-agenda-export-html-style))
+ (write-file file)
+ (kill-buffer (current-buffer))
+ (message "HTML written to %s" file))
+ ((string-match "\\.ps\\'" file)
+ (ps-print-buffer-with-faces file)
+ (message "Postscript written to %s" file))
+ (t
+ (let ((bs (buffer-string)))
+ (find-file file)
+ (insert bs)
+ (save-buffer 0)
+ (kill-buffer (current-buffer))
+ (message "Plain text written to %s" file))))))
+ (set-buffer org-agenda-buffer-name)))
+
+(defmacro org-no-read-only (&rest body)
+ "Inhibit read-only for BODY."
+ `(let ((inhibit-read-only t)) ,@body))
+
+(defun org-check-for-org-mode ()
+ "Make sure current buffer is in org-mode. Error if not."
+ (or (org-mode-p)
+ (error "Cannot execute org-mode agenda command on buffer in %s."
+ major-mode)))
+
+(defun org-fit-agenda-window ()
+ "Fit the window to the buffer size."
+ (and (memq org-agenda-window-setup '(reorganize-frame))
+ (fboundp 'fit-window-to-buffer)
+ (fit-window-to-buffer
+ nil
+ (floor (* (frame-height) (cdr org-agenda-window-frame-fractions)))
+ (floor (* (frame-height) (car org-agenda-window-frame-fractions))))))
+
+;;; Agenda file list
+
+(defun org-agenda-files (&optional unrestricted)
+ "Get the list of agenda files.
+Optional UNRESTRICTED means return the full list even if a restriction
+is currently in place."
+ (let ((files
+ (cond
+ ((and (not unrestricted) (get 'org-agenda-files 'org-restrict)))
+ ((stringp org-agenda-files) (org-read-agenda-file-list))
+ ((listp org-agenda-files) org-agenda-files)
+ (t (error "Invalid value of `org-agenda-files'")))))
+ (setq files (apply 'append
+ (mapcar (lambda (f)
+ (if (file-directory-p f)
+ (directory-files f t
+ org-agenda-file-regexp)
+ (list f)))
+ files)))
+ (if org-agenda-skip-unavailable-files
+ (delq nil
+ (mapcar (function
+ (lambda (file)
+ (and (file-readable-p file) file)))
+ files))
+ files))) ; `org-check-agenda-file' will remove them from the list
+
+(defun org-edit-agenda-file-list ()
+ "Edit the list of agenda files.
+Depending on setup, this either uses customize to edit the variable
+`org-agenda-files', or it visits the file that is holding the list. In the
+latter case, the buffer is set up in a way that saving it automatically kills
+the buffer and restores the previous window configuration."
+ (interactive)
+ (if (stringp org-agenda-files)
+ (let ((cw (current-window-configuration)))
+ (find-file org-agenda-files)
+ (org-set-local 'org-window-configuration cw)
+ (org-add-hook 'after-save-hook
+ (lambda ()
+ (set-window-configuration
+ (prog1 org-window-configuration
+ (kill-buffer (current-buffer))))
+ (org-install-agenda-files-menu)
+ (message "New agenda file list installed"))
+ nil 'local)
+ (message "%s" (substitute-command-keys
+ "Edit list and finish with \\[save-buffer]")))
+ (customize-variable 'org-agenda-files)))
+
+(defun org-store-new-agenda-file-list (list)
+ "Set new value for the agenda file list and save it correcly."
+ (if (stringp org-agenda-files)
+ (let ((f org-agenda-files) b)
+ (while (setq b (find-buffer-visiting f)) (kill-buffer b))
+ (with-temp-file f
+ (insert (mapconcat 'identity list "\n") "\n")))
+ (let ((org-mode-hook nil) (default-major-mode 'fundamental-mode))
+ (setq org-agenda-files list)
+ (customize-save-variable 'org-agenda-files org-agenda-files))))
+
+(defun org-read-agenda-file-list ()
+ "Read the list of agenda files from a file."
+ (when (stringp org-agenda-files)
+ (with-temp-buffer
+ (insert-file-contents org-agenda-files)
+ (org-split-string (buffer-string) "[ \t\r\n]*?[\r\n][ \t\r\n]*"))))
+
+
+;;;###autoload
+(defun org-cycle-agenda-files ()
+ "Cycle through the files in `org-agenda-files'.
+If the current buffer visits an agenda file, find the next one in the list.
+If the current buffer does not, find the first agenda file."
+ (interactive)
+ (let* ((fs (org-agenda-files t))
+ (files (append fs (list (car fs))))
+ (tcf (if buffer-file-name (file-truename buffer-file-name)))
+ file)
+ (unless files (error "No agenda files"))
+ (catch 'exit
+ (while (setq file (pop files))
+ (if (equal (file-truename file) tcf)
+ (when (car files)
+ (find-file (car files))
+ (throw 'exit t))))
+ (find-file (car fs)))
+ (if (buffer-base-buffer) (switch-to-buffer (buffer-base-buffer)))))
+
+(defun org-agenda-file-to-front (&optional to-end)
+ "Move/add the current file to the top of the agenda file list.
+If the file is not present in the list, it is added to the front. If it is
+present, it is moved there. With optional argument TO-END, add/move to the
+end of the list."
+ (interactive "P")
+ (let ((org-agenda-skip-unavailable-files nil)
+ (file-alist (mapcar (lambda (x)
+ (cons (file-truename x) x))
+ (org-agenda-files t)))
+ (ctf (file-truename buffer-file-name))
+ x had)
+ (setq x (assoc ctf file-alist) had x)
+
+ (if (not x) (setq x (cons ctf (abbreviate-file-name buffer-file-name))))
+ (if to-end
+ (setq file-alist (append (delq x file-alist) (list x)))
+ (setq file-alist (cons x (delq x file-alist))))
+ (org-store-new-agenda-file-list (mapcar 'cdr file-alist))
+ (org-install-agenda-files-menu)
+ (message "File %s to %s of agenda file list"
+ (if had "moved" "added") (if to-end "end" "front"))))
+
+(defun org-remove-file (&optional file)
+ "Remove current file from the list of files in variable `org-agenda-files'.
+These are the files which are being checked for agenda entries.
+Optional argument FILE means, use this file instead of the current."
+ (interactive)
+ (let* ((org-agenda-skip-unavailable-files nil)
+ (file (or file buffer-file-name))
+ (true-file (file-truename file))
+ (afile (abbreviate-file-name file))
+ (files (delq nil (mapcar
+ (lambda (x)
+ (if (equal true-file
+ (file-truename x))
+ nil x))
+ (org-agenda-files t)))))
+ (if (not (= (length files) (length (org-agenda-files t))))
+ (progn
+ (org-store-new-agenda-file-list files)
+ (org-install-agenda-files-menu)
+ (message "Removed file: %s" afile))
+ (message "File was not in list: %s (not removed)" afile))))
+
+(defun org-file-menu-entry (file)
+ (vector file (list 'find-file file) t))
+
+(defun org-check-agenda-file (file)
+ "Make sure FILE exists. If not, ask user what to do."
+ (when (not (file-exists-p file))
+ (message "non-existent file %s. [R]emove from list or [A]bort?"
+ (abbreviate-file-name file))
+ (let ((r (downcase (read-char-exclusive))))
+ (cond
+ ((equal r ?r)
+ (org-remove-file file)
+ (throw 'nextfile t))
+ (t (error "Abort"))))))
+
+;;; Agenda prepare and finalize
+
+(defvar org-agenda-multi nil) ; dynammically scoped
+(defvar org-agenda-buffer-name "*Org Agenda*")
+(defvar org-pre-agenda-window-conf nil)
+(defvar org-agenda-name nil)
+(defun org-prepare-agenda (&optional name)
+ (setq org-todo-keywords-for-agenda nil)
+ (setq org-done-keywords-for-agenda nil)
+ (if org-agenda-multi
+ (progn
+ (setq buffer-read-only nil)
+ (goto-char (point-max))
+ (unless (or (bobp) org-agenda-compact-blocks)
+ (insert "\n" (make-string (window-width) ?=) "\n"))
+ (narrow-to-region (point) (point-max)))
+ (org-agenda-maybe-reset-markers 'force)
+ (org-prepare-agenda-buffers (org-agenda-files))
+ (setq org-todo-keywords-for-agenda
+ (org-uniquify org-todo-keywords-for-agenda))
+ (setq org-done-keywords-for-agenda
+ (org-uniquify org-done-keywords-for-agenda))
+ (let* ((abuf (get-buffer-create org-agenda-buffer-name))
+ (awin (get-buffer-window abuf)))
+ (cond
+ ((equal (current-buffer) abuf) nil)
+ (awin (select-window awin))
+ ((not (setq org-pre-agenda-window-conf (current-window-configuration))))
+ ((equal org-agenda-window-setup 'current-window)
+ (switch-to-buffer abuf))
+ ((equal org-agenda-window-setup 'other-window)
+ (org-switch-to-buffer-other-window abuf))
+ ((equal org-agenda-window-setup 'other-frame)
+ (switch-to-buffer-other-frame abuf))
+ ((equal org-agenda-window-setup 'reorganize-frame)
+ (delete-other-windows)
+ (org-switch-to-buffer-other-window abuf))))
+ (setq buffer-read-only nil)
+ (erase-buffer)
+ (org-agenda-mode)
+ (and name (not org-agenda-name)
+ (org-set-local 'org-agenda-name name)))
+ (setq buffer-read-only nil))
+
+(defun org-finalize-agenda ()
+ "Finishing touch for the agenda buffer, called just before displaying it."
+ (unless org-agenda-multi
+ (save-excursion
+ (let ((inhibit-read-only t))
+ (goto-char (point-min))
+ (while (org-activate-bracket-links (point-max))
+ (add-text-properties (match-beginning 0) (match-end 0)
+ '(face org-link)))
+ (org-agenda-align-tags)
+ (unless org-agenda-with-colors
+ (remove-text-properties (point-min) (point-max) '(face nil))))
+ (if (and (boundp 'org-overriding-columns-format)
+ org-overriding-columns-format)
+ (org-set-local 'org-overriding-columns-format
+ org-overriding-columns-format))
+ (if (and (boundp 'org-agenda-view-columns-initially)
+ org-agenda-view-columns-initially)
+ (org-agenda-columns))
+ (when org-agenda-fontify-priorities
+ (org-fontify-priorities))
+ (run-hooks 'org-finalize-agenda-hook))))
+
+(defun org-fontify-priorities ()
+ "Make highest priority lines bold, and lowest italic."
+ (interactive)
+ (mapc (lambda (o) (if (eq (org-overlay-get o 'org-type) 'org-priority)
+ (org-delete-overlay o)))
+ (org-overlays-in (point-min) (point-max)))
+ (save-excursion
+ (let ((inhibit-read-only t)
+ b e p ov h l)
+ (goto-char (point-min))
+ (while (re-search-forward "\\[#\\(.\\)\\]" nil t)
+ (setq h (or (get-char-property (point) 'org-highest-priority)
+ org-highest-priority)
+ l (or (get-char-property (point) 'org-lowest-priority)
+ org-lowest-priority)
+ p (string-to-char (match-string 1))
+ b (match-beginning 0) e (point-at-eol)
+ ov (org-make-overlay b e))
+ (org-overlay-put
+ ov 'face
+ (cond ((listp org-agenda-fontify-priorities)
+ (cdr (assoc p org-agenda-fontify-priorities)))
+ ((equal p l) 'italic)
+ ((equal p h) 'bold)))
+ (org-overlay-put ov 'org-type 'org-priority)))))
+
+(defun org-prepare-agenda-buffers (files)
+ "Create buffers for all agenda files, protect archived trees and comments."
+ (interactive)
+ (let ((pa '(:org-archived t))
+ (pc '(:org-comment t))
+ (pall '(:org-archived t :org-comment t))
+ (inhibit-read-only t)
+ (rea (concat ":" org-archive-tag ":"))
+ bmp file re)
+ (save-excursion
+ (save-restriction
+ (while (setq file (pop files))
+ (if (bufferp file)
+ (set-buffer file)
+ (org-check-agenda-file file)
+ (set-buffer (org-get-agenda-file-buffer file)))
+ (widen)
+ (setq bmp (buffer-modified-p))
+ (org-refresh-category-properties)
+ (setq org-todo-keywords-for-agenda
+ (append org-todo-keywords-for-agenda org-todo-keywords-1))
+ (setq org-done-keywords-for-agenda
+ (append org-done-keywords-for-agenda org-done-keywords))
+ (save-excursion
+ (remove-text-properties (point-min) (point-max) pall)
+ (when org-agenda-skip-archived-trees
+ (goto-char (point-min))
+ (while (re-search-forward rea nil t)
+ (if (org-on-heading-p t)
+ (add-text-properties (point-at-bol) (org-end-of-subtree t) pa))))
+ (goto-char (point-min))
+ (setq re (concat "^\\*+ +" org-comment-string "\\>"))
+ (while (re-search-forward re nil t)
+ (add-text-properties
+ (match-beginning 0) (org-end-of-subtree t) pc)))
+ (set-buffer-modified-p bmp))))))
+
+(defvar org-agenda-skip-function nil
+ "Function to be called at each match during agenda construction.
+If this function returns nil, the current match should not be skipped.
+Otherwise, the function must return a position from where the search
+should be continued.
+This may also be a Lisp form, it will be evaluated.
+Never set this variable using `setq' or so, because then it will apply
+to all future agenda commands. Instead, bind it with `let' to scope
+it dynamically into the agenda-constructing command. A good way to set
+it is through options in org-agenda-custom-commands.")
+
+(defun org-agenda-skip ()
+ "Throw to `:skip' in places that should be skipped.
+Also moves point to the end of the skipped region, so that search can
+continue from there."
+ (let ((p (point-at-bol)) to fp)
+ (and org-agenda-skip-archived-trees
+ (get-text-property p :org-archived)
+ (org-end-of-subtree t)
+ (throw :skip t))
+ (and (get-text-property p :org-comment)
+ (org-end-of-subtree t)
+ (throw :skip t))
+ (if (equal (char-after p) ?#) (throw :skip t))
+ (when (and (or (setq fp (functionp org-agenda-skip-function))
+ (consp org-agenda-skip-function))
+ (setq to (save-excursion
+ (save-match-data
+ (if fp
+ (funcall org-agenda-skip-function)
+ (eval org-agenda-skip-function))))))
+ (goto-char to)
+ (throw :skip t))))
+
+(defvar org-agenda-markers nil
+ "List of all currently active markers created by `org-agenda'.")
+(defvar org-agenda-last-marker-time (time-to-seconds (current-time))
+ "Creation time of the last agenda marker.")
+
+(defun org-agenda-new-marker (&optional pos)
+ "Return a new agenda marker.
+Org-mode keeps a list of these markers and resets them when they are
+no longer in use."
+ (let ((m (copy-marker (or pos (point)))))
+ (setq org-agenda-last-marker-time (time-to-seconds (current-time)))
+ (push m org-agenda-markers)
+ m))
+
+(defun org-agenda-maybe-reset-markers (&optional force)
+ "Reset markers created by `org-agenda'. But only if they are old enough."
+ (if (or (and force (not org-agenda-multi))
+ (> (- (time-to-seconds (current-time))
+ org-agenda-last-marker-time)
+ 5))
+ (while org-agenda-markers
+ (move-marker (pop org-agenda-markers) nil))))
+
+(defun org-get-agenda-file-buffer (file)
+ "Get a buffer visiting FILE. If the buffer needs to be created, add
+it to the list of buffers which might be released later."
+ (let ((buf (org-find-base-buffer-visiting file)))
+ (if buf
+ buf ; just return it
+ ;; Make a new buffer and remember it
+ (setq buf (find-file-noselect file))
+ (if buf (push buf org-agenda-new-buffers))
+ buf)))
+
+(defun org-release-buffers (blist)
+ "Release all buffers in list, asking the user for confirmation when needed.
+When a buffer is unmodified, it is just killed. When modified, it is saved
+\(if the user agrees) and then killed."
+ (let (buf file)
+ (while (setq buf (pop blist))
+ (setq file (buffer-file-name buf))
+ (when (and (buffer-modified-p buf)
+ file
+ (y-or-n-p (format "Save file %s? " file)))
+ (with-current-buffer buf (save-buffer)))
+ (kill-buffer buf))))
+
+(defun org-get-category (&optional pos)
+ "Get the category applying to position POS."
+ (get-text-property (or pos (point)) 'org-category))
+
+;;; Agenda timeline
+
+(defvar org-agenda-only-exact-dates nil) ; dynamically scoped
+
+(defun org-timeline (&optional include-all)
+ "Show a time-sorted view of the entries in the current org file.
+Only entries with a time stamp of today or later will be listed. With
+\\[universal-argument] prefix, all unfinished TODO items will also be shown,
+under the current date.
+If the buffer contains an active region, only check the region for
+dates."
+ (interactive "P")
+ (require 'calendar)
+ (org-compile-prefix-format 'timeline)
+ (org-set-sorting-strategy 'timeline)
+ (let* ((dopast t)
+ (dotodo include-all)
+ (doclosed org-agenda-show-log)
+ (entry buffer-file-name)
+ (date (calendar-current-date))
+ (beg (if (org-region-active-p) (region-beginning) (point-min)))
+ (end (if (org-region-active-p) (region-end) (point-max)))
+ (day-numbers (org-get-all-dates beg end 'no-ranges
+ t doclosed ; always include today
+ org-timeline-show-empty-dates))
+ (org-deadline-warning-days 0)
+ (org-agenda-only-exact-dates t)
+ (today (time-to-days (current-time)))
+ (past t)
+ args
+ s e rtn d emptyp)
+ (setq org-agenda-redo-command
+ (list 'progn
+ (list 'org-switch-to-buffer-other-window (current-buffer))
+ (list 'org-timeline (list 'quote include-all))))
+ (if (not dopast)
+ ;; Remove past dates from the list of dates.
+ (setq day-numbers (delq nil (mapcar (lambda(x)
+ (if (>= x today) x nil))
+ day-numbers))))
+ (org-prepare-agenda (concat "Timeline "
+ (file-name-nondirectory buffer-file-name)))
+ (if doclosed (push :closed args))
+ (push :timestamp args)
+ (push :deadline args)
+ (push :scheduled args)
+ (push :sexp args)
+ (if dotodo (push :todo args))
+ (while (setq d (pop day-numbers))
+ (if (and (listp d) (eq (car d) :omitted))
+ (progn
+ (setq s (point))
+ (insert (format "\n[... %d empty days omitted]\n\n" (cdr d)))
+ (put-text-property s (1- (point)) 'face 'org-agenda-structure))
+ (if (listp d) (setq d (car d) emptyp t) (setq emptyp nil))
+ (if (and (>= d today)
+ dopast
+ past)
+ (progn
+ (setq past nil)
+ (insert (make-string 79 ?-) "\n")))
+ (setq date (calendar-gregorian-from-absolute d))
+ (setq s (point))
+ (setq rtn (and (not emptyp)
+ (apply 'org-agenda-get-day-entries entry
+ date args)))
+ (if (or rtn (equal d today) org-timeline-show-empty-dates)
+ (progn
+ (insert
+ (if (stringp org-agenda-format-date)
+ (format-time-string org-agenda-format-date
+ (org-time-from-absolute date))
+ (funcall org-agenda-format-date date))
+ "\n")
+ (put-text-property s (1- (point)) 'face 'org-agenda-structure)
+ (put-text-property s (1- (point)) 'org-date-line t)
+ (if (equal d today)
+ (put-text-property s (1- (point)) 'org-today t))
+ (and rtn (insert (org-finalize-agenda-entries rtn) "\n"))
+ (put-text-property s (1- (point)) 'day d)))))
+ (goto-char (point-min))
+ (goto-char (or (text-property-any (point-min) (point-max) 'org-today t)
+ (point-min)))
+ (add-text-properties (point-min) (point-max) '(org-agenda-type timeline))
+ (org-finalize-agenda)
+ (setq buffer-read-only t)))
+
+(defun org-get-all-dates (beg end &optional no-ranges force-today inactive empty)
+ "Return a list of all relevant day numbers from BEG to END buffer positions.
+If NO-RANGES is non-nil, include only the start and end dates of a range,
+not every single day in the range. If FORCE-TODAY is non-nil, make
+sure that TODAY is included in the list. If INACTIVE is non-nil, also
+inactive time stamps (those in square brackets) are included.
+When EMPTY is non-nil, also include days without any entries."
+ (let ((re (if inactive org-ts-regexp-both org-ts-regexp))
+ dates dates1 date day day1 day2 ts1 ts2)
+ (if force-today
+ (setq dates (list (time-to-days (current-time)))))
+ (save-excursion
+ (goto-char beg)
+ (while (re-search-forward re end t)
+ (setq day (time-to-days (org-time-string-to-time
+ (substring (match-string 1) 0 10))))
+ (or (memq day dates) (push day dates)))
+ (unless no-ranges
+ (goto-char beg)
+ (while (re-search-forward org-tr-regexp end t)
+ (setq ts1 (substring (match-string 1) 0 10)
+ ts2 (substring (match-string 2) 0 10)
+ day1 (time-to-days (org-time-string-to-time ts1))
+ day2 (time-to-days (org-time-string-to-time ts2)))
+ (while (< (setq day1 (1+ day1)) day2)
+ (or (memq day1 dates) (push day1 dates)))))
+ (setq dates (sort dates '<))
+ (when empty
+ (while (setq day (pop dates))
+ (setq day2 (car dates))
+ (push day dates1)
+ (when (and day2 empty)
+ (if (or (eq empty t)
+ (and (numberp empty) (<= (- day2 day) empty)))
+ (while (< (setq day (1+ day)) day2)
+ (push (list day) dates1))
+ (push (cons :omitted (- day2 day)) dates1))))
+ (setq dates (nreverse dates1)))
+ dates)))
+
+;;; Agenda Daily/Weekly
+
+(defvar org-agenda-overriding-arguments nil) ; dynamically scoped parameter
+(defvar org-agenda-start-day nil) ; dynamically scoped parameter
+(defvar org-agenda-last-arguments nil
+ "The arguments of the previous call to org-agenda")
+(defvar org-starting-day nil) ; local variable in the agenda buffer
+(defvar org-agenda-span nil) ; local variable in the agenda buffer
+(defvar org-include-all-loc nil) ; local variable
+(defvar org-agenda-remove-date nil) ; dynamically scoped
+
+;;;###autoload
+(defun org-agenda-list (&optional include-all start-day ndays)
+ "Produce a daily/weekly view from all files in variable `org-agenda-files'.
+The view will be for the current day or week, but from the overview buffer
+you will be able to go to other days/weeks.
+
+With one \\[universal-argument] prefix argument INCLUDE-ALL,
+all unfinished TODO items will also be shown, before the agenda.
+This feature is considered obsolete, please use the TODO list or a block
+agenda instead.
+
+With a numeric prefix argument in an interactive call, the agenda will
+span INCLUDE-ALL days. Lisp programs should instead specify NDAYS to change
+the number of days. NDAYS defaults to `org-agenda-ndays'.
+
+START-DAY defaults to TODAY, or to the most recent match for the weekday
+given in `org-agenda-start-on-weekday'."
+ (interactive "P")
+ (if (and (integerp include-all) (> include-all 0))
+ (setq ndays include-all include-all nil))
+ (setq ndays (or ndays org-agenda-ndays)
+ start-day (or start-day org-agenda-start-day))
+ (if org-agenda-overriding-arguments
+ (setq include-all (car org-agenda-overriding-arguments)
+ start-day (nth 1 org-agenda-overriding-arguments)
+ ndays (nth 2 org-agenda-overriding-arguments)))
+ (if (stringp start-day)
+ ;; Convert to an absolute day number
+ (setq start-day (time-to-days (org-read-date nil t start-day))))
+ (setq org-agenda-last-arguments (list include-all start-day ndays))
+ (org-compile-prefix-format 'agenda)
+ (org-set-sorting-strategy 'agenda)
+ (require 'calendar)
+ (let* ((org-agenda-start-on-weekday
+ (if (or (equal ndays 7) (and (null ndays) (equal 7 org-agenda-ndays)))
+ org-agenda-start-on-weekday nil))
+ (thefiles (org-agenda-files))
+ (files thefiles)
+ (today (time-to-days
+ (time-subtract (current-time)
+ (list 0 (* 3600 org-extend-today-until) 0))))
+ (sd (or start-day today))
+ (start (if (or (null org-agenda-start-on-weekday)
+ (< org-agenda-ndays 7))
+ sd
+ (let* ((nt (calendar-day-of-week
+ (calendar-gregorian-from-absolute sd)))
+ (n1 org-agenda-start-on-weekday)
+ (d (- nt n1)))
+ (- sd (+ (if (< d 0) 7 0) d)))))
+ (day-numbers (list start))
+ (day-cnt 0)
+ (inhibit-redisplay (not debug-on-error))
+ s e rtn rtnall file date d start-pos end-pos todayp nd)
+ (setq org-agenda-redo-command
+ (list 'org-agenda-list (list 'quote include-all) start-day ndays))
+ ;; Make the list of days
+ (setq ndays (or ndays org-agenda-ndays)
+ nd ndays)
+ (while (> ndays 1)
+ (push (1+ (car day-numbers)) day-numbers)
+ (setq ndays (1- ndays)))
+ (setq day-numbers (nreverse day-numbers))
+ (org-prepare-agenda "Day/Week")
+ (org-set-local 'org-starting-day (car day-numbers))
+ (org-set-local 'org-include-all-loc include-all)
+ (org-set-local 'org-agenda-span
+ (org-agenda-ndays-to-span nd))
+ (when (and (or include-all org-agenda-include-all-todo)
+ (member today day-numbers))
+ (setq files thefiles
+ rtnall nil)
+ (while (setq file (pop files))
+ (catch 'nextfile
+ (org-check-agenda-file file)
+ (setq date (calendar-gregorian-from-absolute today)
+ rtn (org-agenda-get-day-entries
+ file date :todo))
+ (setq rtnall (append rtnall rtn))))
+ (when rtnall
+ (insert "ALL CURRENTLY OPEN TODO ITEMS:\n")
+ (add-text-properties (point-min) (1- (point))
+ (list 'face 'org-agenda-structure))
+ (insert (org-finalize-agenda-entries rtnall) "\n")))
+ (unless org-agenda-compact-blocks
+ (setq s (point))
+ (insert (capitalize (symbol-name (org-agenda-ndays-to-span nd)))
+ "-agenda:\n")
+ (add-text-properties s (1- (point)) (list 'face 'org-agenda-structure
+ 'org-date-line t)))
+ (while (setq d (pop day-numbers))
+ (setq date (calendar-gregorian-from-absolute d)
+ s (point))
+ (if (or (setq todayp (= d today))
+ (and (not start-pos) (= d sd)))
+ (setq start-pos (point))
+ (if (and start-pos (not end-pos))
+ (setq end-pos (point))))
+ (setq files thefiles
+ rtnall nil)
+ (while (setq file (pop files))
+ (catch 'nextfile
+ (org-check-agenda-file file)
+ (if org-agenda-show-log
+ (setq rtn (org-agenda-get-day-entries
+ file date
+ :deadline :scheduled :timestamp :sexp :closed))
+ (setq rtn (org-agenda-get-day-entries
+ file date
+ :deadline :scheduled :sexp :timestamp)))
+ (setq rtnall (append rtnall rtn))))
+ (if org-agenda-include-diary
+ (progn
+ (require 'diary-lib)
+ (setq rtn (org-get-entries-from-diary date))
+ (setq rtnall (append rtnall rtn))))
+ (if (or rtnall org-agenda-show-all-dates)
+ (progn
+ (setq day-cnt (1+ day-cnt))
+ (insert
+ (if (stringp org-agenda-format-date)
+ (format-time-string org-agenda-format-date
+ (org-time-from-absolute date))
+ (funcall org-agenda-format-date date))
+ "\n")
+ (put-text-property s (1- (point)) 'face 'org-agenda-structure)
+ (put-text-property s (1- (point)) 'org-date-line t)
+ (put-text-property s (1- (point)) 'org-day-cnt day-cnt)
+ (if todayp (put-text-property s (1- (point)) 'org-today t))
+ (if rtnall (insert
+ (org-finalize-agenda-entries
+ (org-agenda-add-time-grid-maybe
+ rtnall nd todayp))
+ "\n"))
+ (put-text-property s (1- (point)) 'day d)
+ (put-text-property s (1- (point)) 'org-day-cnt day-cnt))))
+ (goto-char (point-min))
+ (org-fit-agenda-window)
+ (unless (and (pos-visible-in-window-p (point-min))
+ (pos-visible-in-window-p (point-max)))
+ (goto-char (1- (point-max)))
+ (recenter -1)
+ (if (not (pos-visible-in-window-p (or start-pos 1)))
+ (progn
+ (goto-char (or start-pos 1))
+ (recenter 1))))
+ (goto-char (or start-pos 1))
+ (add-text-properties (point-min) (point-max) '(org-agenda-type agenda))
+ (org-finalize-agenda)
+ (setq buffer-read-only t)
+ (message "")))
+
+(defun org-agenda-ndays-to-span (n)
+ (cond ((< n 7) 'day) ((= n 7) 'week) ((< n 32) 'month) (t 'year)))
+
+;;; Agenda TODO list
+
+(defvar org-select-this-todo-keyword nil)
+(defvar org-last-arg nil)
+
+;;;###autoload
+(defun org-todo-list (arg)
+ "Show all TODO entries from all agenda file in a single list.
+The prefix arg can be used to select a specific TODO keyword and limit
+the list to these. When using \\[universal-argument], you will be prompted
+for a keyword. A numeric prefix directly selects the Nth keyword in
+`org-todo-keywords-1'."
+ (interactive "P")
+ (require 'calendar)
+ (org-compile-prefix-format 'todo)
+ (org-set-sorting-strategy 'todo)
+ (org-prepare-agenda "TODO")
+ (let* ((today (time-to-days (current-time)))
+ (date (calendar-gregorian-from-absolute today))
+ (kwds org-todo-keywords-for-agenda)
+ (completion-ignore-case t)
+ (org-select-this-todo-keyword
+ (if (stringp arg) arg
+ (and arg (integerp arg) (> arg 0)
+ (nth (1- arg) kwds))))
+ rtn rtnall files file pos)
+ (when (equal arg '(4))
+ (setq org-select-this-todo-keyword
+ (completing-read "Keyword (or KWD1|K2D2|...): "
+ (mapcar 'list kwds) nil nil)))
+ (and (equal 0 arg) (setq org-select-this-todo-keyword nil))
+ (org-set-local 'org-last-arg arg)
+ (setq org-agenda-redo-command
+ '(org-todo-list (or current-prefix-arg org-last-arg)))
+ (setq files (org-agenda-files)
+ rtnall nil)
+ (while (setq file (pop files))
+ (catch 'nextfile
+ (org-check-agenda-file file)
+ (setq rtn (org-agenda-get-day-entries file date :todo))
+ (setq rtnall (append rtnall rtn))))
+ (if org-agenda-overriding-header
+ (insert (org-add-props (copy-sequence org-agenda-overriding-header)
+ nil 'face 'org-agenda-structure) "\n")
+ (insert "Global list of TODO items of type: ")
+ (add-text-properties (point-min) (1- (point))
+ (list 'face 'org-agenda-structure))
+ (setq pos (point))
+ (insert (or org-select-this-todo-keyword "ALL") "\n")
+ (add-text-properties pos (1- (point)) (list 'face 'org-warning))
+ (setq pos (point))
+ (unless org-agenda-multi
+ (insert "Available with `N r': (0)ALL")
+ (let ((n 0) s)
+ (mapc (lambda (x)
+ (setq s (format "(%d)%s" (setq n (1+ n)) x))
+ (if (> (+ (current-column) (string-width s) 1) (frame-width))
+ (insert "\n "))
+ (insert " " s))
+ kwds))
+ (insert "\n"))
+ (add-text-properties pos (1- (point)) (list 'face 'org-agenda-structure)))
+ (when rtnall
+ (insert (org-finalize-agenda-entries rtnall) "\n"))
+ (goto-char (point-min))
+ (org-fit-agenda-window)
+ (add-text-properties (point-min) (point-max) '(org-agenda-type todo))
+ (org-finalize-agenda)
+ (setq buffer-read-only t)))
+
+;;; Agenda tags match
+
+;;;###autoload
+(defun org-tags-view (&optional todo-only match)
+ "Show all headlines for all `org-agenda-files' matching a TAGS criterion.
+The prefix arg TODO-ONLY limits the search to TODO entries."
+ (interactive "P")
+ (org-compile-prefix-format 'tags)
+ (org-set-sorting-strategy 'tags)
+ (let* ((org-tags-match-list-sublevels
+ (if todo-only t org-tags-match-list-sublevels))
+ (completion-ignore-case t)
+ rtn rtnall files file pos matcher
+ buffer)
+ (setq matcher (org-make-tags-matcher match)
+ match (car matcher) matcher (cdr matcher))
+ (org-prepare-agenda (concat "TAGS " match))
+ (setq org-agenda-query-string match)
+ (setq org-agenda-redo-command
+ (list 'org-tags-view (list 'quote todo-only)
+ (list 'if 'current-prefix-arg nil 'org-agenda-query-string)))
+ (setq files (org-agenda-files)
+ rtnall nil)
+ (while (setq file (pop files))
+ (catch 'nextfile
+ (org-check-agenda-file file)
+ (setq buffer (if (file-exists-p file)
+ (org-get-agenda-file-buffer file)
+ (error "No such file %s" file)))
+ (if (not buffer)
+ ;; If file does not exist, merror message to agenda
+ (setq rtn (list
+ (format "ORG-AGENDA-ERROR: No such org-file %s" file))
+ rtnall (append rtnall rtn))
+ (with-current-buffer buffer
+ (unless (org-mode-p)
+ (error "Agenda file %s is not in `org-mode'" file))
+ (save-excursion
+ (save-restriction
+ (if org-agenda-restrict
+ (narrow-to-region org-agenda-restrict-begin
+ org-agenda-restrict-end)
+ (widen))
+ (setq rtn (org-scan-tags 'agenda matcher todo-only))
+ (setq rtnall (append rtnall rtn))))))))
+ (if org-agenda-overriding-header
+ (insert (org-add-props (copy-sequence org-agenda-overriding-header)
+ nil 'face 'org-agenda-structure) "\n")
+ (insert "Headlines with TAGS match: ")
+ (add-text-properties (point-min) (1- (point))
+ (list 'face 'org-agenda-structure))
+ (setq pos (point))
+ (insert match "\n")
+ (add-text-properties pos (1- (point)) (list 'face 'org-warning))
+ (setq pos (point))
+ (unless org-agenda-multi
+ (insert "Press `C-u r' to enter new search string; use `/;\\=' to adjust interactively\n"))
+ (add-text-properties pos (1- (point)) (list 'face 'org-agenda-structure)))
+ (when rtnall
+ (insert (org-finalize-agenda-entries rtnall) "\n"))
+ (goto-char (point-min))
+ (org-fit-agenda-window)
+ (add-text-properties (point-min) (point-max) '(org-agenda-type tags))
+ (org-finalize-agenda)
+ (setq buffer-read-only t)))
+
+;;; Agenda interactive query manipulation
+
+(defcustom org-agenda-query-selection-single-key t
+ "Non-nil means, query manipulation exits after first change.
+When nil, you have to press RET to exit it.
+During query selection, you can toggle this flag with `C-c'.
+This variable can also have the value `expert'. In this case, the window
+displaying the tags menu is not even shown, until you press C-c again."
+ :group 'org-agenda
+ :type '(choice
+ (const :tag "No" nil)
+ (const :tag "Yes" t)
+ (const :tag "Expert" expert)))
+
+(defun org-agenda-query-selection (current op table &optional todo-table)
+ "Fast query manipulation with single keys.
+CURRENT is the current query string, OP is the initial
+operator (one of \"+|-=\"), TABLE is an alist of tags and
+corresponding keys, possibly with grouping information.
+TODO-TABLE is a similar table with TODO keywords, should these
+have keys assigned to them. If the keys are nil, a-z are
+automatically assigned. Returns the new query string, or nil to
+not change the current one."
+ (let* ((fulltable (append table todo-table))
+ (maxlen (apply 'max (mapcar
+ (lambda (x)
+ (if (stringp (car x)) (string-width (car x)) 0))
+ fulltable)))
+ (fwidth (+ maxlen 3 1 3))
+ (ncol (/ (- (window-width) 4) fwidth))
+ (expert (eq org-agenda-query-selection-single-key 'expert))
+ (exit-after-next org-agenda-query-selection-single-key)
+ (done-keywords org-done-keywords)
+ tbl char cnt e groups ingroup
+ tg c2 c c1 ntable rtn)
+ (save-window-excursion
+ (if expert
+ (set-buffer (get-buffer-create " *Org tags*"))
+ (delete-other-windows)
+ (split-window-vertically)
+ (org-switch-to-buffer-other-window (get-buffer-create " *Org tags*")))
+ (erase-buffer)
+ (org-set-local 'org-done-keywords done-keywords)
+ (insert "Query: " current "\n")
+ (org-agenda-query-op-line op)
+ (insert "\n\n")
+ (org-fast-tag-show-exit exit-after-next)
+ (setq tbl fulltable char ?a cnt 0)
+ (while (setq e (pop tbl))
+ (cond
+ ((equal e '(:startgroup))
+ (push '() groups) (setq ingroup t)
+ (when (not (= cnt 0))
+ (setq cnt 0)
+ (insert "\n"))
+ (insert "{ "))
+ ((equal e '(:endgroup))
+ (setq ingroup nil cnt 0)
+ (insert "}\n"))
+ (t
+ (setq tg (car e) c2 nil)
+ (if (cdr e)
+ (setq c (cdr e))
+ ;; automatically assign a character.
+ (setq c1 (string-to-char
+ (downcase (substring
+ tg (if (= (string-to-char tg) ?@) 1 0)))))
+ (if (or (rassoc c1 ntable) (rassoc c1 table))
+ (while (or (rassoc char ntable) (rassoc char table))
+ (setq char (1+ char)))
+ (setq c2 c1))
+ (setq c (or c2 char)))
+ (if ingroup (push tg (car groups)))
+ (setq tg (org-add-props tg nil 'face
+ (cond
+ ((not (assoc tg table))
+ (org-get-todo-face tg))
+ (t nil))))
+ (if (and (= cnt 0) (not ingroup)) (insert " "))
+ (insert "[" c "] " tg (make-string
+ (- fwidth 4 (length tg)) ?\ ))
+ (push (cons tg c) ntable)
+ (when (= (setq cnt (1+ cnt)) ncol)
+ (insert "\n")
+ (if ingroup (insert " "))
+ (setq cnt 0)))))
+ (setq ntable (nreverse ntable))
+ (insert "\n")
+ (goto-char (point-min))
+ (if (and (not expert) (fboundp 'fit-window-to-buffer))
+ (fit-window-to-buffer))
+ (setq rtn
+ (catch 'exit
+ (while t
+ (message "[a-z..]:Toggle [SPC]:clear [RET]:accept [TAB]:free%s%s"
+ (if groups " [!] no groups" " [!]groups")
+ (if expert " [C-c]:window" (if exit-after-next " [C-c]:single" " [C-c]:multi")))
+ (setq c (let ((inhibit-quit t)) (read-char-exclusive)))
+ (cond
+ ((= c ?\r) (throw 'exit t))
+ ((= c ?!)
+ (setq groups (not groups))
+ (goto-char (point-min))
+ (while (re-search-forward "[{}]" nil t) (replace-match " ")))
+ ((= c ?\C-c)
+ (if (not expert)
+ (org-fast-tag-show-exit
+ (setq exit-after-next (not exit-after-next)))
+ (setq expert nil)
+ (delete-other-windows)
+ (split-window-vertically)
+ (org-switch-to-buffer-other-window " *Org tags*")
+ (and (fboundp 'fit-window-to-buffer)
+ (fit-window-to-buffer))))
+ ((or (= c ?\C-g)
+ (and (= c ?q) (not (rassoc c ntable))))
+ (setq quit-flag t))
+ ((= c ?\ )
+ (setq current "")
+ (if exit-after-next (setq exit-after-next 'now)))
+ ((= c ?\[) ; clear left
+ (org-agenda-query-decompose current)
+ (setq current (concat "/" (match-string 2 current)))
+ (if exit-after-next (setq exit-after-next 'now)))
+ ((= c ?\]) ; clear right
+ (org-agenda-query-decompose current)
+ (setq current (match-string 1 current))
+ (if exit-after-next (setq exit-after-next 'now)))
+ ((= c ?\t)
+ (condition-case nil
+ (setq current (read-string "Query: " current))
+ (quit))
+ (if exit-after-next (setq exit-after-next 'now)))
+ ;; operators
+ ((or (= c ?/) (= c ?+)) (setq op "+"))
+ ((or (= c ?\;) (= c ?|)) (setq op "|"))
+ ((or (= c ?\\) (= c ?-)) (setq op "-"))
+ ((= c ?=) (setq op "="))
+ ;; todos
+ ((setq e (rassoc c todo-table) tg (car e))
+ (setq current (org-agenda-query-manip
+ current op groups 'todo tg))
+ (if exit-after-next (setq exit-after-next 'now)))
+ ;; tags
+ ((setq e (rassoc c ntable) tg (car e))
+ (setq current (org-agenda-query-manip
+ current op groups 'tag tg))
+ (if exit-after-next (setq exit-after-next 'now))))
+ (if (eq exit-after-next 'now) (throw 'exit t))
+ (goto-char (point-min))
+ (beginning-of-line 1)
+ (delete-region (point) (point-at-eol))
+ (insert "Query: " current)
+ (beginning-of-line 2)
+ (delete-region (point) (point-at-eol))
+ (org-agenda-query-op-line op)
+ (goto-char (point-min)))))
+ (if rtn current nil))))
+
+(defun org-agenda-query-op-line (op)
+ (insert "Operator: "
+ (org-agenda-query-op-entry (equal op "+") "/+" "and")
+ (org-agenda-query-op-entry (equal op "|") ";|" "or")
+ (org-agenda-query-op-entry (equal op "-") "\\-" "not")
+ (org-agenda-query-op-entry (equal op "=") "=" "clear")))
+
+(defun org-agenda-query-op-entry (matchp chars str)
+ (if matchp
+ (org-add-props (format "[%s %s] " chars (upcase str))
+ nil 'face 'org-todo)
+ (format "[%s]%s " chars str)))
+
+(defun org-agenda-query-decompose (current)
+ (string-match "\\([^/]*\\)/?\\(.*\\)" current))
+
+(defun org-agenda-query-clear (current prefix tag)
+ (if (string-match (concat prefix "\\b" (regexp-quote tag) "\\b") current)
+ (replace-match "" t t current)
+ current))
+
+(defun org-agenda-query-manip (current op groups kind tag)
+ "Apply an operator to a query string and a tag.
+CURRENT is the current query string, OP is the operator, GROUPS is a
+list of lists of tags that are mutually exclusive. KIND is 'tag for a
+regular tag, or 'todo for a TODO keyword, and TAG is the tag or
+keyword string."
+ ;; If this tag is already in query string, remove it.
+ (setq current (org-agenda-query-clear current "[-\\+&|]?" tag))
+ (if (equal op "=") current
+ ;; When using AND, also remove mutually exclusive tags.
+ (if (equal op "+")
+ (loop for g in groups do
+ (if (member tag g)
+ (mapc (lambda (x)
+ (setq current
+ (org-agenda-query-clear current "\\+" x)))
+ g))))
+ ;; Decompose current query into q1 (tags) and q2 (TODOs).
+ (org-agenda-query-decompose current)
+ (let* ((q1 (match-string 1 current))
+ (q2 (match-string 2 current)))
+ (cond
+ ((eq kind 'tag)
+ (concat q1 op tag "/" q2))
+ ;; It's a TODO; when using AND, drop all other TODOs.
+ ((equal op "+")
+ (concat q1 "/+" tag))
+ (t
+ (concat q1 "/" q2 op tag))))))
+
+(defun org-agenda-query-global-todo-keys (&optional files)
+ "Return alist of all TODO keywords and their fast keys, in all FILES."
+ (let (alist)
+ (unless (and files (car files))
+ (setq files (org-agenda-files)))
+ (save-excursion
+ (loop for f in files do
+ (set-buffer (find-file-noselect f))
+ (loop for k in org-todo-key-alist do
+ (setq alist (org-agenda-query-merge-todo-key
+ alist k)))))
+ alist))
+
+(defun org-agenda-query-merge-todo-key (alist entry)
+ (let (e)
+ (cond
+ ;; if this is not a keyword (:startgroup, etc), ignore it
+ ((not (stringp (car entry))))
+ ;; if keyword already exists, replace char if it's null
+ ((setq e (assoc (car entry) alist))
+ (when (null (cdr e)) (setcdr e (cdr entry))))
+ ;; if char already exists, prepend keyword but drop char
+ ((rassoc (cdr entry) alist)
+ (error "TRACE POSITION 2")
+ (setq alist (cons (cons (car entry) nil) alist)))
+ ;; else, prepend COPY of entry
+ (t
+ (setq alist (cons (cons (car entry) (cdr entry)) alist)))))
+ alist)
+
+(defun org-agenda-query-generic-cmd (op)
+ "Activate query manipulation with OP as initial operator."
+ (let ((q (org-agenda-query-selection org-agenda-query-string op
+ org-tag-alist
+ (org-agenda-query-global-todo-keys))))
+ (when q
+ (setq org-agenda-query-string q)
+ (org-agenda-redo))))
+
+(defun org-agenda-query-clear-cmd ()
+ "Activate query manipulation, to clear a tag from the string."
+ (interactive)
+ (org-agenda-query-generic-cmd "="))
+
+(defun org-agenda-query-and-cmd ()
+ "Activate query manipulation, initially using the AND (+) operator."
+ (interactive)
+ (org-agenda-query-generic-cmd "+"))
+
+(defun org-agenda-query-or-cmd ()
+ "Activate query manipulation, initially using the OR (|) operator."
+ (interactive)
+ (org-agenda-query-generic-cmd "|"))
+
+(defun org-agenda-query-not-cmd ()
+ "Activate query manipulation, initially using the NOT (-) operator."
+ (interactive)
+ (org-agenda-query-generic-cmd "-"))
+
+;;; Agenda Finding stuck projects
+
+(defvar org-agenda-skip-regexp nil
+ "Regular expression used in skipping subtrees for the agenda.
+This is basically a temporary global variable that can be set and then
+used by user-defined selections using `org-agenda-skip-function'.")
+
+(defvar org-agenda-overriding-header nil
+ "When this is set during todo and tags searches, will replace header.")
+
+(defun org-agenda-skip-subtree-when-regexp-matches ()
+ "Checks if the current subtree contains match for `org-agenda-skip-regexp'.
+If yes, it returns the end position of this tree, causing agenda commands
+to skip this subtree. This is a function that can be put into
+`org-agenda-skip-function' for the duration of a command."
+ (let ((end (save-excursion (org-end-of-subtree t)))
+ skip)
+ (save-excursion
+ (setq skip (re-search-forward org-agenda-skip-regexp end t)))
+ (and skip end)))
+
+(defun org-agenda-skip-entry-if (&rest conditions)
+ "Skip entry if any of CONDITIONS is true.
+See `org-agenda-skip-if' for details."
+ (org-agenda-skip-if nil conditions))
+
+(defun org-agenda-skip-subtree-if (&rest conditions)
+ "Skip entry if any of CONDITIONS is true.
+See `org-agenda-skip-if' for details."
+ (org-agenda-skip-if t conditions))
+
+(defun org-agenda-skip-if (subtree conditions)
+ "Checks current entity for CONDITIONS.
+If SUBTREE is non-nil, the entire subtree is checked. Otherwise, only
+the entry, i.e. the text before the next heading is checked.
+
+CONDITIONS is a list of symbols, boolean OR is used to combine the results
+from different tests. Valid conditions are:
+
+scheduled Check if there is a scheduled cookie
+notscheduled Check if there is no scheduled cookie
+deadline Check if there is a deadline
+notdeadline Check if there is no deadline
+regexp Check if regexp matches
+notregexp Check if regexp does not match.
+
+The regexp is taken from the conditions list, it must come right after
+the `regexp' or `notregexp' element.
+
+If any of these conditions is met, this function returns the end point of
+the entity, causing the search to continue from there. This is a function
+that can be put into `org-agenda-skip-function' for the duration of a command."
+ (let (beg end m)
+ (org-back-to-heading t)
+ (setq beg (point)
+ end (if subtree
+ (progn (org-end-of-subtree t) (point))
+ (progn (outline-next-heading) (1- (point)))))
+ (goto-char beg)
+ (and
+ (or
+ (and (memq 'scheduled conditions)
+ (re-search-forward org-scheduled-time-regexp end t))
+ (and (memq 'notscheduled conditions)
+ (not (re-search-forward org-scheduled-time-regexp end t)))
+ (and (memq 'deadline conditions)
+ (re-search-forward org-deadline-time-regexp end t))
+ (and (memq 'notdeadline conditions)
+ (not (re-search-forward org-deadline-time-regexp end t)))
+ (and (setq m (memq 'regexp conditions))
+ (stringp (nth 1 m))
+ (re-search-forward (nth 1 m) end t))
+ (and (setq m (memq 'notregexp conditions))
+ (stringp (nth 1 m))
+ (not (re-search-forward (nth 1 m) end t))))
+ end)))
+
+;;;###autoload
+(defun org-agenda-list-stuck-projects (&rest ignore)
+ "Create agenda view for projects that are stuck.
+Stuck projects are project that have no next actions. For the definitions
+of what a project is and how to check if it stuck, customize the variable
+`org-stuck-projects'.
+MATCH is being ignored."
+ (interactive)
+ (let* ((org-agenda-skip-function 'org-agenda-skip-subtree-when-regexp-matches)
+ ;; FIXME: we could have used org-agenda-skip-if here.
+ (org-agenda-overriding-header "List of stuck projects: ")
+ (matcher (nth 0 org-stuck-projects))
+ (todo (nth 1 org-stuck-projects))
+ (todo-wds (if (member "*" todo)
+ (progn
+ (org-prepare-agenda-buffers (org-agenda-files))
+ (org-delete-all
+ org-done-keywords-for-agenda
+ (copy-sequence org-todo-keywords-for-agenda)))
+ todo))
+ (todo-re (concat "^\\*+[ \t]+\\("
+ (mapconcat 'identity todo-wds "\\|")
+ "\\)\\>"))
+ (tags (nth 2 org-stuck-projects))
+ (tags-re (if (member "*" tags)
+ (org-re "^\\*+ .*:[[:alnum:]_@]+:[ \t]*$")
+ (concat "^\\*+ .*:\\("
+ (mapconcat 'identity tags "\\|")
+ (org-re "\\):[[:alnum:]_@:]*[ \t]*$"))))
+ (gen-re (nth 3 org-stuck-projects))
+ (re-list
+ (delq nil
+ (list
+ (if todo todo-re)
+ (if tags tags-re)
+ (and gen-re (stringp gen-re) (string-match "\\S-" gen-re)
+ gen-re)))))
+ (setq org-agenda-skip-regexp
+ (if re-list
+ (mapconcat 'identity re-list "\\|")
+ (error "No information how to identify unstuck projects")))
+ (org-tags-view nil matcher)
+ (with-current-buffer org-agenda-buffer-name
+ (setq org-agenda-redo-command
+ '(org-agenda-list-stuck-projects
+ (or current-prefix-arg org-last-arg))))))
+
+;;; Diary integration
+
+(defvar org-disable-agenda-to-diary nil) ;Dynamically-scoped param.
+
+(defun org-get-entries-from-diary (date)
+ "Get the (Emacs Calendar) diary entries for DATE."
+ (let* ((fancy-diary-buffer "*temporary-fancy-diary-buffer*")
+ (diary-display-hook '(fancy-diary-display))
+ (pop-up-frames nil)
+ (list-diary-entries-hook
+ (cons 'org-diary-default-entry list-diary-entries-hook))
+ (diary-file-name-prefix-function nil) ; turn this feature off
+ (diary-modify-entry-list-string-function 'org-modify-diary-entry-string)
+ entries
+ (org-disable-agenda-to-diary t))
+ (save-excursion
+ (save-window-excursion
+ (funcall (if (fboundp 'diary-list-entries)
+ 'diary-list-entries 'list-diary-entries)
+ date 1)))
+ (if (not (get-buffer fancy-diary-buffer))
+ (setq entries nil)
+ (with-current-buffer fancy-diary-buffer
+ (setq buffer-read-only nil)
+ (if (zerop (buffer-size))
+ ;; No entries
+ (setq entries nil)
+ ;; Omit the date and other unnecessary stuff
+ (org-agenda-cleanup-fancy-diary)
+ ;; Add prefix to each line and extend the text properties
+ (if (zerop (buffer-size))
+ (setq entries nil)
+ (setq entries (buffer-substring (point-min) (- (point-max) 1)))))
+ (set-buffer-modified-p nil)
+ (kill-buffer fancy-diary-buffer)))
+ (when entries
+ (setq entries (org-split-string entries "\n"))
+ (setq entries
+ (mapcar
+ (lambda (x)
+ (setq x (org-format-agenda-item "" x "Diary" nil 'time))
+ ;; Extend the text properties to the beginning of the line
+ (org-add-props x (text-properties-at (1- (length x)) x)
+ 'type "diary" 'date date))
+ entries)))))
+
+(defun org-agenda-cleanup-fancy-diary ()
+ "Remove unwanted stuff in buffer created by `fancy-diary-display'.
+This gets rid of the date, the underline under the date, and
+the dummy entry installed by `org-mode' to ensure non-empty diary for each
+date. It also removes lines that contain only whitespace."
+ (goto-char (point-min))
+ (if (looking-at ".*?:[ \t]*")
+ (progn
+ (replace-match "")
+ (re-search-forward "\n=+$" nil t)
+ (replace-match "")
+ (while (re-search-backward "^ +\n?" nil t) (replace-match "")))
+ (re-search-forward "\n=+$" nil t)
+ (delete-region (point-min) (min (point-max) (1+ (match-end 0)))))
+ (goto-char (point-min))
+ (while (re-search-forward "^ +\n" nil t)
+ (replace-match ""))
+ (goto-char (point-min))
+ (if (re-search-forward "^Org-mode dummy\n?" nil t)
+ (replace-match "")))
+
+;; Make sure entries from the diary have the right text properties.
+(eval-after-load "diary-lib"
+ '(if (boundp 'diary-modify-entry-list-string-function)
+ ;; We can rely on the hook, nothing to do
+ nil
+ ;; Hook not avaiable, must use advice to make this work
+ (defadvice add-to-diary-list (before org-mark-diary-entry activate)
+ "Make the position visible."
+ (if (and org-disable-agenda-to-diary ;; called from org-agenda
+ (stringp string)
+ buffer-file-name)
+ (setq string (org-modify-diary-entry-string string))))))
+
+(defun org-modify-diary-entry-string (string)
+ "Add text properties to string, allowing org-mode to act on it."
+ (org-add-props string nil
+ 'mouse-face 'highlight
+ 'keymap org-agenda-keymap
+ 'help-echo (if buffer-file-name
+ (format "mouse-2 or RET jump to diary file %s"
+ (abbreviate-file-name buffer-file-name))
+ "")
+ 'org-agenda-diary-link t
+ 'org-marker (org-agenda-new-marker (point-at-bol))))
+
+(defun org-diary-default-entry ()
+ "Add a dummy entry to the diary.
+Needed to avoid empty dates which mess up holiday display."
+ ;; Catch the error if dealing with the new add-to-diary-alist
+ (when org-disable-agenda-to-diary
+ (condition-case nil
+ (add-to-diary-list original-date "Org-mode dummy" "")
+ (error
+ (add-to-diary-list original-date "Org-mode dummy" "" nil)))))
+
+;;;###autoload
+(defun org-diary (&rest args)
+ "Return diary information from org-files.
+This function can be used in a \"sexp\" diary entry in the Emacs calendar.
+It accesses org files and extracts information from those files to be
+listed in the diary. The function accepts arguments specifying what
+items should be listed. The following arguments are allowed:
+
+ :timestamp List the headlines of items containing a date stamp or
+ date range matching the selected date. Deadlines will
+ also be listed, on the expiration day.
+
+ :sexp List entries resulting from diary-like sexps.
+
+ :deadline List any deadlines past due, or due within
+ `org-deadline-warning-days'. The listing occurs only
+ in the diary for *today*, not at any other date. If
+ an entry is marked DONE, it is no longer listed.
+
+ :scheduled List all items which are scheduled for the given date.
+ The diary for *today* also contains items which were
+ scheduled earlier and are not yet marked DONE.
+
+ :todo List all TODO items from the org-file. This may be a
+ long list - so this is not turned on by default.
+ Like deadlines, these entries only show up in the
+ diary for *today*, not at any other date.
+
+The call in the diary file should look like this:
+
+ &%%(org-diary) ~/path/to/some/orgfile.org
+
+Use a separate line for each org file to check. Or, if you omit the file name,
+all files listed in `org-agenda-files' will be checked automatically:
+
+ &%%(org-diary)
+
+If you don't give any arguments (as in the example above), the default
+arguments (:deadline :scheduled :timestamp :sexp) are used.
+So the example above may also be written as
+
+ &%%(org-diary :deadline :timestamp :sexp :scheduled)
+
+The function expects the lisp variables `entry' and `date' to be provided
+by the caller, because this is how the calendar works. Don't use this
+function from a program - use `org-agenda-get-day-entries' instead."
+ (org-agenda-maybe-reset-markers)
+ (org-compile-prefix-format 'agenda)
+ (org-set-sorting-strategy 'agenda)
+ (setq args (or args '(:deadline :scheduled :timestamp :sexp)))
+ (let* ((files (if (and entry (stringp entry) (string-match "\\S-" entry))
+ (list entry)
+ (org-agenda-files t)))
+ file rtn results)
+ (org-prepare-agenda-buffers files)
+ ;; If this is called during org-agenda, don't return any entries to
+ ;; the calendar. Org Agenda will list these entries itself.
+ (if org-disable-agenda-to-diary (setq files nil))
+ (while (setq file (pop files))
+ (setq rtn (apply 'org-agenda-get-day-entries file date args))
+ (setq results (append results rtn)))
+ (if results
+ (concat (org-finalize-agenda-entries results) "\n"))))
+
+;;; Agenda entry finders
+
+(defun org-agenda-get-day-entries (file date &rest args)
+ "Does the work for `org-diary' and `org-agenda'.
+FILE is the path to a file to be checked for entries. DATE is date like
+the one returned by `calendar-current-date'. ARGS are symbols indicating
+which kind of entries should be extracted. For details about these, see
+the documentation of `org-diary'."
+ (setq args (or args '(:deadline :scheduled :timestamp :sexp)))
+ (let* ((org-startup-folded nil)
+ (org-startup-align-all-tables nil)
+ (buffer (if (file-exists-p file)
+ (org-get-agenda-file-buffer file)
+ (error "No such file %s" file)))
+ arg results rtn)
+ (if (not buffer)
+ ;; If file does not exist, make sure an error message ends up in diary
+ (list (format "ORG-AGENDA-ERROR: No such org-file %s" file))
+ (with-current-buffer buffer
+ (unless (org-mode-p)
+ (error "Agenda file %s is not in `org-mode'" file))
+ (let ((case-fold-search nil))
+ (save-excursion
+ (save-restriction
+ (if org-agenda-restrict
+ (narrow-to-region org-agenda-restrict-begin
+ org-agenda-restrict-end)
+ (widen))
+ ;; The way we repeatedly append to `results' makes it O(n^2) :-(
+ (while (setq arg (pop args))
+ (cond
+ ((and (eq arg :todo)
+ (equal date (calendar-current-date)))
+ (setq rtn (org-agenda-get-todos))
+ (setq results (append results rtn)))
+ ((eq arg :timestamp)
+ (setq rtn (org-agenda-get-blocks))
+ (setq results (append results rtn))
+ (setq rtn (org-agenda-get-timestamps))
+ (setq results (append results rtn)))
+ ((eq arg :sexp)
+ (setq rtn (org-agenda-get-sexps))
+ (setq results (append results rtn)))
+ ((eq arg :scheduled)
+ (setq rtn (org-agenda-get-scheduled))
+ (setq results (append results rtn)))
+ ((eq arg :closed)
+ (setq rtn (org-agenda-get-closed))
+ (setq results (append results rtn)))
+ ((eq arg :deadline)
+ (setq rtn (org-agenda-get-deadlines))
+ (setq results (append results rtn))))))))
+ results))))
+
+(defun org-entry-is-todo-p ()
+ (member (org-get-todo-state) org-not-done-keywords))
+
+(defun org-entry-is-done-p ()
+ (member (org-get-todo-state) org-done-keywords))
+
+(defun org-get-todo-state ()
+ (save-excursion
+ (org-back-to-heading t)
+ (and (looking-at org-todo-line-regexp)
+ (match-end 2)
+ (match-string 2))))
+
+(defun org-at-date-range-p (&optional inactive-ok)
+ "Is the cursor inside a date range?"
+ (interactive)
+ (save-excursion
+ (catch 'exit
+ (let ((pos (point)))
+ (skip-chars-backward "^[<\r\n")
+ (skip-chars-backward "<[")
+ (and (looking-at (if inactive-ok org-tr-regexp-both org-tr-regexp))
+ (>= (match-end 0) pos)
+ (throw 'exit t))
+ (skip-chars-backward "^<[\r\n")
+ (skip-chars-backward "<[")
+ (and (looking-at (if inactive-ok org-tr-regexp-both org-tr-regexp))
+ (>= (match-end 0) pos)
+ (throw 'exit t)))
+ nil)))
+
+(defun org-agenda-get-todos ()
+ "Return the TODO information for agenda display."
+ (let* ((props (list 'face nil
+ 'done-face 'org-done
+ 'org-not-done-regexp org-not-done-regexp
+ 'org-todo-regexp org-todo-regexp
+ 'mouse-face 'highlight
+ 'keymap org-agenda-keymap
+ 'help-echo
+ (format "mouse-2 or RET jump to org file %s"
+ (abbreviate-file-name buffer-file-name))))
+ ;; FIXME: get rid of the \n at some point but watch out
+ (regexp (concat "^\\*+[ \t]+\\("
+ (if org-select-this-todo-keyword
+ (if (equal org-select-this-todo-keyword "*")
+ org-todo-regexp
+ (concat "\\<\\("
+ (mapconcat 'identity (org-split-string org-select-this-todo-keyword "|") "\\|")
+ "\\)\\>"))
+ org-not-done-regexp)
+ "[^\n\r]*\\)"))
+ marker priority category tags
+ ee txt beg end)
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (catch :skip
+ (save-match-data
+ (beginning-of-line)
+ (setq beg (point) end (progn (outline-next-heading) (point)))
+ (when (or (and org-agenda-todo-ignore-with-date (goto-char beg)
+ (re-search-forward org-ts-regexp end t))
+ (and org-agenda-todo-ignore-scheduled (goto-char beg)
+ (re-search-forward org-scheduled-time-regexp end t))
+ (and org-agenda-todo-ignore-deadlines (goto-char beg)
+ (re-search-forward org-deadline-time-regexp end t)
+ (org-deadline-close (match-string 1))))
+ (goto-char (1+ beg))
+ (or org-agenda-todo-list-sublevels (org-end-of-subtree 'invisible))
+ (throw :skip nil)))
+ (goto-char beg)
+ (org-agenda-skip)
+ (goto-char (match-beginning 1))
+ (setq marker (org-agenda-new-marker (match-beginning 0))
+ category (org-get-category)
+ tags (org-get-tags-at (point))
+ txt (org-format-agenda-item "" (match-string 1) category tags)
+ priority (1+ (org-get-priority txt)))
+ (org-add-props txt props
+ 'org-marker marker 'org-hd-marker marker
+ 'priority priority 'org-category category
+ 'type "todo")
+ (push txt ee)
+ (if org-agenda-todo-list-sublevels
+ (goto-char (match-end 1))
+ (org-end-of-subtree 'invisible))))
+ (nreverse ee)))
+
+(defconst org-agenda-no-heading-message
+ "No heading for this item in buffer or region.")
+
+(defun org-agenda-get-timestamps ()
+ "Return the date stamp information for agenda display."
+ (let* ((props (list 'face nil
+ 'org-not-done-regexp org-not-done-regexp
+ 'org-todo-regexp org-todo-regexp
+ 'mouse-face 'highlight
+ 'keymap org-agenda-keymap
+ 'help-echo
+ (format "mouse-2 or RET jump to org file %s"
+ (abbreviate-file-name buffer-file-name))))
+ (d1 (calendar-absolute-from-gregorian date))
+ (remove-re
+ (concat
+ (regexp-quote
+ (format-time-string
+ "<%Y-%m-%d"
+ (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date))))
+ ".*?>"))
+ (regexp
+ (concat
+ (regexp-quote
+ (substring
+ (format-time-string
+ (car org-time-stamp-formats)
+ (apply 'encode-time ; DATE bound by calendar
+ (list 0 0 0 (nth 1 date) (car date) (nth 2 date))))
+ 0 11))
+ "\\|\\(<[0-9]+-[0-9]+-[0-9]+[^>\n]+?\\+[0-9]+[dwmy]>\\)"
+ "\\|\\(<%%\\(([^>\n]+)\\)>\\)"))
+ marker hdmarker deadlinep scheduledp donep tmp priority category
+ ee txt timestr tags b0 b3 e3 head)
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (setq b0 (match-beginning 0)
+ b3 (match-beginning 3) e3 (match-end 3))
+ (catch :skip
+ (and (org-at-date-range-p) (throw :skip nil))
+ (org-agenda-skip)
+ (if (and (match-end 1)
+ (not (= d1 (org-time-string-to-absolute (match-string 1) d1))))
+ (throw :skip nil))
+ (if (and e3
+ (not (org-diary-sexp-entry (buffer-substring b3 e3) "" date)))
+ (throw :skip nil))
+ (setq marker (org-agenda-new-marker b0)
+ category (org-get-category b0)
+ tmp (buffer-substring (max (point-min)
+ (- b0 org-ds-keyword-length))
+ b0)
+ timestr (if b3 "" (buffer-substring b0 (point-at-eol)))
+ deadlinep (string-match org-deadline-regexp tmp)
+ scheduledp (string-match org-scheduled-regexp tmp)
+ donep (org-entry-is-done-p))
+ (if (or scheduledp deadlinep) (throw :skip t))
+ (if (string-match ">" timestr)
+ ;; substring should only run to end of time stamp
+ (setq timestr (substring timestr 0 (match-end 0))))
+ (save-excursion
+ (if (re-search-backward "^\\*+ " nil t)
+ (progn
+ (goto-char (match-beginning 0))
+ (setq hdmarker (org-agenda-new-marker)
+ tags (org-get-tags-at))
+ (looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
+ (setq head (match-string 1))
+ (and org-agenda-skip-timestamp-if-done donep (throw :skip t))
+ (setq txt (org-format-agenda-item
+ nil head category tags timestr nil
+ remove-re)))
+ (setq txt org-agenda-no-heading-message))
+ (setq priority (org-get-priority txt))
+ (org-add-props txt props
+ 'org-marker marker 'org-hd-marker hdmarker)
+ (org-add-props txt nil 'priority priority
+ 'org-category category 'date date
+ 'type "timestamp")
+ (push txt ee))
+ (outline-next-heading)))
+ (nreverse ee)))
+
+(defun org-agenda-get-sexps ()
+ "Return the sexp information for agenda display."
+ (require 'diary-lib)
+ (let* ((props (list 'face nil
+ 'mouse-face 'highlight
+ 'keymap org-agenda-keymap
+ 'help-echo
+ (format "mouse-2 or RET jump to org file %s"
+ (abbreviate-file-name buffer-file-name))))
+ (regexp "^&?%%(")
+ marker category ee txt tags entry result beg b sexp sexp-entry)
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (catch :skip
+ (org-agenda-skip)
+ (setq beg (match-beginning 0))
+ (goto-char (1- (match-end 0)))
+ (setq b (point))
+ (forward-sexp 1)
+ (setq sexp (buffer-substring b (point)))
+ (setq sexp-entry (if (looking-at "[ \t]*\\(\\S-.*\\)")
+ (org-trim (match-string 1))
+ ""))
+ (setq result (org-diary-sexp-entry sexp sexp-entry date))
+ (when result
+ (setq marker (org-agenda-new-marker beg)
+ category (org-get-category beg))
+
+ (if (string-match "\\S-" result)
+ (setq txt result)
+ (setq txt "SEXP entry returned empty string"))
+
+ (setq txt (org-format-agenda-item
+ "" txt category tags 'time))
+ (org-add-props txt props 'org-marker marker)
+ (org-add-props txt nil
+ 'org-category category 'date date
+ 'type "sexp")
+ (push txt ee))))
+ (nreverse ee)))
+
+(defun org-agenda-get-closed ()
+ "Return the logged TODO entries for agenda display."
+ (let* ((props (list 'mouse-face 'highlight
+ 'org-not-done-regexp org-not-done-regexp
+ 'org-todo-regexp org-todo-regexp
+ 'keymap org-agenda-keymap
+ 'help-echo
+ (format "mouse-2 or RET jump to org file %s"
+ (abbreviate-file-name buffer-file-name))))
+ (regexp (concat
+ "\\<\\(" org-closed-string "\\|" org-clock-string "\\) *\\["
+ (regexp-quote
+ (substring
+ (format-time-string
+ (car org-time-stamp-formats)
+ (apply 'encode-time ; DATE bound by calendar
+ (list 0 0 0 (nth 1 date) (car date) (nth 2 date))))
+ 1 11))))
+ marker hdmarker priority category tags closedp
+ ee txt timestr)
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (catch :skip
+ (org-agenda-skip)
+ (setq marker (org-agenda-new-marker (match-beginning 0))
+ closedp (equal (match-string 1) org-closed-string)
+ category (org-get-category (match-beginning 0))
+ timestr (buffer-substring (match-beginning 0) (point-at-eol))
+ ;; donep (org-entry-is-done-p)
+ )
+ (if (string-match "\\]" timestr)
+ ;; substring should only run to end of time stamp
+ (setq timestr (substring timestr 0 (match-end 0))))
+ (save-excursion
+ (if (re-search-backward "^\\*+ " nil t)
+ (progn
+ (goto-char (match-beginning 0))
+ (setq hdmarker (org-agenda-new-marker)
+ tags (org-get-tags-at))
+ (looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
+ (setq txt (org-format-agenda-item
+ (if closedp "Closed: " "Clocked: ")
+ (match-string 1) category tags timestr)))
+ (setq txt org-agenda-no-heading-message))
+ (setq priority 100000)
+ (org-add-props txt props
+ 'org-marker marker 'org-hd-marker hdmarker 'face 'org-done
+ 'priority priority 'org-category category
+ 'type "closed" 'date date
+ 'undone-face 'org-warning 'done-face 'org-done)
+ (push txt ee))
+ (outline-next-heading)))
+ (nreverse ee)))
+
+(defun org-agenda-get-deadlines ()
+ "Return the deadline information for agenda display."
+ (let* ((props (list 'mouse-face 'highlight
+ 'org-not-done-regexp org-not-done-regexp
+ 'org-todo-regexp org-todo-regexp
+ 'keymap org-agenda-keymap
+ 'help-echo
+ (format "mouse-2 or RET jump to org file %s"
+ (abbreviate-file-name buffer-file-name))))
+ (regexp org-deadline-time-regexp)
+ (todayp (equal date (calendar-current-date))) ; DATE bound by calendar
+ (d1 (calendar-absolute-from-gregorian date)) ; DATE bound by calendar
+ d2 diff dfrac wdays pos pos1 category tags
+ ee txt head face s upcomingp donep timestr)
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (catch :skip
+ (org-agenda-skip)
+ (setq s (match-string 1)
+ pos (1- (match-beginning 1))
+ d2 (org-time-string-to-absolute (match-string 1) d1)
+ diff (- d2 d1)
+ wdays (org-get-wdays s)
+ dfrac (/ (* 1.0 (- wdays diff)) wdays)
+ upcomingp (and todayp (> diff 0)))
+ ;; When to show a deadline in the calendar:
+ ;; If the expiration is within wdays warning time.
+ ;; Past-due deadlines are only shown on the current date
+ (if (or (and (<= diff wdays)
+ (and todayp (not org-agenda-only-exact-dates)))
+ (= diff 0))
+ (save-excursion
+ (setq category (org-get-category))
+ (if (re-search-backward "^\\*+[ \t]+" nil t)
+ (progn
+ (goto-char (match-end 0))
+ (setq pos1 (match-beginning 0))
+ (setq tags (org-get-tags-at pos1))
+ (setq head (buffer-substring-no-properties
+ (point)
+ (progn (skip-chars-forward "^\r\n")
+ (point))))
+ (setq donep (string-match org-looking-at-done-regexp head))
+ (if (string-match " \\([012]?[0-9]:[0-9][0-9]\\)" s)
+ (setq timestr
+ (concat (substring s (match-beginning 1)) " "))
+ (setq timestr 'time))
+ (if (and donep
+ (or org-agenda-skip-deadline-if-done
+ (not (= diff 0))))
+ (setq txt nil)
+ (setq txt (org-format-agenda-item
+ (if (= diff 0)
+ (car org-agenda-deadline-leaders)
+ (format (nth 1 org-agenda-deadline-leaders)
+ diff))
+ head category tags timestr))))
+ (setq txt org-agenda-no-heading-message))
+ (when txt
+ (setq face (org-agenda-deadline-face dfrac))
+ (org-add-props txt props
+ 'org-marker (org-agenda-new-marker pos)
+ 'org-hd-marker (org-agenda-new-marker pos1)
+ 'priority (+ (if upcomingp (floor (* dfrac 10.)) 100)
+ (org-get-priority txt))
+ 'org-category category
+ 'type (if upcomingp "upcoming-deadline" "deadline")
+ 'date (if upcomingp date d2)
+ 'face (if donep 'org-done face)
+ 'undone-face face 'done-face 'org-done)
+ (push txt ee))))))
+ (nreverse ee)))
+
+(defun org-agenda-deadline-face (fraction)
+ "Return the face to displaying a deadline item.
+FRACTION is what fraction of the head-warning time has passed."
+ (let ((faces org-agenda-deadline-faces) f)
+ (catch 'exit
+ (while (setq f (pop faces))
+ (if (>= fraction (car f)) (throw 'exit (cdr f)))))))
+
+(defun org-agenda-get-scheduled ()
+ "Return the scheduled information for agenda display."
+ (let* ((props (list 'org-not-done-regexp org-not-done-regexp
+ 'org-todo-regexp org-todo-regexp
+ 'done-face 'org-done
+ 'mouse-face 'highlight
+ 'keymap org-agenda-keymap
+ 'help-echo
+ (format "mouse-2 or RET jump to org file %s"
+ (abbreviate-file-name buffer-file-name))))
+ (regexp org-scheduled-time-regexp)
+ (todayp (equal date (calendar-current-date))) ; DATE bound by calendar
+ (d1 (calendar-absolute-from-gregorian date)) ; DATE bound by calendar
+ d2 diff pos pos1 category tags
+ ee txt head pastschedp donep face timestr s)
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (catch :skip
+ (org-agenda-skip)
+ (setq s (match-string 1)
+ pos (1- (match-beginning 1))
+ d2 (org-time-string-to-absolute (match-string 1) d1)
+ diff (- d2 d1))
+ (setq pastschedp (and todayp (< diff 0)))
+ ;; When to show a scheduled item in the calendar:
+ ;; If it is on or past the date.
+ (if (or (and (< diff 0)
+ (and todayp (not org-agenda-only-exact-dates)))
+ (= diff 0))
+ (save-excursion
+ (setq category (org-get-category))
+ (if (re-search-backward "^\\*+[ \t]+" nil t)
+ (progn
+ (goto-char (match-end 0))
+ (setq pos1 (match-beginning 0))
+ (setq tags (org-get-tags-at))
+ (setq head (buffer-substring-no-properties
+ (point)
+ (progn (skip-chars-forward "^\r\n") (point))))
+ (setq donep (string-match org-looking-at-done-regexp head))
+ (if (string-match " \\([012]?[0-9]:[0-9][0-9]\\)" s)
+ (setq timestr
+ (concat (substring s (match-beginning 1)) " "))
+ (setq timestr 'time))
+ (if (and donep
+ (or org-agenda-skip-scheduled-if-done
+ (not (= diff 0))))
+ (setq txt nil)
+ (setq txt (org-format-agenda-item
+ (if (= diff 0)
+ (car org-agenda-scheduled-leaders)
+ (format (nth 1 org-agenda-scheduled-leaders)
+ (- 1 diff)))
+ head category tags timestr))))
+ (setq txt org-agenda-no-heading-message))
+ (when txt
+ (setq face (if pastschedp
+ 'org-scheduled-previously
+ 'org-scheduled-today))
+ (org-add-props txt props
+ 'undone-face face
+ 'face (if donep 'org-done face)
+ 'org-marker (org-agenda-new-marker pos)
+ 'org-hd-marker (org-agenda-new-marker pos1)
+ 'type (if pastschedp "past-scheduled" "scheduled")
+ 'date (if pastschedp d2 date)
+ 'priority (+ 94 (- 5 diff) (org-get-priority txt))
+ 'org-category category)
+ (push txt ee))))))
+ (nreverse ee)))
+
+(defun org-agenda-get-blocks ()
+ "Return the date-range information for agenda display."
+ (let* ((props (list 'face nil
+ 'org-not-done-regexp org-not-done-regexp
+ 'org-todo-regexp org-todo-regexp
+ 'mouse-face 'highlight
+ 'keymap org-agenda-keymap
+ 'help-echo
+ (format "mouse-2 or RET jump to org file %s"
+ (abbreviate-file-name buffer-file-name))))
+ (regexp org-tr-regexp)
+ (d0 (calendar-absolute-from-gregorian date))
+ marker hdmarker ee txt d1 d2 s1 s2 timestr category tags pos
+ donep head)
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (catch :skip
+ (org-agenda-skip)
+ (setq pos (point))
+ (setq timestr (match-string 0)
+ s1 (match-string 1)
+ s2 (match-string 2)
+ d1 (time-to-days (org-time-string-to-time s1))
+ d2 (time-to-days (org-time-string-to-time s2)))
+ (if (and (> (- d0 d1) -1) (> (- d2 d0) -1))
+ ;; Only allow days between the limits, because the normal
+ ;; date stamps will catch the limits.
+ (save-excursion
+ (setq marker (org-agenda-new-marker (point)))
+ (setq category (org-get-category))
+ (if (re-search-backward "^\\*+ " nil t)
+ (progn
+ (goto-char (match-beginning 0))
+ (setq hdmarker (org-agenda-new-marker (point)))
+ (setq tags (org-get-tags-at))
+ (looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
+ (setq head (match-string 1))
+ (and org-agenda-skip-timestamp-if-done
+ (org-entry-is-done-p)
+ (throw :skip t))
+ (setq txt (org-format-agenda-item
+ (format (if (= d1 d2) "" "(%d/%d): ")
+ (1+ (- d0 d1)) (1+ (- d2 d1)))
+ head category tags
+ (if (= d0 d1) timestr))))
+ (setq txt org-agenda-no-heading-message))
+ (org-add-props txt props
+ 'org-marker marker 'org-hd-marker hdmarker
+ 'type "block" 'date date
+ 'priority (org-get-priority txt) 'org-category category)
+ (push txt ee)))
+ (goto-char pos)))
+ ;; Sort the entries by expiration date.
+ (nreverse ee)))
+
+;;; Agenda presentation and sorting
+
+(defconst org-plain-time-of-day-regexp
+ (concat
+ "\\(\\<[012]?[0-9]"
+ "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
+ "\\(--?"
+ "\\(\\<[012]?[0-9]"
+ "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
+ "\\)?")
+ "Regular expression to match a plain time or time range.
+Examples: 11:45 or 8am-13:15 or 2:45-2:45pm. After a match, the following
+groups carry important information:
+0 the full match
+1 the first time, range or not
+8 the second time, if it is a range.")
+
+(defconst org-plain-time-extension-regexp
+ (concat
+ "\\(\\<[012]?[0-9]"
+ "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
+ "\\+\\([0-9]+\\)\\(:\\([0-5][0-9]\\)\\)?")
+ "Regular expression to match a time range like 13:30+2:10 = 13:30-15:40.
+Examples: 11:45 or 8am-13:15 or 2:45-2:45pm. After a match, the following
+groups carry important information:
+0 the full match
+7 hours of duration
+9 minutes of duration")
+
+(defconst org-stamp-time-of-day-regexp
+ (concat
+ "<\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} +\\sw+ +\\)"
+ "\\([012][0-9]:[0-5][0-9]\\(-\\([012][0-9]:[0-5][0-9]\\)\\)?[^\n\r>]*?\\)>"
+ "\\(--?"
+ "<\\1\\([012][0-9]:[0-5][0-9]\\)>\\)?")
+ "Regular expression to match a timestamp time or time range.
+After a match, the following groups carry important information:
+0 the full match
+1 date plus weekday, for backreferencing to make sure both times on same day
+2 the first time, range or not
+4 the second time, if it is a range.")
+
+(defvar org-prefix-has-time nil
+ "A flag, set by `org-compile-prefix-format'.
+The flag is set if the currently compiled format contains a `%t'.")
+(defvar org-prefix-has-tag nil
+ "A flag, set by `org-compile-prefix-format'.
+The flag is set if the currently compiled format contains a `%T'.")
+
+(defun org-format-agenda-item (extra txt &optional category tags dotime
+ noprefix remove-re)
+ "Format TXT to be inserted into the agenda buffer.
+In particular, it adds the prefix and corresponding text properties. EXTRA
+must be a string and replaces the `%s' specifier in the prefix format.
+CATEGORY (string, symbol or nil) may be used to overrule the default
+category taken from local variable or file name. It will replace the `%c'
+specifier in the format. DOTIME, when non-nil, indicates that a
+time-of-day should be extracted from TXT for sorting of this entry, and for
+the `%t' specifier in the format. When DOTIME is a string, this string is
+searched for a time before TXT is. NOPREFIX is a flag and indicates that
+only the correctly processes TXT should be returned - this is used by
+`org-agenda-change-all-lines'. TAGS can be the tags of the headline.
+Any match of REMOVE-RE will be removed from TXT."
+ (save-match-data
+ ;; Diary entries sometimes have extra whitespace at the beginning
+ (if (string-match "^ +" txt) (setq txt (replace-match "" nil nil txt)))
+ (let* ((category (or category
+ org-category
+ (if buffer-file-name
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))
+ "")))
+ (tag (if tags (nth (1- (length tags)) tags) ""))
+ time ; time and tag are needed for the eval of the prefix format
+ (ts (if dotime (concat (if (stringp dotime) dotime "") txt)))
+ (time-of-day (and dotime (org-get-time-of-day ts)))
+ stamp plain s0 s1 s2 rtn srp)
+ (when (and dotime time-of-day org-prefix-has-time)
+ ;; Extract starting and ending time and move them to prefix
+ (when (or (setq stamp (string-match org-stamp-time-of-day-regexp ts))
+ (setq plain (string-match org-plain-time-of-day-regexp ts)))
+ (setq s0 (match-string 0 ts)
+ srp (and stamp (match-end 3))
+ s1 (match-string (if plain 1 2) ts)
+ s2 (match-string (if plain 8 (if srp 4 6)) ts))
+
+ ;; If the times are in TXT (not in DOTIMES), and the prefix will list
+ ;; them, we might want to remove them there to avoid duplication.
+ ;; The user can turn this off with a variable.
+ (if (and org-agenda-remove-times-when-in-prefix (or stamp plain)
+ (string-match (concat (regexp-quote s0) " *") txt)
+ (not (equal ?\] (string-to-char (substring txt (match-end 0)))))
+ (if (eq org-agenda-remove-times-when-in-prefix 'beg)
+ (= (match-beginning 0) 0)
+ t))
+ (setq txt (replace-match "" nil nil txt))))
+ ;; Normalize the time(s) to 24 hour
+ (if s1 (setq s1 (org-get-time-of-day s1 'string t)))
+ (if s2 (setq s2 (org-get-time-of-day s2 'string t))))
+
+ (when (and s1 (not s2) org-agenda-default-appointment-duration
+ (string-match "\\([0-9]+\\):\\([0-9]+\\)" s1))
+ (let ((m (+ (string-to-number (match-string 2 s1))
+ (* 60 (string-to-number (match-string 1 s1)))
+ org-agenda-default-appointment-duration))
+ h)
+ (setq h (/ m 60) m (- m (* h 60)))
+ (setq s2 (format "%02d:%02d" h m))))
+
+ (when (string-match (org-re "\\([ \t]+\\)\\(:[[:alnum:]_@:]+:\\)[ \t]*$")
+ txt)
+ ;; Tags are in the string
+ (if (or (eq org-agenda-remove-tags t)
+ (and org-agenda-remove-tags
+ org-prefix-has-tag))
+ (setq txt (replace-match "" t t txt))
+ (setq txt (replace-match
+ (concat (make-string (max (- 50 (length txt)) 1) ?\ )
+ (match-string 2 txt))
+ t t txt))))
+
+ (when remove-re
+ (while (string-match remove-re txt)
+ (setq txt (replace-match "" t t txt))))
+
+ ;; Create the final string
+ (if noprefix
+ (setq rtn txt)
+ ;; Prepare the variables needed in the eval of the compiled format
+ (setq time (cond (s2 (concat s1 "-" s2))
+ (s1 (concat s1 "......"))
+ (t ""))
+ extra (or extra "")
+ category (if (symbolp category) (symbol-name category) category))
+ ;; Evaluate the compiled format
+ (setq rtn (concat (eval org-prefix-format-compiled) txt)))
+
+ ;; And finally add the text properties
+ (org-add-props rtn nil
+ 'org-category (downcase category) 'tags tags
+ 'org-highest-priority org-highest-priority
+ 'org-lowest-priority org-lowest-priority
+ 'prefix-length (- (length rtn) (length txt))
+ 'time-of-day time-of-day
+ 'txt txt
+ 'time time
+ 'extra extra
+ 'dotime dotime))))
+
+(defvar org-agenda-sorting-strategy) ;; because the def is in a let form
+(defvar org-agenda-sorting-strategy-selected nil)
+
+(defun org-agenda-add-time-grid-maybe (list ndays todayp)
+ (catch 'exit
+ (cond ((not org-agenda-use-time-grid) (throw 'exit list))
+ ((and todayp (member 'today (car org-agenda-time-grid))))
+ ((and (= ndays 1) (member 'daily (car org-agenda-time-grid))))
+ ((member 'weekly (car org-agenda-time-grid)))
+ (t (throw 'exit list)))
+ (let* ((have (delq nil (mapcar
+ (lambda (x) (get-text-property 1 'time-of-day x))
+ list)))
+ (string (nth 1 org-agenda-time-grid))
+ (gridtimes (nth 2 org-agenda-time-grid))
+ (req (car org-agenda-time-grid))
+ (remove (member 'remove-match req))
+ new time)
+ (if (and (member 'require-timed req) (not have))
+ ;; don't show empty grid
+ (throw 'exit list))
+ (while (setq time (pop gridtimes))
+ (unless (and remove (member time have))
+ (setq time (int-to-string time))
+ (push (org-format-agenda-item
+ nil string "" nil
+ (concat (substring time 0 -2) ":" (substring time -2)))
+ new)
+ (put-text-property
+ 1 (length (car new)) 'face 'org-time-grid (car new))))
+ (if (member 'time-up org-agenda-sorting-strategy-selected)
+ (append new list)
+ (append list new)))))
+
+(defun org-compile-prefix-format (key)
+ "Compile the prefix format into a Lisp form that can be evaluated.
+The resulting form is returned and stored in the variable
+`org-prefix-format-compiled'."
+ (setq org-prefix-has-time nil org-prefix-has-tag nil)
+ (let ((s (cond
+ ((stringp org-agenda-prefix-format)
+ org-agenda-prefix-format)
+ ((assq key org-agenda-prefix-format)
+ (cdr (assq key org-agenda-prefix-format)))
+ (t " %-12:c%?-12t% s")))
+ (start 0)
+ varform vars var e c f opt)
+ (while (string-match "%\\(\\?\\)?\\([-+]?[0-9.]*\\)\\([ .;,:!?=|/<>]?\\)\\([cts]\\)"
+ s start)
+ (setq var (cdr (assoc (match-string 4 s)
+ '(("c" . category) ("t" . time) ("s" . extra)
+ ("T" . tag))))
+ c (or (match-string 3 s) "")
+ opt (match-beginning 1)
+ start (1+ (match-beginning 0)))
+ (if (equal var 'time) (setq org-prefix-has-time t))
+ (if (equal var 'tag) (setq org-prefix-has-tag t))
+ (setq f (concat "%" (match-string 2 s) "s"))
+ (if opt
+ (setq varform
+ `(if (equal "" ,var)
+ ""
+ (format ,f (if (equal "" ,var) "" (concat ,var ,c)))))
+ (setq varform `(format ,f (if (equal ,var "") "" (concat ,var ,c)))))
+ (setq s (replace-match "%s" t nil s))
+ (push varform vars))
+ (setq vars (nreverse vars))
+ (setq org-prefix-format-compiled `(format ,s ,@vars))))
+
+(defun org-set-sorting-strategy (key)
+ (if (symbolp (car org-agenda-sorting-strategy))
+ ;; the old format
+ (setq org-agenda-sorting-strategy-selected org-agenda-sorting-strategy)
+ (setq org-agenda-sorting-strategy-selected
+ (or (cdr (assq key org-agenda-sorting-strategy))
+ (cdr (assq 'agenda org-agenda-sorting-strategy))
+ '(time-up category-keep priority-down)))))
+
+(defun org-get-time-of-day (s &optional string mod24)
+ "Check string S for a time of day.
+If found, return it as a military time number between 0 and 2400.
+If not found, return nil.
+The optional STRING argument forces conversion into a 5 character wide string
+HH:MM."
+ (save-match-data
+ (when
+ (or (string-match "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)\\([AaPp][Mm]\\)?\\> *" s)
+ (string-match "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\([AaPp][Mm]\\)\\> *" s))
+ (let* ((h (string-to-number (match-string 1 s)))
+ (m (if (match-end 3) (string-to-number (match-string 3 s)) 0))
+ (ampm (if (match-end 4) (downcase (match-string 4 s))))
+ (am-p (equal ampm "am"))
+ (h1 (cond ((not ampm) h)
+ ((= h 12) (if am-p 0 12))
+ (t (+ h (if am-p 0 12)))))
+ (h2 (if (and string mod24 (not (and (= m 0) (= h1 24))))
+ (mod h1 24) h1))
+ (t0 (+ (* 100 h2) m))
+ (t1 (concat (if (>= h1 24) "+" " ")
+ (if (< t0 100) "0" "")
+ (if (< t0 10) "0" "")
+ (int-to-string t0))))
+ (if string (concat (substring t1 -4 -2) ":" (substring t1 -2)) t0)))))
+
+(defun org-finalize-agenda-entries (list &optional nosort)
+ "Sort and concatenate the agenda items."
+ (setq list (mapcar 'org-agenda-highlight-todo list))
+ (if nosort
+ list
+ (mapconcat 'identity (sort list 'org-entries-lessp) "\n")))
+
+(defun org-agenda-highlight-todo (x)
+ (let (re pl)
+ (if (eq x 'line)
+ (save-excursion
+ (beginning-of-line 1)
+ (setq re (get-text-property (point) 'org-todo-regexp))
+ (goto-char (+ (point) (or (get-text-property (point) 'prefix-length) 0)))
+ (and (looking-at (concat "[ \t]*\\.*" re))
+ (add-text-properties (match-beginning 0) (match-end 0)
+ (list 'face (org-get-todo-face 0)))))
+ (setq re (concat (get-text-property 0 'org-todo-regexp x))
+ pl (get-text-property 0 'prefix-length x))
+ (and re (equal (string-match (concat "\\(\\.*\\)" re) x (or pl 0)) pl)
+ (add-text-properties
+ (or (match-end 1) (match-end 0)) (match-end 0)
+ (list 'face (org-get-todo-face (match-string 2 x)))
+ x))
+ x)))
+
+(defsubst org-cmp-priority (a b)
+ "Compare the priorities of string A and B."
+ (let ((pa (or (get-text-property 1 'priority a) 0))
+ (pb (or (get-text-property 1 'priority b) 0)))
+ (cond ((> pa pb) +1)
+ ((< pa pb) -1)
+ (t nil))))
+
+(defsubst org-cmp-category (a b)
+ "Compare the string values of categories of strings A and B."
+ (let ((ca (or (get-text-property 1 'org-category a) ""))
+ (cb (or (get-text-property 1 'org-category b) "")))
+ (cond ((string-lessp ca cb) -1)
+ ((string-lessp cb ca) +1)
+ (t nil))))
+
+(defsubst org-cmp-tag (a b)
+ "Compare the string values of categories of strings A and B."
+ (let ((ta (car (last (get-text-property 1 'tags a))))
+ (tb (car (last (get-text-property 1 'tags b)))))
+ (cond ((not ta) +1)
+ ((not tb) -1)
+ ((string-lessp ta tb) -1)
+ ((string-lessp tb ta) +1)
+ (t nil))))
+
+(defsubst org-cmp-time (a b)
+ "Compare the time-of-day values of strings A and B."
+ (let* ((def (if org-sort-agenda-notime-is-late 9901 -1))
+ (ta (or (get-text-property 1 'time-of-day a) def))
+ (tb (or (get-text-property 1 'time-of-day b) def)))
+ (cond ((< ta tb) -1)
+ ((< tb ta) +1)
+ (t nil))))
+
+(defun org-entries-lessp (a b)
+ "Predicate for sorting agenda entries."
+ ;; The following variables will be used when the form is evaluated.
+ ;; So even though the compiler complains, keep them.
+ (let* ((time-up (org-cmp-time a b))
+ (time-down (if time-up (- time-up) nil))
+ (priority-up (org-cmp-priority a b))
+ (priority-down (if priority-up (- priority-up) nil))
+ (category-up (org-cmp-category a b))
+ (category-down (if category-up (- category-up) nil))
+ (category-keep (if category-up +1 nil))
+ (tag-up (org-cmp-tag a b))
+ (tag-down (if tag-up (- tag-up) nil)))
+ (cdr (assoc
+ (eval (cons 'or org-agenda-sorting-strategy-selected))
+ '((-1 . t) (1 . nil) (nil . nil))))))
+
+;;; Agenda restriction lock
+
+(defvar org-agenda-restriction-lock-overlay (org-make-overlay 1 1)
+ "Overlay to mark the headline to which arenda commands are restricted.")
+(org-overlay-put org-agenda-restriction-lock-overlay
+ 'face 'org-agenda-restriction-lock)
+(org-overlay-put org-agenda-restriction-lock-overlay
+ 'help-echo "Agendas are currently limited to this subtree.")
+(org-detach-overlay org-agenda-restriction-lock-overlay)
+(defvar org-speedbar-restriction-lock-overlay (org-make-overlay 1 1)
+ "Overlay marking the agenda restriction line in speedbar.")
+(org-overlay-put org-speedbar-restriction-lock-overlay
+ 'face 'org-agenda-restriction-lock)
+(org-overlay-put org-speedbar-restriction-lock-overlay
+ 'help-echo "Agendas are currently limited to this item.")
+(org-detach-overlay org-speedbar-restriction-lock-overlay)
+
+(defun org-agenda-set-restriction-lock (&optional type)
+ "Set restriction lock for agenda, to current subtree or file.
+Restriction will be the file if TYPE is `file', or if type is the
+universal prefix '(4), or if the cursor is before the first headline
+in the file. Otherwise, restriction will be to the current subtree."
+ (interactive "P")
+ (and (equal type '(4)) (setq type 'file))
+ (setq type (cond
+ (type type)
+ ((org-at-heading-p) 'subtree)
+ ((condition-case nil (org-back-to-heading t) (error nil))
+ 'subtree)
+ (t 'file)))
+ (if (eq type 'subtree)
+ (progn
+ (setq org-agenda-restrict t)
+ (setq org-agenda-overriding-restriction 'subtree)
+ (put 'org-agenda-files 'org-restrict
+ (list (buffer-file-name (buffer-base-buffer))))
+ (org-back-to-heading t)
+ (org-move-overlay org-agenda-restriction-lock-overlay (point) (point-at-eol))
+ (move-marker org-agenda-restrict-begin (point))
+ (move-marker org-agenda-restrict-end
+ (save-excursion (org-end-of-subtree t)))
+ (message "Locking agenda restriction to subtree"))
+ (put 'org-agenda-files 'org-restrict
+ (list (buffer-file-name (buffer-base-buffer))))
+ (setq org-agenda-restrict nil)
+ (setq org-agenda-overriding-restriction 'file)
+ (move-marker org-agenda-restrict-begin nil)
+ (move-marker org-agenda-restrict-end nil)
+ (message "Locking agenda restriction to file"))
+ (setq current-prefix-arg nil)
+ (org-agenda-maybe-redo))
+
+(defun org-agenda-remove-restriction-lock (&optional noupdate)
+ "Remove the agenda restriction lock."
+ (interactive "P")
+ (org-detach-overlay org-agenda-restriction-lock-overlay)
+ (org-detach-overlay org-speedbar-restriction-lock-overlay)
+ (setq org-agenda-overriding-restriction nil)
+ (setq org-agenda-restrict nil)
+ (put 'org-agenda-files 'org-restrict nil)
+ (move-marker org-agenda-restrict-begin nil)
+ (move-marker org-agenda-restrict-end nil)
+ (setq current-prefix-arg nil)
+ (message "Agenda restriction lock removed")
+ (or noupdate (org-agenda-maybe-redo)))
+
+(defun org-agenda-maybe-redo ()
+ "If there is any window showing the agenda view, update it."
+ (let ((w (get-buffer-window org-agenda-buffer-name t))
+ (w0 (selected-window)))
+ (when w
+ (select-window w)
+ (org-agenda-redo)
+ (select-window w0)
+ (if org-agenda-overriding-restriction
+ (message "Agenda view shifted to new %s restriction"
+ org-agenda-overriding-restriction)
+ (message "Agenda restriction lock removed")))))
+
+;;; Agenda commands
+
+(defun org-agenda-check-type (error &rest types)
+ "Check if agenda buffer is of allowed type.
+If ERROR is non-nil, throw an error, otherwise just return nil."
+ (if (memq org-agenda-type types)
+ t
+ (if error
+ (error "Not allowed in %s-type agenda buffers" org-agenda-type)
+ nil)))
+
+(defun org-agenda-quit ()
+ "Exit agenda by removing the window or the buffer."
+ (interactive)
+ (let ((buf (current-buffer)))
+ (if (not (one-window-p)) (delete-window))
+ (kill-buffer buf)
+ (org-agenda-maybe-reset-markers 'force)
+ (org-columns-remove-overlays))
+ ;; Maybe restore the pre-agenda window configuration.
+ (and org-agenda-restore-windows-after-quit
+ (not (eq org-agenda-window-setup 'other-frame))
+ org-pre-agenda-window-conf
+ (set-window-configuration org-pre-agenda-window-conf)))
+
+(defun org-agenda-exit ()
+ "Exit agenda by removing the window or the buffer.
+Also kill all Org-mode buffers which have been loaded by `org-agenda'.
+Org-mode buffers visited directly by the user will not be touched."
+ (interactive)
+ (org-release-buffers org-agenda-new-buffers)
+ (setq org-agenda-new-buffers nil)
+ (org-agenda-quit))
+
+(defun org-agenda-execute (arg)
+ "Execute another agenda command, keeping same window.\\<global-map>
+So this is just a shortcut for `\\[org-agenda]', available in the agenda."
+ (interactive "P")
+ (let ((org-agenda-window-setup 'current-window))
+ (org-agenda arg)))
+
+(defun org-save-all-org-buffers ()
+ "Save all Org-mode buffers without user confirmation."
+ (interactive)
+ (message "Saving all Org-mode buffers...")
+ (save-some-buffers t 'org-mode-p)
+ (message "Saving all Org-mode buffers... done"))
+
+(defun org-agenda-redo ()
+ "Rebuild Agenda.
+When this is the global TODO list, a prefix argument will be interpreted."
+ (interactive)
+ (let* ((org-agenda-keep-modes t)
+ (line (org-current-line))
+ (window-line (- line (org-current-line (window-start))))
+ (lprops (get 'org-agenda-redo-command 'org-lprops)))
+ (message "Rebuilding agenda buffer...")
+ (org-let lprops '(eval org-agenda-redo-command))
+ (setq org-agenda-undo-list nil
+ org-agenda-pending-undo-list nil)
+ (message "Rebuilding agenda buffer...done")
+ (goto-line line)
+ (recenter window-line)))
+
+(defun org-agenda-goto-date (date)
+ "Jump to DATE in agenda."
+ (interactive (list (org-read-date)))
+ (org-agenda-list nil date))
+
+(defun org-agenda-goto-today ()
+ "Go to today."
+ (interactive)
+ (org-agenda-check-type t 'timeline 'agenda)
+ (let ((tdpos (text-property-any (point-min) (point-max) 'org-today t)))
+ (cond
+ (tdpos (goto-char tdpos))
+ ((eq org-agenda-type 'agenda)
+ (let* ((sd (time-to-days
+ (time-subtract (current-time)
+ (list 0 (* 3600 org-extend-today-until) 0))))
+ (comp (org-agenda-compute-time-span sd org-agenda-span))
+ (org-agenda-overriding-arguments org-agenda-last-arguments))
+ (setf (nth 1 org-agenda-overriding-arguments) (car comp))
+ (setf (nth 2 org-agenda-overriding-arguments) (cdr comp))
+ (org-agenda-redo)
+ (org-agenda-find-same-or-today-or-agenda)))
+ (t (error "Cannot find today")))))
+
+(defun org-agenda-find-same-or-today-or-agenda (&optional cnt)
+ (goto-char
+ (or (and cnt (text-property-any (point-min) (point-max) 'org-day-cnt cnt))
+ (text-property-any (point-min) (point-max) 'org-today t)
+ (text-property-any (point-min) (point-max) 'org-agenda-type 'agenda)
+ (point-min))))
+
+(defun org-agenda-later (arg)
+ "Go forward in time by thee current span.
+With prefix ARG, go forward that many times the current span."
+ (interactive "p")
+ (org-agenda-check-type t 'agenda)
+ (let* ((span org-agenda-span)
+ (sd org-starting-day)
+ (greg (calendar-gregorian-from-absolute sd))
+ (cnt (get-text-property (point) 'org-day-cnt))
+ greg2 nd)
+ (cond
+ ((eq span 'day)
+ (setq sd (+ arg sd) nd 1))
+ ((eq span 'week)
+ (setq sd (+ (* 7 arg) sd) nd 7))
+ ((eq span 'month)
+ (setq greg2 (list (+ (car greg) arg) (nth 1 greg) (nth 2 greg))
+ sd (calendar-absolute-from-gregorian greg2))
+ (setcar greg2 (1+ (car greg2)))
+ (setq nd (- (calendar-absolute-from-gregorian greg2) sd)))
+ ((eq span 'year)
+ (setq greg2 (list (car greg) (nth 1 greg) (+ arg (nth 2 greg)))
+ sd (calendar-absolute-from-gregorian greg2))
+ (setcar (nthcdr 2 greg2) (1+ (nth 2 greg2)))
+ (setq nd (- (calendar-absolute-from-gregorian greg2) sd))))
+ (let ((org-agenda-overriding-arguments
+ (list (car org-agenda-last-arguments) sd nd t)))
+ (org-agenda-redo)
+ (org-agenda-find-same-or-today-or-agenda cnt))))
+
+(defun org-agenda-earlier (arg)
+ "Go backward in time by the current span.
+With prefix ARG, go backward that many times the current span."
+ (interactive "p")
+ (org-agenda-later (- arg)))
+
+(defun org-agenda-day-view ()
+ "Switch to daily view for agenda."
+ (interactive)
+ (setq org-agenda-ndays 1)
+ (org-agenda-change-time-span 'day))
+(defun org-agenda-week-view ()
+ "Switch to daily view for agenda."
+ (interactive)
+ (setq org-agenda-ndays 7)
+ (org-agenda-change-time-span 'week))
+(defun org-agenda-month-view ()
+ "Switch to daily view for agenda."
+ (interactive)
+ (org-agenda-change-time-span 'month))
+(defun org-agenda-year-view ()
+ "Switch to daily view for agenda."
+ (interactive)
+ (if (y-or-n-p "Are you sure you want to compute the agenda for an entire year? ")
+ (org-agenda-change-time-span 'year)
+ (error "Abort")))
+
+(defun org-agenda-change-time-span (span)
+ "Change the agenda view to SPAN.
+SPAN may be `day', `week', `month', `year'."
+ (org-agenda-check-type t 'agenda)
+ (if (equal org-agenda-span span)
+ (error "Viewing span is already \"%s\"" span))
+ (let* ((sd (or (get-text-property (point) 'day)
+ org-starting-day))
+ (computed (org-agenda-compute-time-span sd span))
+ (org-agenda-overriding-arguments
+ (list (car org-agenda-last-arguments)
+ (car computed) (cdr computed) t)))
+ (org-agenda-redo)
+ (org-agenda-find-same-or-today-or-agenda))
+ (org-agenda-set-mode-name)
+ (message "Switched to %s view" span))
+
+(defun org-agenda-compute-time-span (sd span)
+ "Compute starting date and number of days for agenda.
+SPAN may be `day', `week', `month', `year'. The return value
+is a cons cell with the starting date and the number of days,
+so that the date SD will be in that range."
+ (let* ((greg (calendar-gregorian-from-absolute sd))
+ nd)
+ (cond
+ ((eq span 'day)
+ (setq nd 1))
+ ((eq span 'week)
+ (let* ((nt (calendar-day-of-week
+ (calendar-gregorian-from-absolute sd)))
+ (d (if org-agenda-start-on-weekday
+ (- nt org-agenda-start-on-weekday)
+ 0)))
+ (setq sd (- sd (+ (if (< d 0) 7 0) d)))
+ (setq nd 7)))
+ ((eq span 'month)
+ (setq sd (calendar-absolute-from-gregorian
+ (list (car greg) 1 (nth 2 greg)))
+ nd (- (calendar-absolute-from-gregorian
+ (list (1+ (car greg)) 1 (nth 2 greg)))
+ sd)))
+ ((eq span 'year)
+ (setq sd (calendar-absolute-from-gregorian
+ (list 1 1 (nth 2 greg)))
+ nd (- (calendar-absolute-from-gregorian
+ (list 1 1 (1+ (nth 2 greg))))
+ sd))))
+ (cons sd nd)))
+
+;; FIXME: does not work if user makes date format that starts with a blank
+(defun org-agenda-next-date-line (&optional arg)
+ "Jump to the next line indicating a date in agenda buffer."
+ (interactive "p")
+ (org-agenda-check-type t 'agenda 'timeline)
+ (beginning-of-line 1)
+ (if (looking-at "^\\S-") (forward-char 1))
+ (if (not (re-search-forward "^\\S-" nil t arg))
+ (progn
+ (backward-char 1)
+ (error "No next date after this line in this buffer")))
+ (goto-char (match-beginning 0)))
+
+(defun org-agenda-previous-date-line (&optional arg)
+ "Jump to the previous line indicating a date in agenda buffer."
+ (interactive "p")
+ (org-agenda-check-type t 'agenda 'timeline)
+ (beginning-of-line 1)
+ (if (not (re-search-backward "^\\S-" nil t arg))
+ (error "No previous date before this line in this buffer")))
+
+;; Initialize the highlight
+(defvar org-hl (org-make-overlay 1 1))
+(org-overlay-put org-hl 'face 'highlight)
+
+(defun org-highlight (begin end &optional buffer)
+ "Highlight a region with overlay."
+ (funcall (if (featurep 'xemacs) 'set-extent-endpoints 'move-overlay)
+ org-hl begin end (or buffer (current-buffer))))
+
+(defun org-unhighlight ()
+ "Detach overlay INDEX."
+ (funcall (if (featurep 'xemacs) 'detach-extent 'delete-overlay) org-hl))
+
+;; FIXME this is currently not used.
+(defun org-highlight-until-next-command (beg end &optional buffer)
+ (org-highlight beg end buffer)
+ (add-hook 'pre-command-hook 'org-unhighlight-once))
+(defun org-unhighlight-once ()
+ (remove-hook 'pre-command-hook 'org-unhighlight-once)
+ (org-unhighlight))
+
+(defun org-agenda-follow-mode ()
+ "Toggle follow mode in an agenda buffer."
+ (interactive)
+ (setq org-agenda-follow-mode (not org-agenda-follow-mode))
+ (org-agenda-set-mode-name)
+ (message "Follow mode is %s"
+ (if org-agenda-follow-mode "on" "off")))
+
+(defun org-agenda-log-mode ()
+ "Toggle log mode in an agenda buffer."
+ (interactive)
+ (org-agenda-check-type t 'agenda 'timeline)
+ (setq org-agenda-show-log (not org-agenda-show-log))
+ (org-agenda-set-mode-name)
+ (org-agenda-redo)
+ (message "Log mode is %s"
+ (if org-agenda-show-log "on" "off")))
+
+(defun org-agenda-toggle-diary ()
+ "Toggle diary inclusion in an agenda buffer."
+ (interactive)
+ (org-agenda-check-type t 'agenda)
+ (setq org-agenda-include-diary (not org-agenda-include-diary))
+ (org-agenda-redo)
+ (org-agenda-set-mode-name)
+ (message "Diary inclusion turned %s"
+ (if org-agenda-include-diary "on" "off")))
+
+(defun org-agenda-toggle-time-grid ()
+ "Toggle time grid in an agenda buffer."
+ (interactive)
+ (org-agenda-check-type t 'agenda)
+ (setq org-agenda-use-time-grid (not org-agenda-use-time-grid))
+ (org-agenda-redo)
+ (org-agenda-set-mode-name)
+ (message "Time-grid turned %s"
+ (if org-agenda-use-time-grid "on" "off")))
+
+(defun org-agenda-set-mode-name ()
+ "Set the mode name to indicate all the small mode settings."
+ (setq mode-name
+ (concat "Org-Agenda"
+ (if (equal org-agenda-ndays 1) " Day" "")
+ (if (equal org-agenda-ndays 7) " Week" "")
+ (if org-agenda-follow-mode " Follow" "")
+ (if org-agenda-include-diary " Diary" "")
+ (if org-agenda-use-time-grid " Grid" "")
+ (if org-agenda-show-log " Log" "")))
+ (force-mode-line-update))
+
+(defun org-agenda-post-command-hook ()
+ (and (eolp) (not (bolp)) (backward-char 1))
+ (setq org-agenda-type (get-text-property (point) 'org-agenda-type))
+ (if (and org-agenda-follow-mode
+ (get-text-property (point) 'org-marker))
+ (org-agenda-show)))
+
+(defun org-agenda-show-priority ()
+ "Show the priority of the current item.
+This priority is composed of the main priority given with the [#A] cookies,
+and by additional input from the age of a schedules or deadline entry."
+ (interactive)
+ (let* ((pri (get-text-property (point-at-bol) 'priority)))
+ (message "Priority is %d" (if pri pri -1000))))
+
+(defun org-agenda-show-tags ()
+ "Show the tags applicable to the current item."
+ (interactive)
+ (let* ((tags (get-text-property (point-at-bol) 'tags)))
+ (if tags
+ (message "Tags are :%s:"
+ (org-no-properties (mapconcat 'identity tags ":")))
+ (message "No tags associated with this line"))))
+
+(defun org-agenda-goto (&optional highlight)
+ "Go to the Org-mode file which contains the item at point."
+ (interactive)
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker)))
+ (switch-to-buffer-other-window buffer)
+ (widen)
+ (goto-char pos)
+ (when (org-mode-p)
+ (org-show-context 'agenda)
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil)))) ; show the next heading
+ (run-hooks 'org-agenda-after-show-hook)
+ (and highlight (org-highlight (point-at-bol) (point-at-eol)))))
+
+(defvar org-agenda-after-show-hook nil
+ "Normal hook run after an item has been shown from the agenda.
+Point is in the buffer where the item originated.")
+
+(defun org-agenda-kill ()
+ "Kill the entry or subtree belonging to the current agenda entry."
+ (interactive)
+ (or (eq major-mode 'org-agenda-mode) (error "Not in agenda"))
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker))
+ (type (get-text-property (point) 'type))
+ dbeg dend (n 0) conf)
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (save-excursion
+ (goto-char pos)
+ (if (and (org-mode-p) (not (member type '("sexp"))))
+ (setq dbeg (progn (org-back-to-heading t) (point))
+ dend (org-end-of-subtree t t))
+ (setq dbeg (point-at-bol)
+ dend (min (point-max) (1+ (point-at-eol)))))
+ (goto-char dbeg)
+ (while (re-search-forward "^[ \t]*\\S-" dend t) (setq n (1+ n)))))
+ (setq conf (or (eq t org-agenda-confirm-kill)
+ (and (numberp org-agenda-confirm-kill)
+ (> n org-agenda-confirm-kill))))
+ (and conf
+ (not (y-or-n-p
+ (format "Delete entry with %d lines in buffer \"%s\"? "
+ n (buffer-name buffer))))
+ (error "Abort"))
+ (org-remove-subtree-entries-from-agenda buffer dbeg dend)
+ (with-current-buffer buffer (delete-region dbeg dend))
+ (message "Agenda item and source killed"))))
+
+(defun org-agenda-archive ()
+ "Kill the entry or subtree belonging to the current agenda entry."
+ (interactive)
+ (or (eq major-mode 'org-agenda-mode) (error "Not in agenda"))
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker)))
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (if (org-mode-p)
+ (save-excursion
+ (goto-char pos)
+ (org-remove-subtree-entries-from-agenda)
+ (org-back-to-heading t)
+ (org-archive-subtree))
+ (error "Archiving works only in Org-mode files"))))))
+
+(defun org-remove-subtree-entries-from-agenda (&optional buf beg end)
+ "Remove all lines in the agenda that correspond to a given subtree.
+The subtree is the one in buffer BUF, starting at BEG and ending at END.
+If this information is not given, the function uses the tree at point."
+ (let ((buf (or buf (current-buffer))) m p)
+ (save-excursion
+ (unless (and beg end)
+ (org-back-to-heading t)
+ (setq beg (point))
+ (org-end-of-subtree t)
+ (setq end (point)))
+ (set-buffer (get-buffer org-agenda-buffer-name))
+ (save-excursion
+ (goto-char (point-max))
+ (beginning-of-line 1)
+ (while (not (bobp))
+ (when (and (setq m (get-text-property (point) 'org-marker))
+ (equal buf (marker-buffer m))
+ (setq p (marker-position m))
+ (>= p beg)
+ (<= p end))
+ (let ((inhibit-read-only t))
+ (delete-region (point-at-bol) (1+ (point-at-eol)))))
+ (beginning-of-line 0))))))
+
+(defun org-agenda-open-link ()
+ "Follow the link in the current line, if any."
+ (interactive)
+ (org-agenda-copy-local-variable 'org-link-abbrev-alist-local)
+ (save-excursion
+ (save-restriction
+ (narrow-to-region (point-at-bol) (point-at-eol))
+ (org-open-at-point))))
+
+(defun org-agenda-copy-local-variable (var)
+ "Get a variable from a referenced buffer and install it here."
+ (let ((m (get-text-property (point) 'org-marker)))
+ (when (and m (buffer-live-p (marker-buffer m)))
+ (org-set-local var (with-current-buffer (marker-buffer m)
+ (symbol-value var))))))
+
+(defun org-agenda-switch-to (&optional delete-other-windows)
+ "Go to the Org-mode file which contains the item at point."
+ (interactive)
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker)))
+ (switch-to-buffer buffer)
+ (and delete-other-windows (delete-other-windows))
+ (widen)
+ (goto-char pos)
+ (when (org-mode-p)
+ (org-show-context 'agenda)
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil)))))) ; show the next heading
+
+(defun org-agenda-goto-mouse (ev)
+ "Go to the Org-mode file which contains the item at the mouse click."
+ (interactive "e")
+ (mouse-set-point ev)
+ (org-agenda-goto))
+
+(defun org-agenda-show ()
+ "Display the Org-mode file which contains the item at point."
+ (interactive)
+ (let ((win (selected-window)))
+ (org-agenda-goto t)
+ (select-window win)))
+
+(defun org-agenda-recenter (arg)
+ "Display the Org-mode file which contains the item at point and recenter."
+ (interactive "P")
+ (let ((win (selected-window)))
+ (org-agenda-goto t)
+ (recenter arg)
+ (select-window win)))
+
+(defun org-agenda-show-mouse (ev)
+ "Display the Org-mode file which contains the item at the mouse click."
+ (interactive "e")
+ (mouse-set-point ev)
+ (org-agenda-show))
+
+(defun org-agenda-check-no-diary ()
+ "Check if the entry is a diary link and abort if yes."
+ (if (get-text-property (point) 'org-agenda-diary-link)
+ (org-agenda-error)))
+
+(defun org-agenda-error ()
+ (error "Command not allowed in this line"))
+
+(defun org-agenda-tree-to-indirect-buffer ()
+ "Show the subtree corresponding to the current entry in an indirect buffer.
+This calls the command `org-tree-to-indirect-buffer' from the original
+Org-mode buffer.
+With numerical prefix arg ARG, go up to this level and then take that tree.
+With a C-u prefix, make a separate frame for this tree (i.e. don't use the
+dedicated frame)."
+ (interactive)
+ (org-agenda-check-no-diary)
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker)))
+ (with-current-buffer buffer
+ (save-excursion
+ (goto-char pos)
+ (call-interactively 'org-tree-to-indirect-buffer)))))
+
+(defvar org-last-heading-marker (make-marker)
+ "Marker pointing to the headline that last changed its TODO state
+by a remote command from the agenda.")
+
+(defun org-agenda-todo-nextset ()
+ "Switch TODO entry to next sequence."
+ (interactive)
+ (org-agenda-todo 'nextset))
+
+(defun org-agenda-todo-previousset ()
+ "Switch TODO entry to previous sequence."
+ (interactive)
+ (org-agenda-todo 'previousset))
+
+(defun org-agenda-todo (&optional arg)
+ "Cycle TODO state of line at point, also in Org-mode file.
+This changes the line at point, all other lines in the agenda referring to
+the same tree node, and the headline of the tree node in the Org-mode file."
+ (interactive "P")
+ (org-agenda-check-no-diary)
+ (let* ((col (current-column))
+ (marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker))
+ (hdmarker (get-text-property (point) 'org-hd-marker))
+ (inhibit-read-only t)
+ newhead)
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (widen)
+ (goto-char pos)
+ (org-show-context 'agenda)
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil))) ; show the next heading
+ (org-todo arg)
+ (and (bolp) (forward-char 1))
+ (setq newhead (org-get-heading))
+ (save-excursion
+ (org-back-to-heading)
+ (move-marker org-last-heading-marker (point))))
+ (beginning-of-line 1)
+ (save-excursion
+ (org-agenda-change-all-lines newhead hdmarker 'fixface))
+ (move-to-column col))))
+
+(defun org-agenda-change-all-lines (newhead hdmarker &optional fixface)
+ "Change all lines in the agenda buffer which match HDMARKER.
+The new content of the line will be NEWHEAD (as modified by
+`org-format-agenda-item'). HDMARKER is checked with
+`equal' against all `org-hd-marker' text properties in the file.
+If FIXFACE is non-nil, the face of each item is modified acording to
+the new TODO state."
+ (let* ((inhibit-read-only t)
+ props m pl undone-face done-face finish new dotime cat tags)
+ (save-excursion
+ (goto-char (point-max))
+ (beginning-of-line 1)
+ (while (not finish)
+ (setq finish (bobp))
+ (when (and (setq m (get-text-property (point) 'org-hd-marker))
+ (equal m hdmarker))
+ (setq props (text-properties-at (point))
+ dotime (get-text-property (point) 'dotime)
+ cat (get-text-property (point) 'org-category)
+ tags (get-text-property (point) 'tags)
+ new (org-format-agenda-item "x" newhead cat tags dotime 'noprefix)
+ pl (get-text-property (point) 'prefix-length)
+ undone-face (get-text-property (point) 'undone-face)
+ done-face (get-text-property (point) 'done-face))
+ (move-to-column pl)
+ (cond
+ ((equal new "")
+ (beginning-of-line 1)
+ (and (looking-at ".*\n?") (replace-match "")))
+ ((looking-at ".*")
+ (replace-match new t t)
+ (beginning-of-line 1)
+ (add-text-properties (point-at-bol) (point-at-eol) props)
+ (when fixface
+ (add-text-properties
+ (point-at-bol) (point-at-eol)
+ (list 'face
+ (if org-last-todo-state-is-todo
+ undone-face done-face))))
+ (org-agenda-highlight-todo 'line)
+ (beginning-of-line 1))
+ (t (error "Line update did not work"))))
+ (beginning-of-line 0)))
+ (org-finalize-agenda)))
+
+(defun org-agenda-align-tags (&optional line)
+ "Align all tags in agenda items to `org-agenda-tags-column'."
+ (let ((inhibit-read-only t) l c)
+ (save-excursion
+ (goto-char (if line (point-at-bol) (point-min)))
+ (while (re-search-forward (org-re "\\([ \t]+\\)\\(:[[:alnum:]_@:]+:\\)[ \t]*$")
+ (if line (point-at-eol) nil) t)
+ (add-text-properties
+ (match-beginning 2) (match-end 2)
+ (list 'face (list 'org-tag (get-text-property
+ (match-beginning 2) 'face))))
+ (setq l (- (match-end 2) (match-beginning 2))
+ c (if (< org-agenda-tags-column 0)
+ (- (abs org-agenda-tags-column) l)
+ org-agenda-tags-column))
+ (delete-region (match-beginning 1) (match-end 1))
+ (goto-char (match-beginning 1))
+ (insert (org-add-props
+ (make-string (max 1 (- c (current-column))) ?\ )
+ (text-properties-at (point))))))))
+
+(defun org-agenda-priority-up ()
+ "Increase the priority of line at point, also in Org-mode file."
+ (interactive)
+ (org-agenda-priority 'up))
+
+(defun org-agenda-priority-down ()
+ "Decrease the priority of line at point, also in Org-mode file."
+ (interactive)
+ (org-agenda-priority 'down))
+
+(defun org-agenda-priority (&optional force-direction)
+ "Set the priority of line at point, also in Org-mode file.
+This changes the line at point, all other lines in the agenda referring to
+the same tree node, and the headline of the tree node in the Org-mode file."
+ (interactive)
+ (org-agenda-check-no-diary)
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (hdmarker (get-text-property (point) 'org-hd-marker))
+ (buffer (marker-buffer hdmarker))
+ (pos (marker-position hdmarker))
+ (inhibit-read-only t)
+ newhead)
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (widen)
+ (goto-char pos)
+ (org-show-context 'agenda)
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil))) ; show the next heading
+ (funcall 'org-priority force-direction)
+ (end-of-line 1)
+ (setq newhead (org-get-heading)))
+ (org-agenda-change-all-lines newhead hdmarker)
+ (beginning-of-line 1))))
+
+(defun org-get-tags-at (&optional pos)
+ "Get a list of all headline tags applicable at POS.
+POS defaults to point. If tags are inherited, the list contains
+the targets in the same sequence as the headlines appear, i.e.
+the tags of the current headline come last."
+ (interactive)
+ (let (tags lastpos)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (or pos (point)))
+ (save-match-data
+ (org-back-to-heading t)
+ (condition-case nil
+ (while (not (equal lastpos (point)))
+ (setq lastpos (point))
+ (if (looking-at (org-re "[^\r\n]+?:\\([[:alnum:]_@:]+\\):[ \t]*$"))
+ (setq tags (append (org-split-string
+ (org-match-string-no-properties 1) ":")
+ tags)))
+ (or org-use-tag-inheritance (error ""))
+ (org-up-heading-all 1))
+ (error nil))))
+ tags)))
+
+;; FIXME: should fix the tags property of the agenda line.
+(defun org-agenda-set-tags ()
+ "Set tags for the current headline."
+ (interactive)
+ (org-agenda-check-no-diary)
+ (if (and (org-region-active-p) (interactive-p))
+ (call-interactively 'org-change-tag-in-region)
+ (org-agenda-show) ;;; FIXME This is a stupid hack and should not be needed
+ (let* ((hdmarker (or (get-text-property (point) 'org-hd-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer hdmarker))
+ (pos (marker-position hdmarker))
+ (inhibit-read-only t)
+ newhead)
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (widen)
+ (goto-char pos)
+ (save-excursion
+ (org-show-context 'agenda))
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil))) ; show the next heading
+ (goto-char pos)
+ (call-interactively 'org-set-tags)
+ (end-of-line 1)
+ (setq newhead (org-get-heading)))
+ (org-agenda-change-all-lines newhead hdmarker)
+ (beginning-of-line 1)))))
+
+(defun org-agenda-toggle-archive-tag ()
+ "Toggle the archive tag for the current entry."
+ (interactive)
+ (org-agenda-check-no-diary)
+ (org-agenda-show) ;;; FIXME This is a stupid hack and should not be needed
+ (let* ((hdmarker (or (get-text-property (point) 'org-hd-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer hdmarker))
+ (pos (marker-position hdmarker))
+ (inhibit-read-only t)
+ newhead)
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (widen)
+ (goto-char pos)
+ (org-show-context 'agenda)
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil))) ; show the next heading
+ (call-interactively 'org-toggle-archive-tag)
+ (end-of-line 1)
+ (setq newhead (org-get-heading)))
+ (org-agenda-change-all-lines newhead hdmarker)
+ (beginning-of-line 1))))
+
+(defun org-agenda-date-later (arg &optional what)
+ "Change the date of this item to one day later."
+ (interactive "p")
+ (org-agenda-check-type t 'agenda 'timeline)
+ (org-agenda-check-no-diary)
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker)))
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (widen)
+ (goto-char pos)
+ (if (not (org-at-timestamp-p))
+ (error "Cannot find time stamp"))
+ (org-timestamp-change arg (or what 'day)))
+ (org-agenda-show-new-time marker org-last-changed-timestamp))
+ (message "Time stamp changed to %s" org-last-changed-timestamp)))
+
+(defun org-agenda-date-earlier (arg &optional what)
+ "Change the date of this item to one day earlier."
+ (interactive "p")
+ (org-agenda-date-later (- arg) what))
+
+(defun org-agenda-show-new-time (marker stamp &optional prefix)
+ "Show new date stamp via text properties."
+ ;; We use text properties to make this undoable
+ (let ((inhibit-read-only t))
+ (setq stamp (concat " " prefix " => " stamp))
+ (save-excursion
+ (goto-char (point-max))
+ (while (not (bobp))
+ (when (equal marker (get-text-property (point) 'org-marker))
+ (move-to-column (- (window-width) (length stamp)) t)
+ (if (featurep 'xemacs)
+ ;; Use `duplicable' property to trigger undo recording
+ (let ((ex (make-extent nil nil))
+ (gl (make-glyph stamp)))
+ (set-glyph-face gl 'secondary-selection)
+ (set-extent-properties
+ ex (list 'invisible t 'end-glyph gl 'duplicable t))
+ (insert-extent ex (1- (point)) (point-at-eol)))
+ (add-text-properties
+ (1- (point)) (point-at-eol)
+ (list 'display (org-add-props stamp nil
+ 'face 'secondary-selection))))
+ (beginning-of-line 1))
+ (beginning-of-line 0)))))
+
+(defun org-agenda-date-prompt (arg)
+ "Change the date of this item. Date is prompted for, with default today.
+The prefix ARG is passed to the `org-time-stamp' command and can therefore
+be used to request time specification in the time stamp."
+ (interactive "P")
+ (org-agenda-check-type t 'agenda 'timeline)
+ (org-agenda-check-no-diary)
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker)))
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (widen)
+ (goto-char pos)
+ (if (not (org-at-timestamp-p))
+ (error "Cannot find time stamp"))
+ (org-time-stamp arg)
+ (message "Time stamp changed to %s" org-last-changed-timestamp)))))
+
+(defun org-agenda-schedule (arg)
+ "Schedule the item at point."
+ (interactive "P")
+ (org-agenda-check-type t 'agenda 'timeline 'todo 'tags)
+ (org-agenda-check-no-diary)
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker))
+ (org-insert-labeled-timestamps-at-point nil)
+ ts)
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (widen)
+ (goto-char pos)
+ (setq ts (org-schedule arg)))
+ (org-agenda-show-new-time marker ts "S"))
+ (message "Item scheduled for %s" ts)))
+
+(defun org-agenda-deadline (arg)
+ "Schedule the item at point."
+ (interactive "P")
+ (org-agenda-check-type t 'agenda 'timeline 'todo 'tags)
+ (org-agenda-check-no-diary)
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer marker))
+ (pos (marker-position marker))
+ (org-insert-labeled-timestamps-at-point nil)
+ ts)
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (widen)
+ (goto-char pos)
+ (setq ts (org-deadline arg)))
+ (org-agenda-show-new-time marker ts "S"))
+ (message "Deadline for this item set to %s" ts)))
+
+(defun org-get-heading (&optional no-tags)
+ "Return the heading of the current entry, without the stars."
+ (save-excursion
+ (org-back-to-heading t)
+ (if (looking-at
+ (if no-tags
+ (org-re "\\*+[ \t]+\\([^\n\r]*?\\)\\([ \t]+:[[:alnum:]:_@]+:[ \t]*\\)?$")
+ "\\*+[ \t]+\\([^\r\n]*\\)"))
+ (match-string 1) "")))
+
+(defun org-agenda-clock-in (&optional arg)
+ "Start the clock on the currently selected item."
+ (interactive "P")
+ (org-agenda-check-no-diary)
+ (let* ((marker (or (get-text-property (point) 'org-marker)
+ (org-agenda-error)))
+ (pos (marker-position marker)))
+ (org-with-remote-undo (marker-buffer marker)
+ (with-current-buffer (marker-buffer marker)
+ (widen)
+ (goto-char pos)
+ (org-clock-in)))))
+
+(defun org-agenda-clock-out (&optional arg)
+ "Stop the currently running clock."
+ (interactive "P")
+ (unless (marker-buffer org-clock-marker)
+ (error "No running clock"))
+ (org-with-remote-undo (marker-buffer org-clock-marker)
+ (org-clock-out)))
+
+(defun org-agenda-clock-cancel (&optional arg)
+ "Cancel the currently running clock."
+ (interactive "P")
+ (unless (marker-buffer org-clock-marker)
+ (error "No running clock"))
+ (org-with-remote-undo (marker-buffer org-clock-marker)
+ (org-clock-cancel)))
+
+(defun org-agenda-diary-entry ()
+ "Make a diary entry, like the `i' command from the calendar.
+All the standard commands work: block, weekly etc."
+ (interactive)
+ (org-agenda-check-type t 'agenda 'timeline)
+ (require 'diary-lib)
+ (let* ((char (progn
+ (message "Diary entry: [d]ay [w]eekly [m]onthly [y]early [a]nniversary [b]lock [c]yclic")
+ (read-char-exclusive)))
+ (cmd (cdr (assoc char
+ '((?d . insert-diary-entry)
+ (?w . insert-weekly-diary-entry)
+ (?m . insert-monthly-diary-entry)
+ (?y . insert-yearly-diary-entry)
+ (?a . insert-anniversary-diary-entry)
+ (?b . insert-block-diary-entry)
+ (?c . insert-cyclic-diary-entry)))))
+ (oldf (symbol-function 'calendar-cursor-to-date))
+; (buf (get-file-buffer (substitute-in-file-name diary-file)))
+ (point (point))
+ (mark (or (mark t) (point))))
+ (unless cmd
+ (error "No command associated with <%c>" char))
+ (unless (and (get-text-property point 'day)
+ (or (not (equal ?b char))
+ (get-text-property mark 'day)))
+ (error "Don't know which date to use for diary entry"))
+ ;; We implement this by hacking the `calendar-cursor-to-date' function
+ ;; and the `calendar-mark-ring' variable. Saves a lot of code.
+ (let ((calendar-mark-ring
+ (list (calendar-gregorian-from-absolute
+ (or (get-text-property mark 'day)
+ (get-text-property point 'day))))))
+ (unwind-protect
+ (progn
+ (fset 'calendar-cursor-to-date
+ (lambda (&optional error)
+ (calendar-gregorian-from-absolute
+ (get-text-property point 'day))))
+ (call-interactively cmd))
+ (fset 'calendar-cursor-to-date oldf)))))
+
+
+(defun org-agenda-execute-calendar-command (cmd)
+ "Execute a calendar command from the agenda, with the date associated to
+the cursor position."
+ (org-agenda-check-type t 'agenda 'timeline)
+ (require 'diary-lib)
+ (unless (get-text-property (point) 'day)
+ (error "Don't know which date to use for calendar command"))
+ (let* ((oldf (symbol-function 'calendar-cursor-to-date))
+ (point (point))
+ (date (calendar-gregorian-from-absolute
+ (get-text-property point 'day)))
+ ;; the following 3 vars are needed in the calendar
+ (displayed-day (extract-calendar-day date))
+ (displayed-month (extract-calendar-month date))
+ (displayed-year (extract-calendar-year date)))
+ (unwind-protect
+ (progn
+ (fset 'calendar-cursor-to-date
+ (lambda (&optional error)
+ (calendar-gregorian-from-absolute
+ (get-text-property point 'day))))
+ (call-interactively cmd))
+ (fset 'calendar-cursor-to-date oldf))))
+
+(defun org-agenda-phases-of-moon ()
+ "Display the phases of the moon for the 3 months around the cursor date."
+ (interactive)
+ (org-agenda-execute-calendar-command 'calendar-phases-of-moon))
+
+(defun org-agenda-holidays ()
+ "Display the holidays for the 3 months around the cursor date."
+ (interactive)
+ (org-agenda-execute-calendar-command 'list-calendar-holidays))
+
+(defun org-agenda-sunrise-sunset (arg)
+ "Display sunrise and sunset for the cursor date.
+Latitude and longitude can be specified with the variables
+`calendar-latitude' and `calendar-longitude'. When called with prefix
+argument, latitude and longitude will be prompted for."
+ (interactive "P")
+ (let ((calendar-longitude (if arg nil calendar-longitude))
+ (calendar-latitude (if arg nil calendar-latitude))
+ (calendar-location-name
+ (if arg "the given coordinates" calendar-location-name)))
+ (org-agenda-execute-calendar-command 'calendar-sunrise-sunset)))
+
+(defun org-agenda-goto-calendar ()
+ "Open the Emacs calendar with the date at the cursor."
+ (interactive)
+ (org-agenda-check-type t 'agenda 'timeline)
+ (let* ((day (or (get-text-property (point) 'day)
+ (error "Don't know which date to open in calendar")))
+ (date (calendar-gregorian-from-absolute day))
+ (calendar-move-hook nil)
+ (view-calendar-holidays-initially nil)
+ (view-diary-entries-initially nil))
+ (calendar)
+ (calendar-goto-date date)))
+
+(defun org-calendar-goto-agenda ()
+ "Compute the Org-mode agenda for the calendar date displayed at the cursor.
+This is a command that has to be installed in `calendar-mode-map'."
+ (interactive)
+ (org-agenda-list nil (calendar-absolute-from-gregorian
+ (calendar-cursor-to-date))
+ nil))
+
+(defun org-agenda-convert-date ()
+ (interactive)
+ (org-agenda-check-type t 'agenda 'timeline)
+ (let ((day (get-text-property (point) 'day))
+ date s)
+ (unless day
+ (error "Don't know which date to convert"))
+ (setq date (calendar-gregorian-from-absolute day))
+ (setq s (concat
+ "Gregorian: " (calendar-date-string date) "\n"
+ "ISO: " (calendar-iso-date-string date) "\n"
+ "Day of Yr: " (calendar-day-of-year-string date) "\n"
+ "Julian: " (calendar-julian-date-string date) "\n"
+ "Astron. JD: " (calendar-astro-date-string date)
+ " (Julian date number at noon UTC)\n"
+ "Hebrew: " (calendar-hebrew-date-string date) " (until sunset)\n"
+ "Islamic: " (calendar-islamic-date-string date) " (until sunset)\n"
+ "French: " (calendar-french-date-string date) "\n"
+ "Baha'i: " (calendar-bahai-date-string date) " (until sunset)\n"
+ "Mayan: " (calendar-mayan-date-string date) "\n"
+ "Coptic: " (calendar-coptic-date-string date) "\n"
+ "Ethiopic: " (calendar-ethiopic-date-string date) "\n"
+ "Persian: " (calendar-persian-date-string date) "\n"
+ "Chinese: " (calendar-chinese-date-string date) "\n"))
+ (with-output-to-temp-buffer "*Dates*"
+ (princ s))
+ (if (fboundp 'fit-window-to-buffer)
+ (fit-window-to-buffer (get-buffer-window "*Dates*")))))
+
+
+;;;; Embedded LaTeX
+
+(defvar org-cdlatex-mode-map (make-sparse-keymap)
+ "Keymap for the minor `org-cdlatex-mode'.")
+
+(org-defkey org-cdlatex-mode-map "_" 'org-cdlatex-underscore-caret)
+(org-defkey org-cdlatex-mode-map "^" 'org-cdlatex-underscore-caret)
+(org-defkey org-cdlatex-mode-map "`" 'cdlatex-math-symbol)
+(org-defkey org-cdlatex-mode-map "'" 'org-cdlatex-math-modify)
+(org-defkey org-cdlatex-mode-map "\C-c{" 'cdlatex-environment)
+
+(defvar org-cdlatex-texmathp-advice-is-done nil
+ "Flag remembering if we have applied the advice to texmathp already.")
+
+(define-minor-mode org-cdlatex-mode
+ "Toggle the minor `org-cdlatex-mode'.
+This mode supports entering LaTeX environment and math in LaTeX fragments
+in Org-mode.
+\\{org-cdlatex-mode-map}"
+ nil " OCDL" nil
+ (when org-cdlatex-mode (require 'cdlatex))
+ (unless org-cdlatex-texmathp-advice-is-done
+ (setq org-cdlatex-texmathp-advice-is-done t)
+ (defadvice texmathp (around org-math-always-on activate)
+ "Always return t in org-mode buffers.
+This is because we want to insert math symbols without dollars even outside
+the LaTeX math segments. If Orgmode thinks that point is actually inside
+en embedded LaTeX fragement, let texmathp do its job.
+\\[org-cdlatex-mode-map]"
+ (interactive)
+ (let (p)
+ (cond
+ ((not (org-mode-p)) ad-do-it)
+ ((eq this-command 'cdlatex-math-symbol)
+ (setq ad-return-value t
+ texmathp-why '("cdlatex-math-symbol in org-mode" . 0)))
+ (t
+ (let ((p (org-inside-LaTeX-fragment-p)))
+ (if (and p (member (car p) (plist-get org-format-latex-options :matchers)))
+ (setq ad-return-value t
+ texmathp-why '("Org-mode embedded math" . 0))
+ (if p ad-do-it)))))))))
+
+(defun turn-on-org-cdlatex ()
+ "Unconditionally turn on `org-cdlatex-mode'."
+ (org-cdlatex-mode 1))
+
+(defun org-inside-LaTeX-fragment-p ()
+ "Test if point is inside a LaTeX fragment.
+I.e. after a \\begin, \\(, \\[, $, or $$, without the corresponding closing
+sequence appearing also before point.
+Even though the matchers for math are configurable, this function assumes
+that \\begin, \\(, \\[, and $$ are always used. Only the single dollar
+delimiters are skipped when they have been removed by customization.
+The return value is nil, or a cons cell with the delimiter and
+and the position of this delimiter.
+
+This function does a reasonably good job, but can locally be fooled by
+for example currency specifications. For example it will assume being in
+inline math after \"$22.34\". The LaTeX fragment formatter will only format
+fragments that are properly closed, but during editing, we have to live
+with the uncertainty caused by missing closing delimiters. This function
+looks only before point, not after."
+ (catch 'exit
+ (let ((pos (point))
+ (dodollar (member "$" (plist-get org-format-latex-options :matchers)))
+ (lim (progn
+ (re-search-backward (concat "^\\(" paragraph-start "\\)") nil t)
+ (point)))
+ dd-on str (start 0) m re)
+ (goto-char pos)
+ (when dodollar
+ (setq str (concat (buffer-substring lim (point)) "\000 X$.")
+ re (nth 1 (assoc "$" org-latex-regexps)))
+ (while (string-match re str start)
+ (cond
+ ((= (match-end 0) (length str))
+ (throw 'exit (cons "$" (+ lim (match-beginning 0) 1))))
+ ((= (match-end 0) (- (length str) 5))
+ (throw 'exit nil))
+ (t (setq start (match-end 0))))))
+ (when (setq m (re-search-backward "\\(\\\\begin{[^}]*}\\|\\\\(\\|\\\\\\[\\)\\|\\(\\\\end{[^}]*}\\|\\\\)\\|\\\\\\]\\)\\|\\(\\$\\$\\)" lim t))
+ (goto-char pos)
+ (and (match-beginning 1) (throw 'exit (cons (match-string 1) m)))
+ (and (match-beginning 2) (throw 'exit nil))
+ ;; count $$
+ (while (re-search-backward "\\$\\$" lim t)
+ (setq dd-on (not dd-on)))
+ (goto-char pos)
+ (if dd-on (cons "$$" m))))))
+
+
+(defun org-try-cdlatex-tab ()
+ "Check if it makes sense to execute `cdlatex-tab', and do it if yes.
+It makes sense to do so if `org-cdlatex-mode' is active and if the cursor is
+ - inside a LaTeX fragment, or
+ - after the first word in a line, where an abbreviation expansion could
+ insert a LaTeX environment."
+ (when org-cdlatex-mode
+ (cond
+ ((save-excursion
+ (skip-chars-backward "a-zA-Z0-9*")
+ (skip-chars-backward " \t")
+ (bolp))
+ (cdlatex-tab) t)
+ ((org-inside-LaTeX-fragment-p)
+ (cdlatex-tab) t)
+ (t nil))))
+
+(defun org-cdlatex-underscore-caret (&optional arg)
+ "Execute `cdlatex-sub-superscript' in LaTeX fragments.
+Revert to the normal definition outside of these fragments."
+ (interactive "P")
+ (if (org-inside-LaTeX-fragment-p)
+ (call-interactively 'cdlatex-sub-superscript)
+ (let (org-cdlatex-mode)
+ (call-interactively (key-binding (vector last-input-event))))))
+
+(defun org-cdlatex-math-modify (&optional arg)
+ "Execute `cdlatex-math-modify' in LaTeX fragments.
+Revert to the normal definition outside of these fragments."
+ (interactive "P")
+ (if (org-inside-LaTeX-fragment-p)
+ (call-interactively 'cdlatex-math-modify)
+ (let (org-cdlatex-mode)
+ (call-interactively (key-binding (vector last-input-event))))))
+
+(defvar org-latex-fragment-image-overlays nil
+ "List of overlays carrying the images of latex fragments.")
+(make-variable-buffer-local 'org-latex-fragment-image-overlays)
+
+(defun org-remove-latex-fragment-image-overlays ()
+ "Remove all overlays with LaTeX fragment images in current buffer."
+ (mapc 'org-delete-overlay org-latex-fragment-image-overlays)
+ (setq org-latex-fragment-image-overlays nil))
+
+(defun org-preview-latex-fragment (&optional subtree)
+ "Preview the LaTeX fragment at point, or all locally or globally.
+If the cursor is in a LaTeX fragment, create the image and overlay
+it over the source code. If there is no fragment at point, display
+all fragments in the current text, from one headline to the next. With
+prefix SUBTREE, display all fragments in the current subtree. With a
+double prefix `C-u C-u', or when the cursor is before the first headline,
+display all fragments in the buffer.
+The images can be removed again with \\[org-ctrl-c-ctrl-c]."
+ (interactive "P")
+ (org-remove-latex-fragment-image-overlays)
+ (save-excursion
+ (save-restriction
+ (let (beg end at msg)
+ (cond
+ ((or (equal subtree '(16))
+ (not (save-excursion
+ (re-search-backward (concat "^" outline-regexp) nil t))))
+ (setq beg (point-min) end (point-max)
+ msg "Creating images for buffer...%s"))
+ ((equal subtree '(4))
+ (org-back-to-heading)
+ (setq beg (point) end (org-end-of-subtree t)
+ msg "Creating images for subtree...%s"))
+ (t
+ (if (setq at (org-inside-LaTeX-fragment-p))
+ (goto-char (max (point-min) (- (cdr at) 2)))
+ (org-back-to-heading))
+ (setq beg (point) end (progn (outline-next-heading) (point))
+ msg (if at "Creating image...%s"
+ "Creating images for entry...%s"))))
+ (message msg "")
+ (narrow-to-region beg end)
+ (goto-char beg)
+ (org-format-latex
+ (concat "ltxpng/" (file-name-sans-extension
+ (file-name-nondirectory
+ buffer-file-name)))
+ default-directory 'overlays msg at 'forbuffer)
+ (message msg "done. Use `C-c C-c' to remove images.")))))
+
+(defvar org-latex-regexps
+ '(("begin" "^[ \t]*\\(\\\\begin{\\([a-zA-Z0-9\\*]+\\)[^\000]+?\\\\end{\\2}\\)" 1 t)
+ ;; ("$" "\\([ (]\\|^\\)\\(\\(\\([$]\\)\\([^ \r\n,.$].*?\\(\n.*?\\)\\{0,5\\}[^ \r\n,.$]\\)\\4\\)\\)\\([ .,?;:'\")]\\|$\\)" 2 nil)
+ ;; \000 in the following regex is needed for org-inside-LaTeX-fragment-p
+ ("$" "\\([^$]\\)\\(\\(\\$\\([^ \r\n,;.$][^$\n\r]*?\\(\n[^$\n\r]*?\\)\\{0,2\\}[^ \r\n,.$]\\)\\$\\)\\)\\([ .,?;:'\")\000]\\|$\\)" 2 nil)
+ ("\\(" "\\\\([^\000]*?\\\\)" 0 nil)
+ ("\\[" "\\\\\\[[^\000]*?\\\\\\]" 0 t)
+ ("$$" "\\$\\$[^\000]*?\\$\\$" 0 t))
+ "Regular expressions for matching embedded LaTeX.")
+
+(defun org-format-latex (prefix &optional dir overlays msg at forbuffer)
+ "Replace LaTeX fragments with links to an image, and produce images."
+ (if (and overlays (fboundp 'clear-image-cache)) (clear-image-cache))
+ (let* ((prefixnodir (file-name-nondirectory prefix))
+ (absprefix (expand-file-name prefix dir))
+ (todir (file-name-directory absprefix))
+ (opt org-format-latex-options)
+ (matchers (plist-get opt :matchers))
+ (re-list org-latex-regexps)
+ (cnt 0) txt link beg end re e checkdir
+ m n block linkfile movefile ov)
+ ;; Check if there are old images files with this prefix, and remove them
+ (when (file-directory-p todir)
+ (mapc 'delete-file
+ (directory-files
+ todir 'full
+ (concat (regexp-quote prefixnodir) "_[0-9]+\\.png$"))))
+ ;; Check the different regular expressions
+ (while (setq e (pop re-list))
+ (setq m (car e) re (nth 1 e) n (nth 2 e)
+ block (if (nth 3 e) "\n\n" ""))
+ (when (member m matchers)
+ (goto-char (point-min))
+ (while (re-search-forward re nil t)
+ (when (or (not at) (equal (cdr at) (match-beginning n)))
+ (setq txt (match-string n)
+ beg (match-beginning n) end (match-end n)
+ cnt (1+ cnt)
+ linkfile (format "%s_%04d.png" prefix cnt)
+ movefile (format "%s_%04d.png" absprefix cnt)
+ link (concat block "[[file:" linkfile "]]" block))
+ (if msg (message msg cnt))
+ (goto-char beg)
+ (unless checkdir ; make sure the directory exists
+ (setq checkdir t)
+ (or (file-directory-p todir) (make-directory todir)))
+ (org-create-formula-image
+ txt movefile opt forbuffer)
+ (if overlays
+ (progn
+ (setq ov (org-make-overlay beg end))
+ (if (featurep 'xemacs)
+ (progn
+ (org-overlay-put ov 'invisible t)
+ (org-overlay-put
+ ov 'end-glyph
+ (make-glyph (vector 'png :file movefile))))
+ (org-overlay-put
+ ov 'display
+ (list 'image :type 'png :file movefile :ascent 'center)))
+ (push ov org-latex-fragment-image-overlays)
+ (goto-char end))
+ (delete-region beg end)
+ (insert link))))))))
+
+;; This function borrows from Ganesh Swami's latex2png.el
+(defun org-create-formula-image (string tofile options buffer)
+ (let* ((tmpdir (if (featurep 'xemacs)
+ (temp-directory)
+ temporary-file-directory))
+ (texfilebase (make-temp-name
+ (expand-file-name "orgtex" tmpdir)))
+ (texfile (concat texfilebase ".tex"))
+ (dvifile (concat texfilebase ".dvi"))
+ (pngfile (concat texfilebase ".png"))
+ (fnh (face-attribute 'default :height nil))
+ (scale (or (plist-get options (if buffer :scale :html-scale)) 1.0))
+ (dpi (number-to-string (* scale (floor (* 0.9 (if buffer fnh 140.))))))
+ (fg (or (plist-get options (if buffer :foreground :html-foreground))
+ "Black"))
+ (bg (or (plist-get options (if buffer :background :html-background))
+ "Transparent")))
+ (if (eq fg 'default) (setq fg (org-dvipng-color :foreground)))
+ (if (eq bg 'default) (setq bg (org-dvipng-color :background)))
+ (with-temp-file texfile
+ (insert org-format-latex-header
+ "\n\\begin{document}\n" string "\n\\end{document}\n"))
+ (let ((dir default-directory))
+ (condition-case nil
+ (progn
+ (cd tmpdir)
+ (call-process "latex" nil nil nil texfile))
+ (error nil))
+ (cd dir))
+ (if (not (file-exists-p dvifile))
+ (progn (message "Failed to create dvi file from %s" texfile) nil)
+ (call-process "dvipng" nil nil nil
+ "-E" "-fg" fg "-bg" bg
+ "-D" dpi
+ ;;"-x" scale "-y" scale
+ "-T" "tight"
+ "-o" pngfile
+ dvifile)
+ (if (not (file-exists-p pngfile))
+ (progn (message "Failed to create png file from %s" texfile) nil)
+ ;; Use the requested file name and clean up
+ (copy-file pngfile tofile 'replace)
+ (loop for e in '(".dvi" ".tex" ".aux" ".log" ".png") do
+ (delete-file (concat texfilebase e)))
+ pngfile))))
+
+(defun org-dvipng-color (attr)
+ "Return an rgb color specification for dvipng."
+ (apply 'format "rgb %s %s %s"
+ (mapcar 'org-normalize-color
+ (color-values (face-attribute 'default attr nil)))))
+
+(defun org-normalize-color (value)
+ "Return string to be used as color value for an RGB component."
+ (format "%g" (/ value 65535.0)))
+
+;;;; Exporting
+
+;;; Variables, constants, and parameter plists
+
+(defconst org-level-max 20)
+
+(defvar org-export-html-preamble nil
+ "Preamble, to be inserted just after <body>. Set by publishing functions.")
+(defvar org-export-html-postamble nil
+ "Preamble, to be inserted just before </body>. Set by publishing functions.")
+(defvar org-export-html-auto-preamble t
+ "Should default preamble be inserted? Set by publishing functions.")
+(defvar org-export-html-auto-postamble t
+ "Should default postamble be inserted? Set by publishing functions.")
+(defvar org-current-export-file nil) ; dynamically scoped parameter
+(defvar org-current-export-dir nil) ; dynamically scoped parameter
+
+
+(defconst org-export-plist-vars
+ '((:language . org-export-default-language)
+ (:customtime . org-display-custom-times)
+ (:headline-levels . org-export-headline-levels)
+ (:section-numbers . org-export-with-section-numbers)
+ (:table-of-contents . org-export-with-toc)
+ (:preserve-breaks . org-export-preserve-breaks)
+ (:archived-trees . org-export-with-archived-trees)
+ (:emphasize . org-export-with-emphasize)
+ (:sub-superscript . org-export-with-sub-superscripts)
+ (:special-strings . org-export-with-special-strings)
+ (:footnotes . org-export-with-footnotes)
+ (:drawers . org-export-with-drawers)
+ (:tags . org-export-with-tags)
+ (:TeX-macros . org-export-with-TeX-macros)
+ (:LaTeX-fragments . org-export-with-LaTeX-fragments)
+ (:skip-before-1st-heading . org-export-skip-text-before-1st-heading)
+ (:fixed-width . org-export-with-fixed-width)
+ (:timestamps . org-export-with-timestamps)
+ (:author-info . org-export-author-info)
+ (:time-stamp-file . org-export-time-stamp-file)
+ (:tables . org-export-with-tables)
+ (:table-auto-headline . org-export-highlight-first-table-line)
+ (:style . org-export-html-style)
+ (:agenda-style . org-agenda-export-html-style)
+ (:convert-org-links . org-export-html-link-org-files-as-html)
+ (:inline-images . org-export-html-inline-images)
+ (:html-extension . org-export-html-extension)
+ (:html-table-tag . org-export-html-table-tag)
+ (:expand-quoted-html . org-export-html-expand)
+ (:timestamp . org-export-html-with-timestamp)
+ (:publishing-directory . org-export-publishing-directory)
+ (:preamble . org-export-html-preamble)
+ (:postamble . org-export-html-postamble)
+ (:auto-preamble . org-export-html-auto-preamble)
+ (:auto-postamble . org-export-html-auto-postamble)
+ (:author . user-full-name)
+ (:email . user-mail-address)))
+
+(defun org-default-export-plist ()
+ "Return the property list with default settings for the export variables."
+ (let ((l org-export-plist-vars) rtn e)
+ (while (setq e (pop l))
+ (setq rtn (cons (car e) (cons (symbol-value (cdr e)) rtn))))
+ rtn))
+
+(defun org-infile-export-plist ()
+ "Return the property list with file-local settings for export."
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char 0)
+ (let ((re (org-make-options-regexp
+ '("TITLE" "AUTHOR" "DATE" "EMAIL" "TEXT" "OPTIONS" "LANGUAGE")))
+ p key val text options)
+ (while (re-search-forward re nil t)
+ (setq key (org-match-string-no-properties 1)
+ val (org-match-string-no-properties 2))
+ (cond
+ ((string-equal key "TITLE") (setq p (plist-put p :title val)))
+ ((string-equal key "AUTHOR")(setq p (plist-put p :author val)))
+ ((string-equal key "EMAIL") (setq p (plist-put p :email val)))
+ ((string-equal key "DATE") (setq p (plist-put p :date val)))
+ ((string-equal key "LANGUAGE") (setq p (plist-put p :language val)))
+ ((string-equal key "TEXT")
+ (setq text (if text (concat text "\n" val) val)))
+ ((string-equal key "OPTIONS") (setq options val))))
+ (setq p (plist-put p :text text))
+ (when options
+ (let ((op '(("H" . :headline-levels)
+ ("num" . :section-numbers)
+ ("toc" . :table-of-contents)
+ ("\\n" . :preserve-breaks)
+ ("@" . :expand-quoted-html)
+ (":" . :fixed-width)
+ ("|" . :tables)
+ ("^" . :sub-superscript)
+ ("-" . :special-strings)
+ ("f" . :footnotes)
+ ("d" . :drawers)
+ ("tags" . :tags)
+ ("*" . :emphasize)
+ ("TeX" . :TeX-macros)
+ ("LaTeX" . :LaTeX-fragments)
+ ("skip" . :skip-before-1st-heading)
+ ("author" . :author-info)
+ ("timestamp" . :time-stamp-file)))
+ o)
+ (while (setq o (pop op))
+ (if (string-match (concat (regexp-quote (car o))
+ ":\\([^ \t\n\r;,.]*\\)")
+ options)
+ (setq p (plist-put p (cdr o)
+ (car (read-from-string
+ (match-string 1 options)))))))))
+ p))))
+
+(defun org-export-directory (type plist)
+ (let* ((val (plist-get plist :publishing-directory))
+ (dir (if (listp val)
+ (or (cdr (assoc type val)) ".")
+ val)))
+ dir))
+
+(defun org-skip-comments (lines)
+ "Skip lines starting with \"#\" and subtrees starting with COMMENT."
+ (let ((re1 (concat "^\\(\\*+\\)[ \t]+" org-comment-string))
+ (re2 "^\\(\\*+\\)[ \t\n\r]")
+ (case-fold-search nil)
+ rtn line level)
+ (while (setq line (pop lines))
+ (cond
+ ((and (string-match re1 line)
+ (setq level (- (match-end 1) (match-beginning 1))))
+ ;; Beginning of a COMMENT subtree. Skip it.
+ (while (and (setq line (pop lines))
+ (or (not (string-match re2 line))
+ (> (- (match-end 1) (match-beginning 1)) level))))
+ (setq lines (cons line lines)))
+ ((string-match "^#" line)
+ ;; an ordinary comment line
+ )
+ ((and org-export-table-remove-special-lines
+ (string-match "^[ \t]*|" line)
+ (or (string-match "^[ \t]*| *[!_^] *|" line)
+ (and (string-match "| *<[0-9]+> *|" line)
+ (not (string-match "| *[^ <|]" line)))))
+ ;; a special table line that should be removed
+ )
+ (t (setq rtn (cons line rtn)))))
+ (nreverse rtn)))
+
+(defun org-export (&optional arg)
+ (interactive)
+ (let ((help "[t] insert the export option template
+\[v] limit export to visible part of outline tree
+
+\[a] export as ASCII
+
+\[h] export as HTML
+\[H] export as HTML to temporary buffer
+\[R] export region as HTML
+\[b] export as HTML and browse immediately
+\[x] export as XOXO
+
+\[l] export as LaTeX
+\[L] export as LaTeX to temporary buffer
+
+\[i] export current file as iCalendar file
+\[I] export all agenda files as iCalendar files
+\[c] export agenda files into combined iCalendar file
+
+\[F] publish current file
+\[P] publish current project
+\[X] publish... (project will be prompted for)
+\[A] publish all projects")
+ (cmds
+ '((?t . org-insert-export-options-template)
+ (?v . org-export-visible)
+ (?a . org-export-as-ascii)
+ (?h . org-export-as-html)
+ (?b . org-export-as-html-and-open)
+ (?H . org-export-as-html-to-buffer)
+ (?R . org-export-region-as-html)
+ (?x . org-export-as-xoxo)
+ (?l . org-export-as-latex)
+ (?L . org-export-as-latex-to-buffer)
+ (?i . org-export-icalendar-this-file)
+ (?I . org-export-icalendar-all-agenda-files)
+ (?c . org-export-icalendar-combine-agenda-files)
+ (?F . org-publish-current-file)
+ (?P . org-publish-current-project)
+ (?X . org-publish)
+ (?A . org-publish-all)))
+ r1 r2 ass)
+ (save-window-excursion
+ (delete-other-windows)
+ (with-output-to-temp-buffer "*Org Export/Publishing Help*"
+ (princ help))
+ (message "Select command: ")
+ (setq r1 (read-char-exclusive)))
+ (setq r2 (if (< r1 27) (+ r1 96) r1))
+ (if (setq ass (assq r2 cmds))
+ (call-interactively (cdr ass))
+ (error "No command associated with key %c" r1))))
+
+(defconst org-html-entities
+ '(("nbsp")
+ ("iexcl")
+ ("cent")
+ ("pound")
+ ("curren")
+ ("yen")
+ ("brvbar")
+ ("vert" . "&#124;")
+ ("sect")
+ ("uml")
+ ("copy")
+ ("ordf")
+ ("laquo")
+ ("not")
+ ("shy")
+ ("reg")
+ ("macr")
+ ("deg")
+ ("plusmn")
+ ("sup2")
+ ("sup3")
+ ("acute")
+ ("micro")
+ ("para")
+ ("middot")
+ ("odot"."o")
+ ("star"."*")
+ ("cedil")
+ ("sup1")
+ ("ordm")
+ ("raquo")
+ ("frac14")
+ ("frac12")
+ ("frac34")
+ ("iquest")
+ ("Agrave")
+ ("Aacute")
+ ("Acirc")
+ ("Atilde")
+ ("Auml")
+ ("Aring") ("AA"."&Aring;")
+ ("AElig")
+ ("Ccedil")
+ ("Egrave")
+ ("Eacute")
+ ("Ecirc")
+ ("Euml")
+ ("Igrave")
+ ("Iacute")
+ ("Icirc")
+ ("Iuml")
+ ("ETH")
+ ("Ntilde")
+ ("Ograve")
+ ("Oacute")
+ ("Ocirc")
+ ("Otilde")
+ ("Ouml")
+ ("times")
+ ("Oslash")
+ ("Ugrave")
+ ("Uacute")
+ ("Ucirc")
+ ("Uuml")
+ ("Yacute")
+ ("THORN")
+ ("szlig")
+ ("agrave")
+ ("aacute")
+ ("acirc")
+ ("atilde")
+ ("auml")
+ ("aring")
+ ("aelig")
+ ("ccedil")
+ ("egrave")
+ ("eacute")
+ ("ecirc")
+ ("euml")
+ ("igrave")
+ ("iacute")
+ ("icirc")
+ ("iuml")
+ ("eth")
+ ("ntilde")
+ ("ograve")
+ ("oacute")
+ ("ocirc")
+ ("otilde")
+ ("ouml")
+ ("divide")
+ ("oslash")
+ ("ugrave")
+ ("uacute")
+ ("ucirc")
+ ("uuml")
+ ("yacute")
+ ("thorn")
+ ("yuml")
+ ("fnof")
+ ("Alpha")
+ ("Beta")
+ ("Gamma")
+ ("Delta")
+ ("Epsilon")
+ ("Zeta")
+ ("Eta")
+ ("Theta")
+ ("Iota")
+ ("Kappa")
+ ("Lambda")
+ ("Mu")
+ ("Nu")
+ ("Xi")
+ ("Omicron")
+ ("Pi")
+ ("Rho")
+ ("Sigma")
+ ("Tau")
+ ("Upsilon")
+ ("Phi")
+ ("Chi")
+ ("Psi")
+ ("Omega")
+ ("alpha")
+ ("beta")
+ ("gamma")
+ ("delta")
+ ("epsilon")
+ ("varepsilon"."&epsilon;")
+ ("zeta")
+ ("eta")
+ ("theta")
+ ("iota")
+ ("kappa")
+ ("lambda")
+ ("mu")
+ ("nu")
+ ("xi")
+ ("omicron")
+ ("pi")
+ ("rho")
+ ("sigmaf") ("varsigma"."&sigmaf;")
+ ("sigma")
+ ("tau")
+ ("upsilon")
+ ("phi")
+ ("chi")
+ ("psi")
+ ("omega")
+ ("thetasym") ("vartheta"."&thetasym;")
+ ("upsih")
+ ("piv")
+ ("bull") ("bullet"."&bull;")
+ ("hellip") ("dots"."&hellip;")
+ ("prime")
+ ("Prime")
+ ("oline")
+ ("frasl")
+ ("weierp")
+ ("image")
+ ("real")
+ ("trade")
+ ("alefsym")
+ ("larr") ("leftarrow"."&larr;") ("gets"."&larr;")
+ ("uarr") ("uparrow"."&uarr;")
+ ("rarr") ("to"."&rarr;") ("rightarrow"."&rarr;")
+ ("darr")("downarrow"."&darr;")
+ ("harr") ("leftrightarrow"."&harr;")
+ ("crarr") ("hookleftarrow"."&crarr;") ; has round hook, not quite CR
+ ("lArr") ("Leftarrow"."&lArr;")
+ ("uArr") ("Uparrow"."&uArr;")
+ ("rArr") ("Rightarrow"."&rArr;")
+ ("dArr") ("Downarrow"."&dArr;")
+ ("hArr") ("Leftrightarrow"."&hArr;")
+ ("forall")
+ ("part") ("partial"."&part;")
+ ("exist") ("exists"."&exist;")
+ ("empty") ("emptyset"."&empty;")
+ ("nabla")
+ ("isin") ("in"."&isin;")
+ ("notin")
+ ("ni")
+ ("prod")
+ ("sum")
+ ("minus")
+ ("lowast") ("ast"."&lowast;")
+ ("radic")
+ ("prop") ("proptp"."&prop;")
+ ("infin") ("infty"."&infin;")
+ ("ang") ("angle"."&ang;")
+ ("and") ("wedge"."&and;")
+ ("or") ("vee"."&or;")
+ ("cap")
+ ("cup")
+ ("int")
+ ("there4")
+ ("sim")
+ ("cong") ("simeq"."&cong;")
+ ("asymp")("approx"."&asymp;")
+ ("ne") ("neq"."&ne;")
+ ("equiv")
+ ("le")
+ ("ge")
+ ("sub") ("subset"."&sub;")
+ ("sup") ("supset"."&sup;")
+ ("nsub")
+ ("sube")
+ ("supe")
+ ("oplus")
+ ("otimes")
+ ("perp")
+ ("sdot") ("cdot"."&sdot;")
+ ("lceil")
+ ("rceil")
+ ("lfloor")
+ ("rfloor")
+ ("lang")
+ ("rang")
+ ("loz") ("Diamond"."&loz;")
+ ("spades") ("spadesuit"."&spades;")
+ ("clubs") ("clubsuit"."&clubs;")
+ ("hearts") ("diamondsuit"."&hearts;")
+ ("diams") ("diamondsuit"."&diams;")
+ ("smile"."&#9786;") ("blacksmile"."&#9787;") ("sad"."&#9785;")
+ ("quot")
+ ("amp")
+ ("lt")
+ ("gt")
+ ("OElig")
+ ("oelig")
+ ("Scaron")
+ ("scaron")
+ ("Yuml")
+ ("circ")
+ ("tilde")
+ ("ensp")
+ ("emsp")
+ ("thinsp")
+ ("zwnj")
+ ("zwj")
+ ("lrm")
+ ("rlm")
+ ("ndash")
+ ("mdash")
+ ("lsquo")
+ ("rsquo")
+ ("sbquo")
+ ("ldquo")
+ ("rdquo")
+ ("bdquo")
+ ("dagger")
+ ("Dagger")
+ ("permil")
+ ("lsaquo")
+ ("rsaquo")
+ ("euro")
+
+ ("arccos"."arccos")
+ ("arcsin"."arcsin")
+ ("arctan"."arctan")
+ ("arg"."arg")
+ ("cos"."cos")
+ ("cosh"."cosh")
+ ("cot"."cot")
+ ("coth"."coth")
+ ("csc"."csc")
+ ("deg"."deg")
+ ("det"."det")
+ ("dim"."dim")
+ ("exp"."exp")
+ ("gcd"."gcd")
+ ("hom"."hom")
+ ("inf"."inf")
+ ("ker"."ker")
+ ("lg"."lg")
+ ("lim"."lim")
+ ("liminf"."liminf")
+ ("limsup"."limsup")
+ ("ln"."ln")
+ ("log"."log")
+ ("max"."max")
+ ("min"."min")
+ ("Pr"."Pr")
+ ("sec"."sec")
+ ("sin"."sin")
+ ("sinh"."sinh")
+ ("sup"."sup")
+ ("tan"."tan")
+ ("tanh"."tanh")
+ )
+ "Entities for TeX->HTML translation.
+Entries can be like (\"ent\"), in which case \"\\ent\" will be translated to
+\"&ent;\". An entry can also be a dotted pair like (\"ent\".\"&other;\").
+In that case, \"\\ent\" will be translated to \"&other;\".
+The list contains HTML entities for Latin-1, Greek and other symbols.
+It is supplemented by a number of commonly used TeX macros with appropriate
+translations. There is currently no way for users to extend this.")
+
+;;; General functions for all backends
+
+(defun org-cleaned-string-for-export (string &rest parameters)
+ "Cleanup a buffer STRING so that links can be created safely."
+ (interactive)
+ (let* ((re-radio (and org-target-link-regexp
+ (concat "\\([^<]\\)\\(" org-target-link-regexp "\\)")))
+ (re-plain-link (concat "\\([^[<]\\)" org-plain-link-re))
+ (re-angle-link (concat "\\([^[]\\)" org-angle-link-re))
+ (re-archive (concat ":" org-archive-tag ":"))
+ (re-quote (concat "^\\*+[ \t]+" org-quote-string "\\>"))
+ (re-commented (concat "^\\*+[ \t]+" org-comment-string "\\>"))
+ (htmlp (plist-get parameters :for-html))
+ (asciip (plist-get parameters :for-ascii))
+ (latexp (plist-get parameters :for-LaTeX))
+ (commentsp (plist-get parameters :comments))
+ (archived-trees (plist-get parameters :archived-trees))
+ (inhibit-read-only t)
+ (drawers org-drawers)
+ (exp-drawers (plist-get parameters :drawers))
+ (outline-regexp "\\*+ ")
+ a b xx
+ rtn p)
+ (with-current-buffer (get-buffer-create " org-mode-tmp")
+ (erase-buffer)
+ (insert string)
+ ;; Remove license-to-kill stuff
+ (while (setq p (text-property-any (point-min) (point-max)
+ :org-license-to-kill t))
+ (delete-region p (next-single-property-change p :org-license-to-kill)))
+
+ (let ((org-inhibit-startup t)) (org-mode))
+ (untabify (point-min) (point-max))
+
+ ;; Get the correct stuff before the first headline
+ (when (plist-get parameters :skip-before-1st-heading)
+ (goto-char (point-min))
+ (when (re-search-forward "^\\*+[ \t]" nil t)
+ (delete-region (point-min) (match-beginning 0))
+ (goto-char (point-min))
+ (insert "\n")))
+ (when (plist-get parameters :add-text)
+ (goto-char (point-min))
+ (insert (plist-get parameters :add-text) "\n"))
+
+ ;; Get rid of archived trees
+ (when (not (eq archived-trees t))
+ (goto-char (point-min))
+ (while (re-search-forward re-archive nil t)
+ (if (not (org-on-heading-p t))
+ (org-end-of-subtree t)
+ (beginning-of-line 1)
+ (setq a (if archived-trees
+ (1+ (point-at-eol)) (point))
+ b (org-end-of-subtree t))
+ (if (> b a) (delete-region a b)))))
+
+ ;; Get rid of drawers
+ (unless (eq t exp-drawers)
+ (goto-char (point-min))
+ (let ((re (concat "^[ \t]*:\\("
+ (mapconcat
+ 'identity
+ (org-delete-all exp-drawers
+ (copy-sequence drawers))
+ "\\|")
+ "\\):[ \t]*\n\\([^@]*?\n\\)?[ \t]*:END:[ \t]*\n")))
+ (while (re-search-forward re nil t)
+ (replace-match ""))))
+
+ ;; Find targets in comments and move them out of comments,
+ ;; but mark them as targets that should be invisible
+ (goto-char (point-min))
+ (while (re-search-forward "^#.*?\\(<<<?[^>\r\n]+>>>?\\).*" nil t)
+ (replace-match "\\1(INVISIBLE)"))
+
+ ;; Protect backend specific stuff, throw away the others.
+ (let ((formatters
+ `((,htmlp "HTML" "BEGIN_HTML" "END_HTML")
+ (,asciip "ASCII" "BEGIN_ASCII" "END_ASCII")
+ (,latexp "LaTeX" "BEGIN_LaTeX" "END_LaTeX")))
+ fmt)
+ (goto-char (point-min))
+ (while (re-search-forward "^#\\+BEGIN_EXAMPLE[ \t]*\n" nil t)
+ (goto-char (match-end 0))
+ (while (not (looking-at "#\\+END_EXAMPLE"))
+ (insert ": ")
+ (beginning-of-line 2)))
+ (goto-char (point-min))
+ (while (re-search-forward "^[ \t]*:.*\\(\n[ \t]*:.*\\)*" nil t)
+ (add-text-properties (match-beginning 0) (match-end 0)
+ '(org-protected t)))
+ (while formatters
+ (setq fmt (pop formatters))
+ (when (car fmt)
+ (goto-char (point-min))
+ (while (re-search-forward (concat "^#\\+" (cadr fmt)
+ ":[ \t]*\\(.*\\)") nil t)
+ (replace-match "\\1" t)
+ (add-text-properties
+ (point-at-bol) (min (1+ (point-at-eol)) (point-max))
+ '(org-protected t))))
+ (goto-char (point-min))
+ (while (re-search-forward
+ (concat "^#\\+"
+ (caddr fmt) "\\>.*\\(\\(\n.*\\)*?\n\\)#\\+"
+ (cadddr fmt) "\\>.*\n?") nil t)
+ (if (car fmt)
+ (add-text-properties (match-beginning 1) (1+ (match-end 1))
+ '(org-protected t))
+ (delete-region (match-beginning 0) (match-end 0))))))
+
+ ;; Protect quoted subtrees
+ (goto-char (point-min))
+ (while (re-search-forward re-quote nil t)
+ (goto-char (match-beginning 0))
+ (end-of-line 1)
+ (add-text-properties (point) (org-end-of-subtree t)
+ '(org-protected t)))
+
+ ;; Protect verbatim elements
+ (goto-char (point-min))
+ (while (re-search-forward org-verbatim-re nil t)
+ (add-text-properties (match-beginning 4) (match-end 4)
+ '(org-protected t))
+ (goto-char (1+ (match-end 4))))
+
+ ;; Remove subtrees that are commented
+ (goto-char (point-min))
+ (while (re-search-forward re-commented nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (point) (org-end-of-subtree t)))
+
+ ;; Remove special table lines
+ (when org-export-table-remove-special-lines
+ (goto-char (point-min))
+ (while (re-search-forward "^[ \t]*|" nil t)
+ (beginning-of-line 1)
+ (if (or (looking-at "[ \t]*| *[!_^] *|")
+ (and (looking-at ".*?| *<[0-9]+> *|")
+ (not (looking-at ".*?| *[^ <|]"))))
+ (delete-region (max (point-min) (1- (point-at-bol)))
+ (point-at-eol))
+ (end-of-line 1))))
+
+ ;; Specific LaTeX stuff
+ (when latexp
+ (require 'org-export-latex nil)
+ (org-export-latex-cleaned-string))
+
+ (when asciip
+ (org-export-ascii-clean-string))
+
+ ;; Specific HTML stuff
+ (when htmlp
+ ;; Convert LaTeX fragments to images
+ (when (plist-get parameters :LaTeX-fragments)
+ (org-format-latex
+ (concat "ltxpng/" (file-name-sans-extension
+ (file-name-nondirectory
+ org-current-export-file)))
+ org-current-export-dir nil "Creating LaTeX image %s"))
+ (message "Exporting..."))
+
+ ;; Remove or replace comments
+ (goto-char (point-min))
+ (while (re-search-forward "^#\\(.*\n?\\)" nil t)
+ (if commentsp
+ (progn (add-text-properties
+ (match-beginning 0) (match-end 0) '(org-protected t))
+ (replace-match (format commentsp (match-string 1)) t t))
+ (replace-match "")))
+
+ ;; Find matches for radio targets and turn them into internal links
+ (goto-char (point-min))
+ (when re-radio
+ (while (re-search-forward re-radio nil t)
+ (org-if-unprotected
+ (replace-match "\\1[[\\2]]"))))
+
+ ;; Find all links that contain a newline and put them into a single line
+ (goto-char (point-min))
+ (while (re-search-forward "\\(\\(\\[\\|\\]\\)\\[[^]]*?\\)[ \t]*\n[ \t]*\\([^]]*\\]\\(\\[\\|\\]\\)\\)" nil t)
+ (org-if-unprotected
+ (replace-match "\\1 \\3")
+ (goto-char (match-beginning 0))))
+
+
+ ;; Normalize links: Convert angle and plain links into bracket links
+ ;; Expand link abbreviations
+ (goto-char (point-min))
+ (while (re-search-forward re-plain-link nil t)
+ (goto-char (1- (match-end 0)))
+ (org-if-unprotected
+ (let* ((s (concat (match-string 1) "[[" (match-string 2)
+ ":" (match-string 3) "]]")))
+ ;; added 'org-link face to links
+ (put-text-property 0 (length s) 'face 'org-link s)
+ (replace-match s t t))))
+ (goto-char (point-min))
+ (while (re-search-forward re-angle-link nil t)
+ (goto-char (1- (match-end 0)))
+ (org-if-unprotected
+ (let* ((s (concat (match-string 1) "[[" (match-string 2)
+ ":" (match-string 3) "]]")))
+ (put-text-property 0 (length s) 'face 'org-link s)
+ (replace-match s t t))))
+ (goto-char (point-min))
+ (while (re-search-forward org-bracket-link-regexp nil t)
+ (org-if-unprotected
+ (let* ((s (concat "[[" (setq xx (save-match-data
+ (org-link-expand-abbrev (match-string 1))))
+ "]"
+ (if (match-end 3)
+ (match-string 2)
+ (concat "[" xx "]"))
+ "]")))
+ (put-text-property 0 (length s) 'face 'org-link s)
+ (replace-match s t t))))
+
+ ;; Find multiline emphasis and put them into single line
+ (when (plist-get parameters :emph-multiline)
+ (goto-char (point-min))
+ (while (re-search-forward org-emph-re nil t)
+ (if (not (= (char-after (match-beginning 3))
+ (char-after (match-beginning 4))))
+ (org-if-unprotected
+ (subst-char-in-region (match-beginning 0) (match-end 0)
+ ?\n ?\ t)
+ (goto-char (1- (match-end 0))))
+ (goto-char (1+ (match-beginning 0))))))
+
+ (setq rtn (buffer-string)))
+ (kill-buffer " org-mode-tmp")
+ rtn))
+
+(defun org-export-grab-title-from-buffer ()
+ "Get a title for the current document, from looking at the buffer."
+ (let ((inhibit-read-only t))
+ (save-excursion
+ (goto-char (point-min))
+ (let ((end (save-excursion (outline-next-heading) (point))))
+ (when (re-search-forward "^[ \t]*[^|# \t\r\n].*\n" end t)
+ ;; Mark the line so that it will not be exported as normal text.
+ (org-unmodified
+ (add-text-properties (match-beginning 0) (match-end 0)
+ (list :org-license-to-kill t)))
+ ;; Return the title string
+ (org-trim (match-string 0)))))))
+
+(defun org-export-get-title-from-subtree ()
+ "Return subtree title and exclude it from export."
+ (let (title (m (mark)))
+ (save-excursion
+ (goto-char (region-beginning))
+ (when (and (org-at-heading-p)
+ (>= (org-end-of-subtree t t) (region-end)))
+ ;; This is a subtree, we take the title from the first heading
+ (goto-char (region-beginning))
+ (looking-at org-todo-line-regexp)
+ (setq title (match-string 3))
+ (org-unmodified
+ (add-text-properties (point) (1+ (point-at-eol))
+ (list :org-license-to-kill t)))))
+ title))
+
+(defun org-solidify-link-text (s &optional alist)
+ "Take link text and make a safe target out of it."
+ (save-match-data
+ (let* ((rtn
+ (mapconcat
+ 'identity
+ (org-split-string s "[ \t\r\n]+") "--"))
+ (a (assoc rtn alist)))
+ (or (cdr a) rtn))))
+
+(defun org-get-min-level (lines)
+ "Get the minimum level in LINES."
+ (let ((re "^\\(\\*+\\) ") l min)
+ (catch 'exit
+ (while (setq l (pop lines))
+ (if (string-match re l)
+ (throw 'exit (org-tr-level (length (match-string 1 l))))))
+ 1)))
+
+;; Variable holding the vector with section numbers
+(defvar org-section-numbers (make-vector org-level-max 0))
+
+(defun org-init-section-numbers ()
+ "Initialize the vector for the section numbers."
+ (let* ((level -1)
+ (numbers (nreverse (org-split-string "" "\\.")))
+ (depth (1- (length org-section-numbers)))
+ (i depth) number-string)
+ (while (>= i 0)
+ (if (> i level)
+ (aset org-section-numbers i 0)
+ (setq number-string (or (car numbers) "0"))
+ (if (string-match "\\`[A-Z]\\'" number-string)
+ (aset org-section-numbers i
+ (- (string-to-char number-string) ?A -1))
+ (aset org-section-numbers i (string-to-number number-string)))
+ (pop numbers))
+ (setq i (1- i)))))
+
+(defun org-section-number (&optional level)
+ "Return a string with the current section number.
+When LEVEL is non-nil, increase section numbers on that level."
+ (let* ((depth (1- (length org-section-numbers))) idx n (string ""))
+ (when level
+ (when (> level -1)
+ (aset org-section-numbers
+ level (1+ (aref org-section-numbers level))))
+ (setq idx (1+ level))
+ (while (<= idx depth)
+ (if (not (= idx 1))
+ (aset org-section-numbers idx 0))
+ (setq idx (1+ idx))))
+ (setq idx 0)
+ (while (<= idx depth)
+ (setq n (aref org-section-numbers idx))
+ (setq string (concat string (if (not (string= string "")) "." "")
+ (int-to-string n)))
+ (setq idx (1+ idx)))
+ (save-match-data
+ (if (string-match "\\`\\([@0]\\.\\)+" string)
+ (setq string (replace-match "" t nil string)))
+ (if (string-match "\\(\\.0\\)+\\'" string)
+ (setq string (replace-match "" t nil string))))
+ string))
+
+;;; ASCII export
+
+(defvar org-last-level nil) ; dynamically scoped variable
+(defvar org-min-level nil) ; dynamically scoped variable
+(defvar org-levels-open nil) ; dynamically scoped parameter
+(defvar org-ascii-current-indentation nil) ; For communication
+
+(defun org-export-as-ascii (arg)
+ "Export the outline as a pretty ASCII file.
+If there is an active region, export only the region.
+The prefix ARG specifies how many levels of the outline should become
+underlined headlines. The default is 3."
+ (interactive "P")
+ (setq-default org-todo-line-regexp org-todo-line-regexp)
+ (let* ((opt-plist (org-combine-plists (org-default-export-plist)
+ (org-infile-export-plist)))
+ (region-p (org-region-active-p))
+ (subtree-p
+ (when region-p
+ (save-excursion
+ (goto-char (region-beginning))
+ (and (org-at-heading-p)
+ (>= (org-end-of-subtree t t) (region-end))))))
+ (custom-times org-display-custom-times)
+ (org-ascii-current-indentation '(0 . 0))
+ (level 0) line txt
+ (umax nil)
+ (umax-toc nil)
+ (case-fold-search nil)
+ (filename (concat (file-name-as-directory
+ (org-export-directory :ascii opt-plist))
+ (file-name-sans-extension
+ (or (and subtree-p
+ (org-entry-get (region-beginning)
+ "EXPORT_FILE_NAME" t))
+ (file-name-nondirectory buffer-file-name)))
+ ".txt"))
+ (filename (if (equal (file-truename filename)
+ (file-truename buffer-file-name))
+ (concat filename ".txt")
+ filename))
+ (buffer (find-file-noselect filename))
+ (org-levels-open (make-vector org-level-max nil))
+ (odd org-odd-levels-only)
+ (date (plist-get opt-plist :date))
+ (author (plist-get opt-plist :author))
+ (title (or (and subtree-p (org-export-get-title-from-subtree))
+ (plist-get opt-plist :title)
+ (and (not
+ (plist-get opt-plist :skip-before-1st-heading))
+ (org-export-grab-title-from-buffer))
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))))
+ (email (plist-get opt-plist :email))
+ (language (plist-get opt-plist :language))
+ (quote-re0 (concat "^[ \t]*" org-quote-string "\\>"))
+; (quote-re (concat "^\\(\\*+\\)\\([ \t]*" org-quote-string "\\>\\)"))
+ (todo nil)
+ (lang-words nil)
+ (region
+ (buffer-substring
+ (if (org-region-active-p) (region-beginning) (point-min))
+ (if (org-region-active-p) (region-end) (point-max))))
+ (lines (org-split-string
+ (org-cleaned-string-for-export
+ region
+ :for-ascii t
+ :skip-before-1st-heading
+ (plist-get opt-plist :skip-before-1st-heading)
+ :drawers (plist-get opt-plist :drawers)
+ :verbatim-multiline t
+ :archived-trees
+ (plist-get opt-plist :archived-trees)
+ :add-text (plist-get opt-plist :text))
+ "\n"))
+ thetoc have-headings first-heading-pos
+ table-open table-buffer)
+
+ (let ((inhibit-read-only t))
+ (org-unmodified
+ (remove-text-properties (point-min) (point-max)
+ '(:org-license-to-kill t))))
+
+ (setq org-min-level (org-get-min-level lines))
+ (setq org-last-level org-min-level)
+ (org-init-section-numbers)
+
+ (find-file-noselect filename)
+
+ (setq lang-words (or (assoc language org-export-language-setup)
+ (assoc "en" org-export-language-setup)))
+ (switch-to-buffer-other-window buffer)
+ (erase-buffer)
+ (fundamental-mode)
+ ;; create local variables for all options, to make sure all called
+ ;; functions get the correct information
+ (mapc (lambda (x)
+ (set (make-local-variable (cdr x))
+ (plist-get opt-plist (car x))))
+ org-export-plist-vars)
+ (org-set-local 'org-odd-levels-only odd)
+ (setq umax (if arg (prefix-numeric-value arg)
+ org-export-headline-levels))
+ (setq umax-toc (if (integerp org-export-with-toc)
+ (min org-export-with-toc umax)
+ umax))
+
+ ;; File header
+ (if title (org-insert-centered title ?=))
+ (insert "\n")
+ (if (and (or author email)
+ org-export-author-info)
+ (insert (concat (nth 1 lang-words) ": " (or author "")
+ (if email (concat " <" email ">") "")
+ "\n")))
+
+ (cond
+ ((and date (string-match "%" date))
+ (setq date (format-time-string date (current-time))))
+ (date)
+ (t (setq date (format-time-string "%Y/%m/%d %X" (current-time)))))
+
+ (if (and date org-export-time-stamp-file)
+ (insert (concat (nth 2 lang-words) ": " date"\n")))
+
+ (insert "\n\n")
+
+ (if org-export-with-toc
+ (progn
+ (push (concat (nth 3 lang-words) "\n") thetoc)
+ (push (concat (make-string (length (nth 3 lang-words)) ?=) "\n") thetoc)
+ (mapc '(lambda (line)
+ (if (string-match org-todo-line-regexp
+ line)
+ ;; This is a headline
+ (progn
+ (setq have-headings t)
+ (setq level (- (match-end 1) (match-beginning 1))
+ level (org-tr-level level)
+ txt (match-string 3 line)
+ todo
+ (or (and org-export-mark-todo-in-toc
+ (match-beginning 2)
+ (not (member (match-string 2 line)
+ org-done-keywords)))
+ ; TODO, not DONE
+ (and org-export-mark-todo-in-toc
+ (= level umax-toc)
+ (org-search-todo-below
+ line lines level))))
+ (setq txt (org-html-expand-for-ascii txt))
+
+ (while (string-match org-bracket-link-regexp txt)
+ (setq txt
+ (replace-match
+ (match-string (if (match-end 2) 3 1) txt)
+ t t txt)))
+
+ (if (and (memq org-export-with-tags '(not-in-toc nil))
+ (string-match
+ (org-re "[ \t]+:[[:alnum:]_@:]+:[ \t]*$")
+ txt))
+ (setq txt (replace-match "" t t txt)))
+ (if (string-match quote-re0 txt)
+ (setq txt (replace-match "" t t txt)))
+
+ (if org-export-with-section-numbers
+ (setq txt (concat (org-section-number level)
+ " " txt)))
+ (if (<= level umax-toc)
+ (progn
+ (push
+ (concat
+ (make-string
+ (* (max 0 (- level org-min-level)) 4) ?\ )
+ (format (if todo "%s (*)\n" "%s\n") txt))
+ thetoc)
+ (setq org-last-level level))
+ ))))
+ lines)
+ (setq thetoc (if have-headings (nreverse thetoc) nil))))
+
+ (org-init-section-numbers)
+ (while (setq line (pop lines))
+ ;; Remove the quoted HTML tags.
+ (setq line (org-html-expand-for-ascii line))
+ ;; Remove targets
+ (while (string-match "<<<?[^<>]*>>>?[ \t]*\n?" line)
+ (setq line (replace-match "" t t line)))
+ ;; Replace internal links
+ (while (string-match org-bracket-link-regexp line)
+ (setq line (replace-match
+ (if (match-end 3) "[\\3]" "[\\1]")
+ t nil line)))
+ (when custom-times
+ (setq line (org-translate-time line)))
+ (cond
+ ((string-match "^\\(\\*+\\)[ \t]+\\(.*\\)" line)
+ ;; a Headline
+ (setq first-heading-pos (or first-heading-pos (point)))
+ (setq level (org-tr-level (- (match-end 1) (match-beginning 1)))
+ txt (match-string 2 line))
+ (org-ascii-level-start level txt umax lines))
+
+ ((and org-export-with-tables
+ (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)" line))
+ (if (not table-open)
+ ;; New table starts
+ (setq table-open t table-buffer nil))
+ ;; Accumulate lines
+ (setq table-buffer (cons line table-buffer))
+ (when (or (not lines)
+ (not (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)"
+ (car lines))))
+ (setq table-open nil
+ table-buffer (nreverse table-buffer))
+ (insert (mapconcat
+ (lambda (x)
+ (org-fix-indentation x org-ascii-current-indentation))
+ (org-format-table-ascii table-buffer)
+ "\n") "\n")))
+ (t
+ (setq line (org-fix-indentation line org-ascii-current-indentation))
+ (if (and org-export-with-fixed-width
+ (string-match "^\\([ \t]*\\)\\(:\\)" line))
+ (setq line (replace-match "\\1" nil nil line)))
+ (insert line "\n"))))
+
+ (normal-mode)
+
+ ;; insert the table of contents
+ (when thetoc
+ (goto-char (point-min))
+ (if (re-search-forward "^[ \t]*\\[TABLE-OF-CONTENTS\\][ \t]*$" nil t)
+ (progn
+ (goto-char (match-beginning 0))
+ (replace-match ""))
+ (goto-char first-heading-pos))
+ (mapc 'insert thetoc)
+ (or (looking-at "[ \t]*\n[ \t]*\n")
+ (insert "\n\n")))
+
+ ;; Convert whitespace place holders
+ (goto-char (point-min))
+ (let (beg end)
+ (while (setq beg (next-single-property-change (point) 'org-whitespace))
+ (setq end (next-single-property-change beg 'org-whitespace))
+ (goto-char beg)
+ (delete-region beg end)
+ (insert (make-string (- end beg) ?\ ))))
+
+ (save-buffer)
+ ;; remove display and invisible chars
+ (let (beg end)
+ (goto-char (point-min))
+ (while (setq beg (next-single-property-change (point) 'display))
+ (setq end (next-single-property-change beg 'display))
+ (delete-region beg end)
+ (goto-char beg)
+ (insert "=>"))
+ (goto-char (point-min))
+ (while (setq beg (next-single-property-change (point) 'org-cwidth))
+ (setq end (next-single-property-change beg 'org-cwidth))
+ (delete-region beg end)
+ (goto-char beg)))
+ (goto-char (point-min))))
+
+(defun org-export-ascii-clean-string ()
+ "Do extra work for ASCII export"
+ (goto-char (point-min))
+ (while (re-search-forward org-verbatim-re nil t)
+ (goto-char (match-end 2))
+ (backward-delete-char 1) (insert "'")
+ (goto-char (match-beginning 2))
+ (delete-char 1) (insert "`")
+ (goto-char (match-end 2))))
+
+(defun org-search-todo-below (line lines level)
+ "Search the subtree below LINE for any TODO entries."
+ (let ((rest (cdr (memq line lines)))
+ (re org-todo-line-regexp)
+ line lv todo)
+ (catch 'exit
+ (while (setq line (pop rest))
+ (if (string-match re line)
+ (progn
+ (setq lv (- (match-end 1) (match-beginning 1))
+ todo (and (match-beginning 2)
+ (not (member (match-string 2 line)
+ org-done-keywords))))
+ ; TODO, not DONE
+ (if (<= lv level) (throw 'exit nil))
+ (if todo (throw 'exit t))))))))
+
+(defun org-html-expand-for-ascii (line)
+ "Handle quoted HTML for ASCII export."
+ (if org-export-html-expand
+ (while (string-match "@<[^<>\n]*>" line)
+ ;; We just remove the tags for now.
+ (setq line (replace-match "" nil nil line))))
+ line)
+
+(defun org-insert-centered (s &optional underline)
+ "Insert the string S centered and underline it with character UNDERLINE."
+ (let ((ind (max (/ (- 80 (string-width s)) 2) 0)))
+ (insert (make-string ind ?\ ) s "\n")
+ (if underline
+ (insert (make-string ind ?\ )
+ (make-string (string-width s) underline)
+ "\n"))))
+
+(defun org-ascii-level-start (level title umax &optional lines)
+ "Insert a new level in ASCII export."
+ (let (char (n (- level umax 1)) (ind 0))
+ (if (> level umax)
+ (progn
+ (insert (make-string (* 2 n) ?\ )
+ (char-to-string (nth (% n (length org-export-ascii-bullets))
+ org-export-ascii-bullets))
+ " " title "\n")
+ ;; find the indentation of the next non-empty line
+ (catch 'stop
+ (while lines
+ (if (string-match "^\\* " (car lines)) (throw 'stop nil))
+ (if (string-match "^\\([ \t]*\\)\\S-" (car lines))
+ (throw 'stop (setq ind (org-get-indentation (car lines)))))
+ (pop lines)))
+ (setq org-ascii-current-indentation (cons (* 2 (1+ n)) ind)))
+ (if (or (not (equal (char-before) ?\n))
+ (not (equal (char-before (1- (point))) ?\n)))
+ (insert "\n"))
+ (setq char (nth (- umax level) (reverse org-export-ascii-underline)))
+ (unless org-export-with-tags
+ (if (string-match (org-re "[ \t]+\\(:[[:alnum:]_@:]+:\\)[ \t]*$") title)
+ (setq title (replace-match "" t t title))))
+ (if org-export-with-section-numbers
+ (setq title (concat (org-section-number level) " " title)))
+ (insert title "\n" (make-string (string-width title) char) "\n")
+ (setq org-ascii-current-indentation '(0 . 0)))))
+
+(defun org-export-visible (type arg)
+ "Create a copy of the visible part of the current buffer, and export it.
+The copy is created in a temporary buffer and removed after use.
+TYPE is the final key (as a string) that also select the export command in
+the `C-c C-e' export dispatcher.
+As a special case, if the you type SPC at the prompt, the temporary
+org-mode file will not be removed but presented to you so that you can
+continue to use it. The prefix arg ARG is passed through to the exporting
+command."
+ (interactive
+ (list (progn
+ (message "Export visible: [a]SCII [h]tml [b]rowse HTML [H/R]uffer with HTML [x]OXO [ ]keep buffer")
+ (read-char-exclusive))
+ current-prefix-arg))
+ (if (not (member type '(?a ?\C-a ?b ?\C-b ?h ?x ?\ )))
+ (error "Invalid export key"))
+ (let* ((binding (cdr (assoc type
+ '((?a . org-export-as-ascii)
+ (?\C-a . org-export-as-ascii)
+ (?b . org-export-as-html-and-open)
+ (?\C-b . org-export-as-html-and-open)
+ (?h . org-export-as-html)
+ (?H . org-export-as-html-to-buffer)
+ (?R . org-export-region-as-html)
+ (?x . org-export-as-xoxo)))))
+ (keepp (equal type ?\ ))
+ (file buffer-file-name)
+ (buffer (get-buffer-create "*Org Export Visible*"))
+ s e)
+ ;; Need to hack the drawers here.
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward org-drawer-regexp nil t)
+ (goto-char (match-beginning 1))
+ (or (org-invisible-p) (org-flag-drawer nil))))
+ (with-current-buffer buffer (erase-buffer))
+ (save-excursion
+ (setq s (goto-char (point-min)))
+ (while (not (= (point) (point-max)))
+ (goto-char (org-find-invisible))
+ (append-to-buffer buffer s (point))
+ (setq s (goto-char (org-find-visible))))
+ (org-cycle-hide-drawers 'all)
+ (goto-char (point-min))
+ (unless keepp
+ ;; Copy all comment lines to the end, to make sure #+ settings are
+ ;; still available for the second export step. Kind of a hack, but
+ ;; does do the trick.
+ (if (looking-at "#[^\r\n]*")
+ (append-to-buffer buffer (match-beginning 0) (1+ (match-end 0))))
+ (while (re-search-forward "[\n\r]#[^\n\r]*" nil t)
+ (append-to-buffer buffer (1+ (match-beginning 0))
+ (min (point-max) (1+ (match-end 0))))))
+ (set-buffer buffer)
+ (let ((buffer-file-name file)
+ (org-inhibit-startup t))
+ (org-mode)
+ (show-all)
+ (unless keepp (funcall binding arg))))
+ (if (not keepp)
+ (kill-buffer buffer)
+ (switch-to-buffer-other-window buffer)
+ (goto-char (point-min)))))
+
+(defun org-find-visible ()
+ (let ((s (point)))
+ (while (and (not (= (point-max) (setq s (next-overlay-change s))))
+ (get-char-property s 'invisible)))
+ s))
+(defun org-find-invisible ()
+ (let ((s (point)))
+ (while (and (not (= (point-max) (setq s (next-overlay-change s))))
+ (not (get-char-property s 'invisible))))
+ s))
+
+;;; HTML export
+
+(defun org-get-current-options ()
+ "Return a string with current options as keyword options.
+Does include HTML export options as well as TODO and CATEGORY stuff."
+ (format
+ "#+TITLE: %s
+#+AUTHOR: %s
+#+EMAIL: %s
+#+LANGUAGE: %s
+#+TEXT: Some descriptive text to be emitted. Several lines OK.
+#+OPTIONS: H:%d num:%s toc:%s \\n:%s @:%s ::%s |:%s ^:%s -:%s f:%s *:%s TeX:%s LaTeX:%s skip:%s d:%s tags:%s
+#+CATEGORY: %s
+#+SEQ_TODO: %s
+#+TYP_TODO: %s
+#+PRIORITIES: %c %c %c
+#+DRAWERS: %s
+#+STARTUP: %s %s %s %s %s
+#+TAGS: %s
+#+ARCHIVE: %s
+#+LINK: %s
+"
+ (buffer-name) (user-full-name) user-mail-address org-export-default-language
+ org-export-headline-levels
+ org-export-with-section-numbers
+ org-export-with-toc
+ org-export-preserve-breaks
+ org-export-html-expand
+ org-export-with-fixed-width
+ org-export-with-tables
+ org-export-with-sub-superscripts
+ org-export-with-special-strings
+ org-export-with-footnotes
+ org-export-with-emphasize
+ org-export-with-TeX-macros
+ org-export-with-LaTeX-fragments
+ org-export-skip-text-before-1st-heading
+ org-export-with-drawers
+ org-export-with-tags
+ (file-name-nondirectory buffer-file-name)
+ "TODO FEEDBACK VERIFY DONE"
+ "Me Jason Marie DONE"
+ org-highest-priority org-lowest-priority org-default-priority
+ (mapconcat 'identity org-drawers " ")
+ (cdr (assoc org-startup-folded
+ '((nil . "showall") (t . "overview") (content . "content"))))
+ (if org-odd-levels-only "odd" "oddeven")
+ (if org-hide-leading-stars "hidestars" "showstars")
+ (if org-startup-align-all-tables "align" "noalign")
+ (cond ((eq t org-log-done) "logdone")
+ ((not org-log-done) "nologging")
+ ((listp org-log-done)
+ (mapconcat (lambda (x) (concat "lognote" (symbol-name x)))
+ org-log-done " ")))
+ (or (mapconcat (lambda (x)
+ (cond
+ ((equal '(:startgroup) x) "{")
+ ((equal '(:endgroup) x) "}")
+ ((cdr x) (format "%s(%c)" (car x) (cdr x)))
+ (t (car x))))
+ (or org-tag-alist (org-get-buffer-tags)) " ") "")
+ org-archive-location
+ "org file:~/org/%s.org"
+ ))
+
+(defun org-insert-export-options-template ()
+ "Insert into the buffer a template with information for exporting."
+ (interactive)
+ (if (not (bolp)) (newline))
+ (let ((s (org-get-current-options)))
+ (and (string-match "#\\+CATEGORY" s)
+ (setq s (substring s 0 (match-beginning 0))))
+ (insert s)))
+
+(defun org-toggle-fixed-width-section (arg)
+ "Toggle the fixed-width export.
+If there is no active region, the QUOTE keyword at the current headline is
+inserted or removed. When present, it causes the text between this headline
+and the next to be exported as fixed-width text, and unmodified.
+If there is an active region, this command adds or removes a colon as the
+first character of this line. If the first character of a line is a colon,
+this line is also exported in fixed-width font."
+ (interactive "P")
+ (let* ((cc 0)
+ (regionp (org-region-active-p))
+ (beg (if regionp (region-beginning) (point)))
+ (end (if regionp (region-end)))
+ (nlines (or arg (if (and beg end) (count-lines beg end) 1)))
+ (case-fold-search nil)
+ (re "[ \t]*\\(:\\)")
+ off)
+ (if regionp
+ (save-excursion
+ (goto-char beg)
+ (setq cc (current-column))
+ (beginning-of-line 1)
+ (setq off (looking-at re))
+ (while (> nlines 0)
+ (setq nlines (1- nlines))
+ (beginning-of-line 1)
+ (cond
+ (arg
+ (move-to-column cc t)
+ (insert ":\n")
+ (forward-line -1))
+ ((and off (looking-at re))
+ (replace-match "" t t nil 1))
+ ((not off) (move-to-column cc t) (insert ":")))
+ (forward-line 1)))
+ (save-excursion
+ (org-back-to-heading)
+ (if (looking-at (concat outline-regexp
+ "\\( *\\<" org-quote-string "\\>[ \t]*\\)"))
+ (replace-match "" t t nil 1)
+ (if (looking-at outline-regexp)
+ (progn
+ (goto-char (match-end 0))
+ (insert org-quote-string " "))))))))
+
+(defun org-export-as-html-and-open (arg)
+ "Export the outline as HTML and immediately open it with a browser.
+If there is an active region, export only the region.
+The prefix ARG specifies how many levels of the outline should become
+headlines. The default is 3. Lower levels will become bulleted lists."
+ (interactive "P")
+ (org-export-as-html arg 'hidden)
+ (org-open-file buffer-file-name))
+
+(defun org-export-as-html-batch ()
+ "Call `org-export-as-html', may be used in batch processing as
+emacs --batch
+ --load=$HOME/lib/emacs/org.el
+ --eval \"(setq org-export-headline-levels 2)\"
+ --visit=MyFile --funcall org-export-as-html-batch"
+ (org-export-as-html org-export-headline-levels 'hidden))
+
+(defun org-export-as-html-to-buffer (arg)
+ "Call `org-exort-as-html` with output to a temporary buffer.
+No file is created. The prefix ARG is passed through to `org-export-as-html'."
+ (interactive "P")
+ (org-export-as-html arg nil nil "*Org HTML Export*")
+ (switch-to-buffer-other-window "*Org HTML Export*"))
+
+(defun org-replace-region-by-html (beg end)
+ "Assume the current region has org-mode syntax, and convert it to HTML.
+This can be used in any buffer. For example, you could write an
+itemized list in org-mode syntax in an HTML buffer and then use this
+command to convert it."
+ (interactive "r")
+ (let (reg html buf pop-up-frames)
+ (save-window-excursion
+ (if (org-mode-p)
+ (setq html (org-export-region-as-html
+ beg end t 'string))
+ (setq reg (buffer-substring beg end)
+ buf (get-buffer-create "*Org tmp*"))
+ (with-current-buffer buf
+ (erase-buffer)
+ (insert reg)
+ (org-mode)
+ (setq html (org-export-region-as-html
+ (point-min) (point-max) t 'string)))
+ (kill-buffer buf)))
+ (delete-region beg end)
+ (insert html)))
+
+(defun org-export-region-as-html (beg end &optional body-only buffer)
+ "Convert region from BEG to END in org-mode buffer to HTML.
+If prefix arg BODY-ONLY is set, omit file header, footer, and table of
+contents, and only produce the region of converted text, useful for
+cut-and-paste operations.
+If BUFFER is a buffer or a string, use/create that buffer as a target
+of the converted HTML. If BUFFER is the symbol `string', return the
+produced HTML as a string and leave not buffer behind. For example,
+a Lisp program could call this function in the following way:
+
+ (setq html (org-export-region-as-html beg end t 'string))
+
+When called interactively, the output buffer is selected, and shown
+in a window. A non-interactive call will only retunr the buffer."
+ (interactive "r\nP")
+ (when (interactive-p)
+ (setq buffer "*Org HTML Export*"))
+ (let ((transient-mark-mode t) (zmacs-regions t)
+ rtn)
+ (goto-char end)
+ (set-mark (point)) ;; to activate the region
+ (goto-char beg)
+ (setq rtn (org-export-as-html
+ nil nil nil
+ buffer body-only))
+ (if (fboundp 'deactivate-mark) (deactivate-mark))
+ (if (and (interactive-p) (bufferp rtn))
+ (switch-to-buffer-other-window rtn)
+ rtn)))
+
+(defvar html-table-tag nil) ; dynamically scoped into this.
+(defun org-export-as-html (arg &optional hidden ext-plist
+ to-buffer body-only)
+ "Export the outline as a pretty HTML file.
+If there is an active region, export only the region. The prefix
+ARG specifies how many levels of the outline should become
+headlines. The default is 3. Lower levels will become bulleted
+lists. When HIDDEN is non-nil, don't display the HTML buffer.
+EXT-PLIST is a property list with external parameters overriding
+org-mode's default settings, but still inferior to file-local
+settings. When TO-BUFFER is non-nil, create a buffer with that
+name and export to that buffer. If TO-BUFFER is the symbol `string',
+don't leave any buffer behind but just return the resulting HTML as
+a string. When BODY-ONLY is set, don't produce the file header and footer,
+simply return the content of <body>...</body>, without even
+the body tags themselves."
+ (interactive "P")
+
+ ;; Make sure we have a file name when we need it.
+ (when (and (not (or to-buffer body-only))
+ (not buffer-file-name))
+ (if (buffer-base-buffer)
+ (org-set-local 'buffer-file-name
+ (with-current-buffer (buffer-base-buffer)
+ buffer-file-name))
+ (error "Need a file name to be able to export.")))
+
+ (message "Exporting...")
+ (setq-default org-todo-line-regexp org-todo-line-regexp)
+ (setq-default org-deadline-line-regexp org-deadline-line-regexp)
+ (setq-default org-done-keywords org-done-keywords)
+ (setq-default org-maybe-keyword-time-regexp org-maybe-keyword-time-regexp)
+ (let* ((opt-plist (org-combine-plists (org-default-export-plist)
+ ext-plist
+ (org-infile-export-plist)))
+
+ (style (plist-get opt-plist :style))
+ (link-validate (plist-get opt-plist :link-validation-function))
+ valid thetoc have-headings first-heading-pos
+ (odd org-odd-levels-only)
+ (region-p (org-region-active-p))
+ (subtree-p
+ (when region-p
+ (save-excursion
+ (goto-char (region-beginning))
+ (and (org-at-heading-p)
+ (>= (org-end-of-subtree t t) (region-end))))))
+ ;; The following two are dynamically scoped into other
+ ;; routines below.
+ (org-current-export-dir (org-export-directory :html opt-plist))
+ (org-current-export-file buffer-file-name)
+ (level 0) (line "") (origline "") txt todo
+ (umax nil)
+ (umax-toc nil)
+ (filename (if to-buffer nil
+ (expand-file-name
+ (concat
+ (file-name-sans-extension
+ (or (and subtree-p
+ (org-entry-get (region-beginning)
+ "EXPORT_FILE_NAME" t))
+ (file-name-nondirectory buffer-file-name)))
+ "." org-export-html-extension)
+ (file-name-as-directory
+ (org-export-directory :html opt-plist)))))
+ (current-dir (if buffer-file-name
+ (file-name-directory buffer-file-name)
+ default-directory))
+ (buffer (if to-buffer
+ (cond
+ ((eq to-buffer 'string) (get-buffer-create "*Org HTML Export*"))
+ (t (get-buffer-create to-buffer)))
+ (find-file-noselect filename)))
+ (org-levels-open (make-vector org-level-max nil))
+ (date (plist-get opt-plist :date))
+ (author (plist-get opt-plist :author))
+ (title (or (and subtree-p (org-export-get-title-from-subtree))
+ (plist-get opt-plist :title)
+ (and (not
+ (plist-get opt-plist :skip-before-1st-heading))
+ (org-export-grab-title-from-buffer))
+ (and buffer-file-name
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name)))
+ "UNTITLED"))
+ (html-table-tag (plist-get opt-plist :html-table-tag))
+ (quote-re0 (concat "^[ \t]*" org-quote-string "\\>"))
+ (quote-re (concat "^\\(\\*+\\)\\([ \t]+" org-quote-string "\\>\\)"))
+ (inquote nil)
+ (infixed nil)
+ (in-local-list nil)
+ (local-list-num nil)
+ (local-list-indent nil)
+ (llt org-plain-list-ordered-item-terminator)
+ (email (plist-get opt-plist :email))
+ (language (plist-get opt-plist :language))
+ (lang-words nil)
+ (target-alist nil) tg
+ (head-count 0) cnt
+ (start 0)
+ (coding-system (and (boundp 'buffer-file-coding-system)
+ buffer-file-coding-system))
+ (coding-system-for-write (or org-export-html-coding-system
+ coding-system))
+ (save-buffer-coding-system (or org-export-html-coding-system
+ coding-system))
+ (charset (and coding-system-for-write
+ (fboundp 'coding-system-get)
+ (coding-system-get coding-system-for-write
+ 'mime-charset)))
+ (region
+ (buffer-substring
+ (if region-p (region-beginning) (point-min))
+ (if region-p (region-end) (point-max))))
+ (lines
+ (org-split-string
+ (org-cleaned-string-for-export
+ region
+ :emph-multiline t
+ :for-html t
+ :skip-before-1st-heading
+ (plist-get opt-plist :skip-before-1st-heading)
+ :drawers (plist-get opt-plist :drawers)
+ :archived-trees
+ (plist-get opt-plist :archived-trees)
+ :add-text
+ (plist-get opt-plist :text)
+ :LaTeX-fragments
+ (plist-get opt-plist :LaTeX-fragments))
+ "[\r\n]"))
+ table-open type
+ table-buffer table-orig-buffer
+ ind start-is-num starter didclose
+ rpl path desc descp desc1 desc2 link
+ )
+
+ (let ((inhibit-read-only t))
+ (org-unmodified
+ (remove-text-properties (point-min) (point-max)
+ '(:org-license-to-kill t))))
+
+ (message "Exporting...")
+
+ (setq org-min-level (org-get-min-level lines))
+ (setq org-last-level org-min-level)
+ (org-init-section-numbers)
+
+ (cond
+ ((and date (string-match "%" date))
+ (setq date (format-time-string date (current-time))))
+ (date)
+ (t (setq date (format-time-string "%Y/%m/%d %X" (current-time)))))
+
+ ;; Get the language-dependent settings
+ (setq lang-words (or (assoc language org-export-language-setup)
+ (assoc "en" org-export-language-setup)))
+
+ ;; Switch to the output buffer
+ (set-buffer buffer)
+ (erase-buffer)
+ (fundamental-mode)
+
+ (and (fboundp 'set-buffer-file-coding-system)
+ (set-buffer-file-coding-system coding-system-for-write))
+
+ (let ((case-fold-search nil)
+ (org-odd-levels-only odd))
+ ;; create local variables for all options, to make sure all called
+ ;; functions get the correct information
+ (mapc (lambda (x)
+ (set (make-local-variable (cdr x))
+ (plist-get opt-plist (car x))))
+ org-export-plist-vars)
+ (setq umax (if arg (prefix-numeric-value arg)
+ org-export-headline-levels))
+ (setq umax-toc (if (integerp org-export-with-toc)
+ (min org-export-with-toc umax)
+ umax))
+ (unless body-only
+ ;; File header
+ (insert (format
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
+<html xmlns=\"http://www.w3.org/1999/xhtml\"
+lang=\"%s\" xml:lang=\"%s\">
+<head>
+<title>%s</title>
+<meta http-equiv=\"Content-Type\" content=\"text/html;charset=%s\"/>
+<meta name=\"generator\" content=\"Org-mode\"/>
+<meta name=\"generated\" content=\"%s\"/>
+<meta name=\"author\" content=\"%s\"/>
+%s
+</head><body>
+"
+ language language (org-html-expand title)
+ (or charset "iso-8859-1") date author style))
+
+ (insert (or (plist-get opt-plist :preamble) ""))
+
+ (when (plist-get opt-plist :auto-preamble)
+ (if title (insert (format org-export-html-title-format
+ (org-html-expand title))))))
+
+ (if (and org-export-with-toc (not body-only))
+ (progn
+ (push (format "<h%d>%s</h%d>\n"
+ org-export-html-toplevel-hlevel
+ (nth 3 lang-words)
+ org-export-html-toplevel-hlevel)
+ thetoc)
+ (push "<ul>\n<li>" thetoc)
+ (setq lines
+ (mapcar '(lambda (line)
+ (if (string-match org-todo-line-regexp line)
+ ;; This is a headline
+ (progn
+ (setq have-headings t)
+ (setq level (- (match-end 1) (match-beginning 1))
+ level (org-tr-level level)
+ txt (save-match-data
+ (org-html-expand
+ (org-export-cleanup-toc-line
+ (match-string 3 line))))
+ todo
+ (or (and org-export-mark-todo-in-toc
+ (match-beginning 2)
+ (not (member (match-string 2 line)
+ org-done-keywords)))
+ ; TODO, not DONE
+ (and org-export-mark-todo-in-toc
+ (= level umax-toc)
+ (org-search-todo-below
+ line lines level))))
+ (if (string-match
+ (org-re "[ \t]+:\\([[:alnum:]_@:]+\\):[ \t]*$") txt)
+ (setq txt (replace-match "&nbsp;&nbsp;&nbsp;<span class=\"tag\"> \\1</span>" t nil txt)))
+ (if (string-match quote-re0 txt)
+ (setq txt (replace-match "" t t txt)))
+ (if org-export-with-section-numbers
+ (setq txt (concat (org-section-number level)
+ " " txt)))
+ (if (<= level (max umax umax-toc))
+ (setq head-count (+ head-count 1)))
+ (if (<= level umax-toc)
+ (progn
+ (if (> level org-last-level)
+ (progn
+ (setq cnt (- level org-last-level))
+ (while (>= (setq cnt (1- cnt)) 0)
+ (push "\n<ul>\n<li>" thetoc))
+ (push "\n" thetoc)))
+ (if (< level org-last-level)
+ (progn
+ (setq cnt (- org-last-level level))
+ (while (>= (setq cnt (1- cnt)) 0)
+ (push "</li>\n</ul>" thetoc))
+ (push "\n" thetoc)))
+ ;; Check for targets
+ (while (string-match org-target-regexp line)
+ (setq tg (match-string 1 line)
+ line (replace-match
+ (concat "@<span class=\"target\">" tg "@</span> ")
+ t t line))
+ (push (cons (org-solidify-link-text tg)
+ (format "sec-%d" head-count))
+ target-alist))
+ (while (string-match "&lt;\\(&lt;\\)+\\|&gt;\\(&gt;\\)+" txt)
+ (setq txt (replace-match "" t t txt)))
+ (push
+ (format
+ (if todo
+ "</li>\n<li><a href=\"#sec-%d\"><span class=\"todo\">%s</span></a>"
+ "</li>\n<li><a href=\"#sec-%d\">%s</a>")
+ head-count txt) thetoc)
+
+ (setq org-last-level level))
+ )))
+ line)
+ lines))
+ (while (> org-last-level (1- org-min-level))
+ (setq org-last-level (1- org-last-level))
+ (push "</li>\n</ul>\n" thetoc))
+ (setq thetoc (if have-headings (nreverse thetoc) nil))))
+
+ (setq head-count 0)
+ (org-init-section-numbers)
+
+ (while (setq line (pop lines) origline line)
+ (catch 'nextline
+
+ ;; end of quote section?
+ (when (and inquote (string-match "^\\*+ " line))
+ (insert "</pre>\n")
+ (setq inquote nil))
+ ;; inside a quote section?
+ (when inquote
+ (insert (org-html-protect line) "\n")
+ (throw 'nextline nil))
+
+ ;; verbatim lines
+ (when (and org-export-with-fixed-width
+ (string-match "^[ \t]*:\\(.*\\)" line))
+ (when (not infixed)
+ (setq infixed t)
+ (insert "<pre>\n"))
+ (insert (org-html-protect (match-string 1 line)) "\n")
+ (when (and lines
+ (not (string-match "^[ \t]*\\(:.*\\)"
+ (car lines))))
+ (setq infixed nil)
+ (insert "</pre>\n"))
+ (throw 'nextline nil))
+
+ ;; Protected HTML
+ (when (get-text-property 0 'org-protected line)
+ (let (par)
+ (when (re-search-backward
+ "\\(<p>\\)\\([ \t\r\n]*\\)\\=" (- (point) 100) t)
+ (setq par (match-string 1))
+ (replace-match "\\2\n"))
+ (insert line "\n")
+ (while (and lines
+ (or (= (length (car lines)) 0)
+ (get-text-property 0 'org-protected (car lines))))
+ (insert (pop lines) "\n"))
+ (and par (insert "<p>\n")))
+ (throw 'nextline nil))
+
+ ;; Horizontal line
+ (when (string-match "^[ \t]*-\\{5,\\}[ \t]*$" line)
+ (insert "\n<hr/>\n")
+ (throw 'nextline nil))
+
+ ;; make targets to anchors
+ (while (string-match "<<<?\\([^<>]*\\)>>>?\\((INVISIBLE)\\)?[ \t]*\n?" line)
+ (cond
+ ((match-end 2)
+ (setq line (replace-match
+ (concat "@<a name=\""
+ (org-solidify-link-text (match-string 1 line))
+ "\">\\nbsp@</a>")
+ t t line)))
+ ((and org-export-with-toc (equal (string-to-char line) ?*))
+ (setq line (replace-match
+ (concat "@<span class=\"target\">" (match-string 1 line) "@</span> ")
+; (concat "@<i>" (match-string 1 line) "@</i> ")
+ t t line)))
+ (t
+ (setq line (replace-match
+ (concat "@<a name=\""
+ (org-solidify-link-text (match-string 1 line))
+ "\" class=\"target\">" (match-string 1 line) "@</a> ")
+ t t line)))))
+
+ (setq line (org-html-handle-time-stamps line))
+
+ ;; replace "&" by "&amp;", "<" and ">" by "&lt;" and "&gt;"
+ ;; handle @<..> HTML tags (replace "@&gt;..&lt;" by "<..>")
+ ;; Also handle sub_superscripts and checkboxes
+ (or (string-match org-table-hline-regexp line)
+ (setq line (org-html-expand line)))
+
+ ;; Format the links
+ (setq start 0)
+ (while (string-match org-bracket-link-analytic-regexp line start)
+ (setq start (match-beginning 0))
+ (setq type (if (match-end 2) (match-string 2 line) "internal"))
+ (setq path (match-string 3 line))
+ (setq desc1 (if (match-end 5) (match-string 5 line))
+ desc2 (if (match-end 2) (concat type ":" path) path)
+ descp (and desc1 (not (equal desc1 desc2)))
+ desc (or desc1 desc2))
+ ;; Make an image out of the description if that is so wanted
+ (when (and descp (org-file-image-p desc))
+ (save-match-data
+ (if (string-match "^file:" desc)
+ (setq desc (substring desc (match-end 0)))))
+ (setq desc (concat "<img src=\"" desc "\"/>")))
+ ;; FIXME: do we need to unescape here somewhere?
+ (cond
+ ((equal type "internal")
+ (setq rpl
+ (concat
+ "<a href=\"#"
+ (org-solidify-link-text
+ (save-match-data (org-link-unescape path)) target-alist)
+ "\">" desc "</a>")))
+ ((member type '("http" "https"))
+ ;; standard URL, just check if we need to inline an image
+ (if (and (or (eq t org-export-html-inline-images)
+ (and org-export-html-inline-images (not descp)))
+ (org-file-image-p path))
+ (setq rpl (concat "<img src=\"" type ":" path "\"/>"))
+ (setq link (concat type ":" path))
+ (setq rpl (concat "<a href=\"" link "\">" desc "</a>"))))
+ ((member type '("ftp" "mailto" "news"))
+ ;; standard URL
+ (setq link (concat type ":" path))
+ (setq rpl (concat "<a href=\"" link "\">" desc "</a>")))
+ ((string= type "file")
+ ;; FILE link
+ (let* ((filename path)
+ (abs-p (file-name-absolute-p filename))
+ thefile file-is-image-p search)
+ (save-match-data
+ (if (string-match "::\\(.*\\)" filename)
+ (setq search (match-string 1 filename)
+ filename (replace-match "" t nil filename)))
+ (setq valid
+ (if (functionp link-validate)
+ (funcall link-validate filename current-dir)
+ t))
+ (setq file-is-image-p (org-file-image-p filename))
+ (setq thefile (if abs-p (expand-file-name filename) filename))
+ (when (and org-export-html-link-org-files-as-html
+ (string-match "\\.org$" thefile))
+ (setq thefile (concat (substring thefile 0
+ (match-beginning 0))
+ "." org-export-html-extension))
+ (if (and search
+ ;; make sure this is can be used as target search
+ (not (string-match "^[0-9]*$" search))
+ (not (string-match "^\\*" search))
+ (not (string-match "^/.*/$" search)))
+ (setq thefile (concat thefile "#"
+ (org-solidify-link-text
+ (org-link-unescape search)))))
+ (when (string-match "^file:" desc)
+ (setq desc (replace-match "" t t desc))
+ (if (string-match "\\.org$" desc)
+ (setq desc (replace-match "" t t desc))))))
+ (setq rpl (if (and file-is-image-p
+ (or (eq t org-export-html-inline-images)
+ (and org-export-html-inline-images
+ (not descp))))
+ (concat "<img src=\"" thefile "\"/>")
+ (concat "<a href=\"" thefile "\">" desc "</a>")))
+ (if (not valid) (setq rpl desc))))
+ ((member type '("bbdb" "vm" "wl" "mhe" "rmail" "gnus" "shell" "info" "elisp"))
+ (setq rpl (concat "<i>&lt;" type ":"
+ (save-match-data (org-link-unescape path))
+ "&gt;</i>"))))
+ (setq line (replace-match rpl t t line)
+ start (+ start (length rpl))))
+
+ ;; TODO items
+ (if (and (string-match org-todo-line-regexp line)
+ (match-beginning 2))
+
+ (setq line
+ (concat (substring line 0 (match-beginning 2))
+ "<span class=\""
+ (if (member (match-string 2 line)
+ org-done-keywords)
+ "done" "todo")
+ "\">" (match-string 2 line)
+ "</span>" (substring line (match-end 2)))))
+
+ ;; Does this contain a reference to a footnote?
+ (when org-export-with-footnotes
+ (setq start 0)
+ (while (string-match "\\([^* \t].*?\\)\\[\\([0-9]+\\)\\]" line start)
+ (if (get-text-property (match-beginning 2) 'org-protected line)
+ (setq start (match-end 2))
+ (let ((n (match-string 2 line)))
+ (setq line
+ (replace-match
+ (format
+ "%s<sup><a class=\"footref\" name=\"fnr.%s\" href=\"#fn.%s\">%s</a></sup>"
+ (match-string 1 line) n n n)
+ t t line))))))
+
+ (cond
+ ((string-match "^\\(\\*+\\)[ \t]+\\(.*\\)" line)
+ ;; This is a headline
+ (setq level (org-tr-level (- (match-end 1) (match-beginning 1)))
+ txt (match-string 2 line))
+ (if (string-match quote-re0 txt)
+ (setq txt (replace-match "" t t txt)))
+ (if (<= level (max umax umax-toc))
+ (setq head-count (+ head-count 1)))
+ (when in-local-list
+ ;; Close any local lists before inserting a new header line
+ (while local-list-num
+ (org-close-li)
+ (insert (if (car local-list-num) "</ol>\n" "</ul>"))
+ (pop local-list-num))
+ (setq local-list-indent nil
+ in-local-list nil))
+ (setq first-heading-pos (or first-heading-pos (point)))
+ (org-html-level-start level txt umax
+ (and org-export-with-toc (<= level umax))
+ head-count)
+ ;; QUOTES
+ (when (string-match quote-re line)
+ (insert "<pre>")
+ (setq inquote t)))
+
+ ((and org-export-with-tables
+ (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)" line))
+ (if (not table-open)
+ ;; New table starts
+ (setq table-open t table-buffer nil table-orig-buffer nil))
+ ;; Accumulate lines
+ (setq table-buffer (cons line table-buffer)
+ table-orig-buffer (cons origline table-orig-buffer))
+ (when (or (not lines)
+ (not (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)"
+ (car lines))))
+ (setq table-open nil
+ table-buffer (nreverse table-buffer)
+ table-orig-buffer (nreverse table-orig-buffer))
+ (org-close-par-maybe)
+ (insert (org-format-table-html table-buffer table-orig-buffer))))
+ (t
+ ;; Normal lines
+ (when (string-match
+ (cond
+ ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)")
+ ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)")
+ ((= llt ?\)) "^\\( \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+)\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)")
+ (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))
+ line)
+ (setq ind (org-get-string-indentation line)
+ start-is-num (match-beginning 4)
+ starter (if (match-beginning 2)
+ (substring (match-string 2 line) 0 -1))
+ line (substring line (match-beginning 5)))
+ (unless (string-match "[^ \t]" line)
+ ;; empty line. Pretend indentation is large.
+ (setq ind (if org-empty-line-terminates-plain-lists
+ 0
+ (1+ (or (car local-list-indent) 1)))))
+ (setq didclose nil)
+ (while (and in-local-list
+ (or (and (= ind (car local-list-indent))
+ (not starter))
+ (< ind (car local-list-indent))))
+ (setq didclose t)
+ (org-close-li)
+ (insert (if (car local-list-num) "</ol>\n" "</ul>"))
+ (pop local-list-num) (pop local-list-indent)
+ (setq in-local-list local-list-indent))
+ (cond
+ ((and starter
+ (or (not in-local-list)
+ (> ind (car local-list-indent))))
+ ;; Start new (level of) list
+ (org-close-par-maybe)
+ (insert (if start-is-num "<ol>\n<li>\n" "<ul>\n<li>\n"))
+ (push start-is-num local-list-num)
+ (push ind local-list-indent)
+ (setq in-local-list t))
+ (starter
+ ;; continue current list
+ (org-close-li)
+ (insert "<li>\n"))
+ (didclose
+ ;; we did close a list, normal text follows: need <p>
+ (org-open-par)))
+ (if (string-match "^[ \t]*\\[\\([X ]\\)\\]" line)
+ (setq line
+ (replace-match
+ (if (equal (match-string 1 line) "X")
+ "<b>[X]</b>"
+ "<b>[<span style=\"visibility:hidden;\">X</span>]</b>")
+ t t line))))
+
+ ;; Empty lines start a new paragraph. If hand-formatted lists
+ ;; are not fully interpreted, lines starting with "-", "+", "*"
+ ;; also start a new paragraph.
+ (if (string-match "^ [-+*]-\\|^[ \t]*$" line) (org-open-par))
+
+ ;; Is this the start of a footnote?
+ (when org-export-with-footnotes
+ (when (string-match "^[ \t]*\\[\\([0-9]+\\)\\]" line)
+ (org-close-par-maybe)
+ (let ((n (match-string 1 line)))
+ (setq line (replace-match
+ (format "<p class=\"footnote\"><sup><a class=\"footnum\" name=\"fn.%s\" href=\"#fnr.%s\">%s</a></sup>" n n n) t t line)))))
+
+ ;; Check if the line break needs to be conserved
+ (cond
+ ((string-match "\\\\\\\\[ \t]*$" line)
+ (setq line (replace-match "<br/>" t t line)))
+ (org-export-preserve-breaks
+ (setq line (concat line "<br/>"))))
+
+ (insert line "\n")))))
+
+ ;; Properly close all local lists and other lists
+ (when inquote (insert "</pre>\n"))
+ (when in-local-list
+ ;; Close any local lists before inserting a new header line
+ (while local-list-num
+ (org-close-li)
+ (insert (if (car local-list-num) "</ol>\n" "</ul>\n"))
+ (pop local-list-num))
+ (setq local-list-indent nil
+ in-local-list nil))
+ (org-html-level-start 1 nil umax
+ (and org-export-with-toc (<= level umax))
+ head-count)
+
+ (unless body-only
+ (when (plist-get opt-plist :auto-postamble)
+ (insert "<div id=\"postamble\">")
+ (when (and org-export-author-info author)
+ (insert "<p class=\"author\"> "
+ (nth 1 lang-words) ": " author "\n")
+ (when email
+ (if (listp (split-string email ",+ *"))
+ (mapc (lambda(e)
+ (insert "<a href=\"mailto:" e "\">&lt;"
+ e "&gt;</a>\n"))
+ (split-string email ",+ *"))
+ (insert "<a href=\"mailto:" email "\">&lt;"
+ email "&gt;</a>\n")))
+ (insert "</p>\n"))
+ (when (and date org-export-time-stamp-file)
+ (insert "<p class=\"date\"> "
+ (nth 2 lang-words) ": "
+ date "</p>\n"))
+ (insert "</div>"))
+
+ (if org-export-html-with-timestamp
+ (insert org-export-html-html-helper-timestamp))
+ (insert (or (plist-get opt-plist :postamble) ""))
+ (insert "</body>\n</html>\n"))
+
+ (normal-mode)
+ (if (eq major-mode default-major-mode) (html-mode))
+
+ ;; insert the table of contents
+ (goto-char (point-min))
+ (when thetoc
+ (if (or (re-search-forward
+ "<p>\\s-*\\[TABLE-OF-CONTENTS\\]\\s-*</p>" nil t)
+ (re-search-forward
+ "\\[TABLE-OF-CONTENTS\\]" nil t))
+ (progn
+ (goto-char (match-beginning 0))
+ (replace-match ""))
+ (goto-char first-heading-pos)
+ (when (looking-at "\\s-*</p>")
+ (goto-char (match-end 0))
+ (insert "\n")))
+ (insert "<div id=\"table-of-contents\">\n")
+ (mapc 'insert thetoc)
+ (insert "</div>\n"))
+ ;; remove empty paragraphs and lists
+ (goto-char (point-min))
+ (while (re-search-forward "<p>[ \r\n\t]*</p>" nil t)
+ (replace-match ""))
+ (goto-char (point-min))
+ (while (re-search-forward "<li>[ \r\n\t]*</li>\n?" nil t)
+ (replace-match ""))
+ ;; Convert whitespace place holders
+ (goto-char (point-min))
+ (let (beg end n)
+ (while (setq beg (next-single-property-change (point) 'org-whitespace))
+ (setq n (get-text-property beg 'org-whitespace)
+ end (next-single-property-change beg 'org-whitespace))
+ (goto-char beg)
+ (delete-region beg end)
+ (insert (format "<span style=\"visibility:hidden;\">%s</span>"
+ (make-string n ?x)))))
+
+ (or to-buffer (save-buffer))
+ (goto-char (point-min))
+ (message "Exporting... done")
+ (if (eq to-buffer 'string)
+ (prog1 (buffer-substring (point-min) (point-max))
+ (kill-buffer (current-buffer)))
+ (current-buffer)))))
+
+(defvar org-table-colgroup-info nil)
+(defun org-format-table-ascii (lines)
+ "Format a table for ascii export."
+ (if (stringp lines)
+ (setq lines (org-split-string lines "\n")))
+ (if (not (string-match "^[ \t]*|" (car lines)))
+ ;; Table made by table.el - test for spanning
+ lines
+
+ ;; A normal org table
+ ;; Get rid of hlines at beginning and end
+ (if (string-match "^[ \t]*|-" (car lines)) (setq lines (cdr lines)))
+ (setq lines (nreverse lines))
+ (if (string-match "^[ \t]*|-" (car lines)) (setq lines (cdr lines)))
+ (setq lines (nreverse lines))
+ (when org-export-table-remove-special-lines
+ ;; Check if the table has a marking column. If yes remove the
+ ;; column and the special lines
+ (setq lines (org-table-clean-before-export lines)))
+ ;; Get rid of the vertical lines except for grouping
+ (let ((vl (org-colgroup-info-to-vline-list org-table-colgroup-info))
+ rtn line vl1 start)
+ (while (setq line (pop lines))
+ (if (string-match org-table-hline-regexp line)
+ (and (string-match "|\\(.*\\)|" line)
+ (setq line (replace-match " \\1" t nil line)))
+ (setq start 0 vl1 vl)
+ (while (string-match "|" line start)
+ (setq start (match-end 0))
+ (or (pop vl1) (setq line (replace-match " " t t line)))))
+ (push line rtn))
+ (nreverse rtn))))
+
+(defun org-colgroup-info-to-vline-list (info)
+ (let (vl new last)
+ (while info
+ (setq last new new (pop info))
+ (if (or (memq last '(:end :startend))
+ (memq new '(:start :startend)))
+ (push t vl)
+ (push nil vl)))
+ (setq vl (nreverse vl))
+ (and vl (setcar vl nil))
+ vl))
+
+(defun org-format-table-html (lines olines)
+ "Find out which HTML converter to use and return the HTML code."
+ (if (stringp lines)
+ (setq lines (org-split-string lines "\n")))
+ (if (string-match "^[ \t]*|" (car lines))
+ ;; A normal org table
+ (org-format-org-table-html lines)
+ ;; Table made by table.el - test for spanning
+ (let* ((hlines (delq nil (mapcar
+ (lambda (x)
+ (if (string-match "^[ \t]*\\+-" x) x
+ nil))
+ lines)))
+ (first (car hlines))
+ (ll (and (string-match "\\S-+" first)
+ (match-string 0 first)))
+ (re (concat "^[ \t]*" (regexp-quote ll)))
+ (spanning (delq nil (mapcar (lambda (x) (not (string-match re x)))
+ hlines))))
+ (if (and (not spanning)
+ (not org-export-prefer-native-exporter-for-tables))
+ ;; We can use my own converter with HTML conversions
+ (org-format-table-table-html lines)
+ ;; Need to use the code generator in table.el, with the original text.
+ (org-format-table-table-html-using-table-generate-source olines)))))
+
+(defun org-format-org-table-html (lines &optional splice)
+ "Format a table into HTML."
+ ;; Get rid of hlines at beginning and end
+ (if (string-match "^[ \t]*|-" (car lines)) (setq lines (cdr lines)))
+ (setq lines (nreverse lines))
+ (if (string-match "^[ \t]*|-" (car lines)) (setq lines (cdr lines)))
+ (setq lines (nreverse lines))
+ (when org-export-table-remove-special-lines
+ ;; Check if the table has a marking column. If yes remove the
+ ;; column and the special lines
+ (setq lines (org-table-clean-before-export lines)))
+
+ (let ((head (and org-export-highlight-first-table-line
+ (delq nil (mapcar
+ (lambda (x) (string-match "^[ \t]*|-" x))
+ (cdr lines)))))
+ (nlines 0) fnum i
+ tbopen line fields html gr colgropen)
+ (if splice (setq head nil))
+ (unless splice (push (if head "<thead>" "<tbody>") html))
+ (setq tbopen t)
+ (while (setq line (pop lines))
+ (catch 'next-line
+ (if (string-match "^[ \t]*|-" line)
+ (progn
+ (unless splice
+ (push (if head "</thead>" "</tbody>") html)
+ (if lines (push "<tbody>" html) (setq tbopen nil)))
+ (setq head nil) ;; head ends here, first time around
+ ;; ignore this line
+ (throw 'next-line t)))
+ ;; Break the line into fields
+ (setq fields (org-split-string line "[ \t]*|[ \t]*"))
+ (unless fnum (setq fnum (make-vector (length fields) 0)))
+ (setq nlines (1+ nlines) i -1)
+ (push (concat "<tr>"
+ (mapconcat
+ (lambda (x)
+ (setq i (1+ i))
+ (if (and (< i nlines)
+ (string-match org-table-number-regexp x))
+ (incf (aref fnum i)))
+ (if head
+ (concat (car org-export-table-header-tags) x
+ (cdr org-export-table-header-tags))
+ (concat (car org-export-table-data-tags) x
+ (cdr org-export-table-data-tags))))
+ fields "")
+ "</tr>")
+ html)))
+ (unless splice (if tbopen (push "</tbody>" html)))
+ (unless splice (push "</table>\n" html))
+ (setq html (nreverse html))
+ (unless splice
+ ;; Put in col tags with the alignment (unfortuntely often ignored...)
+ (push (mapconcat
+ (lambda (x)
+ (setq gr (pop org-table-colgroup-info))
+ (format "%s<col align=\"%s\"></col>%s"
+ (if (memq gr '(:start :startend))
+ (prog1
+ (if colgropen "</colgroup>\n<colgroup>" "<colgroup>")
+ (setq colgropen t))
+ "")
+ (if (> (/ (float x) nlines) org-table-number-fraction)
+ "right" "left")
+ (if (memq gr '(:end :startend))
+ (progn (setq colgropen nil) "</colgroup>")
+ "")))
+ fnum "")
+ html)
+ (if colgropen (setq html (cons (car html) (cons "</colgroup>" (cdr html)))))
+ (push html-table-tag html))
+ (concat (mapconcat 'identity html "\n") "\n")))
+
+(defun org-table-clean-before-export (lines)
+ "Check if the table has a marking column.
+If yes remove the column and the special lines."
+ (setq org-table-colgroup-info nil)
+ (if (memq nil
+ (mapcar
+ (lambda (x) (or (string-match "^[ \t]*|-" x)
+ (string-match "^[ \t]*| *\\([#!$*_^ /]\\) *|" x)))
+ lines))
+ (progn
+ (setq org-table-clean-did-remove-column nil)
+ (delq nil
+ (mapcar
+ (lambda (x)
+ (cond
+ ((string-match "^[ \t]*| */ *|" x)
+ (setq org-table-colgroup-info
+ (mapcar (lambda (x)
+ (cond ((member x '("<" "&lt;")) :start)
+ ((member x '(">" "&gt;")) :end)
+ ((member x '("<>" "&lt;&gt;")) :startend)
+ (t nil)))
+ (org-split-string x "[ \t]*|[ \t]*")))
+ nil)
+ (t x)))
+ lines)))
+ (setq org-table-clean-did-remove-column t)
+ (delq nil
+ (mapcar
+ (lambda (x)
+ (cond
+ ((string-match "^[ \t]*| */ *|" x)
+ (setq org-table-colgroup-info
+ (mapcar (lambda (x)
+ (cond ((member x '("<" "&lt;")) :start)
+ ((member x '(">" "&gt;")) :end)
+ ((member x '("<>" "&lt;&gt;")) :startend)
+ (t nil)))
+ (cdr (org-split-string x "[ \t]*|[ \t]*"))))
+ nil)
+ ((string-match "^[ \t]*| *[!_^/] *|" x)
+ nil) ; ignore this line
+ ((or (string-match "^\\([ \t]*\\)|-+\\+" x)
+ (string-match "^\\([ \t]*\\)|[^|]*|" x))
+ ;; remove the first column
+ (replace-match "\\1|" t nil x))))
+ lines))))
+
+(defun org-format-table-table-html (lines)
+ "Format a table generated by table.el into HTML.
+This conversion does *not* use `table-generate-source' from table.el.
+This has the advantage that Org-mode's HTML conversions can be used.
+But it has the disadvantage, that no cell- or row-spanning is allowed."
+ (let (line field-buffer
+ (head org-export-highlight-first-table-line)
+ fields html empty)
+ (setq html (concat html-table-tag "\n"))
+ (while (setq line (pop lines))
+ (setq empty "&nbsp;")
+ (catch 'next-line
+ (if (string-match "^[ \t]*\\+-" line)
+ (progn
+ (if field-buffer
+ (progn
+ (setq
+ html
+ (concat
+ html
+ "<tr>"
+ (mapconcat
+ (lambda (x)
+ (if (equal x "") (setq x empty))
+ (if head
+ (concat (car org-export-table-header-tags) x
+ (cdr org-export-table-header-tags))
+ (concat (car org-export-table-data-tags) x
+ (cdr org-export-table-data-tags))))
+ field-buffer "\n")
+ "</tr>\n"))
+ (setq head nil)
+ (setq field-buffer nil)))
+ ;; Ignore this line
+ (throw 'next-line t)))
+ ;; Break the line into fields and store the fields
+ (setq fields (org-split-string line "[ \t]*|[ \t]*"))
+ (if field-buffer
+ (setq field-buffer (mapcar
+ (lambda (x)
+ (concat x "<br/>" (pop fields)))
+ field-buffer))
+ (setq field-buffer fields))))
+ (setq html (concat html "</table>\n"))
+ html))
+
+(defun org-format-table-table-html-using-table-generate-source (lines)
+ "Format a table into html, using `table-generate-source' from table.el.
+This has the advantage that cell- or row-spanning is allowed.
+But it has the disadvantage, that Org-mode's HTML conversions cannot be used."
+ (require 'table)
+ (with-current-buffer (get-buffer-create " org-tmp1 ")
+ (erase-buffer)
+ (insert (mapconcat 'identity lines "\n"))
+ (goto-char (point-min))
+ (if (not (re-search-forward "|[^+]" nil t))
+ (error "Error processing table"))
+ (table-recognize-table)
+ (with-current-buffer (get-buffer-create " org-tmp2 ") (erase-buffer))
+ (table-generate-source 'html " org-tmp2 ")
+ (set-buffer " org-tmp2 ")
+ (buffer-substring (point-min) (point-max))))
+
+(defun org-html-handle-time-stamps (s)
+ "Format time stamps in string S, or remove them."
+ (catch 'exit
+ (let (r b)
+ (while (string-match org-maybe-keyword-time-regexp s)
+ (if (and (match-end 1) (equal (match-string 1 s) org-clock-string))
+ ;; never export CLOCK
+ (throw 'exit ""))
+ (or b (setq b (substring s 0 (match-beginning 0))))
+ (if (not org-export-with-timestamps)
+ (setq r (concat r (substring s 0 (match-beginning 0)))
+ s (substring s (match-end 0)))
+ (setq r (concat
+ r (substring s 0 (match-beginning 0))
+ (if (match-end 1)
+ (format "@<span class=\"timestamp-kwd\">%s @</span>"
+ (match-string 1 s)))
+ (format " @<span class=\"timestamp\">%s@</span>"
+ (substring
+ (org-translate-time (match-string 3 s)) 1 -1)))
+ s (substring s (match-end 0)))))
+ ;; Line break if line started and ended with time stamp stuff
+ (if (not r)
+ s
+ (setq r (concat r s))
+ (unless (string-match "\\S-" (concat b s))
+ (setq r (concat r "@<br/>")))
+ r))))
+
+(defun org-html-protect (s)
+ ;; convert & to &amp;, < to &lt; and > to &gt;
+ (let ((start 0))
+ (while (string-match "&" s start)
+ (setq s (replace-match "&amp;" t t s)
+ start (1+ (match-beginning 0))))
+ (while (string-match "<" s)
+ (setq s (replace-match "&lt;" t t s)))
+ (while (string-match ">" s)
+ (setq s (replace-match "&gt;" t t s))))
+ s)
+
+(defun org-export-cleanup-toc-line (s)
+ "Remove tags and time staps from lines going into the toc."
+ (when (memq org-export-with-tags '(not-in-toc nil))
+ (if (string-match (org-re " +:[[:alnum:]_@:]+: *$") s)
+ (setq s (replace-match "" t t s))))
+ (when org-export-remove-timestamps-from-toc
+ (while (string-match org-maybe-keyword-time-regexp s)
+ (setq s (replace-match "" t t s))))
+ (while (string-match org-bracket-link-regexp s)
+ (setq s (replace-match (match-string (if (match-end 3) 3 1) s)
+ t t s)))
+ s)
+
+(defun org-html-expand (string)
+ "Prepare STRING for HTML export. Applies all active conversions.
+If there are links in the string, don't modify these."
+ (let* ((re (concat org-bracket-link-regexp "\\|"
+ (org-re "[ \t]+\\(:[[:alnum:]_@:]+:\\)[ \t]*$")))
+ m s l res)
+ (while (setq m (string-match re string))
+ (setq s (substring string 0 m)
+ l (match-string 0 string)
+ string (substring string (match-end 0)))
+ (push (org-html-do-expand s) res)
+ (push l res))
+ (push (org-html-do-expand string) res)
+ (apply 'concat (nreverse res))))
+
+(defun org-html-do-expand (s)
+ "Apply all active conversions to translate special ASCII to HTML."
+ (setq s (org-html-protect s))
+ (if org-export-html-expand
+ (let ((start 0))
+ (while (string-match "@&lt;\\([^&]*\\)&gt;" s)
+ (setq s (replace-match "<\\1>" t nil s)))))
+ (if org-export-with-emphasize
+ (setq s (org-export-html-convert-emphasize s)))
+ (if org-export-with-special-strings
+ (setq s (org-export-html-convert-special-strings s)))
+ (if org-export-with-sub-superscripts
+ (setq s (org-export-html-convert-sub-super s)))
+ (if org-export-with-TeX-macros
+ (let ((start 0) wd ass)
+ (while (setq start (string-match "\\\\\\([a-zA-Z]+\\)" s start))
+ (if (get-text-property (match-beginning 0) 'org-protected s)
+ (setq start (match-end 0))
+ (setq wd (match-string 1 s))
+ (if (setq ass (assoc wd org-html-entities))
+ (setq s (replace-match (or (cdr ass)
+ (concat "&" (car ass) ";"))
+ t t s))
+ (setq start (+ start (length wd))))))))
+ s)
+
+(defun org-create-multibrace-regexp (left right n)
+ "Create a regular expression which will match a balanced sexp.
+Opening delimiter is LEFT, and closing delimiter is RIGHT, both given
+as single character strings.
+The regexp returned will match the entire expression including the
+delimiters. It will also define a single group which contains the
+match except for the outermost delimiters. The maximum depth of
+stacked delimiters is N. Escaping delimiters is not possible."
+ (let* ((nothing (concat "[^" "\\" left "\\" right "]*?"))
+ (or "\\|")
+ (re nothing)
+ (next (concat "\\(?:" nothing left nothing right "\\)+" nothing)))
+ (while (> n 1)
+ (setq n (1- n)
+ re (concat re or next)
+ next (concat "\\(?:" nothing left next right "\\)+" nothing)))
+ (concat left "\\(" re "\\)" right)))
+
+(defvar org-match-substring-regexp
+ (concat
+ "\\([^\\]\\)\\([_^]\\)\\("
+ "\\(" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)"
+ "\\|"
+ "\\(" (org-create-multibrace-regexp "(" ")" org-match-sexp-depth) "\\)"
+ "\\|"
+ "\\(\\(?:\\*\\|[-+]?[^-+*!@#$%^_ \t\r\n,:\"?<>~;./{}=()]+\\)\\)\\)")
+ "The regular expression matching a sub- or superscript.")
+
+(defvar org-match-substring-with-braces-regexp
+ (concat
+ "\\([^\\]\\)\\([_^]\\)\\("
+ "\\(" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)"
+ "\\)")
+ "The regular expression matching a sub- or superscript, forcing braces.")
+
+(defconst org-export-html-special-string-regexps
+ '(("\\\\-" . "&shy;")
+ ("---\\([^-]\\)" . "&mdash;\\1")
+ ("--\\([^-]\\)" . "&ndash;\\1")
+ ("\\.\\.\\." . "&hellip;"))
+ "Regular expressions for special string conversion.")
+
+(defun org-export-html-convert-special-strings (string)
+ "Convert special characters in STRING to HTML."
+ (let ((all org-export-html-special-string-regexps)
+ e a re rpl start)
+ (while (setq a (pop all))
+ (setq re (car a) rpl (cdr a) start 0)
+ (while (string-match re string start)
+ (if (get-text-property (match-beginning 0) 'org-protected string)
+ (setq start (match-end 0))
+ (setq string (replace-match rpl t nil string)))))
+ string))
+
+(defun org-export-html-convert-sub-super (string)
+ "Convert sub- and superscripts in STRING to HTML."
+ (let (key c (s 0) (requireb (eq org-export-with-sub-superscripts '{})))
+ (while (string-match org-match-substring-regexp string s)
+ (cond
+ ((and requireb (match-end 8)) (setq s (match-end 2)))
+ ((get-text-property (match-beginning 2) 'org-protected string)
+ (setq s (match-end 2)))
+ (t
+ (setq s (match-end 1)
+ key (if (string= (match-string 2 string) "_") "sub" "sup")
+ c (or (match-string 8 string)
+ (match-string 6 string)
+ (match-string 5 string))
+ string (replace-match
+ (concat (match-string 1 string)
+ "<" key ">" c "</" key ">")
+ t t string)))))
+ (while (string-match "\\\\\\([_^]\\)" string)
+ (setq string (replace-match (match-string 1 string) t t string)))
+ string))
+
+(defun org-export-html-convert-emphasize (string)
+ "Apply emphasis."
+ (let ((s 0) rpl)
+ (while (string-match org-emph-re string s)
+ (if (not (equal
+ (substring string (match-beginning 3) (1+ (match-beginning 3)))
+ (substring string (match-beginning 4) (1+ (match-beginning 4)))))
+ (setq s (match-beginning 0)
+ rpl
+ (concat
+ (match-string 1 string)
+ (nth 2 (assoc (match-string 3 string) org-emphasis-alist))
+ (match-string 4 string)
+ (nth 3 (assoc (match-string 3 string)
+ org-emphasis-alist))
+ (match-string 5 string))
+ string (replace-match rpl t t string)
+ s (+ s (- (length rpl) 2)))
+ (setq s (1+ s))))
+ string))
+
+(defvar org-par-open nil)
+(defun org-open-par ()
+ "Insert <p>, but first close previous paragraph if any."
+ (org-close-par-maybe)
+ (insert "\n<p>")
+ (setq org-par-open t))
+(defun org-close-par-maybe ()
+ "Close paragraph if there is one open."
+ (when org-par-open
+ (insert "</p>")
+ (setq org-par-open nil)))
+(defun org-close-li ()
+ "Close <li> if necessary."
+ (org-close-par-maybe)
+ (insert "</li>\n"))
+
+(defvar body-only) ; dynamically scoped into this.
+(defun org-html-level-start (level title umax with-toc head-count)
+ "Insert a new level in HTML export.
+When TITLE is nil, just close all open levels."
+ (org-close-par-maybe)
+ (let ((l org-level-max))
+ (while (>= l level)
+ (if (aref org-levels-open (1- l))
+ (progn
+ (org-html-level-close l umax)
+ (aset org-levels-open (1- l) nil)))
+ (setq l (1- l)))
+ (when title
+ ;; If title is nil, this means this function is called to close
+ ;; all levels, so the rest is done only if title is given
+ (when (string-match (org-re "\\(:[[:alnum:]_@:]+:\\)[ \t]*$") title)
+ (setq title (replace-match
+ (if org-export-with-tags
+ (save-match-data
+ (concat
+ "&nbsp;&nbsp;&nbsp;<span class=\"tag\">"
+ (mapconcat 'identity (org-split-string
+ (match-string 1 title) ":")
+ "&nbsp;")
+ "</span>"))
+ "")
+ t t title)))
+ (if (> level umax)
+ (progn
+ (if (aref org-levels-open (1- level))
+ (progn
+ (org-close-li)
+ (insert "<li>" title "<br/>\n"))
+ (aset org-levels-open (1- level) t)
+ (org-close-par-maybe)
+ (insert "<ul>\n<li>" title "<br/>\n")))
+ (aset org-levels-open (1- level) t)
+ (if (and org-export-with-section-numbers (not body-only))
+ (setq title (concat (org-section-number level) " " title)))
+ (setq level (+ level org-export-html-toplevel-hlevel -1))
+ (if with-toc
+ (insert (format "\n<div class=\"outline-%d\">\n<h%d id=\"sec-%d\">%s</h%d>\n"
+ level level head-count title level))
+ (insert (format "\n<div class=\"outline-%d\">\n<h%d>%s</h%d>\n" level level title level)))
+ (org-open-par)))))
+
+(defun org-html-level-close (level max-outline-level)
+ "Terminate one level in HTML export."
+ (if (<= level max-outline-level)
+ (insert "</div>\n")
+ (org-close-li)
+ (insert "</ul>\n")))
+
+;;; iCalendar export
+
+;;;###autoload
+(defun org-export-icalendar-this-file ()
+ "Export current file as an iCalendar file.
+The iCalendar file will be located in the same directory as the Org-mode
+file, but with extension `.ics'."
+ (interactive)
+ (org-export-icalendar nil buffer-file-name))
+
+;;;###autoload
+(defun org-export-icalendar-all-agenda-files ()
+ "Export all files in `org-agenda-files' to iCalendar .ics files.
+Each iCalendar file will be located in the same directory as the Org-mode
+file, but with extension `.ics'."
+ (interactive)
+ (apply 'org-export-icalendar nil (org-agenda-files t)))
+
+;;;###autoload
+(defun org-export-icalendar-combine-agenda-files ()
+ "Export all files in `org-agenda-files' to a single combined iCalendar file.
+The file is stored under the name `org-combined-agenda-icalendar-file'."
+ (interactive)
+ (apply 'org-export-icalendar t (org-agenda-files t)))
+
+(defun org-export-icalendar (combine &rest files)
+ "Create iCalendar files for all elements of FILES.
+If COMBINE is non-nil, combine all calendar entries into a single large
+file and store it under the name `org-combined-agenda-icalendar-file'."
+ (save-excursion
+ (org-prepare-agenda-buffers files)
+ (let* ((dir (org-export-directory
+ :ical (list :publishing-directory
+ org-export-publishing-directory)))
+ file ical-file ical-buffer category started org-agenda-new-buffers)
+
+ (and (get-buffer "*ical-tmp*") (kill-buffer "*ical-tmp*"))
+ (when combine
+ (setq ical-file
+ (if (file-name-absolute-p org-combined-agenda-icalendar-file)
+ org-combined-agenda-icalendar-file
+ (expand-file-name org-combined-agenda-icalendar-file dir))
+ ical-buffer (org-get-agenda-file-buffer ical-file))
+ (set-buffer ical-buffer) (erase-buffer))
+ (while (setq file (pop files))
+ (catch 'nextfile
+ (org-check-agenda-file file)
+ (set-buffer (org-get-agenda-file-buffer file))
+ (unless combine
+ (setq ical-file (concat (file-name-as-directory dir)
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))
+ ".ics"))
+ (setq ical-buffer (org-get-agenda-file-buffer ical-file))
+ (with-current-buffer ical-buffer (erase-buffer)))
+ (setq category (or org-category
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))))
+ (if (symbolp category) (setq category (symbol-name category)))
+ (let ((standard-output ical-buffer))
+ (if combine
+ (and (not started) (setq started t)
+ (org-start-icalendar-file org-icalendar-combined-name))
+ (org-start-icalendar-file category))
+ (org-print-icalendar-entries combine)
+ (when (or (and combine (not files)) (not combine))
+ (org-finish-icalendar-file)
+ (set-buffer ical-buffer)
+ (save-buffer)
+ (run-hooks 'org-after-save-iCalendar-file-hook)))))
+ (org-release-buffers org-agenda-new-buffers))))
+
+(defvar org-after-save-iCalendar-file-hook nil
+ "Hook run after an iCalendar file has been saved.
+The iCalendar buffer is still current when this hook is run.
+A good way to use this is to tell a desktop calenndar application to re-read
+the iCalendar file.")
+
+(defun org-print-icalendar-entries (&optional combine)
+ "Print iCalendar entries for the current Org-mode file to `standard-output'.
+When COMBINE is non nil, add the category to each line."
+ (let ((re1 (concat org-ts-regexp "\\|<%%([^>\n]+>"))
+ (re2 (concat "--?-?\\(" org-ts-regexp "\\)"))
+ (dts (org-ical-ts-to-string
+ (format-time-string (cdr org-time-stamp-formats) (current-time))
+ "DTSTART"))
+ hd ts ts2 state status (inc t) pos b sexp rrule
+ scheduledp deadlinep tmp pri category entry location summary desc
+ (sexp-buffer (get-buffer-create "*ical-tmp*")))
+ (org-refresh-category-properties)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward re1 nil t)
+ (catch :skip
+ (org-agenda-skip)
+ (setq pos (match-beginning 0)
+ ts (match-string 0)
+ inc t
+ hd (org-get-heading)
+ summary (org-icalendar-cleanup-string
+ (org-entry-get nil "SUMMARY"))
+ desc (org-icalendar-cleanup-string
+ (or (org-entry-get nil "DESCRIPTION")
+ (and org-icalendar-include-body (org-get-entry)))
+ t org-icalendar-include-body)
+ location (org-icalendar-cleanup-string
+ (org-entry-get nil "LOCATION"))
+ category (org-get-category))
+ (if (looking-at re2)
+ (progn
+ (goto-char (match-end 0))
+ (setq ts2 (match-string 1) inc nil))
+ (setq tmp (buffer-substring (max (point-min)
+ (- pos org-ds-keyword-length))
+ pos)
+ ts2 (if (string-match "[0-9]\\{1,2\\}:[0-9][0-9]-\\([0-9]\\{1,2\\}:[0-9][0-9]\\)" ts)
+ (progn
+ (setq inc nil)
+ (replace-match "\\1" t nil ts))
+ ts)
+ deadlinep (string-match org-deadline-regexp tmp)
+ scheduledp (string-match org-scheduled-regexp tmp)
+ ;; donep (org-entry-is-done-p)
+ ))
+ (if (or (string-match org-tr-regexp hd)
+ (string-match org-ts-regexp hd))
+ (setq hd (replace-match "" t t hd)))
+ (if (string-match "\\+\\([0-9]+\\)\\([dwmy]\\)>" ts)
+ (setq rrule
+ (concat "\nRRULE:FREQ="
+ (cdr (assoc
+ (match-string 2 ts)
+ '(("d" . "DAILY")("w" . "WEEKLY")
+ ("m" . "MONTHLY")("y" . "YEARLY"))))
+ ";INTERVAL=" (match-string 1 ts)))
+ (setq rrule ""))
+ (setq summary (or summary hd))
+ (if (string-match org-bracket-link-regexp summary)
+ (setq summary
+ (replace-match (if (match-end 3)
+ (match-string 3 summary)
+ (match-string 1 summary))
+ t t summary)))
+ (if deadlinep (setq summary (concat "DL: " summary)))
+ (if scheduledp (setq summary (concat "S: " summary)))
+ (if (string-match "\\`<%%" ts)
+ (with-current-buffer sexp-buffer
+ (insert (substring ts 1 -1) " " summary "\n"))
+ (princ (format "BEGIN:VEVENT
+%s
+%s%s
+SUMMARY:%s%s%s
+CATEGORIES:%s
+END:VEVENT\n"
+ (org-ical-ts-to-string ts "DTSTART")
+ (org-ical-ts-to-string ts2 "DTEND" inc)
+ rrule summary
+ (if (and desc (string-match "\\S-" desc))
+ (concat "\nDESCRIPTION: " desc) "")
+ (if (and location (string-match "\\S-" location))
+ (concat "\nLOCATION: " location) "")
+ category)))))
+
+ (when (and org-icalendar-include-sexps
+ (condition-case nil (require 'icalendar) (error nil))
+ (fboundp 'icalendar-export-region))
+ ;; Get all the literal sexps
+ (goto-char (point-min))
+ (while (re-search-forward "^&?%%(" nil t)
+ (catch :skip
+ (org-agenda-skip)
+ (setq b (match-beginning 0))
+ (goto-char (1- (match-end 0)))
+ (forward-sexp 1)
+ (end-of-line 1)
+ (setq sexp (buffer-substring b (point)))
+ (with-current-buffer sexp-buffer
+ (insert sexp "\n"))
+ (princ (org-diary-to-ical-string sexp-buffer)))))
+
+ (when org-icalendar-include-todo
+ (goto-char (point-min))
+ (while (re-search-forward org-todo-line-regexp nil t)
+ (catch :skip
+ (org-agenda-skip)
+ (setq state (match-string 2))
+ (setq status (if (member state org-done-keywords)
+ "COMPLETED" "NEEDS-ACTION"))
+ (when (and state
+ (or (not (member state org-done-keywords))
+ (eq org-icalendar-include-todo 'all))
+ (not (member org-archive-tag (org-get-tags-at)))
+ )
+ (setq hd (match-string 3)
+ summary (org-icalendar-cleanup-string
+ (org-entry-get nil "SUMMARY"))
+ desc (org-icalendar-cleanup-string
+ (or (org-entry-get nil "DESCRIPTION")
+ (and org-icalendar-include-body (org-get-entry)))
+ t org-icalendar-include-body)
+ location (org-icalendar-cleanup-string
+ (org-entry-get nil "LOCATION")))
+ (if (string-match org-bracket-link-regexp hd)
+ (setq hd (replace-match (if (match-end 3) (match-string 3 hd)
+ (match-string 1 hd))
+ t t hd)))
+ (if (string-match org-priority-regexp hd)
+ (setq pri (string-to-char (match-string 2 hd))
+ hd (concat (substring hd 0 (match-beginning 1))
+ (substring hd (match-end 1))))
+ (setq pri org-default-priority))
+ (setq pri (floor (1+ (* 8. (/ (float (- org-lowest-priority pri))
+ (- org-lowest-priority org-highest-priority))))))
+
+ (princ (format "BEGIN:VTODO
+%s
+SUMMARY:%s%s%s
+CATEGORIES:%s
+SEQUENCE:1
+PRIORITY:%d
+STATUS:%s
+END:VTODO\n"
+ dts
+ (or summary hd)
+ (if (and location (string-match "\\S-" location))
+ (concat "\nLOCATION: " location) "")
+ (if (and desc (string-match "\\S-" desc))
+ (concat "\nDESCRIPTION: " desc) "")
+ category pri status)))))))))
+
+(defun org-icalendar-cleanup-string (s &optional is-body maxlength)
+ "Take out stuff and quote what needs to be quoted.
+When IS-BODY is non-nil, assume that this is the body of an item, clean up
+whitespace, newlines, drawers, and timestamps, and cut it down to MAXLENGTH
+characters."
+ (if (not s)
+ nil
+ (when is-body
+ (let ((re (concat "\\(" org-drawer-regexp "\\)[^\000]*?:END:.*\n?"))
+ (re2 (concat "^[ \t]*" org-keyword-time-regexp ".*\n?")))
+ (while (string-match re s) (setq s (replace-match "" t t s)))
+ (while (string-match re2 s) (setq s (replace-match "" t t s)))))
+ (let ((start 0))
+ (while (string-match "\\([,;\\]\\)" s start)
+ (setq start (+ (match-beginning 0) 2)
+ s (replace-match "\\\\\\1" nil nil s))))
+ (when is-body
+ (while (string-match "[ \t]*\n[ \t]*" s)
+ (setq s (replace-match "\\n" t t s))))
+ (setq s (org-trim s))
+ (if is-body
+ (if maxlength
+ (if (and (numberp maxlength)
+ (> (length s) maxlength))
+ (setq s (substring s 0 maxlength)))))
+ s))
+
+(defun org-get-entry ()
+ "Clean-up description string."
+ (save-excursion
+ (org-back-to-heading t)
+ (buffer-substring (point-at-bol 2) (org-end-of-subtree t))))
+
+(defun org-start-icalendar-file (name)
+ "Start an iCalendar file by inserting the header."
+ (let ((user user-full-name)
+ (name (or name "unknown"))
+ (timezone (cadr (current-time-zone))))
+ (princ
+ (format "BEGIN:VCALENDAR
+VERSION:2.0
+X-WR-CALNAME:%s
+PRODID:-//%s//Emacs with Org-mode//EN
+X-WR-TIMEZONE:%s
+CALSCALE:GREGORIAN\n" name user timezone))))
+
+(defun org-finish-icalendar-file ()
+ "Finish an iCalendar file by inserting the END statement."
+ (princ "END:VCALENDAR\n"))
+
+(defun org-ical-ts-to-string (s keyword &optional inc)
+ "Take a time string S and convert it to iCalendar format.
+KEYWORD is added in front, to make a complete line like DTSTART....
+When INC is non-nil, increase the hour by two (if time string contains
+a time), or the day by one (if it does not contain a time)."
+ (let ((t1 (org-parse-time-string s 'nodefault))
+ t2 fmt have-time time)
+ (if (and (car t1) (nth 1 t1) (nth 2 t1))
+ (setq t2 t1 have-time t)
+ (setq t2 (org-parse-time-string s)))
+ (let ((s (car t2)) (mi (nth 1 t2)) (h (nth 2 t2))
+ (d (nth 3 t2)) (m (nth 4 t2)) (y (nth 5 t2)))
+ (when inc
+ (if have-time
+ (if org-agenda-default-appointment-duration
+ (setq mi (+ org-agenda-default-appointment-duration mi))
+ (setq h (+ 2 h)))
+ (setq d (1+ d))))
+ (setq time (encode-time s mi h d m y)))
+ (setq fmt (if have-time ":%Y%m%dT%H%M%S" ";VALUE=DATE:%Y%m%d"))
+ (concat keyword (format-time-string fmt time))))
+
+;;; XOXO export
+
+(defun org-export-as-xoxo-insert-into (buffer &rest output)
+ (with-current-buffer buffer
+ (apply 'insert output)))
+(put 'org-export-as-xoxo-insert-into 'lisp-indent-function 1)
+
+(defun org-export-as-xoxo (&optional buffer)
+ "Export the org buffer as XOXO.
+The XOXO buffer is named *xoxo-<source buffer name>*"
+ (interactive (list (current-buffer)))
+ ;; A quickie abstraction
+
+ ;; Output everything as XOXO
+ (with-current-buffer (get-buffer buffer)
+ (let* ((pos (point))
+ (opt-plist (org-combine-plists (org-default-export-plist)
+ (org-infile-export-plist)))
+ (filename (concat (file-name-as-directory
+ (org-export-directory :xoxo opt-plist))
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))
+ ".html"))
+ (out (find-file-noselect filename))
+ (last-level 1)
+ (hanging-li nil))
+ (goto-char (point-min)) ;; CD: beginning-of-buffer is not allowed.
+ ;; Check the output buffer is empty.
+ (with-current-buffer out (erase-buffer))
+ ;; Kick off the output
+ (org-export-as-xoxo-insert-into out "<ol class='xoxo'>\n")
+ (while (re-search-forward "^\\(\\*+\\)[ \t]+\\(.+\\)" (point-max) 't)
+ (let* ((hd (match-string-no-properties 1))
+ (level (length hd))
+ (text (concat
+ (match-string-no-properties 2)
+ (save-excursion
+ (goto-char (match-end 0))
+ (let ((str ""))
+ (catch 'loop
+ (while 't
+ (forward-line)
+ (if (looking-at "^[ \t]\\(.*\\)")
+ (setq str (concat str (match-string-no-properties 1)))
+ (throw 'loop str)))))))))
+
+ ;; Handle level rendering
+ (cond
+ ((> level last-level)
+ (org-export-as-xoxo-insert-into out "\n<ol>\n"))
+
+ ((< level last-level)
+ (dotimes (- (- last-level level) 1)
+ (if hanging-li
+ (org-export-as-xoxo-insert-into out "</li>\n"))
+ (org-export-as-xoxo-insert-into out "</ol>\n"))
+ (when hanging-li
+ (org-export-as-xoxo-insert-into out "</li>\n")
+ (setq hanging-li nil)))
+
+ ((equal level last-level)
+ (if hanging-li
+ (org-export-as-xoxo-insert-into out "</li>\n")))
+ )
+
+ (setq last-level level)
+
+ ;; And output the new li
+ (setq hanging-li 't)
+ (if (equal ?+ (elt text 0))
+ (org-export-as-xoxo-insert-into out "<li class='" (substring text 1) "'>")
+ (org-export-as-xoxo-insert-into out "<li>" text))))
+
+ ;; Finally finish off the ol
+ (dotimes (- last-level 1)
+ (if hanging-li
+ (org-export-as-xoxo-insert-into out "</li>\n"))
+ (org-export-as-xoxo-insert-into out "</ol>\n"))
+
+ (goto-char pos)
+ ;; Finish the buffer off and clean it up.
+ (switch-to-buffer-other-window out)
+ (indent-region (point-min) (point-max) nil)
+ (save-buffer)
+ (goto-char (point-min))
+ )))
+
+
+;;;; Key bindings
+
+;; Make `C-c C-x' a prefix key
+(org-defkey org-mode-map "\C-c\C-x" (make-sparse-keymap))
+
+;; TAB key with modifiers
+(org-defkey org-mode-map "\C-i" 'org-cycle)
+(org-defkey org-mode-map [(tab)] 'org-cycle)
+(org-defkey org-mode-map [(control tab)] 'org-force-cycle-archived)
+(org-defkey org-mode-map [(meta tab)] 'org-complete)
+(org-defkey org-mode-map "\M-\t" 'org-complete)
+(org-defkey org-mode-map "\M-\C-i" 'org-complete)
+;; The following line is necessary under Suse GNU/Linux
+(unless (featurep 'xemacs)
+ (org-defkey org-mode-map [S-iso-lefttab] 'org-shifttab))
+(org-defkey org-mode-map [(shift tab)] 'org-shifttab)
+(define-key org-mode-map [backtab] 'org-shifttab)
+
+(org-defkey org-mode-map [(shift return)] 'org-table-copy-down)
+(org-defkey org-mode-map [(meta shift return)] 'org-insert-todo-heading)
+(org-defkey org-mode-map [(meta return)] 'org-meta-return)
+
+;; Cursor keys with modifiers
+(org-defkey org-mode-map [(meta left)] 'org-metaleft)
+(org-defkey org-mode-map [(meta right)] 'org-metaright)
+(org-defkey org-mode-map [(meta up)] 'org-metaup)
+(org-defkey org-mode-map [(meta down)] 'org-metadown)
+
+(org-defkey org-mode-map [(meta shift left)] 'org-shiftmetaleft)
+(org-defkey org-mode-map [(meta shift right)] 'org-shiftmetaright)
+(org-defkey org-mode-map [(meta shift up)] 'org-shiftmetaup)
+(org-defkey org-mode-map [(meta shift down)] 'org-shiftmetadown)
+
+(org-defkey org-mode-map [(shift up)] 'org-shiftup)
+(org-defkey org-mode-map [(shift down)] 'org-shiftdown)
+(org-defkey org-mode-map [(shift left)] 'org-shiftleft)
+(org-defkey org-mode-map [(shift right)] 'org-shiftright)
+
+(org-defkey org-mode-map [(control shift right)] 'org-shiftcontrolright)
+(org-defkey org-mode-map [(control shift left)] 'org-shiftcontrolleft)
+
+;;; Extra keys for tty access.
+;; We only set them when really needed because otherwise the
+;; menus don't show the simple keys
+
+(when (or (featurep 'xemacs) ;; because XEmacs supports multi-device stuff
+ (not window-system))
+ (org-defkey org-mode-map "\C-c\C-xc" 'org-table-copy-down)
+ (org-defkey org-mode-map "\C-c\C-xM" 'org-insert-todo-heading)
+ (org-defkey org-mode-map "\C-c\C-xm" 'org-meta-return)
+ (org-defkey org-mode-map [?\e (return)] 'org-meta-return)
+ (org-defkey org-mode-map [?\e (left)] 'org-metaleft)
+ (org-defkey org-mode-map "\C-c\C-xl" 'org-metaleft)
+ (org-defkey org-mode-map [?\e (right)] 'org-metaright)
+ (org-defkey org-mode-map "\C-c\C-xr" 'org-metaright)
+ (org-defkey org-mode-map [?\e (up)] 'org-metaup)
+ (org-defkey org-mode-map "\C-c\C-xu" 'org-metaup)
+ (org-defkey org-mode-map [?\e (down)] 'org-metadown)
+ (org-defkey org-mode-map "\C-c\C-xd" 'org-metadown)
+ (org-defkey org-mode-map "\C-c\C-xL" 'org-shiftmetaleft)
+ (org-defkey org-mode-map "\C-c\C-xR" 'org-shiftmetaright)
+ (org-defkey org-mode-map "\C-c\C-xU" 'org-shiftmetaup)
+ (org-defkey org-mode-map "\C-c\C-xD" 'org-shiftmetadown)
+ (org-defkey org-mode-map [?\C-c (up)] 'org-shiftup)
+ (org-defkey org-mode-map [?\C-c (down)] 'org-shiftdown)
+ (org-defkey org-mode-map [?\C-c (left)] 'org-shiftleft)
+ (org-defkey org-mode-map [?\C-c (right)] 'org-shiftright)
+ (org-defkey org-mode-map [?\C-c ?\C-x (right)] 'org-shiftcontrolright)
+ (org-defkey org-mode-map [?\C-c ?\C-x (left)] 'org-shiftcontrolleft))
+
+ ;; All the other keys
+
+(org-defkey org-mode-map "\C-c\C-a" 'show-all) ; in case allout messed up.
+(org-defkey org-mode-map "\C-c\C-r" 'org-reveal)
+(org-defkey org-mode-map "\C-xns" 'org-narrow-to-subtree)
+(org-defkey org-mode-map "\C-c$" 'org-archive-subtree)
+(org-defkey org-mode-map "\C-c\C-x\C-s" 'org-advertized-archive-subtree)
+(org-defkey org-mode-map "\C-c\C-x\C-a" 'org-toggle-archive-tag)
+(org-defkey org-mode-map "\C-c\C-xb" 'org-tree-to-indirect-buffer)
+(org-defkey org-mode-map "\C-c\C-j" 'org-goto)
+(org-defkey org-mode-map "\C-c\C-t" 'org-todo)
+(org-defkey org-mode-map "\C-c\C-s" 'org-schedule)
+(org-defkey org-mode-map "\C-c\C-d" 'org-deadline)
+(org-defkey org-mode-map "\C-c;" 'org-toggle-comment)
+(org-defkey org-mode-map "\C-c\C-v" 'org-show-todo-tree)
+(org-defkey org-mode-map "\C-c\C-w" 'org-refile)
+(org-defkey org-mode-map "\C-c/" 'org-sparse-tree) ; Minor-mode reserved
+(org-defkey org-mode-map "\C-c\\" 'org-tags-sparse-tree) ; Minor-mode res.
+(org-defkey org-mode-map "\C-c\C-m" 'org-ctrl-c-ret)
+(org-defkey org-mode-map "\M-\C-m" 'org-insert-heading)
+(org-defkey org-mode-map [(control return)] 'org-insert-heading-after-current)
+(org-defkey org-mode-map "\C-c\C-x\C-n" 'org-next-link)
+(org-defkey org-mode-map "\C-c\C-x\C-p" 'org-previous-link)
+(org-defkey org-mode-map "\C-c\C-l" 'org-insert-link)
+(org-defkey org-mode-map "\C-c\C-o" 'org-open-at-point)
+(org-defkey org-mode-map "\C-c%" 'org-mark-ring-push)
+(org-defkey org-mode-map "\C-c&" 'org-mark-ring-goto)
+(org-defkey org-mode-map "\C-c\C-z" 'org-time-stamp) ; Alternative binding
+(org-defkey org-mode-map "\C-c." 'org-time-stamp) ; Minor-mode reserved
+(org-defkey org-mode-map "\C-c!" 'org-time-stamp-inactive) ; Minor-mode r.
+(org-defkey org-mode-map "\C-c," 'org-priority) ; Minor-mode reserved
+(org-defkey org-mode-map "\C-c\C-y" 'org-evaluate-time-range)
+(org-defkey org-mode-map "\C-c>" 'org-goto-calendar)
+(org-defkey org-mode-map "\C-c<" 'org-date-from-calendar)
+(org-defkey org-mode-map [(control ?,)] 'org-cycle-agenda-files)
+(org-defkey org-mode-map [(control ?\')] 'org-cycle-agenda-files)
+(org-defkey org-mode-map "\C-c[" 'org-agenda-file-to-front)
+(org-defkey org-mode-map "\C-c]" 'org-remove-file)
+(org-defkey org-mode-map "\C-c\C-x<" 'org-agenda-set-restriction-lock)
+(org-defkey org-mode-map "\C-c\C-x>" 'org-agenda-remove-restriction-lock)
+(org-defkey org-mode-map "\C-c-" 'org-ctrl-c-minus)
+(org-defkey org-mode-map "\C-c^" 'org-sort)
+(org-defkey org-mode-map "\C-c\C-c" 'org-ctrl-c-ctrl-c)
+(org-defkey org-mode-map "\C-c\C-k" 'org-kill-note-or-show-branches)
+(org-defkey org-mode-map "\C-c#" 'org-update-checkbox-count)
+(org-defkey org-mode-map "\C-m" 'org-return)
+(org-defkey org-mode-map "\C-j" 'org-return-indent)
+(org-defkey org-mode-map "\C-c?" 'org-table-field-info)
+(org-defkey org-mode-map "\C-c " 'org-table-blank-field)
+(org-defkey org-mode-map "\C-c+" 'org-table-sum)
+(org-defkey org-mode-map "\C-c=" 'org-table-eval-formula)
+(org-defkey org-mode-map "\C-c'" 'org-table-edit-formulas)
+(org-defkey org-mode-map "\C-c`" 'org-table-edit-field)
+(org-defkey org-mode-map "\C-c|" 'org-table-create-or-convert-from-region)
+(org-defkey org-mode-map "\C-c*" 'org-table-recalculate)
+(org-defkey org-mode-map [(control ?#)] 'org-table-rotate-recalc-marks)
+(org-defkey org-mode-map "\C-c~" 'org-table-create-with-table.el)
+(org-defkey org-mode-map "\C-c\C-q" 'org-table-wrap-region)
+(org-defkey org-mode-map "\C-c}" 'org-table-toggle-coordinate-overlays)
+(org-defkey org-mode-map "\C-c{" 'org-table-toggle-formula-debugger)
+(org-defkey org-mode-map "\C-c\C-e" 'org-export)
+(org-defkey org-mode-map "\C-c:" 'org-toggle-fixed-width-section)
+(org-defkey org-mode-map "\C-c\C-x\C-f" 'org-emphasize)
+
+(org-defkey org-mode-map "\C-c\C-x\C-k" 'org-cut-special)
+(org-defkey org-mode-map "\C-c\C-x\C-w" 'org-cut-special)
+(org-defkey org-mode-map "\C-c\C-x\M-w" 'org-copy-special)
+(org-defkey org-mode-map "\C-c\C-x\C-y" 'org-paste-special)
+
+(org-defkey org-mode-map "\C-c\C-x\C-t" 'org-toggle-time-stamp-overlays)
+(org-defkey org-mode-map "\C-c\C-x\C-i" 'org-clock-in)
+(org-defkey org-mode-map "\C-c\C-x\C-o" 'org-clock-out)
+(org-defkey org-mode-map "\C-c\C-x\C-j" 'org-clock-goto)
+(org-defkey org-mode-map "\C-c\C-x\C-x" 'org-clock-cancel)
+(org-defkey org-mode-map "\C-c\C-x\C-d" 'org-clock-display)
+(org-defkey org-mode-map "\C-c\C-x\C-r" 'org-clock-report)
+(org-defkey org-mode-map "\C-c\C-x\C-u" 'org-dblock-update)
+(org-defkey org-mode-map "\C-c\C-x\C-l" 'org-preview-latex-fragment)
+(org-defkey org-mode-map "\C-c\C-x\C-b" 'org-toggle-checkbox)
+(org-defkey org-mode-map "\C-c\C-xp" 'org-set-property)
+(org-defkey org-mode-map "\C-c\C-xr" 'org-insert-columns-dblock)
+
+(define-key org-mode-map "\C-c\C-x\C-c" 'org-columns)
+
+(when (featurep 'xemacs)
+ (org-defkey org-mode-map 'button3 'popup-mode-menu))
+
+(defsubst org-table-p () (org-at-table-p))
+
+(defun org-self-insert-command (N)
+ "Like `self-insert-command', use overwrite-mode for whitespace in tables.
+If the cursor is in a table looking at whitespace, the whitespace is
+overwritten, and the table is not marked as requiring realignment."
+ (interactive "p")
+ (if (and (org-table-p)
+ (progn
+ ;; check if we blank the field, and if that triggers align
+ (and org-table-auto-blank-field
+ (member last-command
+ '(org-cycle org-return org-shifttab org-ctrl-c-ctrl-c))
+ (if (or (equal (char-after) ?\ ) (looking-at "[^|\n]* |"))
+ ;; got extra space, this field does not determine column width
+ (let (org-table-may-need-update) (org-table-blank-field))
+ ;; no extra space, this field may determine column width
+ (org-table-blank-field)))
+ t)
+ (eq N 1)
+ (looking-at "[^|\n]* |"))
+ (let (org-table-may-need-update)
+ (goto-char (1- (match-end 0)))
+ (delete-backward-char 1)
+ (goto-char (match-beginning 0))
+ (self-insert-command N))
+ (setq org-table-may-need-update t)
+ (self-insert-command N)
+ (org-fix-tags-on-the-fly)))
+
+(defun org-fix-tags-on-the-fly ()
+ (when (and (equal (char-after (point-at-bol)) ?*)
+ (org-on-heading-p))
+ (org-align-tags-here org-tags-column)))
+
+(defun org-delete-backward-char (N)
+ "Like `delete-backward-char', insert whitespace at field end in tables.
+When deleting backwards, in tables this function will insert whitespace in
+front of the next \"|\" separator, to keep the table aligned. The table will
+still be marked for re-alignment if the field did fill the entire column,
+because, in this case the deletion might narrow the column."
+ (interactive "p")
+ (if (and (org-table-p)
+ (eq N 1)
+ (string-match "|" (buffer-substring (point-at-bol) (point)))
+ (looking-at ".*?|"))
+ (let ((pos (point))
+ (noalign (looking-at "[^|\n\r]* |"))
+ (c org-table-may-need-update))
+ (backward-delete-char N)
+ (skip-chars-forward "^|")
+ (insert " ")
+ (goto-char (1- pos))
+ ;; noalign: if there were two spaces at the end, this field
+ ;; does not determine the width of the column.
+ (if noalign (setq org-table-may-need-update c)))
+ (backward-delete-char N)
+ (org-fix-tags-on-the-fly)))
+
+(defun org-delete-char (N)
+ "Like `delete-char', but insert whitespace at field end in tables.
+When deleting characters, in tables this function will insert whitespace in
+front of the next \"|\" separator, to keep the table aligned. The table will
+still be marked for re-alignment if the field did fill the entire column,
+because, in this case the deletion might narrow the column."
+ (interactive "p")
+ (if (and (org-table-p)
+ (not (bolp))
+ (not (= (char-after) ?|))
+ (eq N 1))
+ (if (looking-at ".*?|")
+ (let ((pos (point))
+ (noalign (looking-at "[^|\n\r]* |"))
+ (c org-table-may-need-update))
+ (replace-match (concat
+ (substring (match-string 0) 1 -1)
+ " |"))
+ (goto-char pos)
+ ;; noalign: if there were two spaces at the end, this field
+ ;; does not determine the width of the column.
+ (if noalign (setq org-table-may-need-update c)))
+ (delete-char N))
+ (delete-char N)
+ (org-fix-tags-on-the-fly)))
+
+;; Make `delete-selection-mode' work with org-mode and orgtbl-mode
+(put 'org-self-insert-command 'delete-selection t)
+(put 'orgtbl-self-insert-command 'delete-selection t)
+(put 'org-delete-char 'delete-selection 'supersede)
+(put 'org-delete-backward-char 'delete-selection 'supersede)
+
+;; Make `flyspell-mode' delay after some commands
+(put 'org-self-insert-command 'flyspell-delayed t)
+(put 'orgtbl-self-insert-command 'flyspell-delayed t)
+(put 'org-delete-char 'flyspell-delayed t)
+(put 'org-delete-backward-char 'flyspell-delayed t)
+
+;; Make pabbrev-mode expand after org-mode commands
+(put 'org-self-insert-command 'pabbrev-expand-after-command t)
+(put 'orgybl-self-insert-command 'pabbrev-expand-after-command t)
+
+;; How to do this: Measure non-white length of current string
+;; If equal to column width, we should realign.
+
+(defun org-remap (map &rest commands)
+ "In MAP, remap the functions given in COMMANDS.
+COMMANDS is a list of alternating OLDDEF NEWDEF command names."
+ (let (new old)
+ (while commands
+ (setq old (pop commands) new (pop commands))
+ (if (fboundp 'command-remapping)
+ (org-defkey map (vector 'remap old) new)
+ (substitute-key-definition old new map global-map)))))
+
+(when (eq org-enable-table-editor 'optimized)
+ ;; If the user wants maximum table support, we need to hijack
+ ;; some standard editing functions
+ (org-remap org-mode-map
+ 'self-insert-command 'org-self-insert-command
+ 'delete-char 'org-delete-char
+ 'delete-backward-char 'org-delete-backward-char)
+ (org-defkey org-mode-map "|" 'org-force-self-insert))
+
+(defun org-shiftcursor-error ()
+ "Throw an error because Shift-Cursor command was applied in wrong context."
+ (error "This command is active in special context like tables, headlines or timestamps"))
+
+(defun org-shifttab (&optional arg)
+ "Global visibility cycling or move to previous table field.
+Calls `org-cycle' with argument t, or `org-table-previous-field', depending
+on context.
+See the individual commands for more information."
+ (interactive "P")
+ (cond
+ ((org-at-table-p) (call-interactively 'org-table-previous-field))
+ (arg (message "Content view to level: ")
+ (org-content (prefix-numeric-value arg))
+ (setq org-cycle-global-status 'overview))
+ (t (call-interactively 'org-global-cycle))))
+
+(defun org-shiftmetaleft ()
+ "Promote subtree or delete table column.
+Calls `org-promote-subtree', `org-outdent-item',
+or `org-table-delete-column', depending on context.
+See the individual commands for more information."
+ (interactive)
+ (cond
+ ((org-at-table-p) (call-interactively 'org-table-delete-column))
+ ((org-on-heading-p) (call-interactively 'org-promote-subtree))
+ ((org-at-item-p) (call-interactively 'org-outdent-item))
+ (t (org-shiftcursor-error))))
+
+(defun org-shiftmetaright ()
+ "Demote subtree or insert table column.
+Calls `org-demote-subtree', `org-indent-item',
+or `org-table-insert-column', depending on context.
+See the individual commands for more information."
+ (interactive)
+ (cond
+ ((org-at-table-p) (call-interactively 'org-table-insert-column))
+ ((org-on-heading-p) (call-interactively 'org-demote-subtree))
+ ((org-at-item-p) (call-interactively 'org-indent-item))
+ (t (org-shiftcursor-error))))
+
+(defun org-shiftmetaup (&optional arg)
+ "Move subtree up or kill table row.
+Calls `org-move-subtree-up' or `org-table-kill-row' or
+`org-move-item-up' depending on context. See the individual commands
+for more information."
+ (interactive "P")
+ (cond
+ ((org-at-table-p) (call-interactively 'org-table-kill-row))
+ ((org-on-heading-p) (call-interactively 'org-move-subtree-up))
+ ((org-at-item-p) (call-interactively 'org-move-item-up))
+ (t (org-shiftcursor-error))))
+(defun org-shiftmetadown (&optional arg)
+ "Move subtree down or insert table row.
+Calls `org-move-subtree-down' or `org-table-insert-row' or
+`org-move-item-down', depending on context. See the individual
+commands for more information."
+ (interactive "P")
+ (cond
+ ((org-at-table-p) (call-interactively 'org-table-insert-row))
+ ((org-on-heading-p) (call-interactively 'org-move-subtree-down))
+ ((org-at-item-p) (call-interactively 'org-move-item-down))
+ (t (org-shiftcursor-error))))
+
+(defun org-metaleft (&optional arg)
+ "Promote heading or move table column to left.
+Calls `org-do-promote' or `org-table-move-column', depending on context.
+With no specific context, calls the Emacs default `backward-word'.
+See the individual commands for more information."
+ (interactive "P")
+ (cond
+ ((org-at-table-p) (org-call-with-arg 'org-table-move-column 'left))
+ ((or (org-on-heading-p) (org-region-active-p))
+ (call-interactively 'org-do-promote))
+ ((org-at-item-p) (call-interactively 'org-outdent-item))
+ (t (call-interactively 'backward-word))))
+
+(defun org-metaright (&optional arg)
+ "Demote subtree or move table column to right.
+Calls `org-do-demote' or `org-table-move-column', depending on context.
+With no specific context, calls the Emacs default `forward-word'.
+See the individual commands for more information."
+ (interactive "P")
+ (cond
+ ((org-at-table-p) (call-interactively 'org-table-move-column))
+ ((or (org-on-heading-p) (org-region-active-p))
+ (call-interactively 'org-do-demote))
+ ((org-at-item-p) (call-interactively 'org-indent-item))
+ (t (call-interactively 'forward-word))))
+
+(defun org-metaup (&optional arg)
+ "Move subtree up or move table row up.
+Calls `org-move-subtree-up' or `org-table-move-row' or
+`org-move-item-up', depending on context. See the individual commands
+for more information."
+ (interactive "P")
+ (cond
+ ((org-at-table-p) (org-call-with-arg 'org-table-move-row 'up))
+ ((org-on-heading-p) (call-interactively 'org-move-subtree-up))
+ ((org-at-item-p) (call-interactively 'org-move-item-up))
+ (t (transpose-lines 1) (beginning-of-line -1))))
+
+(defun org-metadown (&optional arg)
+ "Move subtree down or move table row down.
+Calls `org-move-subtree-down' or `org-table-move-row' or
+`org-move-item-down', depending on context. See the individual
+commands for more information."
+ (interactive "P")
+ (cond
+ ((org-at-table-p) (call-interactively 'org-table-move-row))
+ ((org-on-heading-p) (call-interactively 'org-move-subtree-down))
+ ((org-at-item-p) (call-interactively 'org-move-item-down))
+ (t (beginning-of-line 2) (transpose-lines 1) (beginning-of-line 0))))
+
+(defun org-shiftup (&optional arg)
+ "Increase item in timestamp or increase priority of current headline.
+Calls `org-timestamp-up' or `org-priority-up', or `org-previous-item',
+depending on context. See the individual commands for more information."
+ (interactive "P")
+ (cond
+ ((org-at-timestamp-p t)
+ (call-interactively (if org-edit-timestamp-down-means-later
+ 'org-timestamp-down 'org-timestamp-up)))
+ ((org-on-heading-p) (call-interactively 'org-priority-up))
+ ((org-at-item-p) (call-interactively 'org-previous-item))
+ (t (call-interactively 'org-beginning-of-item) (beginning-of-line 1))))
+
+(defun org-shiftdown (&optional arg)
+ "Decrease item in timestamp or decrease priority of current headline.
+Calls `org-timestamp-down' or `org-priority-down', or `org-next-item'
+depending on context. See the individual commands for more information."
+ (interactive "P")
+ (cond
+ ((org-at-timestamp-p t)
+ (call-interactively (if org-edit-timestamp-down-means-later
+ 'org-timestamp-up 'org-timestamp-down)))
+ ((org-on-heading-p) (call-interactively 'org-priority-down))
+ (t (call-interactively 'org-next-item))))
+
+(defun org-shiftright ()
+ "Next TODO keyword or timestamp one day later, depending on context."
+ (interactive)
+ (cond
+ ((org-at-timestamp-p t) (call-interactively 'org-timestamp-up-day))
+ ((org-on-heading-p) (org-call-with-arg 'org-todo 'right))
+ ((org-at-item-p) (org-call-with-arg 'org-cycle-list-bullet nil))
+ ((org-at-property-p) (call-interactively 'org-property-next-allowed-value))
+ (t (org-shiftcursor-error))))
+
+(defun org-shiftleft ()
+ "Previous TODO keyword or timestamp one day earlier, depending on context."
+ (interactive)
+ (cond
+ ((org-at-timestamp-p t) (call-interactively 'org-timestamp-down-day))
+ ((org-on-heading-p) (org-call-with-arg 'org-todo 'left))
+ ((org-at-item-p) (org-call-with-arg 'org-cycle-list-bullet 'previous))
+ ((org-at-property-p)
+ (call-interactively 'org-property-previous-allowed-value))
+ (t (org-shiftcursor-error))))
+
+(defun org-shiftcontrolright ()
+ "Switch to next TODO set."
+ (interactive)
+ (cond
+ ((org-on-heading-p) (org-call-with-arg 'org-todo 'nextset))
+ (t (org-shiftcursor-error))))
+
+(defun org-shiftcontrolleft ()
+ "Switch to previous TODO set."
+ (interactive)
+ (cond
+ ((org-on-heading-p) (org-call-with-arg 'org-todo 'previousset))
+ (t (org-shiftcursor-error))))
+
+(defun org-ctrl-c-ret ()
+ "Call `org-table-hline-and-move' or `org-insert-heading' dep. on context."
+ (interactive)
+ (cond
+ ((org-at-table-p) (call-interactively 'org-table-hline-and-move))
+ (t (call-interactively 'org-insert-heading))))
+
+(defun org-copy-special ()
+ "Copy region in table or copy current subtree.
+Calls `org-table-copy' or `org-copy-subtree', depending on context.
+See the individual commands for more information."
+ (interactive)
+ (call-interactively
+ (if (org-at-table-p) 'org-table-copy-region 'org-copy-subtree)))
+
+(defun org-cut-special ()
+ "Cut region in table or cut current subtree.
+Calls `org-table-copy' or `org-cut-subtree', depending on context.
+See the individual commands for more information."
+ (interactive)
+ (call-interactively
+ (if (org-at-table-p) 'org-table-cut-region 'org-cut-subtree)))
+
+(defun org-paste-special (arg)
+ "Paste rectangular region into table, or past subtree relative to level.
+Calls `org-table-paste-rectangle' or `org-paste-subtree', depending on context.
+See the individual commands for more information."
+ (interactive "P")
+ (if (org-at-table-p)
+ (org-table-paste-rectangle)
+ (org-paste-subtree arg)))
+
+(defun org-ctrl-c-ctrl-c (&optional arg)
+ "Set tags in headline, or update according to changed information at point.
+
+This command does many different things, depending on context:
+
+- If the cursor is in a headline, prompt for tags and insert them
+ into the current line, aligned to `org-tags-column'. When called
+ with prefix arg, realign all tags in the current buffer.
+
+- If the cursor is in one of the special #+KEYWORD lines, this
+ triggers scanning the buffer for these lines and updating the
+ information.
+
+- If the cursor is inside a table, realign the table. This command
+ works even if the automatic table editor has been turned off.
+
+- If the cursor is on a #+TBLFM line, re-apply the formulas to
+ the entire table.
+
+- If the cursor is a the beginning of a dynamic block, update it.
+
+- If the cursor is inside a table created by the table.el package,
+ activate that table.
+
+- If the current buffer is a remember buffer, close note and file it.
+ with a prefix argument, file it without further interaction to the default
+ location.
+
+- If the cursor is on a <<<target>>>, update radio targets and corresponding
+ links in this buffer.
+
+- If the cursor is on a numbered item in a plain list, renumber the
+ ordered list.
+
+- If the cursor is on a checkbox, toggle it."
+ (interactive "P")
+ (let ((org-enable-table-editor t))
+ (cond
+ ((or org-clock-overlays
+ org-occur-highlights
+ org-latex-fragment-image-overlays)
+ (org-remove-clock-overlays)
+ (org-remove-occur-highlights)
+ (org-remove-latex-fragment-image-overlays)
+ (message "Temporary highlights/overlays removed from current buffer"))
+ ((and (local-variable-p 'org-finish-function (current-buffer))
+ (fboundp org-finish-function))
+ (funcall org-finish-function))
+ ((org-at-property-p)
+ (call-interactively 'org-property-action))
+ ((org-on-target-p) (call-interactively 'org-update-radio-target-regexp))
+ ((org-on-heading-p) (call-interactively 'org-set-tags))
+ ((org-at-table.el-p)
+ (require 'table)
+ (beginning-of-line 1)
+ (re-search-forward "|" (save-excursion (end-of-line 2) (point)))
+ (call-interactively 'table-recognize-table))
+ ((org-at-table-p)
+ (org-table-maybe-eval-formula)
+ (if arg
+ (call-interactively 'org-table-recalculate)
+ (org-table-maybe-recalculate-line))
+ (call-interactively 'org-table-align))
+ ((org-at-item-checkbox-p)
+ (call-interactively 'org-toggle-checkbox))
+ ((org-at-item-p)
+ (call-interactively 'org-maybe-renumber-ordered-list))
+ ((save-excursion (beginning-of-line 1) (looking-at "#\\+BEGIN:"))
+ ;; Dynamic block
+ (beginning-of-line 1)
+ (org-update-dblock))
+ ((save-excursion (beginning-of-line 1) (looking-at "#\\+\\([A-Z]+\\)"))
+ (cond
+ ((equal (match-string 1) "TBLFM")
+ ;; Recalculate the table before this line
+ (save-excursion
+ (beginning-of-line 1)
+ (skip-chars-backward " \r\n\t")
+ (if (org-at-table-p)
+ (org-call-with-arg 'org-table-recalculate t))))
+ (t
+ (call-interactively 'org-mode-restart))))
+ (t (error "C-c C-c can do nothing useful at this location.")))))
+
+(defun org-mode-restart ()
+ "Restart Org-mode, to scan again for special lines.
+Also updates the keyword regular expressions."
+ (interactive)
+ (let ((org-inhibit-startup t)) (org-mode))
+ (message "Org-mode restarted to refresh keyword and special line setup"))
+
+(defun org-kill-note-or-show-branches ()
+ "If this is a Note buffer, abort storing the note. Else call `show-branches'."
+ (interactive)
+ (if (not org-finish-function)
+ (call-interactively 'show-branches)
+ (let ((org-note-abort t))
+ (funcall org-finish-function))))
+
+(defun org-return (&optional indent)
+ "Goto next table row or insert a newline.
+Calls `org-table-next-row' or `newline', depending on context.
+See the individual commands for more information."
+ (interactive)
+ (cond
+ ((bobp) (if indent (newline-and-indent) (newline)))
+ ((org-at-table-p)
+ (org-table-justify-field-maybe)
+ (call-interactively 'org-table-next-row))
+ (t (if indent (newline-and-indent) (newline)))))
+
+(defun org-return-indent ()
+ (interactive)
+ "Goto next table row or insert a newline and indent.
+Calls `org-table-next-row' or `newline-and-indent', depending on
+context. See the individual commands for more information."
+ (org-return t))
+
+(defun org-ctrl-c-minus ()
+ "Insert separator line in table or modify bullet type in list.
+Calls `org-table-insert-hline' or `org-cycle-list-bullet',
+depending on context."
+ (interactive)
+ (cond
+ ((org-at-table-p)
+ (call-interactively 'org-table-insert-hline))
+ ((org-on-heading-p)
+ ;; Convert to item
+ (save-excursion
+ (beginning-of-line 1)
+ (if (looking-at "\\*+ ")
+ (replace-match (concat (make-string (- (match-end 0) (point)) ?\ ) "- ")))))
+ ((org-in-item-p)
+ (call-interactively 'org-cycle-list-bullet))
+ (t (error "`C-c -' does have no function here."))))
+
+(defun org-meta-return (&optional arg)
+ "Insert a new heading or wrap a region in a table.
+Calls `org-insert-heading' or `org-table-wrap-region', depending on context.
+See the individual commands for more information."
+ (interactive "P")
+ (cond
+ ((org-at-table-p)
+ (call-interactively 'org-table-wrap-region))
+ (t (call-interactively 'org-insert-heading))))
+
+;;; Menu entries
+
+;; Define the Org-mode menus
+(easy-menu-define org-tbl-menu org-mode-map "Tbl menu"
+ '("Tbl"
+ ["Align" org-ctrl-c-ctrl-c (org-at-table-p)]
+ ["Next Field" org-cycle (org-at-table-p)]
+ ["Previous Field" org-shifttab (org-at-table-p)]
+ ["Next Row" org-return (org-at-table-p)]
+ "--"
+ ["Blank Field" org-table-blank-field (org-at-table-p)]
+ ["Edit Field" org-table-edit-field (org-at-table-p)]
+ ["Copy Field from Above" org-table-copy-down (org-at-table-p)]
+ "--"
+ ("Column"
+ ["Move Column Left" org-metaleft (org-at-table-p)]
+ ["Move Column Right" org-metaright (org-at-table-p)]
+ ["Delete Column" org-shiftmetaleft (org-at-table-p)]
+ ["Insert Column" org-shiftmetaright (org-at-table-p)])
+ ("Row"
+ ["Move Row Up" org-metaup (org-at-table-p)]
+ ["Move Row Down" org-metadown (org-at-table-p)]
+ ["Delete Row" org-shiftmetaup (org-at-table-p)]
+ ["Insert Row" org-shiftmetadown (org-at-table-p)]
+ ["Sort lines in region" org-table-sort-lines (org-at-table-p)]
+ "--"
+ ["Insert Hline" org-ctrl-c-minus (org-at-table-p)])
+ ("Rectangle"
+ ["Copy Rectangle" org-copy-special (org-at-table-p)]
+ ["Cut Rectangle" org-cut-special (org-at-table-p)]
+ ["Paste Rectangle" org-paste-special (org-at-table-p)]
+ ["Fill Rectangle" org-table-wrap-region (org-at-table-p)])
+ "--"
+ ("Calculate"
+ ["Set Column Formula" org-table-eval-formula (org-at-table-p)]
+ ["Set Field Formula" (org-table-eval-formula '(4)) :active (org-at-table-p) :keys "C-u C-c ="]
+ ["Edit Formulas" org-table-edit-formulas (org-at-table-p)]
+ "--"
+ ["Recalculate line" org-table-recalculate (org-at-table-p)]
+ ["Recalculate all" (lambda () (interactive) (org-table-recalculate '(4))) :active (org-at-table-p) :keys "C-u C-c *"]
+ ["Iterate all" (lambda () (interactive) (org-table-recalculate '(16))) :active (org-at-table-p) :keys "C-u C-u C-c *"]
+ "--"
+ ["Toggle Recalculate Mark" org-table-rotate-recalc-marks (org-at-table-p)]
+ "--"
+ ["Sum Column/Rectangle" org-table-sum
+ (or (org-at-table-p) (org-region-active-p))]
+ ["Which Column?" org-table-current-column (org-at-table-p)])
+ ["Debug Formulas"
+ org-table-toggle-formula-debugger
+ :style toggle :selected org-table-formula-debug]
+ ["Show Col/Row Numbers"
+ org-table-toggle-coordinate-overlays
+ :style toggle :selected org-table-overlay-coordinates]
+ "--"
+ ["Create" org-table-create (and (not (org-at-table-p))
+ org-enable-table-editor)]
+ ["Convert Region" org-table-convert-region (not (org-at-table-p 'any))]
+ ["Import from File" org-table-import (not (org-at-table-p))]
+ ["Export to File" org-table-export (org-at-table-p)]
+ "--"
+ ["Create/Convert from/to table.el" org-table-create-with-table.el t]))
+
+(easy-menu-define org-org-menu org-mode-map "Org menu"
+ '("Org"
+ ("Show/Hide"
+ ["Cycle Visibility" org-cycle (or (bobp) (outline-on-heading-p))]
+ ["Cycle Global Visibility" org-shifttab (not (org-at-table-p))]
+ ["Sparse Tree" org-occur t]
+ ["Reveal Context" org-reveal t]
+ ["Show All" show-all t]
+ "--"
+ ["Subtree to indirect buffer" org-tree-to-indirect-buffer t])
+ "--"
+ ["New Heading" org-insert-heading t]
+ ("Navigate Headings"
+ ["Up" outline-up-heading t]
+ ["Next" outline-next-visible-heading t]
+ ["Previous" outline-previous-visible-heading t]
+ ["Next Same Level" outline-forward-same-level t]
+ ["Previous Same Level" outline-backward-same-level t]
+ "--"
+ ["Jump" org-goto t])
+ ("Edit Structure"
+ ["Move Subtree Up" org-shiftmetaup (not (org-at-table-p))]
+ ["Move Subtree Down" org-shiftmetadown (not (org-at-table-p))]
+ "--"
+ ["Copy Subtree" org-copy-special (not (org-at-table-p))]
+ ["Cut Subtree" org-cut-special (not (org-at-table-p))]
+ ["Paste Subtree" org-paste-special (not (org-at-table-p))]
+ "--"
+ ["Promote Heading" org-metaleft (not (org-at-table-p))]
+ ["Promote Subtree" org-shiftmetaleft (not (org-at-table-p))]
+ ["Demote Heading" org-metaright (not (org-at-table-p))]
+ ["Demote Subtree" org-shiftmetaright (not (org-at-table-p))]
+ "--"
+ ["Sort Region/Children" org-sort (not (org-at-table-p))]
+ "--"
+ ["Convert to odd levels" org-convert-to-odd-levels t]
+ ["Convert to odd/even levels" org-convert-to-oddeven-levels t])
+ ("Editing"
+ ["Emphasis..." org-emphasize t])
+ ("Archive"
+ ["Toggle ARCHIVE tag" org-toggle-archive-tag t]
+; ["Check and Tag Children" (org-toggle-archive-tag (4))
+; :active t :keys "C-u C-c C-x C-a"]
+ ["Sparse trees open ARCHIVE trees"
+ (setq org-sparse-tree-open-archived-trees
+ (not org-sparse-tree-open-archived-trees))
+ :style toggle :selected org-sparse-tree-open-archived-trees]
+ ["Cycling opens ARCHIVE trees"
+ (setq org-cycle-open-archived-trees (not org-cycle-open-archived-trees))
+ :style toggle :selected org-cycle-open-archived-trees]
+ ["Agenda includes ARCHIVE trees"
+ (setq org-agenda-skip-archived-trees (not org-agenda-skip-archived-trees))
+ :style toggle :selected (not org-agenda-skip-archived-trees)]
+ "--"
+ ["Move Subtree to Archive" org-advertized-archive-subtree t]
+ ; ["Check and Move Children" (org-archive-subtree '(4))
+ ; :active t :keys "C-u C-c C-x C-s"]
+ )
+ "--"
+ ("TODO Lists"
+ ["TODO/DONE/-" org-todo t]
+ ("Select keyword"
+ ["Next keyword" org-shiftright (org-on-heading-p)]
+ ["Previous keyword" org-shiftleft (org-on-heading-p)]
+ ["Complete Keyword" org-complete (assq :todo-keyword (org-context))]
+ ["Next keyword set" org-shiftcontrolright (and (> (length org-todo-sets) 1) (org-on-heading-p))]
+ ["Previous keyword set" org-shiftcontrolright (and (> (length org-todo-sets) 1) (org-on-heading-p))])
+ ["Show TODO Tree" org-show-todo-tree t]
+ ["Global TODO list" org-todo-list t]
+ "--"
+ ["Set Priority" org-priority t]
+ ["Priority Up" org-shiftup t]
+ ["Priority Down" org-shiftdown t])
+ ("TAGS and Properties"
+ ["Set Tags" 'org-ctrl-c-ctrl-c (org-at-heading-p)]
+ ["Change tag in region" 'org-change-tag-in-region (org-region-active-p)]
+ "--"
+ ["Set property" 'org-set-property t]
+ ["Column view of properties" org-columns t]
+ ["Insert Column View DBlock" org-insert-columns-dblock t])
+ ("Dates and Scheduling"
+ ["Timestamp" org-time-stamp t]
+ ["Timestamp (inactive)" org-time-stamp-inactive t]
+ ("Change Date"
+ ["1 Day Later" org-shiftright t]
+ ["1 Day Earlier" org-shiftleft t]
+ ["1 ... Later" org-shiftup t]
+ ["1 ... Earlier" org-shiftdown t])
+ ["Compute Time Range" org-evaluate-time-range t]
+ ["Schedule Item" org-schedule t]
+ ["Deadline" org-deadline t]
+ "--"
+ ["Custom time format" org-toggle-time-stamp-overlays
+ :style radio :selected org-display-custom-times]
+ "--"
+ ["Goto Calendar" org-goto-calendar t]
+ ["Date from Calendar" org-date-from-calendar t])
+ ("Logging work"
+ ["Clock in" org-clock-in t]
+ ["Clock out" org-clock-out t]
+ ["Clock cancel" org-clock-cancel t]
+ ["Goto running clock" org-clock-goto t]
+ ["Display times" org-clock-display t]
+ ["Create clock table" org-clock-report t]
+ "--"
+ ["Record DONE time"
+ (progn (setq org-log-done (not org-log-done))
+ (message "Switching to %s will %s record a timestamp"
+ (car org-done-keywords)
+ (if org-log-done "automatically" "not")))
+ :style toggle :selected org-log-done])
+ "--"
+ ["Agenda Command..." org-agenda t]
+ ["Set Restriction Lock" org-agenda-set-restriction-lock t]
+ ("File List for Agenda")
+ ("Special views current file"
+ ["TODO Tree" org-show-todo-tree t]
+ ["Check Deadlines" org-check-deadlines t]
+ ["Timeline" org-timeline t]
+ ["Tags Tree" org-tags-sparse-tree t])
+ "--"
+ ("Hyperlinks"
+ ["Store Link (Global)" org-store-link t]
+ ["Insert Link" org-insert-link t]
+ ["Follow Link" org-open-at-point t]
+ "--"
+ ["Next link" org-next-link t]
+ ["Previous link" org-previous-link t]
+ "--"
+ ["Descriptive Links"
+ (progn (org-add-to-invisibility-spec '(org-link)) (org-restart-font-lock))
+ :style radio :selected (member '(org-link) buffer-invisibility-spec)]
+ ["Literal Links"
+ (progn
+ (org-remove-from-invisibility-spec '(org-link)) (org-restart-font-lock))
+ :style radio :selected (not (member '(org-link) buffer-invisibility-spec))])
+ "--"
+ ["Export/Publish..." org-export t]
+ ("LaTeX"
+ ["Org CDLaTeX mode" org-cdlatex-mode :style toggle
+ :selected org-cdlatex-mode]
+ ["Insert Environment" cdlatex-environment (fboundp 'cdlatex-environment)]
+ ["Insert math symbol" cdlatex-math-symbol (fboundp 'cdlatex-math-symbol)]
+ ["Modify math symbol" org-cdlatex-math-modify
+ (org-inside-LaTeX-fragment-p)]
+ ["Export LaTeX fragments as images"
+ (setq org-export-with-LaTeX-fragments (not org-export-with-LaTeX-fragments))
+ :style toggle :selected org-export-with-LaTeX-fragments])
+ "--"
+ ("Documentation"
+ ["Show Version" org-version t]
+ ["Info Documentation" org-info t])
+ ("Customize"
+ ["Browse Org Group" org-customize t]
+ "--"
+ ["Expand This Menu" org-create-customize-menu
+ (fboundp 'customize-menu-create)])
+ "--"
+ ["Refresh setup" org-mode-restart t]
+ ))
+
+(defun org-info (&optional node)
+ "Read documentation for Org-mode in the info system.
+With optional NODE, go directly to that node."
+ (interactive)
+ (require 'info)
+ (Info-goto-node (format "(org)%s" (or node ""))))
+
+(defun org-install-agenda-files-menu ()
+ (let ((bl (buffer-list)))
+ (save-excursion
+ (while bl
+ (set-buffer (pop bl))
+ (if (org-mode-p) (setq bl nil)))
+ (when (org-mode-p)
+ (easy-menu-change
+ '("Org") "File List for Agenda"
+ (append
+ (list
+ ["Edit File List" (org-edit-agenda-file-list) t]
+ ["Add/Move Current File to Front of List" org-agenda-file-to-front t]
+ ["Remove Current File from List" org-remove-file t]
+ ["Cycle through agenda files" org-cycle-agenda-files t]
+ ["Occur in all agenda files" org-occur-in-agenda-files t]
+ "--")
+ (mapcar 'org-file-menu-entry (org-agenda-files t))))))))
+
+;;;; Documentation
+
+(defun org-customize ()
+ "Call the customize function with org as argument."
+ (interactive)
+ (customize-browse 'org))
+
+(defun org-create-customize-menu ()
+ "Create a full customization menu for Org-mode, insert it into the menu."
+ (interactive)
+ (if (fboundp 'customize-menu-create)
+ (progn
+ (easy-menu-change
+ '("Org") "Customize"
+ `(["Browse Org group" org-customize t]
+ "--"
+ ,(customize-menu-create 'org)
+ ["Set" Custom-set t]
+ ["Save" Custom-save t]
+ ["Reset to Current" Custom-reset-current t]
+ ["Reset to Saved" Custom-reset-saved t]
+ ["Reset to Standard Settings" Custom-reset-standard t]))
+ (message "\"Org\"-menu now contains full customization menu"))
+ (error "Cannot expand menu (outdated version of cus-edit.el)")))
+
+;;;; Miscellaneous stuff
+
+
+;;; Generally useful functions
+
+(defun org-context ()
+ "Return a list of contexts of the current cursor position.
+If several contexts apply, all are returned.
+Each context entry is a list with a symbol naming the context, and
+two positions indicating start and end of the context. Possible
+contexts are:
+
+:headline anywhere in a headline
+:headline-stars on the leading stars in a headline
+:todo-keyword on a TODO keyword (including DONE) in a headline
+:tags on the TAGS in a headline
+:priority on the priority cookie in a headline
+:item on the first line of a plain list item
+:item-bullet on the bullet/number of a plain list item
+:checkbox on the checkbox in a plain list item
+:table in an org-mode table
+:table-special on a special filed in a table
+:table-table in a table.el table
+:link on a hyperlink
+:keyword on a keyword: SCHEDULED, DEADLINE, CLOSE,COMMENT, QUOTE.
+:target on a <<target>>
+:radio-target on a <<<radio-target>>>
+:latex-fragment on a LaTeX fragment
+:latex-preview on a LaTeX fragment with overlayed preview image
+
+This function expects the position to be visible because it uses font-lock
+faces as a help to recognize the following contexts: :table-special, :link,
+and :keyword."
+ (let* ((f (get-text-property (point) 'face))
+ (faces (if (listp f) f (list f)))
+ (p (point)) clist o)
+ ;; First the large context
+ (cond
+ ((org-on-heading-p t)
+ (push (list :headline (point-at-bol) (point-at-eol)) clist)
+ (when (progn
+ (beginning-of-line 1)
+ (looking-at org-todo-line-tags-regexp))
+ (push (org-point-in-group p 1 :headline-stars) clist)
+ (push (org-point-in-group p 2 :todo-keyword) clist)
+ (push (org-point-in-group p 4 :tags) clist))
+ (goto-char p)
+ (skip-chars-backward "^[\n\r \t") (or (eobp) (backward-char 1))
+ (if (looking-at "\\[#[A-Z0-9]\\]")
+ (push (org-point-in-group p 0 :priority) clist)))
+
+ ((org-at-item-p)
+ (push (org-point-in-group p 2 :item-bullet) clist)
+ (push (list :item (point-at-bol)
+ (save-excursion (org-end-of-item) (point)))
+ clist)
+ (and (org-at-item-checkbox-p)
+ (push (org-point-in-group p 0 :checkbox) clist)))
+
+ ((org-at-table-p)
+ (push (list :table (org-table-begin) (org-table-end)) clist)
+ (if (memq 'org-formula faces)
+ (push (list :table-special
+ (previous-single-property-change p 'face)
+ (next-single-property-change p 'face)) clist)))
+ ((org-at-table-p 'any)
+ (push (list :table-table) clist)))
+ (goto-char p)
+
+ ;; Now the small context
+ (cond
+ ((org-at-timestamp-p)
+ (push (org-point-in-group p 0 :timestamp) clist))
+ ((memq 'org-link faces)
+ (push (list :link
+ (previous-single-property-change p 'face)
+ (next-single-property-change p 'face)) clist))
+ ((memq 'org-special-keyword faces)
+ (push (list :keyword
+ (previous-single-property-change p 'face)
+ (next-single-property-change p 'face)) clist))
+ ((org-on-target-p)
+ (push (org-point-in-group p 0 :target) clist)
+ (goto-char (1- (match-beginning 0)))
+ (if (looking-at org-radio-target-regexp)
+ (push (org-point-in-group p 0 :radio-target) clist))
+ (goto-char p))
+ ((setq o (car (delq nil
+ (mapcar
+ (lambda (x)
+ (if (memq x org-latex-fragment-image-overlays) x))
+ (org-overlays-at (point))))))
+ (push (list :latex-fragment
+ (org-overlay-start o) (org-overlay-end o)) clist)
+ (push (list :latex-preview
+ (org-overlay-start o) (org-overlay-end o)) clist))
+ ((org-inside-LaTeX-fragment-p)
+ ;; FIXME: positions wrong.
+ (push (list :latex-fragment (point) (point)) clist)))
+
+ (setq clist (nreverse (delq nil clist)))
+ clist))
+
+;; FIXME: Compare with at-regexp-p Do we need both?
+(defun org-in-regexp (re &optional nlines visually)
+ "Check if point is inside a match of regexp.
+Normally only the current line is checked, but you can include NLINES extra
+lines both before and after point into the search.
+If VISUALLY is set, require that the cursor is not after the match but
+really on, so that the block visually is on the match."
+ (catch 'exit
+ (let ((pos (point))
+ (eol (point-at-eol (+ 1 (or nlines 0))))
+ (inc (if visually 1 0)))
+ (save-excursion
+ (beginning-of-line (- 1 (or nlines 0)))
+ (while (re-search-forward re eol t)
+ (if (and (<= (match-beginning 0) pos)
+ (>= (+ inc (match-end 0)) pos))
+ (throw 'exit (cons (match-beginning 0) (match-end 0)))))))))
+
+(defun org-at-regexp-p (regexp)
+ "Is point inside a match of REGEXP in the current line?"
+ (catch 'exit
+ (save-excursion
+ (let ((pos (point)) (end (point-at-eol)))
+ (beginning-of-line 1)
+ (while (re-search-forward regexp end t)
+ (if (and (<= (match-beginning 0) pos)
+ (>= (match-end 0) pos))
+ (throw 'exit t)))
+ nil))))
+
+(defun org-occur-in-agenda-files (regexp &optional nlines)
+ "Call `multi-occur' with buffers for all agenda files."
+ (interactive "sOrg-files matching: \np")
+ (let* ((files (org-agenda-files))
+ (tnames (mapcar 'file-truename files))
+ (extra org-agenda-multi-occur-extra-files)
+ f)
+ (while (setq f (pop extra))
+ (unless (member (file-truename f) tnames)
+ (add-to-list 'files f 'append)
+ (add-to-list 'tnames (file-truename f) 'append)))
+ (multi-occur
+ (mapcar (lambda (x) (or (get-file-buffer x) (find-file-noselect x))) files)
+ regexp)))
+
+(defun org-uniquify (list)
+ "Remove duplicate elements from LIST."
+ (let (res)
+ (mapc (lambda (x) (add-to-list 'res x 'append)) list)
+ res))
+
+(defun org-delete-all (elts list)
+ "Remove all elements in ELTS from LIST."
+ (while elts
+ (setq list (delete (pop elts) list)))
+ list)
+
+(defun org-back-over-empty-lines ()
+ "Move backwards over witespace, to the beginning of the first empty line.
+Returns the number o empty lines passed."
+ (let ((pos (point)))
+ (skip-chars-backward " \t\n\r")
+ (beginning-of-line 2)
+ (count-lines (point) pos)))
+
+(defun org-skip-whitespace ()
+ (skip-chars-forward " \t\n\r"))
+
+(defun org-point-in-group (point group &optional context)
+ "Check if POINT is in match-group GROUP.
+If CONTEXT is non-nil, return a list with CONTEXT and the boundaries of the
+match. If the match group does ot exist or point is not inside it,
+return nil."
+ (and (match-beginning group)
+ (>= point (match-beginning group))
+ (<= point (match-end group))
+ (if context
+ (list context (match-beginning group) (match-end group))
+ t)))
+
+(defun org-switch-to-buffer-other-window (&rest args)
+ "Switch to buffer in a second window on the current frame.
+In particular, do not allow pop-up frames."
+ (let (pop-up-frames special-display-buffer-names special-display-regexps
+ special-display-function)
+ (apply 'switch-to-buffer-other-window args)))
+
+(defun org-combine-plists (&rest plists)
+ "Create a single property list from all plists in PLISTS.
+The process starts by copying the first list, and then setting properties
+from the other lists. Settings in the last list are the most significant
+ones and overrule settings in the other lists."
+ (let ((rtn (copy-sequence (pop plists)))
+ p v ls)
+ (while plists
+ (setq ls (pop plists))
+ (while ls
+ (setq p (pop ls) v (pop ls))
+ (setq rtn (plist-put rtn p v))))
+ rtn))
+
+(defun org-move-line-down (arg)
+ "Move the current line down. With prefix argument, move it past ARG lines."
+ (interactive "p")
+ (let ((col (current-column))
+ beg end pos)
+ (beginning-of-line 1) (setq beg (point))
+ (beginning-of-line 2) (setq end (point))
+ (beginning-of-line (+ 1 arg))
+ (setq pos (move-marker (make-marker) (point)))
+ (insert (delete-and-extract-region beg end))
+ (goto-char pos)
+ (move-to-column col)))
+
+(defun org-move-line-up (arg)
+ "Move the current line up. With prefix argument, move it past ARG lines."
+ (interactive "p")
+ (let ((col (current-column))
+ beg end pos)
+ (beginning-of-line 1) (setq beg (point))
+ (beginning-of-line 2) (setq end (point))
+ (beginning-of-line (- arg))
+ (setq pos (move-marker (make-marker) (point)))
+ (insert (delete-and-extract-region beg end))
+ (goto-char pos)
+ (move-to-column col)))
+
+(defun org-replace-escapes (string table)
+ "Replace %-escapes in STRING with values in TABLE.
+TABLE is an association list with keys like \"%a\" and string values.
+The sequences in STRING may contain normal field width and padding information,
+for example \"%-5s\". Replacements happen in the sequence given by TABLE,
+so values can contain further %-escapes if they are define later in TABLE."
+ (let ((case-fold-search nil)
+ e re rpl)
+ (while (setq e (pop table))
+ (setq re (concat "%-?[0-9.]*" (substring (car e) 1)))
+ (while (string-match re string)
+ (setq rpl (format (concat (substring (match-string 0 string) 0 -1) "s")
+ (cdr e)))
+ (setq string (replace-match rpl t t string))))
+ string))
+
+
+(defun org-sublist (list start end)
+ "Return a section of LIST, from START to END.
+Counting starts at 1."
+ (let (rtn (c start))
+ (setq list (nthcdr (1- start) list))
+ (while (and list (<= c end))
+ (push (pop list) rtn)
+ (setq c (1+ c)))
+ (nreverse rtn)))
+
+(defun org-find-base-buffer-visiting (file)
+ "Like `find-buffer-visiting' but alway return the base buffer and
+not an indirect buffer"
+ (let ((buf (find-buffer-visiting file)))
+ (if buf
+ (or (buffer-base-buffer buf) buf)
+ nil)))
+
+(defun org-image-file-name-regexp ()
+ "Return regexp matching the file names of images."
+ (if (fboundp 'image-file-name-regexp)
+ (image-file-name-regexp)
+ (let ((image-file-name-extensions
+ '("png" "jpeg" "jpg" "gif" "tiff" "tif"
+ "xbm" "xpm" "pbm" "pgm" "ppm")))
+ (concat "\\."
+ (regexp-opt (nconc (mapcar 'upcase
+ image-file-name-extensions)
+ image-file-name-extensions)
+ t)
+ "\\'"))))
+
+(defun org-file-image-p (file)
+ "Return non-nil if FILE is an image."
+ (save-match-data
+ (string-match (org-image-file-name-regexp) file)))
+
+;;; Paragraph filling stuff.
+;; We want this to be just right, so use the full arsenal.
+
+(defun org-indent-line-function ()
+ "Indent line like previous, but further if previous was headline or item."
+ (interactive)
+ (let* ((pos (point))
+ (itemp (org-at-item-p))
+ column bpos bcol tpos tcol bullet btype bullet-type)
+ ;; Find the previous relevant line
+ (beginning-of-line 1)
+ (cond
+ ((looking-at "#") (setq column 0))
+ ((looking-at "\\*+ ") (setq column 0))
+ (t
+ (beginning-of-line 0)
+ (while (and (not (bobp)) (looking-at "[ \t]*[\n:#|]"))
+ (beginning-of-line 0))
+ (cond
+ ((looking-at "\\*+[ \t]+")
+ (goto-char (match-end 0))
+ (setq column (current-column)))
+ ((org-in-item-p)
+ (org-beginning-of-item)
+; (looking-at "[ \t]*\\(\\S-+\\)[ \t]*")
+ (looking-at "[ \t]*\\(\\S-+\\)[ \t]*\\(\\[[- X]\\][ \t]*\\)?")
+ (setq bpos (match-beginning 1) tpos (match-end 0)
+ bcol (progn (goto-char bpos) (current-column))
+ tcol (progn (goto-char tpos) (current-column))
+ bullet (match-string 1)
+ bullet-type (if (string-match "[0-9]" bullet) "n" bullet))
+ (if (not itemp)
+ (setq column tcol)
+ (goto-char pos)
+ (beginning-of-line 1)
+ (if (looking-at "\\S-")
+ (progn
+ (looking-at "[ \t]*\\(\\S-+\\)[ \t]*")
+ (setq bullet (match-string 1)
+ btype (if (string-match "[0-9]" bullet) "n" bullet))
+ (setq column (if (equal btype bullet-type) bcol tcol)))
+ (setq column (org-get-indentation)))))
+ (t (setq column (org-get-indentation))))))
+ (goto-char pos)
+ (if (<= (current-column) (current-indentation))
+ (indent-line-to column)
+ (save-excursion (indent-line-to column)))
+ (setq column (current-column))
+ (beginning-of-line 1)
+ (if (looking-at
+ "\\([ \t]+\\)\\(:[-_0-9a-zA-Z]+:\\)[ \t]*\\(\\S-.*\\(\\S-\\|$\\)\\)")
+ (replace-match (concat "\\1" (format org-property-format
+ (match-string 2) (match-string 3)))
+ t nil))
+ (move-to-column column)))
+
+(defun org-set-autofill-regexps ()
+ (interactive)
+ ;; In the paragraph separator we include headlines, because filling
+ ;; text in a line directly attached to a headline would otherwise
+ ;; fill the headline as well.
+ (org-set-local 'comment-start-skip "^#+[ \t]*")
+ (org-set-local 'paragraph-separate "\f\\|\\*+ \\|[ ]*$\\|[ \t]*[:|]")
+ ;; The paragraph starter includes hand-formatted lists.
+ (org-set-local 'paragraph-start
+ "\f\\|[ ]*$\\|\\*+ \\|\f\\|[ \t]*\\([-+*][ \t]+\\|[0-9]+[.)][ \t]+\\)\\|[ \t]*[:|]")
+ ;; Inhibit auto-fill for headers, tables and fixed-width lines.
+ ;; But only if the user has not turned off tables or fixed-width regions
+ (org-set-local
+ 'auto-fill-inhibit-regexp
+ (concat "\\*+ \\|#\\+"
+ "\\|[ \t]*" org-keyword-time-regexp
+ (if (or org-enable-table-editor org-enable-fixed-width-editor)
+ (concat
+ "\\|[ \t]*["
+ (if org-enable-table-editor "|" "")
+ (if org-enable-fixed-width-editor ":" "")
+ "]"))))
+ ;; We use our own fill-paragraph function, to make sure that tables
+ ;; and fixed-width regions are not wrapped. That function will pass
+ ;; through to `fill-paragraph' when appropriate.
+ (org-set-local 'fill-paragraph-function 'org-fill-paragraph)
+ ; Adaptive filling: To get full control, first make sure that
+ ;; `adaptive-fill-regexp' never matches. Then install our own matcher.
+ (org-set-local 'adaptive-fill-regexp "\000")
+ (org-set-local 'adaptive-fill-function
+ 'org-adaptive-fill-function))
+
+(defun org-fill-paragraph (&optional justify)
+ "Re-align a table, pass through to fill-paragraph if no table."
+ (let ((table-p (org-at-table-p))
+ (table.el-p (org-at-table.el-p)))
+ (cond ((and (equal (char-after (point-at-bol)) ?*)
+ (save-excursion (goto-char (point-at-bol))
+ (looking-at outline-regexp)))
+ t) ; skip headlines
+ (table.el-p t) ; skip table.el tables
+ (table-p (org-table-align) t) ; align org-mode tables
+ (t nil)))) ; call paragraph-fill
+
+;; For reference, this is the default value of adaptive-fill-regexp
+;; "[ \t]*\\([-|#;>*]+[ \t]*\\|(?[0-9]+[.)][ \t]*\\)*"
+
+(defun org-adaptive-fill-function ()
+ "Return a fill prefix for org-mode files.
+In particular, this makes sure hanging paragraphs for hand-formatted lists
+work correctly."
+ (cond ((looking-at "#[ \t]+")
+ (match-string 0))
+ ((looking-at "[ \t]*\\([-*+] \\|[0-9]+[.)] \\)?")
+ (save-excursion
+ (goto-char (match-end 0))
+ (make-string (current-column) ?\ )))
+ (t nil)))
+
+;;;; Functions extending outline functionality
+
+(defun org-beginning-of-line (&optional arg)
+ "Go to the beginning of the current line. If that is invisible, continue
+to a visible line beginning. This makes the function of C-a more intuitive.
+If this is a headline, and `org-special-ctrl-a/e' is set, ignore tags on the
+first attempt, and only move to after the tags when the cursor is already
+beyond the end of the headline."
+ (interactive "P")
+ (let ((pos (point)))
+ (beginning-of-line 1)
+ (if (bobp)
+ nil
+ (backward-char 1)
+ (if (org-invisible-p)
+ (while (and (not (bobp)) (org-invisible-p))
+ (backward-char 1)
+ (beginning-of-line 1))
+ (forward-char 1)))
+ (when org-special-ctrl-a/e
+ (cond
+ ((and (looking-at org-todo-line-regexp)
+ (= (char-after (match-end 1)) ?\ ))
+ (goto-char
+ (if (eq org-special-ctrl-a/e t)
+ (cond ((> pos (match-beginning 3)) (match-beginning 3))
+ ((= pos (point)) (match-beginning 3))
+ (t (point)))
+ (cond ((> pos (point)) (point))
+ ((not (eq last-command this-command)) (point))
+ (t (match-beginning 3))))))
+ ((org-at-item-p)
+ (goto-char
+ (if (eq org-special-ctrl-a/e t)
+ (cond ((> pos (match-end 4)) (match-end 4))
+ ((= pos (point)) (match-end 4))
+ (t (point)))
+ (cond ((> pos (point)) (point))
+ ((not (eq last-command this-command)) (point))
+ (t (match-end 4))))))))))
+
+(defun org-end-of-line (&optional arg)
+ "Go to the end of the line.
+If this is a headline, and `org-special-ctrl-a/e' is set, ignore tags on the
+first attempt, and only move to after the tags when the cursor is already
+beyond the end of the headline."
+ (interactive "P")
+ (if (or (not org-special-ctrl-a/e)
+ (not (org-on-heading-p)))
+ (end-of-line arg)
+ (let ((pos (point)))
+ (beginning-of-line 1)
+ (if (looking-at (org-re ".*?\\([ \t]*\\)\\(:[[:alnum:]_@:]+:\\)[ \t]*$"))
+ (if (eq org-special-ctrl-a/e t)
+ (if (or (< pos (match-beginning 1))
+ (= pos (match-end 0)))
+ (goto-char (match-beginning 1))
+ (goto-char (match-end 0)))
+ (if (or (< pos (match-end 0)) (not (eq this-command last-command)))
+ (goto-char (match-end 0))
+ (goto-char (match-beginning 1))))
+ (end-of-line arg)))))
+
+(define-key org-mode-map "\C-a" 'org-beginning-of-line)
+(define-key org-mode-map "\C-e" 'org-end-of-line)
+
+(defun org-invisible-p ()
+ "Check if point is at a character currently not visible."
+ ;; Early versions of noutline don't have `outline-invisible-p'.
+ (if (fboundp 'outline-invisible-p)
+ (outline-invisible-p)
+ (get-char-property (point) 'invisible)))
+
+(defun org-invisible-p2 ()
+ "Check if point is at a character currently not visible."
+ (save-excursion
+ (if (and (eolp) (not (bobp))) (backward-char 1))
+ ;; Early versions of noutline don't have `outline-invisible-p'.
+ (if (fboundp 'outline-invisible-p)
+ (outline-invisible-p)
+ (get-char-property (point) 'invisible))))
+
+(defalias 'org-back-to-heading 'outline-back-to-heading)
+(defalias 'org-on-heading-p 'outline-on-heading-p)
+(defalias 'org-at-heading-p 'outline-on-heading-p)
+(defun org-at-heading-or-item-p ()
+ (or (org-on-heading-p) (org-at-item-p)))
+
+(defun org-on-target-p ()
+ (or (org-in-regexp org-radio-target-regexp)
+ (org-in-regexp org-target-regexp)))
+
+(defun org-up-heading-all (arg)
+ "Move to the heading line of which the present line is a subheading.
+This function considers both visible and invisible heading lines.
+With argument, move up ARG levels."
+ (if (fboundp 'outline-up-heading-all)
+ (outline-up-heading-all arg) ; emacs 21 version of outline.el
+ (outline-up-heading arg t))) ; emacs 22 version of outline.el
+
+(defun org-up-heading-safe ()
+ "Move to the heading line of which the present line is a subheading.
+This version will not throw an error. It will return the level of the
+headline found, or nil if no higher level is found."
+ (let ((pos (point)) start-level level
+ (re (concat "^" outline-regexp)))
+ (catch 'exit
+ (outline-back-to-heading t)
+ (setq start-level (funcall outline-level))
+ (if (equal start-level 1) (throw 'exit nil))
+ (while (re-search-backward re nil t)
+ (setq level (funcall outline-level))
+ (if (< level start-level) (throw 'exit level)))
+ nil)))
+
+(defun org-first-sibling-p ()
+ "Is this heading the first child of its parents?"
+ (interactive)
+ (let ((re (concat "^" outline-regexp))
+ level l)
+ (unless (org-at-heading-p t)
+ (error "Not at a heading"))
+ (setq level (funcall outline-level))
+ (save-excursion
+ (if (not (re-search-backward re nil t))
+ t
+ (setq l (funcall outline-level))
+ (< l level)))))
+
+(defun org-goto-sibling (&optional previous)
+ "Goto the next sibling, even if it is invisible.
+When PREVIOUS is set, go to the previous sibling instead. Returns t
+when a sibling was found. When none is found, return nil and don't
+move point."
+ (let ((fun (if previous 're-search-backward 're-search-forward))
+ (pos (point))
+ (re (concat "^" outline-regexp))
+ level l)
+ (when (condition-case nil (org-back-to-heading t) (error nil))
+ (setq level (funcall outline-level))
+ (catch 'exit
+ (or previous (forward-char 1))
+ (while (funcall fun re nil t)
+ (setq l (funcall outline-level))
+ (when (< l level) (goto-char pos) (throw 'exit nil))
+ (when (= l level) (goto-char (match-beginning 0)) (throw 'exit t)))
+ (goto-char pos)
+ nil))))
+
+(defun org-show-siblings ()
+ "Show all siblings of the current headline."
+ (save-excursion
+ (while (org-goto-sibling) (org-flag-heading nil)))
+ (save-excursion
+ (while (org-goto-sibling 'previous)
+ (org-flag-heading nil))))
+
+(defun org-show-hidden-entry ()
+ "Show an entry where even the heading is hidden."
+ (save-excursion
+ (org-show-entry)))
+
+(defun org-flag-heading (flag &optional entry)
+ "Flag the current heading. FLAG non-nil means make invisible.
+When ENTRY is non-nil, show the entire entry."
+ (save-excursion
+ (org-back-to-heading t)
+ ;; Check if we should show the entire entry
+ (if entry
+ (progn
+ (org-show-entry)
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil))))
+ (outline-flag-region (max (point-min) (1- (point)))
+ (save-excursion (outline-end-of-heading) (point))
+ flag))))
+
+(defun org-end-of-subtree (&optional invisible-OK to-heading)
+ ;; This is an exact copy of the original function, but it uses
+ ;; `org-back-to-heading', to make it work also in invisible
+ ;; trees. And is uses an invisible-OK argument.
+ ;; Under Emacs this is not needed, but the old outline.el needs this fix.
+ (org-back-to-heading invisible-OK)
+ (let ((first t)
+ (level (funcall outline-level)))
+ (while (and (not (eobp))
+ (or first (> (funcall outline-level) level)))
+ (setq first nil)
+ (outline-next-heading))
+ (unless to-heading
+ (if (memq (preceding-char) '(?\n ?\^M))
+ (progn
+ ;; Go to end of line before heading
+ (forward-char -1)
+ (if (memq (preceding-char) '(?\n ?\^M))
+ ;; leave blank line before heading
+ (forward-char -1))))))
+ (point))
+
+(defun org-show-subtree ()
+ "Show everything after this heading at deeper levels."
+ (outline-flag-region
+ (point)
+ (save-excursion
+ (outline-end-of-subtree) (outline-next-heading) (point))
+ nil))
+
+(defun org-show-entry ()
+ "Show the body directly following this heading.
+Show the heading too, if it is currently invisible."
+ (interactive)
+ (save-excursion
+ (condition-case nil
+ (progn
+ (org-back-to-heading t)
+ (outline-flag-region
+ (max (point-min) (1- (point)))
+ (save-excursion
+ (re-search-forward
+ (concat "[\r\n]\\(" outline-regexp "\\)") nil 'move)
+ (or (match-beginning 1) (point-max)))
+ nil))
+ (error nil))))
+
+(defun org-make-options-regexp (kwds)
+ "Make a regular expression for keyword lines."
+ (concat
+ "^"
+ "#?[ \t]*\\+\\("
+ (mapconcat 'regexp-quote kwds "\\|")
+ "\\):[ \t]*"
+ "\\(.+\\)"))
+
+;; Make isearch reveal the necessary context
+(defun org-isearch-end ()
+ "Reveal context after isearch exits."
+ (when isearch-success ; only if search was successful
+ (if (featurep 'xemacs)
+ ;; Under XEmacs, the hook is run in the correct place,
+ ;; we directly show the context.
+ (org-show-context 'isearch)
+ ;; In Emacs the hook runs *before* restoring the overlays.
+ ;; So we have to use a one-time post-command-hook to do this.
+ ;; (Emacs 22 has a special variable, see function `org-mode')
+ (unless (and (boundp 'isearch-mode-end-hook-quit)
+ isearch-mode-end-hook-quit)
+ ;; Only when the isearch was not quitted.
+ (org-add-hook 'post-command-hook 'org-isearch-post-command
+ 'append 'local)))))
+
+(defun org-isearch-post-command ()
+ "Remove self from hook, and show context."
+ (remove-hook 'post-command-hook 'org-isearch-post-command 'local)
+ (org-show-context 'isearch))
+
+
+;;;; Integration with and fixes for other packages
+
+;;; Imenu support
+
+(defvar org-imenu-markers nil
+ "All markers currently used by Imenu.")
+(make-variable-buffer-local 'org-imenu-markers)
+
+(defun org-imenu-new-marker (&optional pos)
+ "Return a new marker for use by Imenu, and remember the marker."
+ (let ((m (make-marker)))
+ (move-marker m (or pos (point)))
+ (push m org-imenu-markers)
+ m))
+
+(defun org-imenu-get-tree ()
+ "Produce the index for Imenu."
+ (mapc (lambda (x) (move-marker x nil)) org-imenu-markers)
+ (setq org-imenu-markers nil)
+ (let* ((n org-imenu-depth)
+ (re (concat "^" outline-regexp))
+ (subs (make-vector (1+ n) nil))
+ (last-level 0)
+ m tree level head)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-max))
+ (while (re-search-backward re nil t)
+ (setq level (org-reduced-level (funcall outline-level)))
+ (when (<= level n)
+ (looking-at org-complex-heading-regexp)
+ (setq head (org-match-string-no-properties 4)
+ m (org-imenu-new-marker))
+ (org-add-props head nil 'org-imenu-marker m 'org-imenu t)
+ (if (>= level last-level)
+ (push (cons head m) (aref subs level))
+ (push (cons head (aref subs (1+ level))) (aref subs level))
+ (loop for i from (1+ level) to n do (aset subs i nil)))
+ (setq last-level level)))))
+ (aref subs 1)))
+
+(eval-after-load "imenu"
+ '(progn
+ (add-hook 'imenu-after-jump-hook
+ (lambda () (org-show-context 'org-goto)))))
+
+;; Speedbar support
+
+(defun org-speedbar-set-agenda-restriction ()
+ "Restrict future agenda commands to the location at point in speedbar.
+To get rid of the restriction, use \\[org-agenda-remove-restriction-lock]."
+ (interactive)
+ (let (p m tp np dir txt w)
+ (cond
+ ((setq p (text-property-any (point-at-bol) (point-at-eol)
+ 'org-imenu t))
+ (setq m (get-text-property p 'org-imenu-marker))
+ (save-excursion
+ (save-restriction
+ (set-buffer (marker-buffer m))
+ (goto-char m)
+ (org-agenda-set-restriction-lock 'subtree))))
+ ((setq p (text-property-any (point-at-bol) (point-at-eol)
+ 'speedbar-function 'speedbar-find-file))
+ (setq tp (previous-single-property-change
+ (1+ p) 'speedbar-function)
+ np (next-single-property-change
+ tp 'speedbar-function)
+ dir (speedbar-line-directory)
+ txt (buffer-substring-no-properties (or tp (point-min))
+ (or np (point-max))))
+ (save-excursion
+ (save-restriction
+ (set-buffer (find-file-noselect
+ (let ((default-directory dir))
+ (expand-file-name txt))))
+ (unless (org-mode-p)
+ (error "Cannot restrict to non-Org-mode file"))
+ (org-agenda-set-restriction-lock 'file))))
+ (t (error "Don't know how to restrict Org-mode's agenda")))
+ (org-move-overlay org-speedbar-restriction-lock-overlay
+ (point-at-bol) (point-at-eol))
+ (setq current-prefix-arg nil)
+ (org-agenda-maybe-redo)))
+
+(eval-after-load "speedbar"
+ '(progn
+ (speedbar-add-supported-extension ".org")
+ (define-key speedbar-file-key-map "<" 'org-speedbar-set-agenda-restriction)
+ (define-key speedbar-file-key-map "\C-c\C-x<" 'org-speedbar-set-agenda-restriction)
+ (define-key speedbar-file-key-map ">" 'org-agenda-remove-restriction-lock)
+ (define-key speedbar-file-key-map "\C-c\C-x>" 'org-agenda-remove-restriction-lock)
+ (add-hook 'speedbar-visiting-tag-hook
+ (lambda () (org-show-context 'org-goto)))))
+
+
+;;; Fixes and Hacks
+
+;; Make flyspell not check words in links, to not mess up our keymap
+(defun org-mode-flyspell-verify ()
+ "Don't let flyspell put overlays at active buttons."
+ (not (get-text-property (point) 'keymap)))
+
+;; Make `bookmark-jump' show the jump location if it was hidden.
+(eval-after-load "bookmark"
+ '(if (boundp 'bookmark-after-jump-hook)
+ ;; We can use the hook
+ (add-hook 'bookmark-after-jump-hook 'org-bookmark-jump-unhide)
+ ;; Hook not available, use advice
+ (defadvice bookmark-jump (after org-make-visible activate)
+ "Make the position visible."
+ (org-bookmark-jump-unhide))))
+
+(defun org-bookmark-jump-unhide ()
+ "Unhide the current position, to show the bookmark location."
+ (and (org-mode-p)
+ (or (org-invisible-p)
+ (save-excursion (goto-char (max (point-min) (1- (point))))
+ (org-invisible-p)))
+ (org-show-context 'bookmark-jump)))
+
+;; Fix a bug in htmlize where there are text properties (face nil)
+(eval-after-load "htmlize"
+ '(progn
+ (defadvice htmlize-faces-in-buffer (after org-no-nil-faces activate)
+ "Make sure there are no nil faces"
+ (setq ad-return-value (delq nil ad-return-value)))))
+
+;; Make session.el ignore our circular variable
+(eval-after-load "session"
+ '(add-to-list 'session-globals-exclude 'org-mark-ring))
+
+;;;; Experimental code
+
+(defun org-closed-in-range ()
+ "Sparse tree of items closed in a certain time range.
+Still experimental, may disappear in the future."
+ (interactive)
+ ;; Get the time interval from the user.
+ (let* ((time1 (time-to-seconds
+ (org-read-date nil 'to-time nil "Starting date: ")))
+ (time2 (time-to-seconds
+ (org-read-date nil 'to-time nil "End date:")))
+ ;; callback function
+ (callback (lambda ()
+ (let ((time
+ (time-to-seconds
+ (apply 'encode-time
+ (org-parse-time-string
+ (match-string 1))))))
+ ;; check if time in interval
+ (and (>= time time1) (<= time time2))))))
+ ;; make tree, check each match with the callback
+ (org-occur "CLOSED: +\\[\\(.*?\\)\\]" nil callback)))
+
+;;;; Finish up
+
+(provide 'org)
+
+(run-hooks 'org-load-hook)
+
+;; arch-tag: e77da1a7-acc7-4336-b19e-efa25af3f9fd
+;;; org.el ends here
+
diff --git a/org_xemacs.el b/EXPERIMENTAL/interactive-query/org.el.orig
index ceb6eb4..276854a 100644
--- a/org_xemacs.el
+++ b/EXPERIMENTAL/interactive-query/org.el.orig
@@ -1,17 +1,17 @@
;;; org.el --- Outline-based notes management and organizer
;; Carstens outline-mode for keeping track of everything.
-;; Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;;
-;; Author: Carsten Dominik <dominik at science dot uva dot nl>
+;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
-;; Homepage: http://www.astro.uva.nl/~dominik/Tools/org/
-;; Version: 4.78
+;; Homepage: http://orgmode.org
+;; Version: 5.18a
;;
;; 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 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
@@ -49,7 +49,7 @@
;; ---------------------------
;; See the corresponding sections in the manual at
;;
-;; http://staff.science.uva.nl/~dominik/Tools/org/org.html#Installation
+;; http://orgmode.org/org.html#Installation
;;
;; Documentation
;; -------------
@@ -60,7 +60,7 @@
;; in the etc/ directory of Emacs 22.
;;
;; A list of recent changes can be found at
-;; http://www.astro.uva.nl/~dominik/Tools/org/Changes
+;; http://orgmode.org/Changes.html
;;
;;; Code:
@@ -77,13 +77,14 @@
(require 'outline) (require 'noutline)
;; Other stuff we need.
(require 'time-date)
+(unless (fboundp 'time-subtract) (defalias 'time-subtract 'subtract-time))
(require 'easymenu)
;;;; Customization variables
;;; Version
-(defconst org-version "4.78"
+(defconst org-version "5.17a"
"The version number of the file org.el.")
(defun org-version ()
(interactive)
@@ -97,6 +98,44 @@
(get-text-property 0 'test (format "%s" x)))
"Does format transport text properties?")
+(defmacro org-bound-and-true-p (var)
+ "Return the value of symbol VAR if it is bound, else nil."
+ `(and (boundp (quote ,var)) ,var))
+
+(defmacro org-unmodified (&rest body)
+ "Execute body without changing buffer-modified-p."
+ `(set-buffer-modified-p
+ (prog1 (buffer-modified-p) ,@body)))
+
+(defmacro org-re (s)
+ "Replace posix classes in regular expression."
+ (if (featurep 'xemacs)
+ (let ((ss s))
+ (save-match-data
+ (while (string-match "\\[:alnum:\\]" ss)
+ (setq ss (replace-match "a-zA-Z0-9" t t ss)))
+ (while (string-match "\\[:alpha:\\]" ss)
+ (setq ss (replace-match "a-zA-Z" t t ss)))
+ ss))
+ s))
+
+(defmacro org-preserve-lc (&rest body)
+ `(let ((_line (org-current-line))
+ (_col (current-column)))
+ (unwind-protect
+ (progn ,@body)
+ (goto-line _line)
+ (move-to-column _col))))
+
+(defmacro org-without-partial-completion (&rest body)
+ `(let ((pc-mode (and (boundp 'partial-completion-mode)
+ partial-completion-mode)))
+ (unwind-protect
+ (progn
+ (if pc-mode (partial-completion-mode -1))
+ ,@body)
+ (if pc-mode (partial-completion-mode 1)))))
+
;;; The custom variables
(defgroup org nil
@@ -106,6 +145,13 @@
:group 'hypermedia
:group 'calendar)
+;; FIXME: Needs a separate group...
+(defcustom org-completion-fallback-command 'hippie-expand
+ "The expansion command called by \\[org-complete] in normal context.
+Normal means, no org-mode-specific context."
+ :group 'org
+ :type 'function)
+
(defgroup org-startup nil
"Options concerning startup of Org-mode."
:tag "Org Startup"
@@ -213,11 +259,13 @@ Or return the original if not disputed."
(defcustom org-ellipsis nil
"The ellipsis to use in the Org-mode outline.
When nil, just use the standard three dots. When a string, use that instead,
-and just in Org-mode (which will then use its own display table).
+When a face, use the standart 3 dots, but with the specified face.
+The change affects only Org-mode (which will then use its own display table).
Changing this requires executing `M-x org-mode' in a buffer to become
effective."
:group 'org-startup
:type '(choice (const :tag "Default" nil)
+ (face :tag "Face" :value org-warning)
(string :tag "String" :value "...#")))
(defvar org-display-table nil
@@ -289,6 +337,25 @@ After a match, group 1 contains the repeat expression.")
:tag "Org Reveal Location"
:group 'org-structure)
+(defconst org-context-choice
+ '(choice
+ (const :tag "Always" t)
+ (const :tag "Never" nil)
+ (repeat :greedy t :tag "Individual contexts"
+ (cons
+ (choice :tag "Context"
+ (const agenda)
+ (const org-goto)
+ (const occur-tree)
+ (const tags-tree)
+ (const link-search)
+ (const mark-goto)
+ (const bookmark-jump)
+ (const isearch)
+ (const default))
+ (boolean))))
+ "Contexts for the reveal options.")
+
(defcustom org-show-hierarchy-above '((default . t))
"Non-nil means, show full hierarchy when revealing a location.
Org-mode often shows locations in an org-mode file which might have
@@ -307,22 +374,7 @@ contexts. Valid contexts are
isearch when exiting from an incremental search
default default for all contexts not set explicitly"
:group 'org-reveal-location
- :type '(choice
- (const :tag "Always" t)
- (const :tag "Never" nil)
- (repeat :greedy t :tag "Individual contexts"
- (cons
- (choice :tag "Context"
- (const agenda)
- (const org-goto)
- (const occur-tree)
- (const tags-tree)
- (const link-search)
- (const mark-goto)
- (const bookmark-jump)
- (const isearch)
- (const default))
- (boolean)))))
+ :type org-context-choice)
(defcustom org-show-following-heading '((default . nil))
"Non-nil means, show following heading when revealing a location.
@@ -335,22 +387,7 @@ use the command \\[org-reveal] to show more context.
Instead of t, this can also be an alist specifying this option for different
contexts. See `org-show-hierarchy-above' for valid contexts."
:group 'org-reveal-location
- :type '(choice
- (const :tag "Always" t)
- (const :tag "Never" nil)
- (repeat :greedy t :tag "Individual contexts"
- (cons
- (choice :tag "Context"
- (const agenda)
- (const org-goto)
- (const occur-tree)
- (const tags-tree)
- (const link-search)
- (const mark-goto)
- (const bookmark-jump)
- (const isearch)
- (const default))
- (boolean)))))
+ :type org-context-choice)
(defcustom org-show-siblings '((default . nil) (isearch t))
"Non-nil means, show all sibling heading when revealing a location.
@@ -366,29 +403,42 @@ use the command \\[org-reveal] to show more context.
Instead of t, this can also be an alist specifying this option for different
contexts. See `org-show-hierarchy-above' for valid contexts."
:group 'org-reveal-location
- :type '(choice
- (const :tag "Always" t)
- (const :tag "Never" nil)
- (repeat :greedy t :tag "Individual contexts"
- (cons
- (choice :tag "Context"
- (const agenda)
- (const org-goto)
- (const occur-tree)
- (const tags-tree)
- (const link-search)
- (const mark-goto)
- (const bookmark-jump)
- (const isearch)
- (const default))
- (boolean)))))
+ :type org-context-choice)
+
+(defcustom org-show-entry-below '((default . nil))
+ "Non-nil means, show the entry below a headline when revealing a location.
+Org-mode often shows locations in an org-mode file which might have
+been invisible before. When this is set, the text below the headline that is
+exposed is also shown.
+
+By default this is off for all contexts.
+Instead of t, this can also be an alist specifying this option for different
+contexts. See `org-show-hierarchy-above' for valid contexts."
+ :group 'org-reveal-location
+ :type org-context-choice)
(defgroup org-cycle nil
"Options concerning visibility cycling in Org-mode."
:tag "Org Cycle"
:group 'org-structure)
-(defcustom org-cycle-global-at-bob t
+(defcustom org-drawers '("PROPERTIES" "CLOCK")
+ "Names of drawers. Drawers are not opened by cycling on the headline above.
+Drawers only open with a TAB on the drawer line itself. A drawer looks like
+this:
+ :DRAWERNAME:
+ .....
+ :END:
+The drawer \"PROPERTIES\" is special for capturing properties through
+the property API.
+
+Drawers can be defined on the per-file basis with a line like:
+
+#+DRAWERS: HIDDEN STATE PROPERTIES"
+ :group 'org-structure
+ :type '(repeat (string :tag "Drawer Name")))
+
+(defcustom org-cycle-global-at-bob nil
"Cycle globally if cursor is at beginning of buffer and not at a headline.
This makes it possible to do global cycling without having to use S-TAB or
C-u TAB. For this special case to work, the first line of the buffer
@@ -432,6 +482,7 @@ Special case: when 0, never leave empty lines in collapsed view."
:type 'integer)
(defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees
+ org-cycle-hide-drawers
org-cycle-show-empty-lines
org-optimize-window-after-visibility-change)
"Hook that is run after `org-cycle' has changed the buffer visibility.
@@ -448,14 +499,27 @@ the values `folded', `children', or `subtree'."
:tag "Org Edit Structure"
:group 'org-structure)
-(defcustom org-special-ctrl-a nil
- "Non-nil means `C-a' behaves specially in headlines.
-When set, `C-a' will bring back the cursor to the beginning of the
+(defcustom org-special-ctrl-a/e nil
+ "Non-nil means `C-a' and `C-e' behave specially in headlines and items.
+When t, `C-a' will bring back the cursor to the beginning of the
headline text, i.e. after the stars and after a possible TODO keyword.
+In an item, this will be the position after the bullet.
When the cursor is already at that position, another `C-a' will bring
-it to the beginning of the line."
+it to the beginning of the line.
+`C-e' will jump to the end of the headline, ignoring the presence of tags
+in the headline. A second `C-e' will then jump to the true end of the
+line, after any tags.
+When set to the symbol `reversed', the first `C-a' or `C-e' works normally,
+and only a directly following, identical keypress will bring the cursor
+to the special positions."
:group 'org-edit-structure
- :type 'boolean)
+ :type '(choice
+ (const :tag "off" nil)
+ (const :tag "after bullet first" t)
+ (const :tag "border first" reversed)))
+
+(if (fboundp 'defvaralias)
+ (defvaralias 'org-special-ctrl-a 'org-special-ctrl-a/e))
(defcustom org-odd-levels-only nil
"Non-nil means, skip even levels and only use odd levels for the outline.
@@ -495,7 +559,7 @@ and a boolean flag as cdr."
(defcustom org-insert-heading-hook nil
"Hook being run after inserting a new heading."
:group 'org-edit-structure
- :type 'boolean)
+ :type 'hook)
(defcustom org-enable-fixed-width-editor t
"Non-nil means, lines starting with \":\" are treated as fixed-width.
@@ -585,7 +649,9 @@ with \\[org-ctrl-c-ctrl-c\\]."
(defcustom org-archive-tag "ARCHIVE"
"The tag that marks a subtree as archived.
An archived subtree does not open during visibility cycling, and does
-not contribute to the agenda listings."
+not contribute to the agenda listings.
+After changing this, font-lock must be restarted in the relevant buffers to
+get the proper fontification."
:group 'org-archive
:group 'org-keywords
:type 'string)
@@ -651,18 +717,60 @@ line like
:type 'string)
(defcustom org-archive-mark-done t
- "Non-nil means, mark entries as DONE when they are moved to the archive file."
+ "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 'boolean)
+ :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.
-The time stamp will be added directly after the TODO state keyword in the
-first line, so it is probably best to use this in combinations with
-`org-archive-mark-done'."
+This variable is obsolete and has no effect anymore, instead add ot remove
+`time' from the variablle `org-archive-save-context-info'."
:group 'org-archive
:type 'boolean)
+(defcustom org-archive-save-context-info '(time file 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 looses 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.
+itags The local tags, in the headline of the subtree.
+ltags 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.
+
+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 "TODO state" priority)
+ (const :tag "Inherited tags" itags)
+ (const :tag "Local tags" ltags)))
+
+(defgroup org-imenu-and-speedbar nil
+ "Options concerning imenu and speedbar in Org-mode."
+ :tag "Org Imenu and Speedbar"
+ :group 'org-structure)
+
+(defcustom org-imenu-depth 2
+ "The maximum level for Imenu access to Org-mode headlines.
+This also applied for speedbar access."
+ :group 'org-imenu-and-speedbar
+ :type 'number)
+
(defgroup org-table nil
"Options concerning tables in Org-mode."
:tag "Org Table"
@@ -751,7 +859,7 @@ table, obtained by prompting the user."
:type 'string)
(defcustom org-table-number-regexp
- "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%:]*\\|\\(0[xX]\\)[0-9a-fA-F]+\\)$"
+ "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%:]*\\|\\(0[xX]\\)[0-9a-fA-F]+\\|nan\\)$"
"Regular expression for recognizing numbers in table columns.
If a table column contains mostly numbers, it will be aligned to the
right. If not, it will be aligned to the left.
@@ -776,7 +884,7 @@ Other options offered by the customize interface are more restrictive."
(const :tag "Exponential, Floating point, Integer"
"^[-+]?[0-9.]+\\([eEdD][-+0-9]+\\)?$")
(const :tag "Very General Number-Like, including hex"
- "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%]*\\|\\(0[xX]\\)[0-9a-fA-F]+\\)$")
+ "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%]*\\|\\(0[xX]\\)[0-9a-fA-F]+\\|nan\\)$")
(string :tag "Regexp:")))
(defcustom org-table-number-fraction 0.5
@@ -788,7 +896,7 @@ alignment to the right border applies."
:type 'number)
(defgroup org-table-editing nil
- "Bahavior of tables during editing in Org-mode."
+ "Behavior of tables during editing in Org-mode."
:tag "Org Table Editing"
:group 'org-table)
@@ -880,8 +988,6 @@ from the `constants.el' package."
:group 'org-table-calculation
:type 'boolean)
-;; FIXME this is also a variable that makes Org-mode files non-portable
-;; Maybe I should have a #+ options for constants?
(defcustom org-table-formula-constants nil
"Alist with constant names and values, for use in table formulas.
The car of each element is a name of a constant, without the `$' before it.
@@ -890,12 +996,20 @@ speed of light in a formula, you would configure
(setq org-table-formula-constants '((\"c\" . \"299792458.\")))
-and then use it in an equation like `$1*$c'."
+and then use it in an equation like `$1*$c'.
+
+Constants can also be defined on a per-file basis using a line like
+
+#+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6"
:group 'org-table-calculation
:type '(repeat
(cons (string :tag "name")
(string :tag "value"))))
+(defvar org-table-formula-constants-local nil
+ "Local version of `org-table-formula-constants'.")
+(make-variable-buffer-local 'org-table-formula-constants-local)
+
(defcustom org-table-allow-automatic-line-recalculation t
"Non-nil means, lines marked with |#| or |*| will be recomputed automatically.
Automatically means, when TAB or RET or C-c C-c are pressed in the line."
@@ -921,9 +1035,12 @@ links in Org-mode buffers can have an optional tag after a double colon, e.g.
[[linkkey:tag][description]]
If REPLACE is a string, the tag will simply be appended to create the link.
-If the string contains \"%s\", the tag will be inserted there. REPLACE may
-also be a function that will be called with the tag as the only argument to
-create the link. See the manual for examples."
+If the string contains \"%s\", the tag will be inserted there.
+
+REPLACE may also be a function that will be called with the tag as the
+only argument to create the link, which should be returned as a string.
+
+See the manual for examples."
:group 'org-link
:type 'alist)
@@ -1144,15 +1261,15 @@ if one was given like in <mailto:arthur@galaxy.org::this subject>."
(defcustom org-confirm-shell-link-function 'yes-or-no-p
"Non-nil means, ask for confirmation before executing shell links.
-Shell links can be dangerous, just thing about a link
+Shell links can be dangerous: just think about a link
[[shell:rm -rf ~/*][Google Search]]
-This link would show up in your Org-mode document as \"Google Search\"
+This link would show up in your Org-mode document as \"Google Search\",
but really it would remove your entire home directory.
-Therefore I *definitely* advise against setting this variable to nil.
-Just change it to `y-or-n-p' of you want to confirm with a single key press
-rather than having to type \"yes\"."
+Therefore we advise against setting this variable to nil.
+Just change it to `y-or-n-p' of you want to confirm with a
+single keystroke rather than having to type \"yes\"."
:group 'org-link-follow
:type '(choice
(const :tag "with yes-or-no (safer)" yes-or-no-p)
@@ -1160,16 +1277,16 @@ rather than having to type \"yes\"."
(const :tag "no confirmation (dangerous)" nil)))
(defcustom org-confirm-elisp-link-function 'yes-or-no-p
- "Non-nil means, ask for confirmation before executing elisp links.
-Elisp links can be dangerous, just think about a link
+ "Non-nil means, ask for confirmation before executing Emacs Lisp links.
+Elisp links can be dangerous: just think about a link
[[elisp:(shell-command \"rm -rf ~/*\")][Google Search]]
-This link would show up in your Org-mode document as \"Google Search\"
+This link would show up in your Org-mode document as \"Google Search\",
but really it would remove your entire home directory.
-Therefore I *definitely* advise against setting this variable to nil.
-Just change it to `y-or-n-p' of you want to confirm with a single key press
-rather than having to type \"yes\"."
+Therefore we advise against setting this variable to nil.
+Just change it to `y-or-n-p' of you want to confirm with a
+single keystroke rather than having to type \"yes\"."
:group 'org-link-follow
:type '(choice
(const :tag "with yes-or-no (safer)" yes-or-no-p)
@@ -1285,6 +1402,15 @@ You can set this on a per-template basis with the variable
(const :tag "Default from remember-data-file" nil)
file))
+(defcustom org-remember-store-without-prompt t
+ "Non-nil means, `C-c C-c' stores remember note without further promts.
+In this case, you need `C-u C-c C-c' to get the prompts for
+note file and headline.
+When this variable is nil, `C-c C-c' give you the prompts, and
+`C-u C-c C-c' trigger the fasttrack."
+ :group 'org-remember
+ :type 'boolean)
+
(defcustom org-remember-default-headline ""
"The headline that should be the default location in the notes file.
When filing remember notes, the cursor will start at that position.
@@ -1296,11 +1422,12 @@ You can set this on a per-template basis with the variable
(defcustom org-remember-templates nil
"Templates for the creation of remember buffers.
When nil, just let remember make the buffer.
-When not nil, this is a list of 4-element lists. In each entry, the first
-element is a character, a unique key to select this template.
-The second element is the template. The third element is optional and can
+When not nil, this is a list of 5-element lists. In each entry, the first
+element is a the name of the template, It should be a single short word.
+The second element is a character, a unique key to select this template.
+The third element is the template. The forth element is optional and can
specify a destination file for remember items created with this template.
-The default file is given by `org-default-notes-file'. An optional third
+The default file is given by `org-default-notes-file'. An optional fifth
element can specify the headline in that file that should be offered
first when the user is asked to file the entry. The default headline is
given in the variable `org-remember-default-headline'.
@@ -1309,7 +1436,9 @@ The template specifies the structure of the remember buffer. It should have
a first line starting with a star, to act as the org-mode headline.
Furthermore, the following %-escapes will be replaced with content:
- %^{prompt} prompt the user for a string and replace this sequence with it.
+ %^{prompt} Prompt the user for a string and replace this sequence with it.
+ A default value and a completion table ca be specified like this:
+ %^{prompt|default|completion2|completion3|...}
%t time stamp, date only
%T time stamp with date and time
%u, %U like the above, but inactive time stamps
@@ -1320,6 +1449,13 @@ Furthermore, the following %-escapes will be replaced with content:
%i initial content, the region when remember is called with C-u.
If %i is indented, the entire inserted text will be indented
as well.
+ %c content of the clipboard, or current kill ring head
+ %^g prompt for tags, with completion on tags in target file
+ %^G prompt for tags, with completion all tags in all agenda files
+ %:keyword specific information for certain link types, see below
+ %[pathname] insert the contents of the file given by `pathname'
+ %(sexp) evaluate elisp `(sexp)' and replace with the result
+ %! Store this note immediately after filling the template
%? After completing the template, position cursor here.
@@ -1341,23 +1477,31 @@ w3, w3m | %:type %:url
info | %:type %:file %:node
calendar | %:type %:date"
:group 'org-remember
- :get (lambda (var) ; Make sure all entries have 4 elements
+ :get (lambda (var) ; Make sure all entries have 5 elements
(mapcar (lambda (x)
- (cond ((= (length x) 3) (append x '("")))
- ((= (length x) 2) (append x '("" "")))
+ (if (not (stringp (car x))) (setq x (cons "" x)))
+ (cond ((= (length x) 4) (append x '("")))
+ ((= (length x) 3) (append x '("" "")))
(t x)))
(default-value var)))
:type '(repeat
:tag "enabled"
- (list :value (?a "\n" nil nil)
+ (list :value ("" ?a "\n" nil nil)
+ (string :tag "Name")
(character :tag "Selection Key")
(string :tag "Template")
- (file :tag "Destination file (optional)")
- (string :tag "Destination headline (optional)"))))
+ (choice
+ (file :tag "Destination file")
+ (const :tag "Prompt for file" nil))
+ (choice
+ (string :tag "Destination headline")
+ (const :tag "Selection interface for heading")))))
(defcustom org-reverse-note-order nil
"Non-nil means, store new notes at the beginning of a file or entry.
-When nil, new notes will be filed to the end of a file or entry."
+When nil, new notes will be filed to the end of a file or entry.
+This can also be a list with cons cells of regular expressions that
+are matched against file names, and values."
:group 'org-remember
:type '(choice
(const :tag "Reverse always" t)
@@ -1365,6 +1509,51 @@ When nil, new notes will be filed to the end of a file or entry."
(repeat :tag "By file name regexp"
(cons regexp boolean))))
+(defcustom org-refile-targets '((nil . (:level . 1)))
+ "Targets for refiling entries with \\[org-refile].
+This is list of cons cells. Each cell contains:
+- a specification of the files to be considered, either a list of files,
+ or a symbol whose function or value fields will be used to retrieve
+ a file name or a list of file names. Nil means, refile to a different
+ heading in the current buffer.
+- A specification of how to find candidate refile targets. This may be
+ any of
+ - a cons cell (:tag . \"TAG\") to identify refile targes by a tag.
+ This tag has to be present in all target headlines, inheritance will
+ not be considered.
+ - a cons cell (:todo . \"KEYWORD\" to identify refile targets by
+ todo keyword.
+ - a cons cell (:regexp . \"REGEXP\") with a regular expression matching
+ headlines that are refiling targets.
+ - a cons cell (:level . N). Any headline of level N is considered a target.
+ - a cons cell (:maxlevel . N). Any headline with level <= N is a target."
+;; FIXME: what if there are a var and func with same name???
+ :group 'org-remember
+ :type '(repeat
+ (cons
+ (choice :value org-agenda-files
+ (const :tag "All agenda files" org-agenda-files)
+ (const :tag "Current buffer" nil)
+ (function) (variable) (file))
+ (choice :tag "Identify target headline by"
+ (cons :tag "Specific tag" (const :tag) (string))
+ (cons :tag "TODO keyword" (const :todo) (string))
+ (cons :tag "Regular expression" (const :regexp) (regexp))
+ (cons :tag "Level number" (const :level) (integer))
+ (cons :tag "Max Level number" (const :maxlevel) (integer))))))
+
+(defcustom org-refile-use-outline-path nil
+ "Non-nil means, provide refile targets as paths.
+So a level 3 headline will be available as level1/level2/level3.
+When the value is `file', also include the file name (without directory)
+into the path. When `full-file-path', include the full file path."
+ :group 'org-remember
+ :type '(choice
+ (const :tag "Not" nil)
+ (const :tag "Yes" t)
+ (const :tag "Start with file name" file)
+ (const :tag "Start with full file path" full-file-path)))
+
(defgroup org-todo nil
"Options concerning TODO items in Org-mode."
:tag "Org TODO"
@@ -1424,8 +1613,14 @@ taken from the (otherwise obsolete) variable `org-todo-interpretation'."
(make-variable-buffer-local 'org-todo-heads)
(defvar org-todo-sets nil)
(make-variable-buffer-local 'org-todo-sets)
+(defvar org-todo-log-states nil)
+(make-variable-buffer-local 'org-todo-log-states)
(defvar org-todo-kwd-alist nil)
(make-variable-buffer-local 'org-todo-kwd-alist)
+(defvar org-todo-key-alist nil)
+(make-variable-buffer-local 'org-todo-key-alist)
+(defvar org-todo-key-trigger nil)
+(make-variable-buffer-local 'org-todo-key-trigger)
(defcustom org-todo-interpretation 'sequence
"Controls how TODO keywords are interpreted.
@@ -1438,6 +1633,30 @@ more information."
:type '(choice (const sequence)
(const type)))
+(defcustom org-use-fast-todo-selection 'prefix
+ "Non-nil means, use the fast todo selection scheme with C-c C-t.
+This variable describes if and under what circumstances the cycling
+mechanism for TODO keywords will be replaced by a single-key, direct
+selection scheme.
+
+When nil, fast selection is never used.
+
+When the symbol `prefix', it will be used when `org-todo' is called with
+a prefix argument, i.e. `C-u C-c C-t' in an Org-mode buffer, and `C-u t'
+in an agenda buffer.
+
+When t, fast selection is used by default. In this case, the prefix
+argument forces cycling instead.
+
+In all cases, the special interface is only used if access keys have actually
+been assigned by the user, i.e. if keywords in the configuration are followed
+by a letter in parenthesis, like TODO(t)."
+ :group 'org-todo
+ :type '(choice
+ (const :tag "Never" nil)
+ (const :tag "By default" t)
+ (const :tag "Only with C-u C-c C-t" prefix)))
+
(defcustom org-after-todo-state-change-hook nil
"Hook which is run after the state of a TODO item was changed.
The new state (a string with a TODO keyword, or nil) is available in the
@@ -1447,8 +1666,8 @@ Lisp variable `state'."
(defcustom org-log-done nil
"When set, insert a (non-active) time stamp when TODO entry is marked DONE.
-When the state of an entry is changed from nothing to TODO, remove a previous
-closing date.
+When the state of an entry is changed from nothing or a DONE state to
+a not-done TODO state, remove a previous closing date.
This can also be a list of symbols indicating under which conditions
the time stamp recording the action should be annotated with a short note.
@@ -1473,7 +1692,10 @@ the following lines anywhere in the buffer:
#+STARTUP: nologging
#+STARTUP: lognotedone
#+STARTUP: lognotestate
- #+STARTUP: lognoteclock-out"
+ #+STARTUP: lognoteclock-out
+
+You can have local logging settings for a subtree by setting the LOGGING
+property to one or more of these keywords."
:group 'org-todo
:group 'org-progress
:type '(choice
@@ -1495,7 +1717,7 @@ When nil, only the date will be recorded."
(state . "State %-12s %t")
(clock-out . ""))
"Headings for notes added when clocking out or closing TODO items.
-The value is an alist, with the car being a sympol indicating the note
+The value is an alist, with the car being a symbol indicating the note
context, and the cdr is the heading to be used. The heading may also be the
empty string.
%t in the heading will be replaced by a time stamp.
@@ -1511,13 +1733,57 @@ empty string.
state) string)
(cons (const :tag "Heading when clocking out" clock-out) string)))
+(defcustom org-log-states-order-reversed t
+ "Non-nil means, the latest state change note will be directly after heading.
+When nil, the notes will be orderer according to time."
+ :group 'org-todo
+ :group 'org-progress
+ :type 'boolean)
+
(defcustom org-log-repeat t
"Non-nil means, prompt for a note when REPEAT is resetting a TODO entry.
-When nil, no note will be taken."
+When nil, no note will be taken.
+This option can also be set with on a per-file-basis with
+
+ #+STARTUP: logrepeat
+ #+STARTUP: nologrepeat
+
+You can have local logging settings for a subtree by setting the LOGGING
+property to one or more of these keywords."
:group 'org-todo
:group 'org-progress
:type 'boolean)
+(defcustom org-clock-into-drawer 2
+ "Should clocking info be wrapped into a drawer?
+When t, clocking info will always be inserted into a :CLOCK: drawer.
+If necessary, the drawer will be created.
+When nil, the drawer will not be created, but used when present.
+When an integer and the number of clocking entries in an item
+reaches or exceeds this number, a drawer will be created."
+ :group 'org-todo
+ :group 'org-progress
+ :type '(choice
+ (const :tag "Always" t)
+ (const :tag "Only when drawer exists" nil)
+ (integer :tag "When at least N clock entries")))
+
+(defcustom org-clock-out-when-done t
+ "When t, the clock will be stopped when the relevant entry is marked DONE.
+Nil means, clock will keep running until stopped explicitly with
+`C-c C-x C-o', or until the clock is started in a different item."
+ :group 'org-progress
+ :type 'boolean)
+
+(defcustom org-clock-in-switch-to-state nil
+ "Set task to a special todo state while clocking it.
+The value should be the state to which the entry should be switched."
+ :group 'org-progress
+ :group 'org-todo
+ :type '(choice
+ (const :tag "Don't force a state" nil)
+ (string :tag "State")))
+
(defgroup org-priorities nil
"Priorities in Org-mode."
:tag "Org Priorities"
@@ -1541,6 +1807,13 @@ This is the priority an item get if no explicit priority is given."
:group 'org-priorities
:type 'character)
+(defcustom org-priority-start-cycle-with-default t
+ "Non-nil means, start with default priority when starting to cycle.
+When this is nil, the first step in the cycle will be (depending on the
+command used) one higher or lower that the default priority."
+ :group 'org-priorities
+ :type 'boolean)
+
(defgroup org-time nil
"Options concerning time stamps and deadlines in Org-mode."
:tag "Org Time"
@@ -1594,19 +1867,58 @@ end of the second format."
(concat "[" (substring f 1 -1) "]")
f)))
-(defcustom org-deadline-warning-days 30
- "No. of days before expiration during which a deadline becomes active.
-This variable governs the display in sparse trees and in the agenda."
+(defcustom org-read-date-prefer-future t
+ "Non-nil means, assume future for incomplete date input from user.
+This affects the following situations:
+1. The user gives a day, but no month.
+ For example, if today is the 15th, and you enter \"3\", Org-mode will
+ read this as the third of *next* month. However, if you enter \"17\",
+ it will be considered as *this* month.
+2. The user gives a month but not a year.
+ For example, if it is april and you enter \"feb 2\", this will be read
+ as feb 2, *next* year. \"May 5\", however, will be this year.
+
+When this option is nil, the current month and year will always be used
+as defaults."
:group 'org-time
- :type 'number)
+ :type 'boolean)
+
+(defcustom org-read-date-display-live t
+ "Non-nil means, display current interpretation of date prompt live.
+This display will be in an overlay, in the minibuffer."
+ :group 'org-time
+ :type 'boolean)
-(defcustom org-popup-calendar-for-date-prompt t
+(defcustom org-read-date-popup-calendar t
"Non-nil means, pop up a calendar when prompting for a date.
In the calendar, the date can be selected with mouse-1. However, the
minibuffer will also be active, and you can simply enter the date as well.
When nil, only the minibuffer will be available."
:group 'org-time
:type 'boolean)
+(if (fboundp 'defvaralias)
+ (defvaralias 'org-popup-calendar-for-date-prompt
+ 'org-read-date-popup-calendar))
+
+(defcustom org-extend-today-until 0
+ "The hour when your day really ends.
+This has influence for the following applications:
+- When switching the agenda to \"today\". It it is still earlier than
+ the time given here, the day recognized as TODAY is actually yesterday.
+- When a date is read from the user and it is still before the time given
+ here, the current date and time will be assumed to be yesterday, 23:59.
+
+FIXME:
+IMPORTANT: This is still a very experimental feature, it may disappear
+again or it may be extended to mean more things."
+ :group 'org-time
+ :type 'number)
+
+(defcustom org-edit-timestamp-down-means-later nil
+ "Non-nil means, S-down will increase the time in a time stamp.
+When nil, S-up will increase."
+ :group 'org-time
+ :type 'boolean)
(defcustom org-calendar-follow-timestamp-change t
"Non-nil means, make the calendar window follow timestamp changes.
@@ -1615,6 +1927,13 @@ moved to the new date."
:group 'org-time
:type 'boolean)
+(defcustom org-clock-heading-function nil
+ "When non-nil, should be a function to create `org-clock-heading'.
+This is the string shown in the mode line when a clock is running.
+The function is called with point at the beginning of the headline."
+ :group 'org-time ; FIXME: Should we have a separate group????
+ :type 'function)
+
(defgroup org-tags nil
"Options concerning tags in Org-mode."
:tag "Org Tags"
@@ -1624,9 +1943,10 @@ moved to the new date."
"List of tags allowed in Org-mode files.
When this list is nil, Org-mode will base TAG input on what is already in the
buffer.
-The value of this variable is an alist, the car may be (and should) be a
-character that is used to select that tag through the fast-tag-selection
-interface. See the manual for details."
+The value of this variable is an alist, the car of each entry must be a
+keyword as a string, the cdr may be a character that is used to select
+that tag through the fast-tag-selection interface.
+See the manual for details."
:group 'org-tags
:type '(repeat
(choice
@@ -1662,11 +1982,15 @@ displaying the tags menu is not even shown, until you press C-c again."
(const :tag "Yes" t)
(const :tag "Expert" expert)))
-(defcustom org-tags-column 48
+(defvar org-fast-tag-selection-include-todo nil
+ "Non-nil means, fast tags selection interface will also offer TODO states.
+This is an undocumented feature, you should not rely on it.")
+
+(defcustom org-tags-column -80
"The column to which tags should be indented in a headline.
If this number is positive, it specifies the column. If it is negative,
it means that the tags should be flushright to that column. For example,
--79 works well for a normal 80 character screen."
+-80 works well for a normal 80 character screen."
:group 'org-tags
:type 'integer)
@@ -1705,6 +2029,64 @@ make sure all corresponding TODO items find their way into the list."
"History of minibuffer reads for tags.")
(defvar org-last-tags-completion-table nil
"The last used completion table for tags.")
+(defvar org-after-tags-change-hook nil
+ "Hook that is run after the tags in a line have changed.")
+
+(defgroup org-properties nil
+ "Options concerning properties in Org-mode."
+ :tag "Org Properties"
+ :group 'org)
+
+(defcustom org-property-format "%-10s %s"
+ "How property key/value pairs should be formatted by `indent-line'.
+When `indent-line' hits a property definition, it will format the line
+according to this format, mainly to make sure that the values are
+lined-up with respect to each other."
+ :group 'org-properties
+ :type 'string)
+
+(defcustom org-use-property-inheritance nil
+ "Non-nil means, properties apply also for sublevels.
+This setting is only relevant during property searches, not when querying
+an entry with `org-entry-get'. To retrieve a property with inheritance,
+you need to call `org-entry-get' with the inheritance flag.
+Turning this on can cause significant overhead when doing a search, so
+this is turned off by default.
+When nil, only the properties directly given in the current entry count.
+The value may also be a list of properties that shouldhave inheritance.
+
+However, note that some special properties use inheritance under special
+circumstances (not in searches). Examples are CATEGORY, ARCHIVE, COLUMNS,
+and the properties ending in \"_ALL\" when they are used as descriptor
+for valid values of a property."
+ :group 'org-properties
+ :type '(choice
+ (const :tag "Not" nil)
+ (const :tag "Always" nil)
+ (repeat :tag "Specific properties" (string :tag "Property"))))
+
+(defcustom org-columns-default-format "%25ITEM %TODO %3PRIORITY %TAGS"
+ "The default column format, if no other format has been defined.
+This variable can be set on the per-file basis by inserting a line
+
+#+COLUMNS: %25ITEM ....."
+ :group 'org-properties
+ :type 'string)
+
+(defcustom org-global-properties nil
+ "List of property/value pairs that can be inherited by any entry.
+You can set buffer-local values for this by adding lines like
+
+#+PROPERTY: NAME VALUE"
+ :group 'org-properties
+ :type '(repeat
+ (cons (string :tag "Property")
+ (string :tag "Value"))))
+
+(defvar org-local-properties nil
+ "List of property/value pairs that can be inherited by any entry.
+Valid for the current buffer.
+This variable is populated from #+PROPERTY lines.")
(defgroup org-agenda nil
"Options concerning agenda views in Org-mode."
@@ -1730,14 +2112,36 @@ is used instead.")
Entries may be added to this list with \\[org-agenda-file-to-front] and removed with
\\[org-remove-file]. You can also use customize to edit the list.
+If an entry is a directory, all files in that directory that are matched by
+`org-agenda-file-regexp' will be part of the file list.
+
If the value of the variable is not a list but a single file name, then
the list of agenda files is actually stored and maintained in that file, one
agenda file per line."
:group 'org-agenda
:type '(choice
- (repeat :tag "List of files" file)
+ (repeat :tag "List of files and directories" file)
(file :tag "Store list in a file\n" :value "~/.agenda_files")))
+(defcustom org-agenda-file-regexp "\\`[^.].*\\.org\\'"
+ "Regular expression to match files for `org-agenda-files'.
+If any element in the list in that variable contains a directory instead
+of a normal file, all files in that directory that are matched by this
+regular expression will be included."
+ :group 'org-agenda
+ :type 'regexp)
+
+(defcustom org-agenda-skip-unavailable-files nil
+ "t means to just skip non-reachable files in `org-agenda-files'.
+Nil means to remove them, after a query, from the list."
+ :group 'org-agenda
+ :type 'boolean)
+
+(defcustom org-agenda-multi-occur-extra-files nil
+ "List of extra files to be searched by `org-occur-in-agenda-files'.
+The files in `org-agenda-files' are always searched."
+ :group 'org-agenda
+ :type '(repeat file))
(defcustom org-agenda-confirm-kill 1
"When set, remote killing from the agenda buffer needs confirmation.
@@ -1757,6 +2161,12 @@ forth between agenda and calendar."
:group 'org-agenda
:type 'sexp)
+(defcustom org-agenda-compact-blocks nil
+ "Non-nil means, make the block agenda more compact.
+This is done by leaving out unnecessary lines."
+ :group 'org-agenda
+ :type nil)
+
(defgroup org-agenda-export nil
"Options concerning exporting agenda views in Org-mode."
:tag "Org Agenda Export"
@@ -1825,9 +2235,12 @@ you can \"misuse\" it to also add other text to the header. However,
These commands will be offered on the splash screen displayed by the
agenda dispatcher \\[org-agenda]. Each entry is a list like this:
- (key type match options files)
+ (key desc type match options files)
-key The key (a single char as a string) to be associated with the command.
+key The key (one or more characters as a string) to be associated
+ with the command.
+desc A description of the commend, when omitted or nil, a default
+ description is built using MATCH.
type The command type, any of the following symbols:
todo Entries with a specific TODO keyword, in all agenda files.
tags Tags match in all agenda files.
@@ -1835,11 +2248,12 @@ type The command type, any of the following symbols:
todo-tree Sparse tree of specific TODO keyword in *current* file.
tags-tree Sparse tree with all tags matches in *current* file.
occur-tree Occur sparse tree for *current* file.
+ ... A user-defined function.
match What to search for:
- a single keyword for TODO keyword searches
- a tags match expression for tags searches
- a regular expression for occur searches
-options A list of option setttings, similar to that in a let form, so like
+options A list of option settings, similar to that in a let form, so like
this: ((opt1 val1) (opt2 val2) ...)
files A list of files file to write the produced agenda buffer to
with the command `org-store-agenda-views'.
@@ -1867,12 +2281,23 @@ cmd An agenda command, similar to the above. However, tree commands
Each command can carry a list of options, and another set of options can be
given for the whole set of commands. Individual command options take
-precedence over the general options."
+precedence over the general options.
+
+When using several characters as key to a command, the first characters
+are prefix commands. For the dispatcher to display useful information, you
+should provide a description for the prefix, like
+
+ (setq org-agenda-custom-commands
+ '((\"h\" . \"HOME + Name tag searches\") ; describe prefix \"h\"
+ (\"hl\" tags \"+HOME+Lisa\")
+ (\"hp\" tags \"+HOME+Peter\")
+ (\"hk\" tags \"+HOME+Kim\")))"
:group 'org-agenda-custom-commands
:type '(repeat
- (choice :value ("a" tags "" nil)
+ (choice :value ("a" "" tags "" nil)
(list :tag "Single command"
- (string :tag "Key")
+ (string :tag "Access Key(s) ")
+ (option (string :tag "Description"))
(choice
(const :tag "Agenda" agenda)
(const :tag "TODO list" alltodo)
@@ -1883,14 +2308,14 @@ precedence over the general options."
(const :tag "Tags sparse tree (current buffer)" tags-tree)
(const :tag "TODO keyword tree (current buffer)" todo-tree)
(const :tag "Occur tree (current buffer)" occur-tree)
- (symbol :tag "Other, user-defined function"))
+ (sexp :tag "Other, user-defined function"))
(string :tag "Match")
(repeat :tag "Local options"
(list (variable :tag "Option") (sexp :tag "Value")))
(option (repeat :tag "Export" (file :tag "Export to"))))
(list :tag "Command series, all agenda files"
- (string :tag "Key")
- (string :tag "Description")
+ (string :tag "Access Key(s)")
+ (string :tag "Description ")
(repeat
(choice
(const :tag "Agenda" (agenda))
@@ -1927,7 +2352,10 @@ precedence over the general options."
(repeat :tag "General options"
(list (variable :tag "Option")
(sexp :tag "Value")))
- (option (repeat :tag "Export" (file :tag "Export to")))))))
+ (option (repeat :tag "Export" (file :tag "Export to"))))
+ (cons :tag "Prefix key documentation"
+ (string :tag "Access Key(s)")
+ (string :tag "Description ")))))
(defcustom org-stuck-projects
'("+LEVEL=2/-DONE" ("TODO" "NEXT" "NEXTACTION") nil "")
@@ -1968,10 +2396,22 @@ potentially much shorter TODO lists."
:group 'org-todo
:type 'boolean)
+(defcustom org-agenda-todo-ignore-with-date nil
+ "Non-nil means, don't show entries with a date in the global todo list.
+You can use this if you prefer to mark mere appointments with a TODO keyword,
+but don't want them to show up in the TODO list.
+When this is set, it also covers deadlines and scheduled items, the settings
+of `org-agenda-todo-ignore-scheduled' and `org-agenda-todo-ignore-deadlines'
+will be ignored."
+ :group 'org-agenda-skip
+ :group 'org-todo
+ :type 'boolean)
+
(defcustom org-agenda-todo-ignore-scheduled nil
"Non-nil means, don't show scheduled entries in the global todo list.
The idea behind this is that by scheduling it, you have already taken care
-of this item."
+of this item.
+See also `org-agenda-todo-ignore-with-date'."
:group 'org-agenda-skip
:group 'org-todo
:type 'boolean)
@@ -1979,22 +2419,32 @@ of this item."
(defcustom org-agenda-todo-ignore-deadlines nil
"Non-nil means, don't show near deadline entries in the global todo list.
Near means closer than `org-deadline-warning-days' days.
-The idea behind this is that such items will appear in the agenda anyway."
+The idea behind this is that such items will appear in the agenda anyway.
+See also `org-agenda-todo-ignore-with-date'."
:group 'org-agenda-skip
:group 'org-todo
:type 'boolean)
(defcustom org-agenda-skip-scheduled-if-done nil
"Non-nil means don't show scheduled items in agenda when they are done.
-This is relevant for the daily/weekly agenda, not for the TODO list."
+This is relevant for the daily/weekly agenda, not for the TODO list. And
+it applies only to the actual date of the scheduling. Warnings about
+an item with a past scheduling dates are always turned off when the item
+is DONE."
:group 'org-agenda-skip
:type 'boolean)
(defcustom org-agenda-skip-deadline-if-done nil
"Non-nil means don't show deadines when the corresponding item is done.
When nil, the deadline is still shown and should give you a happy feeling.
+This is relevant for the daily/weekly agenda. And it applied only to the
+actualy date of the deadline. Warnings about approching and past-due
+deadlines are always turned off when the item is DONE."
+ :group 'org-agenda-skip
+ :type 'boolean)
-This is relevant for the daily/weekly agenda."
+(defcustom org-agenda-skip-timestamp-if-done nil
+ "Non-nil means don't don't select item by timestamp or -range if it is DONE."
:group 'org-agenda-skip
:type 'boolean)
@@ -2055,6 +2505,13 @@ See also the variable `org-agenda-restore-windows-after-quit'."
(const other-window)
(const reorganize-frame)))
+(defcustom org-agenda-window-frame-fractions '(0.5 . 0.75)
+ "The min and max height of the agenda window as a fraction of frame height.
+The value of the variable is a cons cell with two numbers between 0 and 1.
+It only matters if `org-agenda-window-setup' is `reorganize-frame'."
+ :group 'org-agenda-windows
+ :type '(cons (number :tag "Minimum") (number :tag "Maximum")))
+
(defcustom org-agenda-restore-windows-after-quit nil
"Non-nil means, restore window configuration open exiting agenda.
Before the window configuration is changed for displaying the agenda,
@@ -2073,7 +2530,9 @@ Valid values are:
current-window Display in the current window
other-window Just display in another window.
dedicated-frame Create one new frame, and re-use it each time.
-new-frame Make a new frame each time."
+new-frame Make a new frame each time. Note that in this case
+ previously-made indirect buffers are kept, and you need to
+ kill these buffers yourself."
:group 'org-structure
:group 'org-agenda-windows
:type '(choice
@@ -2107,13 +2566,25 @@ When nil, only the days which actually have entries are shown."
:group 'org-agenda-daily/weekly
:type 'boolean)
-(defcustom org-agenda-date-format "%A %d %B %Y"
+(defcustom org-agenda-format-date 'org-agenda-format-date-aligned
"Format string for displaying dates in the agenda.
Used by the daily/weekly agenda and by the timeline. This should be
-a format string understood by `format-time-string'.
-FIXME: Not used currently, because of timezone problem."
+a format string understood by `format-time-string', or a function returning
+the formatted date as a string. The function must take a single argument,
+a calendar-style date list like (month day year)."
:group 'org-agenda-daily/weekly
- :type 'string)
+ :type '(choice
+ (string :tag "Format string")
+ (function :tag "Function")))
+
+(defun org-agenda-format-date-aligned (date)
+ "Format a date string for display in the daily/weekly agenda, or timeline.
+This function makes sure that dates are aligned for easy reading."
+ (format "%-9s %2d %s %4d"
+ (calendar-day-name date)
+ (extract-calendar-day date)
+ (calendar-month-name (extract-calendar-month date))
+ (extract-calendar-year date)))
(defcustom org-agenda-include-diary nil
"If non-nil, include in the agenda entries from the Emacs Calendar's diary."
@@ -2127,6 +2598,30 @@ the entries for specific days."
:group 'org-agenda-daily/weekly
:type 'boolean)
+(defcustom org-agenda-repeating-timestamp-show-all t
+ "Non-nil means, show all occurences of a repeating stamp in the agenda.
+When nil, only one occurence is shown, either today or the
+nearest into the future."
+ :group 'org-agenda-daily/weekly
+ :type 'boolean)
+
+(defcustom org-deadline-warning-days 14
+ "No. of days before expiration during which a deadline becomes active.
+This variable governs the display in sparse trees and in the agenda.
+When negative, it means use this number (the absolute value of it)
+even if a deadline has a different individual lead time specified."
+ :group 'org-time
+ :group 'org-agenda-daily/weekly
+ :type 'number)
+
+(defcustom org-scheduled-past-days 10000
+ "No. of days to continue listing scheduled items that are not marked DONE.
+When an item is scheduled on a date, it shows up in the agenda on this
+day and will be listed until it is marked done for the number of days
+given here."
+ :group 'org-agenda-daily/weekly
+ :type 'number)
+
(defgroup org-agenda-time-grid nil
"Options concerning the time grid in the Org-mode Agenda."
:tag "Org Agenda Time Grid"
@@ -2179,18 +2674,19 @@ a grid line."
:tag "Org Agenda Sorting"
:group 'org-agenda)
-(let ((sorting-choice
- '(choice
- (const time-up) (const time-down)
- (const category-keep) (const category-up) (const category-down)
- (const tag-down) (const tag-up)
- (const priority-up) (const priority-down))))
-
- (defcustom org-agenda-sorting-strategy
- '((agenda time-up category-keep priority-down)
- (todo category-keep priority-down)
- (tags category-keep priority-down))
- "Sorting structure for the agenda items of a single day.
+(defconst org-sorting-choice
+ '(choice
+ (const time-up) (const time-down)
+ (const category-keep) (const category-up) (const category-down)
+ (const tag-down) (const tag-up)
+ (const priority-up) (const priority-down))
+ "Sorting choices.")
+
+(defcustom org-agenda-sorting-strategy
+ '((agenda time-up category-keep priority-down)
+ (todo category-keep priority-down)
+ (tags category-keep priority-down))
+ "Sorting structure for the agenda items of a single day.
This is a list of symbols which will be used in sequence to determine
if an entry should be listed before another entry. The following
symbols are recognized:
@@ -2217,17 +2713,21 @@ the sequence given in `org-agenda-files'. Within each category sort by
priority.
Leaving out `category-keep' would mean that items will be sorted across
-categories by priority."
+categories by priority.
+
+Instead of a single list, this can also be a set of list for specific
+contents, with a context symbol in the car of the list, any of
+`agenda', `todo', `tags' for the corresponding agenda views."
:group 'org-agenda-sorting
:type `(choice
- (repeat :tag "General" ,sorting-choice)
+ (repeat :tag "General" ,org-sorting-choice)
(list :tag "Individually"
(cons (const :tag "Strategy for Weekly/Daily agenda" agenda)
- (repeat ,sorting-choice))
+ (repeat ,org-sorting-choice))
(cons (const :tag "Strategy for TODO lists" todo)
- (repeat ,sorting-choice))
+ (repeat ,org-sorting-choice))
(cons (const :tag "Strategy for Tags matches" tags)
- (repeat ,sorting-choice))))))
+ (repeat ,org-sorting-choice)))))
(defcustom org-sort-agenda-notime-is-late t
"Non-nil means, items without time are considered late.
@@ -2239,9 +2739,9 @@ agenda entries."
:group 'org-agenda-sorting
:type 'boolean)
-(defgroup org-agenda-prefix nil
+(defgroup org-agenda-line-format nil
"Options concerning the entry prefix in the Org-mode agenda display."
- :tag "Org Agenda Prefix"
+ :tag "Org Agenda Line Format"
:group 'org-agenda)
(defcustom org-agenda-prefix-format
@@ -2304,12 +2804,34 @@ See also the variables `org-agenda-remove-times-when-in-prefix' and
(cons (const timeline) (string :tag "Format"))
(cons (const todo) (string :tag "Format"))
(cons (const tags) (string :tag "Format"))))
- :group 'org-agenda-prefix)
+ :group 'org-agenda-line-format)
(defvar org-prefix-format-compiled nil
"The compiled version of the most recently used prefix format.
See the variable `org-agenda-prefix-format'.")
+(defcustom org-agenda-scheduled-leaders '("Scheduled: " "Sched.%2dx: ")
+ "Text preceeding scheduled items in the agenda view.
+THis is a list with two strings. The first applies when the item is
+scheduled on the current day. The second applies when it has been scheduled
+previously, it may contain a %d to capture how many days ago the item was
+scheduled."
+ :group 'org-agenda-line-format
+ :type '(list
+ (string :tag "Scheduled today ")
+ (string :tag "Scheduled previously")))
+
+(defcustom org-agenda-deadline-leaders '("Deadline: " "In %3d d.: ")
+ "Text preceeding deadline items in the agenda view.
+This is a list with two strings. The first applies when the item has its
+deadline on the current day. The second applies when it is in the past or
+in the future, it may contain %d to capture how many days away the deadline
+is (was)."
+ :group 'org-agenda-line-format
+ :type '(list
+ (string :tag "Deadline today ")
+ (string :tag "Deadline relative")))
+
(defcustom org-agenda-remove-times-when-in-prefix t
"Non-nil means, remove duplicate time specifications in agenda items.
When the format `org-agenda-prefix-format' contains a `%t' specifier, a
@@ -2321,17 +2843,28 @@ cluttered.
The option can be t or nil. It may also be the symbol `beg', indicating
that the time should only be removed what it is located at the beginning of
the headline/diary entry."
- :group 'org-agenda-prefix
+ :group 'org-agenda-line-format
:type '(choice
(const :tag "Always" t)
(const :tag "Never" nil)
(const :tag "When at beginning of entry" beg)))
+
+(defcustom org-agenda-default-appointment-duration nil
+ "Default duration for appointments that only have a starting time.
+When nil, no duration is specified in such cases.
+When non-nil, this must be the number of minutes, e.g. 60 for one hour."
+ :group 'org-agenda-line-format
+ :type '(choice
+ (integer :tag "Minutes")
+ (const :tag "No default duration")))
+
+
(defcustom org-agenda-remove-tags nil
"Non-nil means, remove the tags from the headline copy in the agenda.
When this is the symbol `prefix', only remove tags when
`org-agenda-prefix-format' contains a `%T' specifier."
- :group 'org-agenda-prefix
+ :group 'org-agenda-line-format
:type '(choice
(const :tag "Always" t)
(const :tag "Never" nil)
@@ -2341,11 +2874,30 @@ When this is the symbol `prefix', only remove tags when
(defvaralias 'org-agenda-remove-tags-when-in-prefix
'org-agenda-remove-tags))
-(defcustom org-agenda-align-tags-to-column 65
- "Shift tags in agenda items to this column."
- :group 'org-agenda-prefix
+(defcustom org-agenda-tags-column -80
+ "Shift tags in agenda items to this column.
+If this number is positive, it specifies the column. If it is negative,
+it means that the tags should be flushright to that column. For example,
+-80 works well for a normal 80 character screen."
+ :group 'org-agenda-line-format
:type 'integer)
+(if (fboundp 'defvaralias)
+ (defvaralias 'org-agenda-align-tags-to-column 'org-agenda-tags-column))
+
+(defcustom org-agenda-fontify-priorities t
+ "Non-nil means, highlight low and high priorities in agenda.
+When t, the highest priority entries are bold, lowest priority italic.
+This may also be an association list of priority faces. The face may be
+a names face, or a list like `(:background \"Red\")'."
+ :group 'org-agenda-line-format
+ :type '(choice
+ (const :tag "Never" nil)
+ (const :tag "Defaults" t)
+ (repeat :tag "Specify"
+ (list (character :tag "Priority" :value ?A)
+ (sexp :tag "face")))))
+
(defgroup org-latex nil
"Options for embedding LaTeX code into Org-mode"
:tag "Org LaTeX"
@@ -2396,30 +2948,31 @@ This is a property list with the following properties:
:tag "Org Export General"
:group 'org-export)
-(defcustom org-export-publishing-directory "."
- "Path to the location where exported files should be located.
-This path may be relative to the directory where the Org-mode file lives.
-The default is to put them into the same directory as the Org-mode file.
-The variable may also be an alist with export types `:html', `:ascii',
-`:ical', or `:xoxo' and the corresponding directories. If a direcoty path
-is relative, it is interpreted relative to the directory where the exported
-Org-mode files lives."
- :group 'org-export-general
- :type '(choice
- (directory)
- (repeat
- (cons
- (choice :tag "Type"
- (const :html) (const :ascii) (const :ical) (const :xoxo))
- (directory)))))
+;; FIXME
+(defvar org-export-publishing-directory nil)
+
+(defcustom org-export-with-special-strings t
+ "Non-nil means, interpret \"\-\", \"--\" and \"---\" for export.
+When this option is turned on, these strings will be exported as:
+
+ Org HTML LaTeX
+ -----+----------+--------
+ \\- &shy; \\-
+ -- &ndash; --
+ --- &mdash; ---
+ ... &hellip; \ldots
+
+This option can also be set with the +OPTIONS line, e.g. \"-:nil\"."
+ :group 'org-export-translation
+ :type 'boolean)
(defcustom org-export-language-setup
'(("en" "Author" "Date" "Table of Contents")
("cs" "Autor" "Datum" "Obsah")
("da" "Ophavsmand" "Dato" "Indhold")
("de" "Autor" "Datum" "Inhaltsverzeichnis")
- ("es" "Autor" "Fecha" "\xccndice")
- ("fr" "Auteur" "Date" "Table des Mati\xe8res")
+ ("es" "Autor" "Fecha" "\xcdndice")
+ ("fr" "Auteur" "Date" "Table des mati\xe8res")
("it" "Autore" "Data" "Indice")
("nl" "Auteur" "Datum" "Inhoudsopgave")
("nn" "Forfattar" "Dato" "Innhold") ;; nn = Norsk (nynorsk)
@@ -2513,6 +3066,23 @@ headline Only export the headline, but skip the tree below it."
(const :tag "headline only" 'headline)
(const :tag "entirely" t)))
+(defcustom org-export-author-info t
+ "Non-nil means, insert author name and email into the exported file.
+
+This option can also be set with the +OPTIONS line,
+e.g. \"author-info:nil\"."
+ :group 'org-export-general
+ :type 'boolean)
+
+(defcustom org-export-time-stamp-file t
+ "Non-nil means, insert a time stamp into the exported file.
+The time stamp shows when the file was created.
+
+This option can also be set with the +OPTIONS line,
+e.g. \"timestamp:nil\"."
+ :group 'org-export-general
+ :type 'boolean)
+
(defcustom org-export-with-timestamps t
"If nil, do not export time stamps and associated keywords."
:group 'org-export-general
@@ -2526,13 +3096,26 @@ headline Only export the headline, but skip the tree below it."
(defcustom org-export-with-tags 'not-in-toc
"If nil, do not export tags, just remove them from headlines.
If this is the symbol `not-in-toc', tags will be removed from table of
-contents entries, but still be shown in the headlines of the document."
+contents entries, but still be shown in the headlines of the document.
+
+This option can also be set with the +OPTIONS line, e.g. \"tags:nil\"."
:group 'org-export-general
:type '(choice
(const :tag "Off" nil)
(const :tag "Not in TOC" not-in-toc)
(const :tag "On" t)))
+(defcustom org-export-with-drawers nil
+ "Non-nil means, export with drawers like the property drawer.
+When t, all drawers are exported. This may also be a list of
+drawer names to export."
+ :group 'org-export-general
+ :type '(choice
+ (const :tag "All drawers" t)
+ (const :tag "None" nil)
+ (repeat :tag "Selected drawers"
+ (string :tag "Drawer name"))))
+
(defgroup org-export-translation nil
"Options for translating special ascii sequences for the export backends."
:tag "Org Export Translation"
@@ -2549,6 +3132,14 @@ This option can also be set with the +OPTIONS line, e.g. \"*:nil\"."
:group 'org-export-translation
:type 'boolean)
+(defcustom org-export-with-footnotes t
+ "If nil, export [1] as a footnote marker.
+Lines starting with [1] will be formatted as footnotes.
+
+This option can also be set with the +OPTIONS line, e.g. \"f:nil\"."
+ :group 'org-export-translation
+ :type 'boolean)
+
(defcustom org-export-with-sub-superscripts t
"Non-nil means, interpret \"_\" and \"^\" for export.
When this option is turned on, you can use TeX-like syntax for sub- and
@@ -2578,6 +3169,20 @@ This option can also be set with the +OPTIONS line, e.g. \"^:nil\"."
(const :tag "Only with braces" {})
(const :tag "Never interpret" nil)))
+(defcustom org-export-with-special-strings t
+ "Non-nil means, interpret \"\-\", \"--\" and \"---\" for export.
+When this option is turned on, these strings will be exported as:
+
+\\- : &shy;
+-- : &ndash;
+--- : &mdash;
+
+Not all export backends support this, but HTML does.
+
+This option can also be set with the +OPTIONS line, e.g. \"-:nil\"."
+ :group 'org-export-translation
+ :type 'boolean)
+
(defcustom org-export-with-TeX-macros t
"Non-nil means, interpret simple TeX-like macros when exporting.
For example, HTML export converts \\alpha to &alpha; and \\AA to &Aring;.
@@ -2588,7 +3193,7 @@ Not all export backends support this.
This option can also be set with the +OPTIONS line, e.g. \"TeX:nil\"."
:group 'org-export-translation
- :group 'org-latex
+ :group 'org-export-latex
:type 'boolean)
(defcustom org-export-with-LaTeX-fragments nil
@@ -2600,7 +3205,7 @@ display math.
This option can also be set with the +OPTIONS line, e.g. \"LaTeX:t\"."
:group 'org-export-translation
- :group 'org-latex
+ :group 'org-export-latex
:type 'boolean)
(defcustom org-export-with-fixed-width t
@@ -2707,6 +3312,11 @@ Org-mode file."
:group 'org-export-html
:type 'coding-system)
+(defcustom org-export-html-extension "html"
+ "The extension for exported HTML files."
+ :group 'org-export-html
+ :type 'string)
+
(defcustom org-export-html-style
"<style type=\"text/css\">
html {
@@ -2841,7 +3451,7 @@ to a file."
(defcustom org-combined-agenda-icalendar-file "~/org.ics"
"The file name for the iCalendar file covering all agenda files.
This file is created with the command \\[org-export-icalendar-all-agenda-files].
-The file name should be absolute."
+The file name should be absolute, the file will be overwritten without warning."
:group 'org-export-icalendar
:type 'file)
@@ -2859,6 +3469,17 @@ These are entries like in the diary, but directly in an Org-mode file."
:group 'org-export-icalendar
:type 'boolean)
+(defcustom org-icalendar-include-body 100
+ "Amount of text below headline to be included in iCalendar export.
+This is a number of characters that should maximally be included.
+Properties, scheduling and clocking lines will always be removed.
+The text will be inserted into the DESCRIPTION field."
+ :group 'org-export-icalendar
+ :type '(choice
+ (const :tag "Nothing" nil)
+ (const :tag "Everything" t)
+ (integer :tag "Max characters")))
+
(defcustom org-icalendar-combined-name "OrgMode"
"Calendar name for the combined iCalendar representing all agenda files."
:group 'org-export-icalendar
@@ -2907,8 +3528,20 @@ Changing this variable requires a restart of Emacs to take effect."
:group 'org-font-lock
:type 'boolean)
+(defcustom org-highlight-latex-fragments-and-specials nil
+ "Non-nil means, fontify what is treated specially by the exporters."
+ :group 'org-font-lock
+ :type 'boolean)
+
+(defcustom org-hide-emphasis-markers nil
+ "Non-nil mean font-lock should hide the emphasis marker characters."
+ :group 'org-font-lock
+ :type 'boolean)
+
(defvar org-emph-re nil
"Regular expression for matching emphasis.")
+(defvar org-verbatim-re nil
+ "Regular expression for matching verbatim text.")
(defvar org-emphasis-regexp-components) ; defined just below
(defvar org-emphasis-alist) ; defined just below
(defun org-set-emph-re (var val)
@@ -2923,33 +3556,53 @@ Changing this variable requires a restart of Emacs to take effect."
(border (nth 2 e))
(body (nth 3 e))
(nl (nth 4 e))
- (stacked (nth 5 e))
+ (stacked (and nil (nth 5 e))) ; stacked is no longer allowed, forced to nil
(body1 (concat body "*?"))
- (markers (mapconcat 'car org-emphasis-alist "")))
+ (markers (mapconcat 'car org-emphasis-alist ""))
+ (vmarkers (mapconcat
+ (lambda (x) (if (eq (nth 4 x) 'verbatim) (car x) ""))
+ org-emphasis-alist "")))
;; make sure special characters appear at the right position in the class
(if (string-match "\\^" markers)
(setq markers (concat (replace-match "" t t markers) "^")))
(if (string-match "-" markers)
(setq markers (concat (replace-match "" t t markers) "-")))
+ (if (string-match "\\^" vmarkers)
+ (setq vmarkers (concat (replace-match "" t t vmarkers) "^")))
+ (if (string-match "-" vmarkers)
+ (setq vmarkers (concat (replace-match "" t t vmarkers) "-")))
(if (> nl 0)
(setq body1 (concat body1 "\\(?:\n" body "*?\\)\\{0,"
(int-to-string nl) "\\}")))
;; Make the regexp
(setq org-emph-re
- (concat "\\([" pre (if stacked markers) "]\\|^\\)"
+ (concat "\\([" pre (if (and nil stacked) markers) "]\\|^\\)"
"\\("
"\\([" markers "]\\)"
"\\("
+ "[^" border "]\\|"
"[^" border (if (and nil stacked) markers) "]"
body1
"[^" border (if (and nil stacked) markers) "]"
"\\)"
"\\3\\)"
- "\\([" post (if stacked markers) "]\\|$\\)")))))
+ "\\([" post (if (and nil stacked) markers) "]\\|$\\)"))
+ (setq org-verbatim-re
+ (concat "\\([" pre "]\\|^\\)"
+ "\\("
+ "\\([" vmarkers "]\\)"
+ "\\("
+ "[^" border "]\\|"
+ "[^" border "]"
+ body1
+ "[^" border "]"
+ "\\)"
+ "\\3\\)"
+ "\\([" post "]\\|$\\)")))))
(defcustom org-emphasis-regexp-components
- '(" \t('\"" "- \t.,:?;'\")" " \t\r\n,\"'" "." 1 nil)
- "Components used to build the reqular expression for emphasis.
+ '(" \t('\"" "- \t.,:?;'\")" " \t\r\n,\"'" "." 1)
+ "Components used to build the regular expression for emphasis.
This is a list with 6 entries. Terminology: In an emphasis string
like \" *strong word* \", we call the initial space PREMATCH, the final
space POSTMATCH, the stars MARKERS, \"s\" and \"d\" are BORDER characters
@@ -2962,10 +3615,7 @@ border The chars *forbidden* as border characters.
body-regexp A regexp like \".\" to match a body character. Don't use
non-shy groups here, and don't allow newline here.
newline The maximum number of newlines allowed in an emphasis exp.
-stacked Non-nil means, allow stacked styles. This works only in HTML
- export. When this is set, all marker characters (as given in
- `org-emphasis-alist') will be allowed as pre/post, aiding
- inside-out matching.
+
Use customize to modify this, or restart Emacs after changing it."
:group 'org-font-lock
:set 'org-set-emph-re
@@ -2975,16 +3625,17 @@ Use customize to modify this, or restart Emacs after changing it."
(sexp :tag "Forbidden chars in border ")
(sexp :tag "Regexp for body ")
(integer :tag "number of newlines allowed")
- (boolean :tag "Stacking allowed ")))
+ (option (boolean :tag "Stacking (DISABLED) "))))
(defcustom org-emphasis-alist
'(("*" bold "<b>" "</b>")
("/" italic "<i>" "</i>")
("_" underline "<u>" "</u>")
- ("=" shadow "<code>" "</code>")
+ ("=" org-code "<code>" "</code>" verbatim)
+ ("~" org-verbatim "" "" verbatim)
("+" (:strike-through t) "<del>" "</del>")
)
-"Special syntax for emphasized text.
+ "Special syntax for emphasized text.
Text starting and ending with a special character will be emphasized, for
example *bold*, _underlined_ and /italic/. This variable sets the marker
characters, the face to be used by font-lock for highlighting in Org-mode
@@ -2999,7 +3650,8 @@ Use customize to modify this, or restart Emacs after changing it."
(face :tag "Font-lock-face")
(plist :tag "Face property list"))
(string :tag "HTML start tag")
- (string :tag "HTML end tag"))))
+ (string :tag "HTML end tag")
+ (option (const verbatim)))))
;;; The faces
@@ -3008,26 +3660,37 @@ Use customize to modify this, or restart Emacs after changing it."
:tag "Org Faces"
:group 'org-font-lock)
-(defun org-compatible-face (specs)
+(defun org-compatible-face (inherits specs)
"Make a compatible face specification.
+If INHERITS is an existing face and if the Emacs version supports it,
+just inherit the face. If not, use SPECS to define the face.
XEmacs and Emacs 21 do not know about the `min-colors' attribute.
For them we convert a (min-colors 8) entry to a `tty' entry and move it
to the top of the list. The `min-colors' attribute will be removed from
any other entries, and any resulting duplicates will be removed entirely."
- (if (or (featurep 'xemacs) (< emacs-major-version 22))
- (let (r e a)
- (while (setq e (pop specs))
- (cond
- ((memq (car e) '(t default)) (push e r))
- ((setq a (member '(min-colors 8) (car e)))
- (nconc r (list (cons (cons '(type tty) (delq (car a) (car e)))
- (cdr e)))))
- ((setq a (assq 'min-colors (car e)))
- (setq e (cons (delq a (car e)) (cdr e)))
- (or (assoc (car e) r) (push e r)))
- (t (or (assoc (car e) r) (push e r)))))
- (nreverse r))
- specs))
+ (cond
+ ((and inherits (facep inherits)
+ (not (featurep 'xemacs)) (> emacs-major-version 22))
+ ;; In Emacs 23, we use inheritance where possible.
+ ;; We only do this in Emacs 23, because only there the outline
+ ;; faces have been changed to the original org-mode-level-faces.
+ (list (list t :inherit inherits)))
+ ((or (featurep 'xemacs) (< emacs-major-version 22))
+ ;; These do not understand the `min-colors' attribute.
+ (let (r e a)
+ (while (setq e (pop specs))
+ (cond
+ ((memq (car e) '(t default)) (push e r))
+ ((setq a (member '(min-colors 8) (car e)))
+ (nconc r (list (cons (cons '(type tty) (delq (car a) (car e)))
+ (cdr e)))))
+ ((setq a (assq 'min-colors (car e)))
+ (setq e (cons (delq a (car e)) (cdr e)))
+ (or (assoc (car e) r) (push e r)))
+ (t (or (assoc (car e) r) (push e r)))))
+ (nreverse r)))
+ (t specs)))
+(put 'org-compatible-face 'lisp-indent-function 1)
(defface org-hide
'((((background light)) (:foreground "white"))
@@ -3038,112 +3701,145 @@ color of the frame."
:group 'org-faces)
(defface org-level-1 ;; font-lock-function-name-face
- (org-compatible-face
- '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
- (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
- (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
- (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
- (((class color) (min-colors 8)) (:foreground "blue" :bold t))
- (t (:bold t))))
+ (org-compatible-face 'outline-1
+ '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 8)) (:foreground "blue" :bold t))
+ (t (:bold t))))
"Face used for level 1 headlines."
:group 'org-faces)
(defface org-level-2 ;; font-lock-variable-name-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod"))
- (((class color) (min-colors 16) (background dark)) (:foreground "LightGoldenrod"))
- (((class color) (min-colors 8) (background light)) (:foreground "yellow"))
- (((class color) (min-colors 8) (background dark)) (:foreground "yellow" :bold t))
- (t (:bold t))))
+ (org-compatible-face 'outline-2
+ '((((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightGoldenrod"))
+ (((class color) (min-colors 8) (background light)) (:foreground "yellow"))
+ (((class color) (min-colors 8) (background dark)) (:foreground "yellow" :bold t))
+ (t (:bold t))))
"Face used for level 2 headlines."
:group 'org-faces)
(defface org-level-3 ;; font-lock-keyword-face
- (org-compatible-face
- '((((class color) (min-colors 88) (background light)) (:foreground "Purple"))
- (((class color) (min-colors 88) (background dark)) (:foreground "Cyan1"))
- (((class color) (min-colors 16) (background light)) (:foreground "Purple"))
- (((class color) (min-colors 16) (background dark)) (:foreground "Cyan"))
- (((class color) (min-colors 8) (background light)) (:foreground "purple" :bold t))
- (((class color) (min-colors 8) (background dark)) (:foreground "cyan" :bold t))
- (t (:bold t))))
+ (org-compatible-face 'outline-3
+ '((((class color) (min-colors 88) (background light)) (:foreground "Purple"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "Cyan1"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Purple"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "Cyan"))
+ (((class color) (min-colors 8) (background light)) (:foreground "purple" :bold t))
+ (((class color) (min-colors 8) (background dark)) (:foreground "cyan" :bold t))
+ (t (:bold t))))
"Face used for level 3 headlines."
:group 'org-faces)
(defface org-level-4 ;; font-lock-comment-face
- (org-compatible-face
- '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
- (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
- (((class color) (min-colors 16) (background light)) (:foreground "red"))
- (((class color) (min-colors 16) (background dark)) (:foreground "red1"))
- (((class color) (min-colors 8) (background light)) (:foreground "red" :bold t))
- (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
- (t (:bold t))))
+ (org-compatible-face 'outline-4
+ '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
+ (((class color) (min-colors 16) (background light)) (:foreground "red"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "red1"))
+ (((class color) (min-colors 8) (background light)) (:foreground "red" :bold t))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:bold t))))
"Face used for level 4 headlines."
:group 'org-faces)
(defface org-level-5 ;; font-lock-type-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "ForestGreen"))
- (((class color) (min-colors 16) (background dark)) (:foreground "PaleGreen"))
- (((class color) (min-colors 8)) (:foreground "green"))))
+ (org-compatible-face 'outline-5
+ '((((class color) (min-colors 16) (background light)) (:foreground "ForestGreen"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "PaleGreen"))
+ (((class color) (min-colors 8)) (:foreground "green"))))
"Face used for level 5 headlines."
:group 'org-faces)
(defface org-level-6 ;; font-lock-constant-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "CadetBlue"))
- (((class color) (min-colors 16) (background dark)) (:foreground "Aquamarine"))
- (((class color) (min-colors 8)) (:foreground "magenta"))))
+ (org-compatible-face 'outline-6
+ '((((class color) (min-colors 16) (background light)) (:foreground "CadetBlue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "Aquamarine"))
+ (((class color) (min-colors 8)) (:foreground "magenta"))))
"Face used for level 6 headlines."
:group 'org-faces)
(defface org-level-7 ;; font-lock-builtin-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "Orchid"))
- (((class color) (min-colors 16) (background dark)) (:foreground "LightSteelBlue"))
- (((class color) (min-colors 8)) (:foreground "blue"))))
+ (org-compatible-face 'outline-7
+ '((((class color) (min-colors 16) (background light)) (:foreground "Orchid"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSteelBlue"))
+ (((class color) (min-colors 8)) (:foreground "blue"))))
"Face used for level 7 headlines."
:group 'org-faces)
(defface org-level-8 ;; font-lock-string-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
- (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
- (((class color) (min-colors 8)) (:foreground "green"))))
+ (org-compatible-face 'outline-8
+ '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
+ (((class color) (min-colors 8)) (:foreground "green"))))
"Face used for level 8 headlines."
:group 'org-faces)
(defface org-special-keyword ;; font-lock-string-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
- (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
- (t (:italic t))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
+ (t (:italic t))))
"Face used for special keywords."
:group 'org-faces)
-(defface org-warning ;; font-lock-warning-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "Red1" :bold t))
- (((class color) (min-colors 16) (background dark)) (:foreground "Pink" :bold t))
- (((class color) (min-colors 8) (background light)) (:foreground "red" :bold t))
- (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
- (t (:bold t))))
+(defface org-drawer ;; font-lock-function-name-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 8)) (:foreground "blue" :bold t))
+ (t (:bold t))))
+ "Face used for drawers."
+ :group 'org-faces)
+
+(defface org-property-value nil
+ "Face used for the value of a property."
+ :group 'org-faces)
+
+(defface org-column
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light))
+ (:background "grey90"))
+ (((class color) (min-colors 16) (background dark))
+ (:background "grey30"))
+ (((class color) (min-colors 8))
+ (:background "cyan" :foreground "black"))
+ (t (:inverse-video t))))
+ "Face for column display of entry properties."
+ :group 'org-faces)
+
+(when (fboundp 'set-face-attribute)
+ ;; Make sure that a fixed-width face is used when we have a column table.
+ (set-face-attribute 'org-column nil
+ :height (face-attribute 'default :height)
+ :family (face-attribute 'default :family)))
+
+(defface org-warning
+ (org-compatible-face 'font-lock-warning-face
+ '((((class color) (min-colors 16) (background light)) (:foreground "Red1" :bold t))
+ (((class color) (min-colors 16) (background dark)) (:foreground "Pink" :bold t))
+ (((class color) (min-colors 8) (background light)) (:foreground "red" :bold t))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:bold t))))
"Face for deadlines and TODO keywords."
:group 'org-faces)
(defface org-archived ; similar to shadow
- (org-compatible-face
- '((((class color grayscale) (min-colors 88) (background light))
- (:foreground "grey50"))
- (((class color grayscale) (min-colors 88) (background dark))
- (:foreground "grey70"))
- (((class color) (min-colors 8) (background light))
- (:foreground "green"))
- (((class color) (min-colors 8) (background dark))
- (:foreground "yellow"))))
- "Face for headline with the ARCHIVE tag."
- :group 'org-faces)
+ (org-compatible-face 'shadow
+ '((((class color grayscale) (min-colors 88) (background light))
+ (:foreground "grey50"))
+ (((class color grayscale) (min-colors 88) (background dark))
+ (:foreground "grey70"))
+ (((class color) (min-colors 8) (background light))
+ (:foreground "green"))
+ (((class color) (min-colors 8) (background dark))
+ (:foreground "yellow"))))
+ "Face for headline with the ARCHIVE tag."
+ :group 'org-faces)
(defface org-link
'((((class color) (background light)) (:foreground "Purple" :underline t))
@@ -3152,6 +3848,13 @@ color of the frame."
"Face for links."
:group 'org-faces)
+(defface org-ellipsis
+ '((((class color) (background light)) (:foreground "DarkGoldenrod" :underline t))
+ (((class color) (background dark)) (:foreground "LightGoldenrod" :underline t))
+ (t (:strike-through t)))
+ "Face for the ellipsis in folded text."
+ :group 'org-faces)
+
(defface org-target
'((((class color) (background light)) (:underline t))
(((class color) (background dark)) (:underline t))
@@ -3178,101 +3881,178 @@ color of the frame."
"Face for tags."
:group 'org-faces)
-(defface org-todo ;; font-lock-warning-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "Red1" :bold t))
- (((class color) (min-colors 16) (background dark)) (:foreground "Pink" :bold t))
- (((class color) (min-colors 8) (background light)) (:foreground "red" :bold t))
- (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
- (t (:inverse-video t :bold t))))
+(defface org-todo ; font-lock-warning-face
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "Red1" :bold t))
+ (((class color) (min-colors 16) (background dark)) (:foreground "Pink" :bold t))
+ (((class color) (min-colors 8) (background light)) (:foreground "red" :bold t))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:inverse-video t :bold t))))
"Face for TODO keywords."
:group 'org-faces)
(defface org-done ;; font-lock-type-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "ForestGreen" :bold t))
- (((class color) (min-colors 16) (background dark)) (:foreground "PaleGreen" :bold t))
- (((class color) (min-colors 8)) (:foreground "green"))
- (t (:bold t))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "ForestGreen" :bold t))
+ (((class color) (min-colors 16) (background dark)) (:foreground "PaleGreen" :bold t))
+ (((class color) (min-colors 8)) (:foreground "green"))
+ (t (:bold t))))
"Face used for todo keywords that indicate DONE items."
:group 'org-faces)
(defface org-headline-done ;; font-lock-string-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
- (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
- (((class color) (min-colors 8) (background light)) (:bold nil))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
+ (((class color) (min-colors 8) (background light)) (:bold nil))))
"Face used to indicate that a headline is DONE.
This face is only used if `org-fontify-done-headline' is set. If applies
to the part of the headline after the DONE keyword."
:group 'org-faces)
+(defcustom org-todo-keyword-faces nil
+ "Faces for specific TODO keywords.
+This is a list of cons cells, with TODO keywords in the car
+and faces in the cdr. The face can be a symbol, or a property
+list of attributes, like (:foreground \"blue\" :weight bold :underline t)."
+ :group 'org-faces
+ :group 'org-todo
+ :type '(repeat
+ (cons
+ (string :tag "keyword")
+ (sexp :tag "face"))))
+
(defface org-table ;; font-lock-function-name-face
- (org-compatible-face
- '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
- (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
- (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
- (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
- (((class color) (min-colors 8) (background light)) (:foreground "blue"))
- (((class color) (min-colors 8) (background dark)))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 8) (background light)) (:foreground "blue"))
+ (((class color) (min-colors 8) (background dark)))))
"Face used for tables."
:group 'org-faces)
(defface org-formula
- (org-compatible-face
- '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
- (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
- (((class color) (min-colors 8) (background light)) (:foreground "red"))
- (((class color) (min-colors 8) (background dark)) (:foreground "red"))
- (t (:bold t :italic t))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
+ (((class color) (min-colors 8) (background light)) (:foreground "red"))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red"))
+ (t (:bold t :italic t))))
"Face for formulas."
:group 'org-faces)
+(defface org-code
+ (org-compatible-face nil
+ '((((class color grayscale) (min-colors 88) (background light))
+ (:foreground "grey50"))
+ (((class color grayscale) (min-colors 88) (background dark))
+ (:foreground "grey70"))
+ (((class color) (min-colors 8) (background light))
+ (:foreground "green"))
+ (((class color) (min-colors 8) (background dark))
+ (:foreground "yellow"))))
+ "Face for fixed-with text like code snippets."
+ :group 'org-faces
+ :version "22.1")
+
+(defface org-verbatim
+ (org-compatible-face nil
+ '((((class color grayscale) (min-colors 88) (background light))
+ (:foreground "grey50" :underline t))
+ (((class color grayscale) (min-colors 88) (background dark))
+ (:foreground "grey70" :underline t))
+ (((class color) (min-colors 8) (background light))
+ (:foreground "green" :underline t))
+ (((class color) (min-colors 8) (background dark))
+ (:foreground "yellow" :underline t))))
+ "Face for fixed-with text like code snippets."
+ :group 'org-faces
+ :version "22.1")
+
(defface org-agenda-structure ;; font-lock-function-name-face
- (org-compatible-face
- '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
- (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
- (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
- (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
- (((class color) (min-colors 8)) (:foreground "blue" :bold t))
- (t (:bold t))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue"))
+ (((class color) (min-colors 8)) (:foreground "blue" :bold t))
+ (t (:bold t))))
"Face used in agenda for captions and dates."
:group 'org-faces)
(defface org-scheduled-today
- (org-compatible-face
- '((((class color) (min-colors 88) (background light)) (:foreground "DarkGreen"))
- (((class color) (min-colors 88) (background dark)) (:foreground "PaleGreen"))
- (((class color) (min-colors 8)) (:foreground "green"))
- (t (:bold t :italic t))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "DarkGreen"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "PaleGreen"))
+ (((class color) (min-colors 8)) (:foreground "green"))
+ (t (:bold t :italic t))))
"Face for items scheduled for a certain day."
:group 'org-faces)
(defface org-scheduled-previously
- (org-compatible-face
- '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
- (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
- (((class color) (min-colors 8) (background light)) (:foreground "red"))
- (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
- (t (:bold t))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
+ (((class color) (min-colors 8) (background light)) (:foreground "red"))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:bold t))))
"Face for items scheduled previously, and not yet done."
:group 'org-faces)
(defface org-upcoming-deadline
- (org-compatible-face
- '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
- (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
- (((class color) (min-colors 8) (background light)) (:foreground "red"))
- (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
- (t (:bold t))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
+ (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
+ (((class color) (min-colors 8) (background light)) (:foreground "red"))
+ (((class color) (min-colors 8) (background dark)) (:foreground "red" :bold t))
+ (t (:bold t))))
"Face for items scheduled previously, and not yet done."
:group 'org-faces)
+(defcustom org-agenda-deadline-faces
+ '((1.0 . org-warning)
+ (0.5 . org-upcoming-deadline)
+ (0.0 . default))
+ "Faces for showing deadlines in the agenda.
+This is a list of cons cells. The cdr of each cess is a face to be used,
+and it can also just be a like like '(:foreground \"yellow\").
+Each car is a fraction of the head-warning time that must have passed for
+this the face in the cdr to be used for display. The numbers must be
+given in descending order. The head-warning time is normally taken
+from `org-deadline-warning-days', but can also be specified in the deadline
+timestamp itself, like this:
+
+ DEADLINE: <2007-08-13 Mon -8d>
+
+You may use d for days, w for weeks, m for months and y for years. Months
+and years will only be treated in an approximate fashion (30.4 days for a
+month and 365.24 days for a year)."
+ :group 'org-faces
+ :group 'org-agenda-daily/weekly
+ :type '(repeat
+ (cons
+ (number :tag "Fraction of head-warning time passed")
+ (sexp :tag "Face"))))
+
+;; FIXME: this is not a good face yet.
+(defface org-agenda-restriction-lock
+ (org-compatible-face nil
+ '((((class color) (min-colors 88) (background light)) (:background "yellow1"))
+ (((class color) (min-colors 88) (background dark)) (:background "skyblue4"))
+ (((class color) (min-colors 16) (background light)) (:background "yellow1"))
+ (((class color) (min-colors 16) (background dark)) (:background "skyblue4"))
+ (((class color) (min-colors 8)) (:background "cyan" :foreground "black"))
+ (t (:inverse-video t))))
+ "Face for showing the agenda restriction lock."
+ :group 'org-faces)
+
(defface org-time-grid ;; font-lock-variable-name-face
- (org-compatible-face
- '((((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod"))
- (((class color) (min-colors 16) (background dark)) (:foreground "LightGoldenrod"))
- (((class color) (min-colors 8)) (:foreground "yellow" :weight light))))
+ (org-compatible-face nil
+ '((((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod"))
+ (((class color) (min-colors 16) (background dark)) (:foreground "LightGoldenrod"))
+ (((class color) (min-colors 8)) (:foreground "yellow" :weight light))))
"Face used for time grids."
:group 'org-faces)
@@ -3280,11 +4060,149 @@ to the part of the headline after the DONE keyword."
'(org-level-1 org-level-2 org-level-3 org-level-4
org-level-5 org-level-6 org-level-7 org-level-8
))
-(defconst org-n-levels (length org-level-faces))
+(defcustom org-n-level-faces (length org-level-faces)
+ "The number different faces to be used for headlines.
+Org-mode defines 8 different headline faces, so this can be at most 8.
+If it is less than 8, the level-1 face gets re-used for level N+1 etc."
+ :type 'number
+ :group 'org-faces)
+
+;;; Functions and variables from ther packages
+;; Declared here to avoid compiler warnings
+
+(eval-and-compile
+ (unless (fboundp 'declare-function)
+ (defmacro declare-function (fn file &optional arglist fileonly))))
+
+;; XEmacs only
+(defvar outline-mode-menu-heading)
+(defvar outline-mode-menu-show)
+(defvar outline-mode-menu-hide)
+(defvar zmacs-regions) ; XEmacs regions
+
+;; Emacs only
+(defvar mark-active)
+
+;; Various packages
+;; FIXME: get the argument lists for the UNKNOWN stuff
+(declare-function add-to-diary-list "diary-lib"
+ (date string specifier &optional marker globcolor literal))
+(declare-function table--at-cell-p "table" (position &optional object at-column))
+(declare-function Info-find-node "info" (filename nodename &optional no-going-back))
+(declare-function Info-goto-node "info" (nodename &optional fork))
+(declare-function bbdb "ext:bbdb-com" (string elidep))
+(declare-function bbdb-company "ext:bbdb-com" (string elidep))
+(declare-function bbdb-current-record "ext:bbdb-com" (&optional planning-on-modifying))
+(declare-function bbdb-name "ext:bbdb-com" (string elidep))
+(declare-function bbdb-record-getprop "ext:bbdb" (record property))
+(declare-function bbdb-record-name "ext:bbdb" (record))
+(declare-function bibtex-beginning-of-entry "bibtex" ())
+(declare-function bibtex-generate-autokey "bibtex" ())
+(declare-function bibtex-parse-entry "bibtex" (&optional content))
+(declare-function bibtex-url "bibtex" (&optional pos no-browse))
+(defvar calc-embedded-close-formula)
+(defvar calc-embedded-open-formula)
+(declare-function calendar-astro-date-string "cal-julian" (&optional date))
+(declare-function calendar-bahai-date-string "cal-bahai" (&optional date))
+(declare-function calendar-check-holidays "holidays" (date))
+(declare-function calendar-chinese-date-string "cal-china" (&optional date))
+(declare-function calendar-coptic-date-string "cal-coptic" (&optional date))
+(declare-function calendar-ethiopic-date-string "cal-coptic" (&optional date))
+(declare-function calendar-forward-day "cal-move" (arg))
+(declare-function calendar-french-date-string "cal-french" (&optional date))
+(declare-function calendar-goto-date "cal-move" (date))
+(declare-function calendar-goto-today "cal-move" ())
+(declare-function calendar-hebrew-date-string "cal-hebrew" (&optional date))
+(declare-function calendar-islamic-date-string "cal-islam" (&optional date))
+(declare-function calendar-iso-date-string "cal-iso" (&optional date))
+(declare-function calendar-julian-date-string "cal-julian" (&optional date))
+(declare-function calendar-mayan-date-string "cal-mayan" (&optional date))
+(declare-function calendar-persian-date-string "cal-persia" (&optional date))
+(defvar calendar-mode-map)
+(defvar original-date) ; dynamically scoped in calendar.el does scope this
+(declare-function cdlatex-tab "ext:cdlatex" ())
+(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep))
+(declare-function elmo-folder-exists-p "ext:elmo" (folder) t)
+(declare-function elmo-message-entity-field "ext:elmo-msgdb" (entity field &optional type))
+(declare-function elmo-message-field "ext:elmo" (folder number field &optional type) t)
+(declare-function elmo-msgdb-overview-get-entity "ext:elmo" (&rest unknown) t)
+(defvar font-lock-unfontify-region-function)
+(declare-function gnus-article-show-summary "gnus-art" ())
+(declare-function gnus-summary-last-subject "gnus-sum" ())
+(defvar gnus-other-frame-object)
+(defvar gnus-group-name)
+(defvar gnus-article-current)
+(defvar Info-current-file)
+(defvar Info-current-node)
+(declare-function mh-display-msg "mh-show" (msg-num folder-name))
+(declare-function mh-find-path "mh-utils" ())
+(declare-function mh-get-header-field "mh-utils" (field))
+(declare-function mh-get-msg-num "mh-utils" (error-if-no-message))
+(declare-function mh-header-display "mh-show" ())
+(declare-function mh-index-previous-folder "mh-search" ())
+(declare-function mh-normalize-folder-name "mh-utils" (folder &optional empty-string-okay dont-remove-trailing-slash return-nil-if-folder-empty))
+(declare-function mh-search "mh-search" (folder search-regexp &optional redo-search-flag window-config))
+(declare-function mh-search-choose "mh-search" (&optional searcher))
+(declare-function mh-show "mh-show" (&optional message redisplay-flag))
+(declare-function mh-show-buffer-message-number "mh-comp" (&optional buffer))
+(declare-function mh-show-header-display "mh-show" t t)
+(declare-function mh-show-msg "mh-show" (msg))
+(declare-function mh-show-show "mh-show" t t)
+(declare-function mh-visit-folder "mh-folder" (folder &optional range index-data))
+(defvar mh-progs)
+(defvar mh-current-folder)
+(defvar mh-show-folder-buffer)
+(defvar mh-index-folder)
+(defvar mh-searcher)
+(declare-function org-export-latex-cleaned-string "org-export-latex" (&optional commentsp))
+(declare-function parse-time-string "parse-time" (string))
+(declare-function remember "remember" (&optional initial))
+(declare-function remember-buffer-desc "remember" ())
+(defvar remember-save-after-remembering)
+(defvar remember-data-file)
+(defvar remember-register)
+(defvar remember-buffer)
+(defvar remember-handler-functions)
+(defvar remember-annotation-functions)
+(declare-function rmail-narrow-to-non-pruned-header "rmail" ())
+(declare-function rmail-show-message "rmail" (&optional n no-summary))
+(declare-function rmail-what-message "rmail" ())
+(defvar texmathp-why)
+(declare-function vm-beginning-of-message "ext:vm-page" ())
+(declare-function vm-follow-summary-cursor "ext:vm-motion" ())
+(declare-function vm-get-header-contents "ext:vm-summary" (message header-name-regexp &optional clump-sep))
+(declare-function vm-isearch-narrow "ext:vm-search" ())
+(declare-function vm-isearch-update "ext:vm-search" ())
+(declare-function vm-select-folder-buffer "ext:vm-macro" ())
+(declare-function vm-su-message-id "ext:vm-summary" (m))
+(declare-function vm-su-subject "ext:vm-summary" (m))
+(declare-function vm-summarize "ext:vm-summary" (&optional display raise))
+(defvar vm-message-pointer)
+(defvar vm-folder-directory)
+(defvar w3m-current-url)
+(defvar w3m-current-title)
+;; backward compatibility to old version of wl
+(declare-function wl-summary-buffer-msgdb "ext:wl-folder" (&rest unknown) t)
+(declare-function wl-folder-get-elmo-folder "ext:wl-folder" (entity &optional no-cache))
+(declare-function wl-summary-goto-folder-subr "ext:wl-summary" (&optional name scan-type other-window sticky interactive scoring force-exit))
+(declare-function wl-summary-jump-to-msg-by-message-id "ext:wl-summary" (&optional id))
+(declare-function wl-summary-line-from "ext:wl-summary" ())
+(declare-function wl-summary-line-subject "ext:wl-summary" ())
+(declare-function wl-summary-message-number "ext:wl-summary" ())
+(declare-function wl-summary-redisplay "ext:wl-summary" (&optional arg))
+(defvar wl-summary-buffer-elmo-folder)
+(defvar wl-summary-buffer-folder-name)
+(declare-function speedbar-line-directory "speedbar" (&optional depth))
+
+(defvar org-latex-regexps)
+(defvar constants-unit-system)
;;; Variables for pre-computed regular expressions, all buffer local
+(defvar org-drawer-regexp nil
+ "Matches first line of a hidden block.")
+(make-variable-buffer-local 'org-drawer-regexp)
(defvar org-todo-regexp nil
"Matches any of the TODO state keywords.")
(make-variable-buffer-local 'org-todo-regexp)
@@ -3294,6 +4212,14 @@ to the part of the headline after the DONE keyword."
(defvar org-todo-line-regexp nil
"Matches a headline and puts TODO state into group 2 if present.")
(make-variable-buffer-local 'org-todo-line-regexp)
+(defvar org-complex-heading-regexp nil
+ "Matches a headline and puts everything into groups:
+group 1: the stars
+group 2: The todo keyword, maybe
+group 3: Priority cookie
+group 4: True headline
+group 5: Tags")
+(make-variable-buffer-local 'org-complex-heading-regexp)
(defvar org-todo-line-tags-regexp nil
"Matches a headline and puts TODO state into group 2 if present.
Also put tags into group 4 if tags are present.")
@@ -3351,7 +4277,9 @@ Also put tags into group 4 if tags are present.")
(match-string-no-properties num string)))
(defsubst org-no-properties (s)
- (remove-text-properties 0 (length s) org-rm-props s)
+ (if (fboundp 'set-text-properties)
+ (set-text-properties 0 (length s) nil s)
+ (remove-text-properties 0 (length s) org-rm-props s))
s)
(defsubst org-get-alist-option (option key)
@@ -3418,15 +4346,21 @@ means to push this value onto the list in the variable.")
"Precompute regular expressions for current buffer."
(when (org-mode-p)
(org-set-local 'org-todo-kwd-alist nil)
+ (org-set-local 'org-todo-key-alist nil)
+ (org-set-local 'org-todo-key-trigger nil)
(org-set-local 'org-todo-keywords-1 nil)
(org-set-local 'org-done-keywords nil)
(org-set-local 'org-todo-heads nil)
(org-set-local 'org-todo-sets nil)
+ (org-set-local 'org-todo-log-states nil)
(let ((re (org-make-options-regexp
- '("CATEGORY" "SEQ_TODO" "PRI_TODO" "TYP_TODO"
- "STARTUP" "ARCHIVE" "TAGS" "LINK" "PRIORITIES")))
+ '("CATEGORY" "SEQ_TODO" "TYP_TODO" "TODO" "COLUMNS"
+ "STARTUP" "ARCHIVE" "TAGS" "LINK" "PRIORITIES"
+ "CONSTANTS" "PROPERTY" "DRAWERS")))
(splitre "[ \t]+")
- kwds key value cat arch tags links hw dws tail sep kws1 prio)
+ kwds kws0 kwsa key value cat arch tags const links hw dws
+ tail sep kws1 prio props drawers
+ ex log)
(save-excursion
(save-restriction
(widen)
@@ -3437,13 +4371,15 @@ means to push this value onto the list in the variable.")
((equal key "CATEGORY")
(if (string-match "[ \t]+$" value)
(setq value (replace-match "" t t value)))
- (setq cat (intern value)))
- ((equal key "SEQ_TODO")
+ (setq cat value))
+ ((member key '("SEQ_TODO" "TODO"))
(push (cons 'sequence (org-split-string value splitre)) kwds))
((equal key "TYP_TODO")
(push (cons 'type (org-split-string value splitre)) kwds))
((equal key "TAGS")
(setq tags (append tags (org-split-string value splitre))))
+ ((equal key "COLUMNS")
+ (org-set-local 'org-columns-default-format value))
((equal key "LINK")
(when (string-match "^\\(\\S-+\\)[ \t]+\\(.+\\)" value)
(push (cons (match-string 1 value)
@@ -3451,6 +4387,14 @@ means to push this value onto the list in the variable.")
links)))
((equal key "PRIORITIES")
(setq prio (org-split-string value " +")))
+ ((equal key "PROPERTY")
+ (when (string-match "\\(\\S-+\\)\\s-+\\(.*\\)" value)
+ (push (cons (match-string 1 value) (match-string 2 value))
+ props)))
+ ((equal key "DRAWERS")
+ (setq drawers (org-split-string value splitre)))
+ ((equal key "CONSTANTS")
+ (setq const (append const (org-split-string value splitre))))
((equal key "STARTUP")
(let ((opts (org-split-string value splitre))
l var val)
@@ -3469,13 +4413,17 @@ means to push this value onto the list in the variable.")
(remove-text-properties 0 (length arch)
'(face t fontified t) arch)))
)))
- (and cat (org-set-local 'org-category cat))
+ (when cat
+ (org-set-local 'org-category (intern cat))
+ (push (cons "CATEGORY" cat) props))
(when prio
(if (< (length prio) 3) (setq prio '("A" "C" "B")))
(setq prio (mapcar 'string-to-char prio))
(org-set-local 'org-highest-priority (nth 0 prio))
(org-set-local 'org-lowest-priority (nth 1 prio))
(org-set-local 'org-default-priority (nth 2 prio)))
+ (and props (org-set-local 'org-local-properties (nreverse props)))
+ (and drawers (org-set-local 'org-drawers drawers))
(and arch (org-set-local 'org-archive-location arch))
(and links (setq org-link-abbrev-alist-local (nreverse links)))
;; Process the TODO keywords
@@ -3487,20 +4435,49 @@ means to push this value onto the list in the variable.")
(default-value 'org-todo-keywords)))))
(setq kwds (reverse kwds)))
(setq kwds (nreverse kwds))
- (let (inter kws)
+ (let (inter kws kw)
(while (setq kws (pop kwds))
(setq inter (pop kws) sep (member "|" kws)
- kws1 (delete "|" (copy-sequence kws))
+ kws0 (delete "|" (copy-sequence kws))
+ kwsa nil
+ kws1 (mapcar
+ (lambda (x)
+ (if (string-match "^\\(.*?\\)\\(?:(\\(..?\\))\\)?$" x)
+ (progn
+ (setq kw (match-string 1 x)
+ ex (and (match-end 2) (match-string 2 x))
+ log (and ex (string-match "@" ex))
+ key (and ex (substring ex 0 1)))
+ (if (equal key "@") (setq key nil))
+ (push (cons kw (and key (string-to-char key))) kwsa)
+ (and log (push kw org-todo-log-states))
+ kw)
+ (error "Invalid TODO keyword %s" x)))
+ kws0)
+ kwsa (if kwsa (append '((:startgroup))
+ (nreverse kwsa)
+ '((:endgroup))))
hw (car kws1)
- dws (if sep (cdr sep) (last kws1))
+ dws (if sep (org-remove-keyword-keys (cdr sep)) (last kws1))
tail (list inter hw (car dws) (org-last dws)))
(add-to-list 'org-todo-heads hw 'append)
(push kws1 org-todo-sets)
(setq org-done-keywords (append org-done-keywords dws nil))
+ (setq org-todo-key-alist (append org-todo-key-alist kwsa))
(mapc (lambda (x) (push (cons x tail) org-todo-kwd-alist)) kws1)
(setq org-todo-keywords-1 (append org-todo-keywords-1 kws1 nil)))
(setq org-todo-sets (nreverse org-todo-sets)
- org-todo-kwd-alist (nreverse org-todo-kwd-alist)))
+ org-todo-kwd-alist (nreverse org-todo-kwd-alist)
+ org-todo-key-trigger (delq nil (mapcar 'cdr org-todo-key-alist))
+ org-todo-key-alist (org-assign-fast-keys org-todo-key-alist)))
+ ;; Process the constants
+ (when const
+ (let (e cst)
+ (while (setq e (pop const))
+ (if (string-match "^\\([a-zA-Z0][_a-zA-Z0-9]*\\)=\\(.*\\)" e)
+ (push (cons (match-string 1 e) (match-string 2 e)) cst)))
+ (setq org-table-formula-constants-local cst)))
+
;; Process the tags.
(when tags
(let (e tgs)
@@ -3508,7 +4485,7 @@ means to push this value onto the list in the variable.")
(cond
((equal e "{") (push '(:startgroup) tgs))
((equal e "}") (push '(:endgroup) tgs))
- ((string-match "^\\([a-zA-Z0-9_@]+\\)(\\(.\\))$" e)
+ ((string-match (org-re "^\\([[:alnum:]_@]+\\)(\\(.\\))$") e)
(push (cons (match-string 1 e)
(string-to-char (match-string 2 e)))
tgs))
@@ -3524,6 +4501,10 @@ means to push this value onto the list in the variable.")
(setq org-done-keywords (list (org-last org-todo-keywords-1))))
(setq org-ds-keyword-length (+ 2 (max (length org-deadline-string)
(length org-scheduled-string)))
+ org-drawer-regexp
+ (concat "^[ \t]*:\\("
+ (mapconcat 'regexp-quote org-drawers "\\|")
+ "\\):[ \t]*$")
org-not-done-keywords
(org-delete-all org-done-keywords (copy-sequence org-todo-keywords-1))
org-todo-regexp
@@ -3534,17 +4515,23 @@ means to push this value onto the list in the variable.")
(mapconcat 'regexp-quote org-not-done-keywords "\\|")
"\\)\\>")
org-todo-line-regexp
- (concat "^\\(\\*+\\)[ \t]*\\(?:\\("
+ (concat "^\\(\\*+\\)[ \t]+\\(?:\\("
+ (mapconcat 'regexp-quote org-todo-keywords-1 "\\|")
+ "\\)\\>\\)?[ \t]*\\(.*\\)")
+ org-complex-heading-regexp
+ (concat "^\\(\\*+\\)\\(?:[ \t]+\\("
(mapconcat 'regexp-quote org-todo-keywords-1 "\\|")
- "\\)\\>\\)? *\\(.*\\)")
+ "\\)\\>\\)?\\(?:[ \t]*\\(\\[#.\\]\\)\\)?[ \t]*\\(.*?\\)"
+ "\\(?:[ \t]+\\(:[[:alnum:]_@:]+:\\)\\)?[ \t]*$")
org-nl-done-regexp
- (concat "[\r\n]\\*+[ \t]+"
+ (concat "\n\\*+[ \t]+"
"\\(?:" (mapconcat 'regexp-quote org-done-keywords "\\|")
"\\)" "\\>")
org-todo-line-tags-regexp
- (concat "^\\(\\*+\\)[ \t]*\\(?:\\("
+ (concat "^\\(\\*+\\)[ \t]+\\(?:\\("
(mapconcat 'regexp-quote org-todo-keywords-1 "\\|")
- "\\)\\>\\)? *\\(.*?\\([ \t]:[a-zA-Z0-9:_@]+:[ \t]*\\)?$\\)")
+ (org-re
+ "\\)\\>\\)? *\\(.*?\\([ \t]:[[:alnum:]:_@]+:[ \t]*\\)?$\\)"))
org-looking-at-done-regexp
(concat "^" "\\(?:"
(mapconcat 'regexp-quote org-done-keywords "\\|") "\\)"
@@ -3569,7 +4556,8 @@ means to push this value onto the list in the variable.")
org-keyword-time-not-clock-regexp
(concat "\\<\\(" org-scheduled-string
"\\|" org-deadline-string
- "\\|" org-closed-string "\\)"
+ "\\|" org-closed-string
+ "\\)"
" *[[<]\\([^]>]+\\)[]>]")
org-maybe-keyword-time-regexp
(concat "\\(\\<\\(" org-scheduled-string
@@ -3580,11 +4568,43 @@ means to push this value onto the list in the variable.")
org-planning-or-clock-line-re
(concat "\\(?:^[ \t]*\\(" org-scheduled-string
"\\|" org-deadline-string
- "\\|" org-closed-string "\\|" org-clock-string "\\)\\>\\)")
+ "\\|" org-closed-string "\\|" org-clock-string
+ "\\)\\>\\)")
)
-
+ (org-compute-latex-and-specials-regexp)
(org-set-font-lock-defaults)))
+(defun org-remove-keyword-keys (list)
+ (mapcar (lambda (x)
+ (if (string-match "(..?)$" x)
+ (substring x 0 (match-beginning 0))
+ x))
+ list))
+
+;; FIXME: this could be done much better, using second characters etc.
+(defun org-assign-fast-keys (alist)
+ "Assign fast keys to a keyword-key alist.
+Respect keys that are already there."
+ (let (new e k c c1 c2 (char ?a))
+ (while (setq e (pop alist))
+ (cond
+ ((equal e '(:startgroup)) (push e new))
+ ((equal e '(:endgroup)) (push e new))
+ (t
+ (setq k (car e) c2 nil)
+ (if (cdr e)
+ (setq c (cdr e))
+ ;; automatically assign a character.
+ (setq c1 (string-to-char
+ (downcase (substring
+ k (if (= (string-to-char k) ?@) 1 0)))))
+ (if (or (rassoc c1 new) (rassoc c1 alist))
+ (while (or (rassoc char new) (rassoc char alist))
+ (setq char (1+ char)))
+ (setq c2 c1))
+ (setq c (or c2 char)))
+ (push (cons k c) new))))
+ (nreverse new)))
;;; Some variables ujsed in various places
@@ -3594,47 +4614,6 @@ means to push this value onto the list in the variable.")
"Function to be called when `C-c C-c' is used.
This is for getting out of special buffers like remember.")
-;;; Foreign variables, to inform the compiler
-
-;; XEmacs only
-(defvar outline-mode-menu-heading)
-(defvar outline-mode-menu-show)
-(defvar outline-mode-menu-hide)
-(defvar zmacs-regions) ; XEmacs regions
-;; Emacs only
-(defvar mark-active)
-
-;; Packages that org-mode interacts with
-(defvar calc-embedded-close-formula)
-(defvar calc-embedded-open-formula)
-(defvar font-lock-unfontify-region-function)
-(defvar org-goto-start-pos)
-(defvar vm-message-pointer)
-(defvar vm-folder-directory)
-(defvar wl-summary-buffer-elmo-folder)
-(defvar wl-summary-buffer-folder-name)
-(defvar gnus-other-frame-object)
-(defvar gnus-group-name)
-(defvar gnus-article-current)
-(defvar w3m-current-url)
-(defvar w3m-current-title)
-(defvar mh-progs)
-(defvar mh-current-folder)
-(defvar mh-show-folder-buffer)
-(defvar mh-index-folder)
-(defvar mh-searcher)
-(defvar calendar-mode-map)
-(defvar Info-current-file)
-(defvar Info-current-node)
-(defvar texmathp-why)
-(defvar remember-save-after-remembering)
-(defvar remember-data-file)
-(defvar annotation) ; from remember.el, dynamically scoped in `remember-mode'
-(defvar initial) ; from remember.el, dynamically scoped in `remember-mode'
-(defvar org-latex-regexps)
-(defvar constants-unit-system)
-
-(defvar original-date) ; dynamically scoped in calendar.el does scope this
;; FIXME: Occasionally check by commenting these, to make sure
;; no other functions uses these, forgetting to let-bind them.
@@ -3644,9 +4623,9 @@ This is for getting out of special buffers like remember.")
(defvar date)
(defvar description)
-
;; Defined somewhere in this file, but used before definition.
(defvar orgtbl-mode-menu) ; defined when orgtbl mode get initialized
+(defvar org-agenda-buffer-name)
(defvar org-agenda-undo-list)
(defvar org-agenda-pending-undo-list)
(defvar org-agenda-overriding-header)
@@ -3656,7 +4635,6 @@ This is for getting out of special buffers like remember.")
(defvar org-org-menu)
(defvar org-tbl-menu)
(defvar org-agenda-keymap)
-(defvar org-category-table)
;;;; Emacs/XEmacs compatibility
@@ -3702,7 +4680,6 @@ This is for getting out of special buffers like remember.")
(overlay-get ovl prop)))
(defun org-overlays-at (pos)
(if (featurep 'xemacs) (extents-at pos) (overlays-at pos)))
-;; FIXME: this is currently not used
(defun org-overlays-in (&optional start end)
(if (featurep 'xemacs)
(extent-list nil start end)
@@ -3711,7 +4688,6 @@ This is for getting out of special buffers like remember.")
(if (featurep 'xemacs) (extent-start-position o) (overlay-start o)))
(defun org-overlay-end (o)
(if (featurep 'xemacs) (extent-end-position o) (overlay-end o)))
-;; FIXME: this is currently not used
(defun org-find-overlays (prop &optional pos delete)
"Find all overlays specifying PROP at POS or point.
If DELETE is non-nil, delete all those overlays."
@@ -3740,7 +4716,9 @@ Works on both Emacs and XEmacs."
nil
(if (featurep 'xemacs)
(and zmacs-regions (region-active-p))
- (and transient-mark-mode mark-active))))
+ (if (fboundp 'use-region-p)
+ (use-region-p)
+ (and transient-mark-mode mark-active))))) ; Emacs 22 and before
;; Invisibility compatibility
@@ -3765,7 +4743,6 @@ that can be added."
(setq buffer-invisibility-spec
(delete arg buffer-invisibility-spec)))))
-;; FIXME: this is currently not used
(defun org-in-invisibility-spec-p (arg)
"Is ARG a member of `buffer-invisibility-spec'?"
(if (consp buffer-invisibility-spec)
@@ -3789,7 +4766,7 @@ This variable is set by `org-before-change-function'.
(defvar org-inhibit-startup nil) ; Dynamically-scoped param.
(defvar org-agenda-keep-modes nil) ; Dynamically-scoped param.
(defvar org-table-buffer-is-an nil)
-
+(defconst org-outline-regexp "\\*+ ")
;;;###autoload
(define-derived-mode org-mode outline-mode "Org"
@@ -3832,14 +4809,19 @@ The following commands are available:
(org-add-to-invisibility-spec '(org-cwidth))
(when (featurep 'xemacs)
(org-set-local 'line-move-ignore-invisible t))
- (setq outline-regexp "\\*+")
- (setq outline-level 'org-outline-level)
- (when (and org-ellipsis (stringp org-ellipsis)
- (fboundp 'set-display-table-slot) (boundp 'buffer-display-table))
+ (org-set-local 'outline-regexp org-outline-regexp)
+ (org-set-local 'outline-level 'org-outline-level)
+ (when (and org-ellipsis
+ (fboundp 'set-display-table-slot) (boundp 'buffer-display-table)
+ (fboundp 'make-glyph-code))
(unless org-display-table
(setq org-display-table (make-display-table)))
- (set-display-table-slot org-display-table
- 4 (string-to-vector org-ellipsis))
+ (set-display-table-slot
+ org-display-table 4
+ (vconcat (mapcar
+ (lambda (c) (make-glyph-code c (and (not (stringp org-ellipsis))
+ org-ellipsis)))
+ (if (stringp org-ellipsis) org-ellipsis "..."))))
(setq buffer-display-table org-display-table))
(org-set-regexps-and-options)
;; Calc embedded
@@ -3864,6 +4846,10 @@ The following commands are available:
; (org-set-local 'comment-start "#") ;; FIXME: this breaks wrapping
(org-set-local 'comment-padding " ")
+ ;; Imenu
+ (org-set-local 'imenu-create-index-function
+ 'org-imenu-get-tree)
+
;; Make isearch reveal context
(if (or (featurep 'xemacs)
(not (boundp 'outline-isearch-open-invisible-function)))
@@ -3884,6 +4870,7 @@ The following commands are available:
(let ((bmp (buffer-modified-p)))
(org-table-map-tables 'org-table-align)
(set-buffer-modified-p bmp)))
+ (org-cycle-hide-drawers 'all)
(cond
((eq org-startup-folded t)
(org-cycle '(4)))
@@ -3900,6 +4887,7 @@ The following commands are available:
(defsubst org-current-line (&optional pos)
(save-excursion
(and pos (goto-char pos))
+ ;; works also in narrowed buffer, because we start at 1, not point-min
(+ (if (bolp) 1 0) (count-lines 1 (point)))))
(defun org-current-time ()
@@ -3941,61 +4929,71 @@ that will be added to PLIST. Returns the string that was modified."
(require 'font-lock)
(defconst org-non-link-chars "]\t\n\r<>")
-(defconst org-link-types '("http" "https" "ftp" "mailto" "file" "news" "bbdb" "vm"
+(defvar org-link-types '("http" "https" "ftp" "mailto" "file" "news" "bbdb" "vm"
"wl" "mhe" "rmail" "gnus" "shell" "info" "elisp"))
-(defconst org-link-re-with-space
- (concat
- "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
- "\\([^" org-non-link-chars " ]"
- "[^" org-non-link-chars "]*"
- "[^" org-non-link-chars " ]\\)>?")
+(defvar org-link-re-with-space nil
"Matches a link with spaces, optional angular brackets around it.")
-
-(defconst org-link-re-with-space2
- (concat
- "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
- "\\([^" org-non-link-chars " ]"
- "[^]\t\n\r]*"
- "[^" org-non-link-chars " ]\\)>?")
+(defvar org-link-re-with-space2 nil
"Matches a link with spaces, optional angular brackets around it.")
-
-(defconst org-angle-link-re
- (concat
- "<\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
- "\\([^" org-non-link-chars " ]"
- "[^" org-non-link-chars "]*"
- "\\)>")
+(defvar org-angle-link-re nil
"Matches link with angular brackets, spaces are allowed.")
-(defconst org-plain-link-re
- (concat
- "\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
- "\\([^]\t\n\r<>,;() ]+\\)")
+(defvar org-plain-link-re nil
"Matches plain link, without spaces.")
-
-(defconst org-bracket-link-regexp
- "\\[\\[\\([^]]+\\)\\]\\(\\[\\([^]]+\\)\\]\\)?\\]"
+(defvar org-bracket-link-regexp nil
"Matches a link in double brackets.")
-
-(defconst org-bracket-link-analytic-regexp
- (concat
- "\\[\\["
- "\\(\\(" (mapconcat 'identity org-link-types "\\|") "\\):\\)?"
- "\\([^]]+\\)"
- "\\]"
- "\\(\\[" "\\([^]]+\\)" "\\]\\)?"
- "\\]"))
-; 1: http:
-; 2: http
-; 3: path
-; 4: [desc]
-; 5: desc
-
-(defconst org-any-link-re
- (concat "\\(" org-bracket-link-regexp "\\)\\|\\("
- org-angle-link-re "\\)\\|\\("
- org-plain-link-re "\\)")
+(defvar org-bracket-link-analytic-regexp nil
+ "Regular expression used to analyze links.
+Here is what the match groups contain after a match:
+1: http:
+2: http
+3: path
+4: [desc]
+5: desc")
+(defvar org-any-link-re nil
"Regular expression matching any link.")
+(defun org-make-link-regexps ()
+ "Update the link regular expressions.
+This should be called after the variable `org-link-types' has changed."
+ (setq org-link-re-with-space
+ (concat
+ "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^" org-non-link-chars " ]"
+ "[^" org-non-link-chars "]*"
+ "[^" org-non-link-chars " ]\\)>?")
+ org-link-re-with-space2
+ (concat
+ "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^" org-non-link-chars " ]"
+ "[^]\t\n\r]*"
+ "[^" org-non-link-chars " ]\\)>?")
+ org-angle-link-re
+ (concat
+ "<\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^" org-non-link-chars " ]"
+ "[^" org-non-link-chars "]*"
+ "\\)>")
+ org-plain-link-re
+ (concat
+ "\\<\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
+ "\\([^]\t\n\r<>,;() ]+\\)")
+ org-bracket-link-regexp
+ "\\[\\[\\([^][]+\\)\\]\\(\\[\\([^][]+\\)\\]\\)?\\]"
+ org-bracket-link-analytic-regexp
+ (concat
+ "\\[\\["
+ "\\(\\(" (mapconcat 'identity org-link-types "\\|") "\\):\\)?"
+ "\\([^]]+\\)"
+ "\\]"
+ "\\(\\[" "\\([^]]+\\)" "\\]\\)?"
+ "\\]")
+ org-any-link-re
+ (concat "\\(" org-bracket-link-regexp "\\)\\|\\("
+ org-angle-link-re "\\)\\|\\("
+ org-plain-link-re "\\)")))
+
+(org-make-link-regexps)
+
(defconst org-ts-regexp "<\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [^\r\n>]*?\\)>"
"Regular expression for fast time stamp matching.")
(defconst org-ts-regexp-both "[[<]\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [^\r\n>]*?\\)[]>]"
@@ -4005,9 +5003,9 @@ that will be added to PLIST. Returns the string that was modified."
This one does not require the space after the date.")
(defconst org-ts-regexp1 "\\(\\([0-9]\\{4\\}\\)-\\([0-9]\\{2\\}\\)-\\([0-9]\\{2\\}\\) \\([^]0-9>\r\n]*\\)\\(\\([0-9]\\{2\\}\\):\\([0-9]\\{2\\}\\)\\)?\\)"
"Regular expression matching time strings for analysis.")
-(defconst org-ts-regexp2 (concat "<" org-ts-regexp1 "[^>\n]\\{0,11\\}>")
+(defconst org-ts-regexp2 (concat "<" org-ts-regexp1 "[^>\n]\\{0,16\\}>")
"Regular expression matching time stamps, with groups.")
-(defconst org-ts-regexp3 (concat "[[<]" org-ts-regexp1 "[^]>\n]\\{0,11\\}[]>]")
+(defconst org-ts-regexp3 (concat "[[<]" org-ts-regexp1 "[^]>\n]\\{0,16\\}[]>]")
"Regular expression matching time stamps (also [..]), with groups.")
(defconst org-tr-regexp (concat org-ts-regexp "--?-?" org-ts-regexp)
"Regular expression matching a time stamp range.")
@@ -4038,7 +5036,12 @@ The time stamps may be either active or inactive.")
org-emphasis-alist)))
(add-text-properties (match-beginning 2) (match-end 2)
'(font-lock-multiline t))
- (backward-char 1))))
+ (when org-hide-emphasis-markers
+ (add-text-properties (match-end 4) (match-beginning 5)
+ '(invisible org-link))
+ (add-text-properties (match-beginning 3) (match-end 3)
+ '(invisible org-link)))))
+ (backward-char 1))
rtn))
(defun org-emphasize (&optional char)
@@ -4092,6 +5095,10 @@ will be prompted for."
(insert string)
(and move (backward-char 1))))
+(defconst org-nonsticky-props
+ '(mouse-face highlight keymap invisible intangible help-echo org-linked-text))
+
+
(defun org-activate-plain-links (limit)
"Run through the buffer and add overlays to links."
(catch 'exit
@@ -4103,18 +5110,25 @@ will be prompted for."
nil
(add-text-properties (match-beginning 0) (match-end 0)
(list 'mouse-face 'highlight
- 'rear-nonsticky t
+ 'rear-nonsticky org-nonsticky-props
'keymap org-mouse-map
))
(throw 'exit t))))))
+(defun org-activate-code (limit)
+ (if (re-search-forward "^[ \t]*\\(:.*\\)" limit t)
+ (unless (get-text-property (match-beginning 1) 'face)
+ (remove-text-properties (match-beginning 0) (match-end 0)
+ '(display t invisible t intangible t))
+ t)))
+
(defun org-activate-angle-links (limit)
"Run through the buffer and add overlays to links."
(if (re-search-forward org-angle-link-re limit t)
(progn
(add-text-properties (match-beginning 0) (match-end 0)
(list 'mouse-face 'highlight
- 'rear-nonsticky t
+ 'rear-nonsticky org-nonsticky-props
'keymap org-mouse-map
))
t)))
@@ -4140,12 +5154,12 @@ We use a macro so that the test can happen at compilation time."
;; but that requires another match, protecting match data,
;; a lot of overhead for font-lock.
(ip (org-maybe-intangible
- (list 'invisible 'org-link 'rear-nonsticky t
+ (list 'invisible 'org-link 'rear-nonsticky org-nonsticky-props
'keymap org-mouse-map 'mouse-face 'highlight
- 'help-echo help)))
- (vp (list 'rear-nonsticky t
+ 'font-lock-multiline t 'help-echo help)))
+ (vp (list 'rear-nonsticky org-nonsticky-props
'keymap org-mouse-map 'mouse-face 'highlight
- 'help-echo help)))
+ ' font-lock-multiline t 'help-echo help)))
;; We need to remove the invisible property here. Table narrowing
;; may have made some of this invisible.
(remove-text-properties (match-beginning 0) (match-end 0)
@@ -4166,7 +5180,7 @@ We use a macro so that the test can happen at compilation time."
(progn
(add-text-properties (match-beginning 0) (match-end 0)
(list 'mouse-face 'highlight
- 'rear-nonsticky t
+ 'rear-nonsticky org-nonsticky-props
'keymap org-mouse-map))
(when org-display-custom-times
(if (match-end 3)
@@ -4191,7 +5205,7 @@ We use a macro so that the test can happen at compilation time."
(progn
(add-text-properties (match-beginning 0) (match-end 0)
(list 'mouse-face 'highlight
- 'rear-nonsticky t
+ 'rear-nonsticky org-nonsticky-props
'keymap org-mouse-map
'help-echo "Radio target link"
'org-linked-text t))
@@ -4215,6 +5229,97 @@ We use a macro so that the test can happen at compilation time."
(goto-char e)
t)))
+(defvar org-latex-and-specials-regexp nil
+ "Regular expression for highlighting export special stuff.")
+(defvar org-match-substring-regexp)
+(defvar org-match-substring-with-braces-regexp)
+(defvar org-export-html-special-string-regexps)
+
+(defun org-compute-latex-and-specials-regexp ()
+ "Compute regular expression for stuff treated specially by exporters."
+ (if (not org-highlight-latex-fragments-and-specials)
+ (org-set-local 'org-latex-and-specials-regexp nil)
+ (let*
+ ((matchers (plist-get org-format-latex-options :matchers))
+ (latexs (delq nil (mapcar (lambda (x) (if (member (car x) matchers) x))
+ org-latex-regexps)))
+ (options (org-combine-plists (org-default-export-plist)
+ (org-infile-export-plist)))
+ (org-export-with-sub-superscripts (plist-get options :sub-superscript))
+ (org-export-with-LaTeX-fragments (plist-get options :LaTeX-fragments))
+ (org-export-with-TeX-macros (plist-get options :TeX-macros))
+ (org-export-html-expand (plist-get options :expand-quoted-html))
+ (org-export-with-special-strings (plist-get options :special-strings))
+ (re-sub
+ (cond
+ ((equal org-export-with-sub-superscripts '{})
+ (list org-match-substring-with-braces-regexp))
+ (org-export-with-sub-superscripts
+ (list org-match-substring-regexp))
+ (t nil)))
+ (re-latex
+ (if org-export-with-LaTeX-fragments
+ (mapcar (lambda (x) (nth 1 x)) latexs)))
+ (re-macros
+ (if org-export-with-TeX-macros
+ (list (concat "\\\\"
+ (regexp-opt
+ (append (mapcar 'car org-html-entities)
+ (if (boundp 'org-latex-entities)
+ org-latex-entities nil))
+ 'words))) ; FIXME
+ ))
+ ;; (list "\\\\\\(?:[a-zA-Z]+\\)")))
+ (re-special (if org-export-with-special-strings
+ (mapcar (lambda (x) (car x))
+ org-export-html-special-string-regexps)))
+ (re-rest
+ (delq nil
+ (list
+ (if org-export-html-expand "@<[^>\n]+>")
+ ))))
+ (org-set-local
+ 'org-latex-and-specials-regexp
+ (mapconcat 'identity (append re-latex re-sub re-macros re-special
+ re-rest) "\\|")))))
+
+(defface org-latex-and-export-specials
+ (let ((font (cond ((assq :inherit custom-face-attributes)
+ '(:inherit underline))
+ (t '(:underline t)))))
+ `((((class grayscale) (background light))
+ (:foreground "DimGray" ,@font))
+ (((class grayscale) (background dark))
+ (:foreground "LightGray" ,@font))
+ (((class color) (background light))
+ (:foreground "SaddleBrown"))
+ (((class color) (background dark))
+ (:foreground "burlywood"))
+ (t (,@font))))
+ "Face used to highlight math latex and other special exporter stuff."
+ :group 'org-faces)
+
+(defun org-do-latex-and-special-faces (limit)
+ "Run through the buffer and add overlays to links."
+ (when org-latex-and-specials-regexp
+ (let (rtn d)
+ (while (and (not rtn) (re-search-forward org-latex-and-specials-regexp
+ limit t))
+ (if (not (memq (car-safe (get-text-property (1+ (match-beginning 0))
+ 'face))
+ '(org-code org-verbatim underline)))
+ (progn
+ (setq rtn t
+ d (cond ((member (char-after (1+ (match-beginning 0)))
+ '(?_ ?^)) 1)
+ (t 0)))
+ (font-lock-prepend-text-property
+ (+ d (match-beginning 0)) (match-end 0)
+ 'face 'org-latex-and-export-specials)
+ (add-text-properties (+ d (match-beginning 0)) (match-end 0)
+ '(font-lock-multiline t)))))
+ rtn)))
+
(defun org-restart-font-lock ()
"Restart font-lock-mode, to force refontification."
(when (and (boundp 'font-lock-mode) font-lock-mode)
@@ -4249,11 +5354,11 @@ between words."
"\\)\\>")))
(defun org-activate-tags (limit)
- (if (re-search-forward "[ \t]\\(:[a-zA-Z0-9_@:]+:\\)[ \r\n]" limit t)
+ (if (re-search-forward (org-re "^\\*+.*[ \t]\\(:[[:alnum:]_@:]+:\\)[ \r\n]") limit t)
(progn
(add-text-properties (match-beginning 1) (match-end 1)
(list 'mouse-face 'highlight
- 'rear-nonsticky t
+ 'rear-nonsticky org-nonsticky-props
'keymap org-mouse-map))
t)))
@@ -4262,20 +5367,37 @@ between words."
(looking-at outline-regexp)
(if (match-beginning 1)
(+ (org-get-string-indentation (match-string 1)) 1000)
- (- (match-end 0) (match-beginning 0)))))
+ (1- (- (match-end 0) (match-beginning 0))))))
(defvar org-font-lock-keywords nil)
+(defconst org-property-re (org-re "^[ \t]*\\(:\\([[:alnum:]_]+\\):\\)[ \t]*\\(\\S-.*\\)")
+ "Regular expression matching a property line.")
+
(defun org-set-font-lock-defaults ()
(let* ((em org-fontify-emphasized-text)
(lk org-activate-links)
(org-font-lock-extra-keywords
- ;; Headlines
(list
- '("^\\(\\**\\)\\(\\*\\)\\(.*\\)" (1 (org-get-level-face 1))
+ ;; Headlines
+ '("^\\(\\**\\)\\(\\* \\)\\(.*\\)" (1 (org-get-level-face 1))
(2 (org-get-level-face 2)) (3 (org-get-level-face 3)))
+ ;; Table lines
'("^[ \t]*\\(\\(|\\|\\+-[-+]\\).*\\S-\\)"
- (1 'org-table))
+ (1 'org-table t))
+ ;; Table internals
+ '("^[ \t]*|\\(?:.*?|\\)? *\\(:?=[^|\n]*\\)" (1 'org-formula t))
+ '("^[ \t]*| *\\([#*]\\) *|" (1 'org-formula t))
+ '("^[ \t]*|\\( *\\([$!_^/]\\) *|.*\\)|" (1 'org-formula t))
+ ;; Drawers
+ (list org-drawer-regexp '(0 'org-special-keyword t))
+ (list "^[ \t]*:END:" '(0 'org-special-keyword t))
+ ;; Properties
+ (list org-property-re
+ '(1 'org-special-keyword t)
+ '(3 'org-property-value t))
+ (if org-format-transports-properties-p
+ '("| *\\(<[0-9]+>\\) *" (1 'org-formula t)))
;; Links
(if (memq 'tag lk) '(org-activate-tags (1 'org-tag prepend)))
(if (memq 'angle lk) '(org-activate-angle-links (0 'org-link t)))
@@ -4286,8 +5408,15 @@ between words."
'("^&?%%(.*\\|<%%([^>\n]*?>" (0 'org-sexp-date t))
'(org-hide-wide-columns (0 nil append))
;; TODO lines
- (list (concat "^\\*+[ \t]*" org-not-done-regexp)
- '(1 'org-todo t))
+ (list (concat "^\\*+[ \t]+" org-todo-regexp)
+ '(1 (org-get-todo-face 1) t))
+ ;; DONE
+ (if org-fontify-done-headline
+ (list (concat "^[*]+ +\\<\\("
+ (mapconcat 'regexp-quote org-done-keywords "\\|")
+ "\\)\\(.*\\)")
+ '(2 'org-headline-done t))
+ nil)
;; Priorities
(list (concat "\\[#[A-Z0-9]\\]") '(0 'org-special-keyword t))
;; Special keywords
@@ -4300,34 +5429,23 @@ between words."
(if (featurep 'xemacs)
'(org-do-emphasis-faces (0 nil append))
'(org-do-emphasis-faces)))
- ;; Checkboxes, similar to Frank Ruell's org-checklet.el
- '("^[ \t]*\\([-+*]\\|[0-9]+[.)]\\) +\\(\\[[ X]\\]\\)"
+ ;; Checkboxes
+ '("^[ \t]*\\([-+*]\\|[0-9]+[.)]\\) +\\(\\[[- X]\\]\\)"
2 'bold prepend)
(if org-provide-checkbox-statistics
'("\\[\\([0-9]*%\\)\\]\\|\\[\\([0-9]*\\)/\\([0-9]*\\)\\]"
(0 (org-get-checkbox-statistics-face) t)))
+ (list (concat "^\\*+ \\(.*:" org-archive-tag ":.*\\)")
+ '(1 'org-archived prepend))
+ ;; Specials
+ '(org-do-latex-and-special-faces)
+ ;; Code
+ '(org-activate-code (1 'org-code t))
;; COMMENT
- (list (concat "^\\*+[ \t]*\\<\\(" org-comment-string
+ (list (concat "^\\*+[ \t]+\\<\\(" org-comment-string
"\\|" org-quote-string "\\)\\>")
'(1 'org-special-keyword t))
'("^#.*" (0 'font-lock-comment-face t))
- ;; DONE
- (if org-fontify-done-headline
- (list (concat "^[*]+ +\\<\\("
- (mapconcat 'regexp-quote org-done-keywords "\\|")
- "\\)\\(.*\\)")
- '(1 'org-done t) '(2 'org-headline-done t))
- (list (concat "^[*]+ +\\<\\("
- (mapconcat 'regexp-quote org-done-keywords "\\|")
- "\\)\\>")
- '(1 'org-done t)))
- ;; Table stuff
- '("^[ \t]*\\(:.*\\)" (1 'org-table t))
- '("| *\\(:?=[^|\n]*\\)" (1 'org-formula t))
- '("^[ \t]*| *\\([#!$*_^]\\) *|" (1 'org-formula t))
- (if org-format-transports-properties-p
- '("| *\\(<[0-9]+>\\) *" (1 'org-formula t)))
- '("^\\*+ \\(.*:ARCHIVE:.*\\)" (1 'org-archived prepend))
)))
(setq org-font-lock-extra-keywords (delq nil org-font-lock-extra-keywords))
;; Now set the full font-lock-keywords
@@ -4341,14 +5459,22 @@ between words."
(defvar org-f nil)
(defun org-get-level-face (n)
"Get the right face for match N in font-lock matching of healdines."
- (setq org-l (- (match-end 2) (match-beginning 1)))
+ (setq org-l (- (match-end 2) (match-beginning 1) 1))
(if org-odd-levels-only (setq org-l (1+ (/ org-l 2))))
- (setq org-f (nth (% (1- org-l) org-n-levels) org-level-faces))
+ (setq org-f (nth (% (1- org-l) org-n-level-faces) org-level-faces))
(cond
((eq n 1) (if org-hide-leading-stars 'org-hide org-f))
((eq n 2) org-f)
(t (if org-level-color-stars-only nil org-f))))
+(defun org-get-todo-face (kwd)
+ "Get the right face for a TODO keyword KWD.
+If KWD is a number, get the corresponding match group."
+ (if (numberp kwd) (setq kwd (match-string kwd)))
+ (or (cdr (assoc kwd org-todo-keyword-faces))
+ (and (member kwd org-done-keywords) 'org-done)
+ 'org-todo))
+
(defun org-unfontify-region (beg end &optional maybe_loudly)
"Remove fontification and activation overlays from links."
(font-lock-default-unfontify-region beg end)
@@ -4358,7 +5484,6 @@ between words."
deactivate-mark buffer-file-name buffer-file-truename)
(remove-text-properties beg end
'(mouse-face t keymap t org-linked-text t
- rear-nonsticky t
invisible t intangible t))))
;;;; Visibility cycling, including org-goto and indirect buffer
@@ -4397,11 +5522,12 @@ between words."
`org-cycle-emulate-tab' for details.
- Special case: if point is at the beginning of the buffer and there is
- no headline in line 1, this function will act as if called with prefix arg."
+ no headline in line 1, this function will act as if called with prefix arg.
+ But only if also the variable `org-cycle-global-at-bob' is t."
(interactive "P")
(let* ((outline-regexp
(if (and (org-mode-p) org-cycle-include-plain-lists)
- "\\(?:\\*+\\|\\([ \t]*\\)\\([-+*]\\|[0-9]+[.)]\\) \\)"
+ "\\(?:\\*+ \\|\\([ \t]*\\)\\([-+*]\\|[0-9]+[.)]\\) \\)"
outline-regexp))
(bob-special (and org-cycle-global-at-bob (bobp)
(not (looking-at outline-regexp))))
@@ -4454,6 +5580,14 @@ between words."
(setq org-cycle-global-status 'overview)
(run-hook-with-args 'org-cycle-hook 'overview))))
+ ((and org-drawers org-drawer-regexp
+ (save-excursion
+ (beginning-of-line 1)
+ (looking-at org-drawer-regexp)))
+ ;; Toggle block visibility
+ (org-flag-drawer
+ (not (get-char-property (match-end 0) 'invisible))))
+
((integerp arg)
;; Show-subtree, ARG levels up from here.
(save-excursion
@@ -4492,7 +5626,8 @@ between words."
(goto-char eos)
(outline-next-heading)
(if (org-invisible-p) (org-flag-heading nil))))
- ((>= eol eos)
+ ((or (>= eol eos)
+ (not (string-match "\\S-" (buffer-substring eol eos))))
;; Entire subtree is hidden in one line: open it
(org-show-entry)
(show-children)
@@ -4535,12 +5670,12 @@ between words."
(>= (match-end 0) pos))))
t
(eq org-cycle-emulate-tab t))
- (if (and (looking-at "[ \n\r\t]")
- (string-match "^[ \t]*$" (buffer-substring
- (point-at-bol) (point))))
- (progn
- (beginning-of-line 1)
- (and (looking-at "[ \t]+") (replace-match ""))))
+; (if (and (looking-at "[ \n\r\t]")
+; (string-match "^[ \t]*$" (buffer-substring
+; (point-at-bol) (point))))
+; (progn
+; (beginning-of-line 1)
+; (and (looking-at "[ \t]+") (replace-match ""))))
(call-interactively (global-key-binding "\t")))
(t (save-excursion
@@ -4608,6 +5743,17 @@ This function is the default value of the hook `org-cycle-hook'."
((eq state 'children) (or (org-subtree-end-visible-p) (recenter 1)))
((eq state 'subtree) (or (org-subtree-end-visible-p) (recenter 1))))))
+(defun org-compact-display-after-subtree-move ()
+ (let (beg end)
+ (save-excursion
+ (if (org-up-heading-safe)
+ (progn
+ (hide-subtree)
+ (show-entry)
+ (show-children)
+ (org-cycle-show-empty-lines 'children)
+ (org-cycle-hide-drawers 'children))
+ (org-overview)))))
(defun org-cycle-show-empty-lines (state)
"Show empty lines above all visible headlines.
@@ -4664,82 +5810,94 @@ Optional argument N means, put the headline into the Nth line of the window."
(defvar org-goto-window-configuration nil)
(defvar org-goto-marker nil)
-(defvar org-goto-map (make-sparse-keymap))
-(let ((cmds '(isearch-forward isearch-backward)) cmd)
- (while (setq cmd (pop cmds))
- (substitute-key-definition cmd cmd org-goto-map global-map)))
-(org-defkey org-goto-map "\C-m" 'org-goto-ret)
-(org-defkey org-goto-map [(left)] 'org-goto-left)
-(org-defkey org-goto-map [(right)] 'org-goto-right)
-(org-defkey org-goto-map [(?q)] 'org-goto-quit)
-(org-defkey org-goto-map [(control ?g)] 'org-goto-quit)
-(org-defkey org-goto-map "\C-i" 'org-cycle)
-(org-defkey org-goto-map [(tab)] 'org-cycle)
-(org-defkey org-goto-map [(down)] 'outline-next-visible-heading)
-(org-defkey org-goto-map [(up)] 'outline-previous-visible-heading)
-(org-defkey org-goto-map "n" 'outline-next-visible-heading)
-(org-defkey org-goto-map "p" 'outline-previous-visible-heading)
-(org-defkey org-goto-map "f" 'outline-forward-same-level)
-(org-defkey org-goto-map "b" 'outline-backward-same-level)
-(org-defkey org-goto-map "u" 'outline-up-heading)
-(org-defkey org-goto-map "\C-c\C-n" 'outline-next-visible-heading)
-(org-defkey org-goto-map "\C-c\C-p" 'outline-previous-visible-heading)
-(org-defkey org-goto-map "\C-c\C-f" 'outline-forward-same-level)
-(org-defkey org-goto-map "\C-c\C-b" 'outline-backward-same-level)
-(org-defkey org-goto-map "\C-c\C-u" 'outline-up-heading)
-(let ((l '(1 2 3 4 5 6 7 8 9 0)))
- (while l (org-defkey org-goto-map (int-to-string (pop l)) 'digit-argument)))
+(defvar org-goto-map
+ (let ((map (make-sparse-keymap)))
+ (let ((cmds '(isearch-forward isearch-backward kill-ring-save set-mark-command mouse-drag-region universal-argument org-occur)) cmd)
+ (while (setq cmd (pop cmds))
+ (substitute-key-definition cmd cmd map global-map)))
+ (suppress-keymap map)
+ (org-defkey map "\C-m" 'org-goto-ret)
+ (org-defkey map [(left)] 'org-goto-left)
+ (org-defkey map [(right)] 'org-goto-right)
+ (org-defkey map [(?q)] 'org-goto-quit)
+ (org-defkey map [(control ?g)] 'org-goto-quit)
+ (org-defkey map "\C-i" 'org-cycle)
+ (org-defkey map [(tab)] 'org-cycle)
+ (org-defkey map [(down)] 'outline-next-visible-heading)
+ (org-defkey map [(up)] 'outline-previous-visible-heading)
+ (org-defkey map "n" 'outline-next-visible-heading)
+ (org-defkey map "p" 'outline-previous-visible-heading)
+ (org-defkey map "f" 'outline-forward-same-level)
+ (org-defkey map "b" 'outline-backward-same-level)
+ (org-defkey map "u" 'outline-up-heading)
+ (org-defkey map "/" 'org-occur)
+ (org-defkey map "\C-c\C-n" 'outline-next-visible-heading)
+ (org-defkey map "\C-c\C-p" 'outline-previous-visible-heading)
+ (org-defkey map "\C-c\C-f" 'outline-forward-same-level)
+ (org-defkey map "\C-c\C-b" 'outline-backward-same-level)
+ (org-defkey map "\C-c\C-u" 'outline-up-heading)
+ map))
(defconst org-goto-help
-"Select a location to jump to, press RET
-\[Up]/[Down]=next/prev headline TAB=cycle visibility RET=select [Q]uit")
+"Browse copy of buffer to find location or copy text.
+RET=jump to location [Q]uit and return to previous location
+\[Up]/[Down]=next/prev headline TAB=cycle visibility [/] org-occur"
+)
+
+(defvar org-goto-start-pos) ; dynamically scoped parameter
(defun org-goto ()
- "Go to a different location of the document, keeping current visibility.
+ "Look up a different location in the current file, keeping current visibility.
-When you want to go to a different location in a document, the fastest way
-is often to fold the entire buffer and then dive into the tree. This
-method has the disadvantage, that the previous location will be folded,
+When you want look-up or go to a different location in a document, the
+fastest way is often to fold the entire buffer and then dive into the tree.
+This method has the disadvantage, that the previous location will be folded,
which may not be what you want.
-This command works around this by showing a copy of the current buffer in
-overview mode. You can dive into the tree in that copy, to find the
-location you want to reach. When pressing RET, the command returns to the
-original buffer in which the visibility is still unchanged. It then jumps
-to the new location, making it and the headline hierarchy above it visible."
+This command works around this by showing a copy of the current buffer
+in an indirect buffer, in overview mode. You can dive into the tree in
+that copy, use org-occur and incremental search to find a location.
+When pressing RET or `Q', the command returns to the original buffer in
+which the visibility is still unchanged. After RET is will also jump to
+the location selected in the indirect buffer and expose the
+the headline hierarchy above."
(interactive)
(let* ((org-goto-start-pos (point))
(selected-point
- (org-get-location (current-buffer) org-goto-help)))
+ (car (org-get-location (current-buffer) org-goto-help))))
(if selected-point
(progn
(org-mark-ring-push org-goto-start-pos)
(goto-char selected-point)
(if (or (org-invisible-p) (org-invisible-p2))
(org-show-context 'org-goto)))
- (error "Quit"))))
+ (message "Quit"))))
-(defvar org-selected-point nil) ; dynamically scoped parameter
+(defvar org-goto-selected-point nil) ; dynamically scoped parameter
+(defvar org-goto-exit-command nil) ; dynamically scoped parameter
(defun org-get-location (buf help)
"Let the user select a location in the Org-mode buffer BUF.
This function uses a recursive edit. It returns the selected position
or nil."
- (let (org-selected-point)
+ (let (org-goto-selected-point org-goto-exit-command)
(save-excursion
(save-window-excursion
(delete-other-windows)
- (switch-to-buffer (get-buffer-create "*org-goto*"))
+ (and (get-buffer "*org-goto*") (kill-buffer "*org-goto*"))
+ (switch-to-buffer
+ (condition-case nil
+ (make-indirect-buffer (current-buffer) "*org-goto*")
+ (error (make-indirect-buffer (current-buffer) "*org-goto*"))))
(with-output-to-temp-buffer "*Help*"
(princ help))
(shrink-window-if-larger-than-buffer (get-buffer-window "*Help*"))
(setq buffer-read-only nil)
- (erase-buffer)
- (insert-buffer-substring buf)
(let ((org-startup-truncated t)
- (org-startup-folded t)
+ (org-startup-folded nil)
(org-startup-align-all-tables nil))
- (org-mode))
+ (org-mode)
+ (org-overview))
(setq buffer-read-only t)
(if (and (boundp 'org-goto-start-pos)
(integer-or-marker-p org-goto-start-pos))
@@ -4753,21 +5911,24 @@ or nil."
(message "Select location and press RET")
;; now we make sure that during selection, ony very few keys work
;; and that it is impossible to switch to another window.
- (let ((gm (current-global-map))
- (overriding-local-map org-goto-map))
- (unwind-protect
- (progn
- (use-global-map org-goto-map)
- (recursive-edit))
- (use-global-map gm)))))
+; (let ((gm (current-global-map))
+; (overriding-local-map org-goto-map))
+; (unwind-protect
+; (progn
+; (use-global-map org-goto-map)
+; (recursive-edit))
+; (use-global-map gm)))
+ (use-local-map org-goto-map)
+ (recursive-edit)
+ ))
(kill-buffer "*org-goto*")
- org-selected-point))
+ (cons org-goto-selected-point org-goto-exit-command)))
(defun org-goto-ret (&optional arg)
"Finish `org-goto' by going to the new location."
(interactive "P")
- (setq org-selected-point (point)
- current-prefix-arg arg)
+ (setq org-goto-selected-point (point)
+ org-goto-exit-command 'return)
(throw 'exit nil))
(defun org-goto-left ()
@@ -4776,8 +5937,8 @@ or nil."
(if (org-on-heading-p)
(progn
(beginning-of-line 1)
- (setq org-selected-point (point)
- current-prefix-arg (- (match-end 0) (match-beginning 0)))
+ (setq org-goto-selected-point (point)
+ org-goto-exit-command 'left)
(throw 'exit nil))
(error "Not on a heading")))
@@ -4786,17 +5947,16 @@ or nil."
(interactive)
(if (org-on-heading-p)
(progn
- (outline-end-of-subtree)
- (or (eobp) (forward-char 1))
- (setq org-selected-point (point)
- current-prefix-arg (- (match-end 0) (match-beginning 0)))
+ (setq org-goto-selected-point (point)
+ org-goto-exit-command 'right)
(throw 'exit nil))
(error "Not on a heading")))
(defun org-goto-quit ()
"Finish `org-goto' without cursor motion."
(interactive)
- (setq org-selected-point nil)
+ (setq org-goto-selected-point nil)
+ (setq org-goto-exit-command 'quit)
(throw 'exit nil))
;;; Indirect buffer display of subtrees
@@ -4809,8 +5969,10 @@ or nil."
"Create indirect buffer and narrow it to current subtree.
With numerical prefix ARG, go up to this level and then take that tree.
If ARG is negative, go up that many levels.
-Normally this command removes the indirect buffer previously made
-with this command. However, when called with a C-u prefix, the last buffer
+If `org-indirect-buffer-display' is not `new-frame', the command removes the
+indirect buffer previously made with this command, to avoid proliferation of
+indirect buffers. However, when you call the command with a `C-u' prefix, or
+when `org-indirect-buffer-display' is `new-frame', the last buffer
is kept so that you can work with several indirect buffers at the same time.
If `org-indirect-buffer-display' is `dedicated-frame', the C-u prefix also
requests that a new frame be made for the new buffer, so that the dedicated
@@ -4830,8 +5992,9 @@ frame is not changed."
(setq beg (point)
heading (org-get-heading))
(org-end-of-subtree t) (setq end (point)))
- (if (and (not arg)
- (buffer-live-p org-last-indirect-buffer))
+ (if (and (buffer-live-p org-last-indirect-buffer)
+ (not (eq org-indirect-buffer-display 'new-frame))
+ (not arg))
(kill-buffer org-last-indirect-buffer))
(setq ibuf (org-get-indirect-buffer cbuf)
org-last-indirect-buffer ibuf)
@@ -4919,6 +6082,13 @@ the current headline."
(unless (= (point) pos) (just-one-space) (backward-delete-char 1))
(run-hooks 'org-insert-heading-hook)))))
+(defun org-insert-heading-after-current ()
+ "Insert a new heading with same level as current, after current subtree."
+ (interactive)
+ (org-back-to-heading)
+ (org-insert-heading)
+ (org-move-subtree-down)
+ (end-of-line 1))
(defun org-insert-todo-heading (arg)
"Insert a new heading with the same level and TODO state as current heading.
@@ -4937,6 +6107,24 @@ state (TODO by default). Also with prefix arg, force first state."
(insert (car org-todo-keywords-1) " ")
(insert (match-string 2) " "))))
+(defun org-insert-subheading (arg)
+ "Insert a new subheading and demote it.
+Works for outline headings and for plain lists alike."
+ (interactive "P")
+ (org-insert-heading arg)
+ (cond
+ ((org-on-heading-p) (org-do-demote))
+ ((org-at-item-p) (org-indent-item 1))))
+
+(defun org-insert-todo-subheading (arg)
+ "Insert a new subheading with TODO keyword or checkbox and demote it.
+Works for outline headings and for plain lists alike."
+ (interactive "P")
+ (org-insert-todo-heading arg)
+ (cond
+ ((org-on-heading-p) (org-do-demote))
+ ((org-at-item-p) (org-indent-item 1))))
+
;;; Promotion and Demotion
(defun org-promote-subtree ()
@@ -4989,6 +6177,9 @@ in the region."
((eolp) (insert " "))
((equal (char-after) ?\ ) (forward-char 1))))))
+(defun org-reduced-level (l)
+ (if org-odd-levels-only (1+ (floor (/ l 2))) l))
+
(defun org-get-legal-level (level &optional change)
"Rectify a level change under the influence of `org-odd-levels-only'
LEVEL is a current level, CHANGE is by how much the level should be
@@ -5006,8 +6197,8 @@ If the region is active in `transient-mark-mode', promote all headings
in the region."
(org-back-to-heading t)
(let* ((level (save-match-data (funcall outline-level)))
- (up-head (make-string (org-get-legal-level level -1) ?*))
- (diff (abs (- level (length up-head)))))
+ (up-head (concat (make-string (org-get-legal-level level -1) ?*) " "))
+ (diff (abs (- level (length up-head) -1))))
(if (= level 1) (error "Cannot promote to level 0. UNDO to recover if necessary"))
(replace-match up-head nil t)
;; Fixup tag positioning
@@ -5020,8 +6211,8 @@ If the region is active in `transient-mark-mode', demote all headings
in the region."
(org-back-to-heading t)
(let* ((level (save-match-data (funcall outline-level)))
- (down-head (make-string (org-get-legal-level level 1) ?*))
- (diff (abs (- level (length down-head)))))
+ (down-head (concat (make-string (org-get-legal-level level 1) ?*) " "))
+ (diff (abs (- level (length down-head) -1))))
(replace-match down-head nil t)
;; Fixup tag positioning
(and org-auto-align-tags (org-set-tags nil t))
@@ -5065,8 +6256,10 @@ would end up with no indentation after the change, nothing at all is done."
"^\\S-"
(concat "^ \\{0," (int-to-string (- diff)) "\\}\\S-")))
col)
- (unless (save-excursion (re-search-forward prohibit end t))
- (while (re-search-forward "^[ \t]+" end t)
+ (unless (save-excursion (end-of-line 1)
+ (re-search-forward prohibit end t))
+ (while (and (< (point) end)
+ (re-search-forward "^[ \t]+" end t))
(goto-char (match-end 0))
(setq col (current-column))
(if (< diff 0) (replace-match ""))
@@ -5082,8 +6275,8 @@ level 5 etc."
(let ((org-odd-levels-only nil) n)
(save-excursion
(goto-char (point-min))
- (while (re-search-forward "^\\*\\*+" nil t)
- (setq n (1- (length (match-string 0))))
+ (while (re-search-forward "^\\*\\*+ " nil t)
+ (setq n (- (length (match-string 0)) 2))
(while (>= (setq n (1- n)) 0)
(org-demote))
(end-of-line 1))))))
@@ -5097,15 +6290,15 @@ is signaled in this case."
(interactive)
(goto-char (point-min))
;; First check if there are no even levels
- (when (re-search-forward "^\\(\\*\\*\\)+[^*]" nil t)
+ (when (re-search-forward "^\\(\\*\\*\\)+ " nil t)
(org-show-context t)
(error "Not all levels are odd in this file. Conversion not possible."))
(when (yes-or-no-p "Are you sure you want to globally change levels to odd-even? ")
(let ((org-odd-levels-only nil) n)
(save-excursion
(goto-char (point-min))
- (while (re-search-forward "^\\*\\*+" nil t)
- (setq n (/ (length (match-string 0)) 2))
+ (while (re-search-forward "^\\*\\*+ " nil t)
+ (setq n (/ (1- (length (match-string 0))) 2))
(while (>= (setq n (1- n)) 0)
(org-promote))
(end-of-line 1))))))
@@ -5129,38 +6322,65 @@ is signaled in this case."
'outline-get-last-sibling))
(ins-point (make-marker))
(cnt (abs arg))
- beg end txt folded)
+ beg beg0 end txt folded ne-beg ne-end ne-ins ins-end)
;; Select the tree
(org-back-to-heading)
- (setq beg (point))
+ (setq beg0 (point))
+ (save-excursion
+ (setq ne-beg (org-back-over-empty-lines))
+ (setq beg (point)))
(save-match-data
(save-excursion (outline-end-of-heading)
(setq folded (org-invisible-p)))
(outline-end-of-subtree))
(outline-next-heading)
+ (setq ne-end (org-back-over-empty-lines))
(setq end (point))
+ (goto-char beg0)
+ (when (and (> arg 0) (org-first-sibling-p) (< ne-end ne-beg))
+ ;; include less whitespace
+ (save-excursion
+ (goto-char beg)
+ (forward-line (- ne-beg ne-end))
+ (setq beg (point))))
;; Find insertion point, with error handling
- (goto-char beg)
(while (> cnt 0)
(or (and (funcall movfunc) (looking-at outline-regexp))
- (progn (goto-char beg)
+ (progn (goto-char beg0)
(error "Cannot move past superior level or buffer limit")))
(setq cnt (1- cnt)))
(if (> arg 0)
;; Moving forward - still need to move over subtree
- (progn (outline-end-of-subtree)
- (outline-next-heading)
- (if (not (or (looking-at (concat "^" outline-regexp))
- (bolp)))
- (newline))))
+ (progn (org-end-of-subtree t t)
+ (save-excursion
+ (org-back-over-empty-lines)
+ (or (bolp) (newline)))))
+ (setq ne-ins (org-back-over-empty-lines))
(move-marker ins-point (point))
(setq txt (buffer-substring beg end))
(delete-region beg end)
+ (outline-flag-region (1- beg) beg nil)
+ (outline-flag-region (1- (point)) (point) nil)
(insert txt)
(or (bolp) (insert "\n"))
+ (setq ins-end (point))
(goto-char ins-point)
- (if folded (hide-subtree))
- (move-marker ins-point nil)))
+ (org-skip-whitespace)
+ (when (and (< arg 0)
+ (org-first-sibling-p)
+ (> ne-ins ne-beg))
+ ;; Move whitespace back to beginning
+ (save-excursion
+ (goto-char ins-end)
+ (let ((kill-whole-line t))
+ (kill-line (- ne-ins ne-beg)) (point)))
+ (insert (make-string (- ne-ins ne-beg) ?\n)))
+ (move-marker ins-point nil)
+ (org-compact-display-after-subtree-move)
+ (unless folded
+ (org-show-entry)
+ (show-children)
+ (org-cycle-hide-drawers 'children))))
(defvar org-subtree-clip ""
"Clipboard for cut and paste of subtrees.
@@ -5171,34 +6391,41 @@ ring. We need it to check if the kill was created by `org-copy-subtree'.")
"Was the last copied subtree folded?
This is used to fold the tree back after pasting.")
-(defun org-cut-subtree ()
+(defun org-cut-subtree (&optional n)
"Cut the current subtree into the clipboard.
+With prefix arg N, cut this many sequential subtrees.
This is a short-hand for marking the subtree and then cutting it."
- (interactive)
- (org-copy-subtree 'cut))
+ (interactive "p")
+ (org-copy-subtree n 'cut))
-(defun org-copy-subtree (&optional cut)
+(defun org-copy-subtree (&optional n cut)
"Cut the current subtree into the clipboard.
+With prefix arg N, cut this many sequential subtrees.
This is a short-hand for marking the subtree and then copying it.
If CUT is non-nil, actually cut the subtree."
- (interactive)
- (let (beg end folded)
+ (interactive "p")
+ (let (beg end folded (beg0 (point)))
(if (interactive-p)
(org-back-to-heading nil) ; take what looks like a subtree
(org-back-to-heading t)) ; take what is really there
+ (org-back-over-empty-lines)
(setq beg (point))
+ (skip-chars-forward " \t\r\n")
(save-match-data
(save-excursion (outline-end-of-heading)
(setq folded (org-invisible-p)))
- (outline-end-of-subtree))
- (if (equal (char-after) ?\n) (forward-char 1))
+ (condition-case nil
+ (outline-forward-same-level (1- n))
+ (error nil))
+ (org-end-of-subtree t t))
+ (org-back-over-empty-lines)
(setq end (point))
- (goto-char beg)
+ (goto-char beg0)
(when (> end beg)
(setq org-subtree-clip-folded folded)
(if cut (kill-region beg end) (copy-region-as-kill beg end))
(setq org-subtree-clip (current-kill 0))
- (message "%s: Subtree with %d characters"
+ (message "%s: Subtree(s) with %d characters"
(if cut "Cut" "Copied")
(length org-subtree-clip)))))
@@ -5221,36 +6448,37 @@ If you want to insert the tree as is, just use \\[yank].
If optional TREE is given, use this text instead of the kill ring."
(interactive "P")
(unless (org-kill-is-subtree-p tree)
- (error
+ (error "%s"
(substitute-command-keys
"The kill is not a (set of) tree(s) - please use \\[yank] to yank anyway")))
(let* ((txt (or tree (and kill-ring (current-kill 0))))
(^re (concat "^\\(" outline-regexp "\\)"))
(re (concat "\\(" outline-regexp "\\)"))
- (^re_ (concat "\\(" outline-regexp "\\)[ \t]*"))
+ (^re_ (concat "\\(\\*+\\)[ \t]*"))
(old-level (if (string-match ^re txt)
- (- (match-end 0) (match-beginning 0))
+ (- (match-end 0) (match-beginning 0) 1)
-1))
(force-level (cond (level (prefix-numeric-value level))
((string-match
^re_ (buffer-substring (point-at-bol) (point)))
- (- (match-end 0) (match-beginning 0)))
+ (- (match-end 1) (match-beginning 1)))
(t nil)))
(previous-level (save-excursion
(condition-case nil
(progn
(outline-previous-visible-heading 1)
(if (looking-at re)
- (- (match-end 0) (match-beginning 0))
+ (- (match-end 0) (match-beginning 0) 1)
1))
(error 1))))
(next-level (save-excursion
(condition-case nil
(progn
- (outline-next-visible-heading 1)
+ (or (looking-at outline-regexp)
+ (outline-next-visible-heading 1))
(if (looking-at re)
- (- (match-end 0) (match-beginning 0))
+ (- (match-end 0) (match-beginning 0) 1)
1))
(error 1))))
(new-level (or force-level (max previous-level next-level)))
@@ -5259,38 +6487,33 @@ If optional TREE is given, use this text instead of the kill ring."
(= old-level new-level))
0
(- new-level old-level)))
- (shift1 shift)
(delta (if (> shift 0) -1 1))
(func (if (> shift 0) 'org-demote 'org-promote))
(org-odd-levels-only nil)
beg end)
- ;; Remove the forces level indicator
+ ;; Remove the forced level indicator
(if force-level
(delete-region (point-at-bol) (point)))
- ;; Make sure we start at the beginning of an empty line
- (if (not (bolp)) (insert "\n"))
- (if (not (looking-at "[ \t]*$"))
- (progn (insert "\n") (backward-char 1)))
;; Paste
+ (beginning-of-line 1)
+ (org-back-over-empty-lines) ;; FIXME: correct fix????
(setq beg (point))
- (if (string-match "[ \t\r\n]+\\'" txt)
- (setq txt (replace-match "\n" t t txt)))
- (insert txt)
+ (insert-before-markers txt) ;; FIXME: correct fix????
+ (unless (string-match "\n\\'" txt) (insert "\n"))
(setq end (point))
- (if (looking-at "[ \t\r\n]+")
- (replace-match "\n"))
(goto-char beg)
+ (skip-chars-forward " \t\n\r")
+ (setq beg (point))
;; Shift if necessary
- (if (= shift 0)
- (message "Pasted at level %d, without shift" new-level)
+ (unless (= shift 0)
(save-restriction
(narrow-to-region beg end)
(while (not (= shift 0))
(org-map-region func (point-min) (point-max))
(setq shift (+ delta shift)))
- (goto-char (point-min))
- (message "Pasted at level %d, with shift by %d levels"
- new-level shift1)))
+ (goto-char (point-min))))
+ (when (interactive-p)
+ (message "Clipboard pasted as level %d subtree" new-level))
(if (and kill-ring
(eq org-subtree-clip (current-kill 0))
org-subtree-clip-folded)
@@ -5306,16 +6529,19 @@ which is OK for `org-paste-subtree'.
If optional TXT is given, check this string instead of the current kill."
(let* ((kill (or txt (and kill-ring (current-kill 0)) ""))
(start-level (and kill
- (string-match (concat "\\`" outline-regexp) kill)
- (- (match-end 0) (match-beginning 0))))
- (re (concat "^" outline-regexp))
- (start 1))
+ (string-match (concat "\\`\\([ \t\n\r]*?\n\\)?\\("
+ org-outline-regexp "\\)")
+ kill)
+ (- (match-end 2) (match-beginning 2) 1)))
+ (re (concat "^" org-outline-regexp))
+ (start (1+ (match-beginning 2))))
(if (not start-level)
- nil ;; does not even start with a heading
+ (progn
+ nil) ;; does not even start with a heading
(catch 'exit
(while (setq start (string-match re kill (1+ start)))
- (if (< (- (match-end 0) (match-beginning 0)) start-level)
- (throw 'exit nil)))
+ (when (< (- (match-end 0) (match-beginning 0) 1) start-level)
+ (throw 'exit nil)))
t))))
(defun org-narrow-to-subtree ()
@@ -5330,13 +6556,16 @@ If optional TXT is given, check this string instead of the current kill."
;;; Outline Sorting
(defun org-sort (with-case)
- "Call `org-sort-entries' or `org-table-sort-lines', depending on context."
+ "Call `org-sort-entries-or-items' or `org-table-sort-lines'.
+Optional argument WITH-CASE means sort case-sensitively."
(interactive "P")
(if (org-at-table-p)
(org-call-with-arg 'org-table-sort-lines with-case)
- (org-call-with-arg 'org-sort-entries with-case)))
+ (org-call-with-arg 'org-sort-entries-or-items with-case)))
-(defun org-sort-entries (&optional with-case sorting-type)
+(defvar org-priority-regexp) ; defined later in the file
+
+(defun org-sort-entries-or-items (&optional with-case sorting-type getkey-func property)
"Sort entries on a certain level of an outline tree.
If there is an active region, the entries in the region are sorted.
Else, if the cursor is before the first entry, sort the top-level items.
@@ -5345,29 +6574,42 @@ Else, the children of the entry at point are sorted.
Sorting can be alphabetically, numerically, and by date/time as given by
the first time stamp in the entry. The command prompts for the sorting
type unless it has been given to the function through the SORTING-TYPE
-argument, which needs to a character, any of (?n ?N ?a ?A ?t ?T).
+argument, which needs to a character, any of (?n ?N ?a ?A ?t ?T ?p ?P ?f ?F).
+If the SORTING-TYPE is ?f or ?F, then GETKEY-FUNC specifies a function to be
+called with point at the beginning of the record. It must return either
+a string or a number that should serve as the sorting key for that record.
Comparing entries ignores case by default. However, with an optional argument
-WITH-CASE, the sorting considers case as well. With two prefix arguments
-`C-u C-u', sorting is case-sensitive and duplicate entries will be removed."
+WITH-CASE, the sorting considers case as well."
(interactive "P")
- (let ((unique (equal with-case '(16)))
- start beg end entries stars re re2 p nentries (nremoved 0)
- last txt what)
+ (let ((case-func (if with-case 'identity 'downcase))
+ start beg end stars re re2
+ txt what tmp plain-list-p)
;; Find beginning and end of region to sort
(cond
((org-region-active-p)
;; we will sort the region
(setq end (region-end)
- what "region")
+ what "region")
(goto-char (region-beginning))
(if (not (org-on-heading-p)) (outline-next-heading))
(setq start (point)))
+ ((org-at-item-p)
+ ;; we will sort this plain list
+ (org-beginning-of-item-list) (setq start (point))
+ (org-end-of-item-list) (setq end (point))
+ (goto-char start)
+ (setq plain-list-p t
+ what "plain list"))
((or (org-on-heading-p)
- (condition-case nil (progn (org-back-to-heading) t) (error nil)))
+ (condition-case nil (progn (org-back-to-heading) t) (error nil)))
;; we will sort the children of the current headline
(org-back-to-heading)
- (setq start (point) end (org-end-of-subtree) what "children")
+ (setq start (point)
+ end (progn (org-end-of-subtree t t)
+ (org-back-over-empty-lines)
+ (point))
+ what "children")
(goto-char start)
(show-subtree)
(outline-next-heading))
@@ -5378,44 +6620,129 @@ WITH-CASE, the sorting considers case as well. With two prefix arguments
(setq start (point) end (point-max) what "top-level")
(goto-char start)
(show-all)))
+
(setq beg (point))
- (if (>= (point) end) (error "Nothing to sort"))
- (looking-at "\\(\\*+\\)")
- (setq stars (match-string 1)
- re (concat "^" (regexp-quote stars) " +")
- re2 (concat "^" (regexp-quote (substring stars 0 -1)) "[^*]")
- txt (buffer-substring beg end))
- (if (not (equal (substring txt -1) "\n")) (setq txt (concat txt "\n")))
- (if (and (not (equal stars "*")) (string-match re2 txt))
- (error "Region to sort contains a level above the first entry"))
- ;; Make a list that can be sorted.
- ;; The car is the string for comparison, the cdr is the subtree
- (message "Sorting entries...")
- (setq entries
- (mapcar
- (lambda (x)
- (string-match "^.*\\(\n.*\\)?" x) ; take two lines
- (cons (match-string 0 x) x))
- (org-split-string txt re)))
+ (if (>= beg end) (error "Nothing to sort"))
+
+ (unless plain-list-p
+ (looking-at "\\(\\*+\\)")
+ (setq stars (match-string 1)
+ re (concat "^" (regexp-quote stars) " +")
+ re2 (concat "^" (regexp-quote (substring stars 0 -1)) "[^*]")
+ txt (buffer-substring beg end))
+ (if (not (equal (substring txt -1) "\n")) (setq txt (concat txt "\n")))
+ (if (and (not (equal stars "*")) (string-match re2 txt))
+ (error "Region to sort contains a level above the first entry")))
+
+ (unless sorting-type
+ (message
+ (if plain-list-p
+ "Sort %s: [a]lpha [n]umeric [t]ime [f]unc A/N/T/F means reversed:"
+ "Sort %s: [a]lpha [n]umeric [t]ime [p]riority p[r]operty [f]unc A/N/T/P/F means reversed:")
+ what)
+ (setq sorting-type (read-char-exclusive))
+
+ (and (= (downcase sorting-type) ?f)
+ (setq getkey-func
+ (completing-read "Sort using function: "
+ obarray 'fboundp t nil nil))
+ (setq getkey-func (intern getkey-func)))
+
+ (and (= (downcase sorting-type) ?r)
+ (setq property
+ (completing-read "Property: "
+ (mapcar 'list (org-buffer-property-keys t))
+ nil t))))
- ;; Sort the list
- (save-excursion
- (goto-char start)
- (setq entries (org-do-sort entries what with-case sorting-type)))
+ (message "Sorting entries...")
- ;; Delete the old stuff
- (goto-char beg)
- (kill-region beg end)
- (setq nentries (length entries))
- ;; Insert the sorted entries, and remove duplicates if this is required
- (while (setq p (pop entries))
- (if (and unique (equal last (setq last (org-trim (cdr p)))))
- (setq nremoved (1+ nremoved)) ; same entry as before, skip it
- (insert stars " " (cdr p))))
- (goto-char start)
- (message "Sorting entries...done (%d entries%s)"
- nentries
- (if unique (format ", %d duplicates removed" nremoved) ""))))
+ (save-restriction
+ (narrow-to-region start end)
+
+ (let ((dcst (downcase sorting-type))
+ (now (current-time)))
+ (sort-subr
+ (/= dcst sorting-type)
+ ;; This function moves to the beginning character of the "record" to
+ ;; be sorted.
+ (if plain-list-p
+ (lambda nil
+ (if (org-at-item-p) t (goto-char (point-max))))
+ (lambda nil
+ (if (re-search-forward re nil t)
+ (goto-char (match-beginning 0))
+ (goto-char (point-max)))))
+ ;; This function moves to the last character of the "record" being
+ ;; sorted.
+ (if plain-list-p
+ 'org-end-of-item
+ (lambda nil
+ (save-match-data
+ (condition-case nil
+ (outline-forward-same-level 1)
+ (error
+ (goto-char (point-max)))))))
+
+ ;; This function returns the value that gets sorted against.
+ (if plain-list-p
+ (lambda nil
+ (when (looking-at "[ \t]*[-+*0-9.)]+[ \t]+")
+ (cond
+ ((= dcst ?n)
+ (string-to-number (buffer-substring (match-end 0)
+ (point-at-eol))))
+ ((= dcst ?a)
+ (buffer-substring (match-end 0) (point-at-eol)))
+ ((= dcst ?t)
+ (if (re-search-forward org-ts-regexp
+ (point-at-eol) t)
+ (org-time-string-to-time (match-string 0))
+ now))
+ ((= dcst ?f)
+ (if getkey-func
+ (progn
+ (setq tmp (funcall getkey-func))
+ (if (stringp tmp) (setq tmp (funcall case-func tmp)))
+ tmp)
+ (error "Invalid key function `%s'" getkey-func)))
+ (t (error "Invalid sorting type `%c'" sorting-type)))))
+ (lambda nil
+ (cond
+ ((= dcst ?n)
+ (if (looking-at outline-regexp)
+ (string-to-number (buffer-substring (match-end 0)
+ (point-at-eol)))
+ nil))
+ ((= dcst ?a)
+ (funcall case-func (buffer-substring (point-at-bol)
+ (point-at-eol))))
+ ((= dcst ?t)
+ (if (re-search-forward org-ts-regexp
+ (save-excursion
+ (forward-line 2)
+ (point)) t)
+ (org-time-string-to-time (match-string 0))
+ now))
+ ((= dcst ?p)
+ (if (re-search-forward org-priority-regexp (point-at-eol) t)
+ (string-to-char (match-string 2))
+ org-default-priority))
+ ((= dcst ?r)
+ (or (org-entry-get nil property) ""))
+ ((= dcst ?f)
+ (if getkey-func
+ (progn
+ (setq tmp (funcall getkey-func))
+ (if (stringp tmp) (setq tmp (funcall case-func tmp)))
+ tmp)
+ (error "Invalid key function `%s'" getkey-func)))
+ (t (error "Invalid sorting type `%c'" sorting-type)))))
+ nil
+ (cond
+ ((= dcst ?a) 'string<)
+ ((= dcst ?t) 'time-less-p)
+ (t nil)))))
+ (message "Sorting entries...done")))
(defun org-do-sort (table what &optional with-case sorting-type)
"Sort TABLE of WHAT according to SORTING-TYPE.
@@ -5426,7 +6753,7 @@ the car of the elements of the table.
If WITH-CASE is non-nil, the sorting will be case-sensitive."
(unless sorting-type
(message
- "Sort %s: [a]lphabetically [n]umerically [t]ime. A/N/T means reversed:"
+ "Sort %s: [a]lphabetic. [n]umeric. [t]ime. A/N/T means reversed:"
what)
(setq sorting-type (read-char-exclusive)))
(let ((dcst (downcase sorting-type))
@@ -5437,7 +6764,8 @@ If WITH-CASE is non-nil, the sorting will be case-sensitive."
(setq extractfun 'string-to-number
comparefun (if (= dcst sorting-type) '< '>)))
((= dcst ?a)
- (setq extractfun (if with-case 'identity 'downcase)
+ (setq extractfun (if with-case (lambda(x) (org-sort-remove-invisible x))
+ (lambda(x) (downcase (org-sort-remove-invisible x))))
comparefun (if (= dcst sorting-type)
'string<
(lambda (a b) (and (not (string< a b))
@@ -5472,7 +6800,6 @@ If WITH-CASE is non-nil, the sorting will be case-sensitive."
((= llt ?\)) "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)")
(t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))))))
-
(defun org-in-item-p ()
"It the cursor inside a plain list item.
Does not have to be the first line."
@@ -5525,7 +6852,7 @@ Return t when things worked, nil when we are not in an item."
(save-excursion
(goto-char (match-end 0))
(skip-chars-forward " \t")
- (looking-at "\\[[ X]\\]"))))
+ (looking-at "\\[[- X]\\]"))))
(defun org-toggle-checkbox (&optional arg)
"Toggle the checkbox in the current line."
@@ -5538,8 +6865,13 @@ Return t when things worked, nil when we are not in an item."
((org-on-heading-p)
(setq beg (point) end (save-excursion (outline-next-heading) (point))))
((org-at-item-checkbox-p)
- (save-excursion
- (replace-match (if (equal (match-string 0) "[ ]") "[X]" "[ ]") t t))
+ (let ((pos (point)))
+ (replace-match
+ (cond (arg "[-]")
+ ((member (match-string 0) '("[ ]" "[-]")) "[X]")
+ (t "[ ]"))
+ t t)
+ (goto-char pos))
(throw 'exit t))
(t (error "Not at a checkbox or heading, and no active region")))
(save-excursion
@@ -5567,11 +6899,13 @@ the whole buffer."
(interactive "P")
(save-excursion
(let* ((buffer-invisibility-spec (org-inhibit-invisibility)) ; Emacs 21
- (beg (progn (outline-back-to-heading) (point)))
+ (beg (condition-case nil
+ (progn (outline-back-to-heading) (point))
+ (error (point-min))))
(end (move-marker (make-marker)
(progn (outline-next-heading) (point))))
(re "\\(\\[[0-9]*%\\]\\)\\|\\(\\[[0-9]*/[0-9]*\\]\\)")
- (re-box "^[ \t]*\\([-+*]\\|[0-9]+[.)]\\) +\\(\\[[ X]\\]\\)")
+ (re-box "^[ \t]*\\([-+*]\\|[0-9]+[.)]\\) +\\(\\[[- X]\\]\\)")
b1 e1 f1 c-on c-off lim (cstat 0))
(when all
(goto-char (point-min))
@@ -5591,14 +6925,16 @@ the whole buffer."
(goto-char e1)
(when lim
(while (re-search-forward re-box lim t)
- (if (equal (match-string 2) "[ ]")
+ (if (member (match-string 2) '("[ ]" "[-]"))
(setq c-off (1+ c-off))
(setq c-on (1+ c-on))))
- (delete-region b1 e1)
+; (delete-region b1 e1)
(goto-char b1)
(insert (if f1
(format "[%d%%]" (/ (* 100 c-on) (max 1 (+ c-on c-off))))
- (format "[%d/%d]" c-on (+ c-on c-off))))))
+ (format "[%d/%d]" c-on (+ c-on c-off))))
+ (and (looking-at "\\[.*?\\]")
+ (replace-match ""))))
(when (interactive-p)
(message "Checkbox satistics updated %s (%d places)"
(if all "in entire file" "in current outline entry") cstat)))))
@@ -5754,27 +7090,49 @@ Error if not at a plain list, or if this is the first item in the list."
(error (goto-char pos)
(error "On first item")))))
+(defun org-first-list-item-p ()
+ "Is this heading the item in a plain list?"
+ (unless (org-at-item-p)
+ (error "Not at a plain list item"))
+ (org-beginning-of-item)
+ (= (point) (save-excursion (org-beginning-of-item-list))))
+
(defun org-move-item-down ()
"Move the plain list item at point down, i.e. swap with following item.
Subitems (items with larger indentation) are considered part of the item,
so this really moves item trees."
(interactive)
- (let (beg end ind ind1 (pos (point)) txt)
+ (let (beg beg0 end end0 ind ind1 (pos (point)) txt ne-end ne-beg)
(org-beginning-of-item)
- (setq beg (point))
+ (setq beg0 (point))
+ (save-excursion
+ (setq ne-beg (org-back-over-empty-lines))
+ (setq beg (point)))
+ (goto-char beg0)
(setq ind (org-get-indentation))
(org-end-of-item)
- (setq end (point))
+ (setq end0 (point))
(setq ind1 (org-get-indentation))
+ (setq ne-end (org-back-over-empty-lines))
+ (setq end (point))
+ (goto-char beg0)
+ (when (and (org-first-list-item-p) (< ne-end ne-beg))
+ ;; include less whitespace
+ (save-excursion
+ (goto-char beg)
+ (forward-line (- ne-beg ne-end))
+ (setq beg (point))))
+ (goto-char end0)
(if (and (org-at-item-p) (= ind ind1))
(progn
(org-end-of-item)
+ (org-back-over-empty-lines)
(setq txt (buffer-substring beg end))
(save-excursion
(delete-region beg end))
(setq pos (point))
(insert txt)
- (goto-char pos)
+ (goto-char pos) (org-skip-whitespace)
(org-maybe-renumber-ordered-list))
(goto-char pos)
(error "Cannot move this item further down"))))
@@ -5784,13 +7142,19 @@ so this really moves item trees."
Subitems (items with larger indentation) are considered part of the item,
so this really moves item trees."
(interactive "p")
- (let (beg end ind ind1 (pos (point)) txt)
+ (let (beg beg0 end end0 ind ind1 (pos (point)) txt
+ ne-beg ne-end ne-ins ins-end)
(org-beginning-of-item)
- (setq beg (point))
+ (setq beg0 (point))
(setq ind (org-get-indentation))
+ (save-excursion
+ (setq ne-beg (org-back-over-empty-lines))
+ (setq beg (point)))
+ (goto-char beg0)
(org-end-of-item)
+ (setq ne-end (org-back-over-empty-lines))
(setq end (point))
- (goto-char beg)
+ (goto-char beg0)
(catch 'exit
(while t
(beginning-of-line 0)
@@ -5809,12 +7173,23 @@ so this really moves item trees."
(setq ind1 (org-get-indentation))
(if (and (org-at-item-p) (= ind ind1))
(progn
+ (setq ne-ins (org-back-over-empty-lines))
(setq txt (buffer-substring beg end))
(save-excursion
(delete-region beg end))
(setq pos (point))
(insert txt)
- (goto-char pos)
+ (setq ins-end (point))
+ (goto-char pos) (org-skip-whitespace)
+
+ (when (and (org-first-list-item-p) (> ne-ins ne-beg))
+ ;; Move whitespace back to beginning
+ (save-excursion
+ (goto-char ins-end)
+ (let ((kill-whole-line t))
+ (kill-line (- ne-ins ne-beg)) (point)))
+ (insert (make-string (- ne-ins ne-beg) ?\n)))
+
(org-maybe-renumber-ordered-list))
(goto-char pos)
(error "Cannot move this item further up"))))
@@ -5828,7 +7203,7 @@ doing the renumbering."
(org-at-item-p))
(if (match-beginning 3)
(org-renumber-ordered-list 1)
- (org-fix-bullet-type 1))))
+ (org-fix-bullet-type))))
(defun org-maybe-renumber-ordered-list-safe ()
(condition-case nil
@@ -5836,6 +7211,36 @@ doing the renumbering."
(org-maybe-renumber-ordered-list))
(error nil)))
+(defun org-cycle-list-bullet (&optional which)
+ "Cycle through the different itemize/enumerate bullets.
+This cycle the entire list level through the sequence:
+
+ `-' -> `+' -> `*' -> `1.' -> `1)'
+
+If WHICH is a string, use that as the new bullet. If WHICH is an integer,
+0 meand `-', 1 means `+' etc."
+ (interactive "P")
+ (org-preserve-lc
+ (org-beginning-of-item-list)
+ (org-at-item-p)
+ (beginning-of-line 1)
+ (let ((current (match-string 0))
+ (prevp (eq which 'previous))
+ new)
+ (setq new (cond
+ ((and (numberp which)
+ (nth (1- which) '("-" "+" "*" "1." "1)"))))
+ ((string-match "-" current) (if prevp "1)" "+"))
+ ((string-match "\\+" current)
+ (if prevp "-" (if (looking-at "\\S-") "1." "*")))
+ ((string-match "\\*" current) (if prevp "+" "1."))
+ ((string-match "\\." current) (if prevp "*" "1)"))
+ ((string-match ")" current) (if prevp "1." "-"))
+ (t (error "This should not happen"))))
+ (and (looking-at "\\([ \t]*\\)\\S-+") (replace-match (concat "\\1" new)))
+ (org-fix-bullet-type)
+ (org-maybe-renumber-ordered-list))))
+
(defun org-get-string-indentation (s)
"What indentation has S due to SPACE and TAB at the beginning of the string?"
(let ((n -1) (i 0) (w tab-width) c)
@@ -5884,17 +7289,14 @@ with something like \"1.\" or \"2)\"."
(goto-line line)
(move-to-column col)))
-(defun org-fix-bullet-type (arg)
- "Renumber an ordered plain list.
-Cursor needs to be in the first line of an item, the line that starts
-with something like \"1.\" or \"2)\"."
- (interactive "p")
+(defun org-fix-bullet-type ()
+ "Make sure all items in this list have the same bullet as the firsst item."
+ (interactive)
(unless (org-at-item-p) (error "This is not a list"))
(let ((line (org-current-line))
(col (current-column))
(ind (current-indentation))
- ind1 (n (1- arg))
- bullet)
+ ind1 bullet)
;; find where this list begins
(org-beginning-of-item-list)
(beginning-of-line 1)
@@ -5934,15 +7336,44 @@ I.e. to the first item in this list."
(while t
(catch 'next
(beginning-of-line 0)
- (if (looking-at "[ \t]*$") (throw 'next t))
+ (if (looking-at "[ \t]*$")
+ (throw (if (bobp) 'exit 'next) t))
(skip-chars-forward " \t") (setq ind1 (current-column))
(if (or (< ind1 ind)
(and (= ind1 ind)
- (not (org-at-item-p))))
+ (not (org-at-item-p)))
+ (bobp))
(throw 'exit t)
- (setq pos (point-at-bol))))))
+ (when (org-at-item-p) (setq pos (point-at-bol)))))))
(goto-char pos)))
+
+(defun org-end-of-item-list ()
+ "Go to the end of the current item list.
+I.e. to the text after the last item."
+ (interactive)
+ (org-beginning-of-item)
+ (let ((pos (point-at-bol))
+ (ind (org-get-indentation))
+ ind1)
+ ;; find where this list begins
+ (catch 'exit
+ (while t
+ (catch 'next
+ (beginning-of-line 2)
+ (if (looking-at "[ \t]*$")
+ (throw (if (eobp) 'exit 'next) t))
+ (skip-chars-forward " \t") (setq ind1 (current-column))
+ (if (or (< ind1 ind)
+ (and (= ind1 ind)
+ (not (org-at-item-p)))
+ (eobp))
+ (progn
+ (setq pos (point-at-bol))
+ (throw 'exit t))))))
+ (goto-char pos)))
+
+
(defvar org-last-indent-begin-marker (make-marker))
(defvar org-last-indent-end-marker (make-marker))
@@ -5971,8 +7402,8 @@ I.e. to the first item in this list."
ind-down (nth 2 tmp)
ind-up (nth 1 tmp)
delta (if (> arg 0)
- (if ind-down (- ind-down ind) (+ 2 ind))
- (if ind-up (- ind-up ind) (- ind 2))))
+ (if ind-down (- ind-down ind) 2)
+ (if ind-up (- ind-up ind) -2)))
(if (< (+ delta ind) 0) (error "Cannot outdent beyond margin"))
(while (< (point) end)
(beginning-of-line 1)
@@ -5980,15 +7411,18 @@ I.e. to the first item in this list."
(delete-region (point-at-bol) (point))
(or (eolp) (indent-to-column (+ ind1 delta)))
(beginning-of-line 2))))
+ (org-fix-bullet-type)
(org-maybe-renumber-ordered-list-safe)
(save-excursion
(beginning-of-line 0)
(condition-case nil (org-beginning-of-item) (error nil))
(org-maybe-renumber-ordered-list-safe)))
-
(defun org-item-indent-positions ()
- "Assumes cursor in item line. FIXME"
+ "Return indentation for plain list items.
+This returns a list with three values: The current indentation, the
+parent indentation and the indentation a child should habe.
+Assumes cursor in item line."
(let* ((bolpos (point-at-bol))
(ind (org-get-indentation))
ind-down ind-up pos)
@@ -6013,6 +7447,203 @@ I.e. to the first item in this list."
(setq ind-down (current-column)))))
(list ind ind-up ind-down)))
+;;; The orgstruct minor mode
+
+;; Define a minor mode which can be used in other modes in order to
+;; integrate the org-mode structure editing commands.
+
+;; This is really a hack, because the org-mode structure commands use
+;; keys which normally belong to the major mode. Here is how it
+;; works: The minor mode defines all the keys necessary to operate the
+;; structure commands, but wraps the commands into a function which
+;; tests if the cursor is currently at a headline or a plain list
+;; item. If that is the case, the structure command is used,
+;; temporarily setting many Org-mode variables like regular
+;; expressions for filling etc. However, when any of those keys is
+;; used at a different location, function uses `key-binding' to look
+;; up if the key has an associated command in another currently active
+;; keymap (minor modes, major mode, global), and executes that
+;; command. There might be problems if any of the keys is otherwise
+;; used as a prefix key.
+
+;; Another challenge is that the key binding for TAB can be tab or \C-i,
+;; likewise the binding for RET can be return or \C-m. Orgtbl-mode
+;; addresses this by checking explicitly for both bindings.
+
+(defvar orgstruct-mode-map (make-sparse-keymap)
+ "Keymap for the minor `orgstruct-mode'.")
+
+(defvar org-local-vars nil
+ "List of local variables, for use by `orgstruct-mode'")
+
+;;;###autoload
+(define-minor-mode orgstruct-mode
+ "Toggle the minor more `orgstruct-mode'.
+This mode is for using Org-mode structure commands in other modes.
+The following key behave as if Org-mode was active, if the cursor
+is on a headline, or on a plain list item (both in the definition
+of Org-mode).
+
+M-up Move entry/item up
+M-down Move entry/item down
+M-left Promote
+M-right Demote
+M-S-up Move entry/item up
+M-S-down Move entry/item down
+M-S-left Promote subtree
+M-S-right Demote subtree
+M-q Fill paragraph and items like in Org-mode
+C-c ^ Sort entries
+C-c - Cycle list bullet
+TAB Cycle item visibility
+M-RET Insert new heading/item
+S-M-RET Insert new TODO heading / Chekbox item
+C-c C-c Set tags / toggle checkbox"
+ nil " OrgStruct" nil
+ (and (orgstruct-setup) (defun orgstruct-setup () nil)))
+
+;;;###autoload
+(defun turn-on-orgstruct ()
+ "Unconditionally turn on `orgstruct-mode'."
+ (orgstruct-mode 1))
+
+;;;###autoload
+(defun turn-on-orgstruct++ ()
+ "Unconditionally turn on `orgstruct-mode', and force org-mode indentations.
+In addition to setting orgstruct-mode, this also exports all indentation and
+autofilling variables from org-mode into the buffer. Note that turning
+off orgstruct-mode will *not* remove these additonal settings."
+ (orgstruct-mode 1)
+ (let (var val)
+ (mapc
+ (lambda (x)
+ (when (string-match
+ "^\\(paragraph-\\|auto-fill\\|fill-paragraph\\|adaptive-fill\\|indent-\\)"
+ (symbol-name (car x)))
+ (setq var (car x) val (nth 1 x))
+ (org-set-local var (if (eq (car-safe val) 'quote) (nth 1 val) val))))
+ org-local-vars)))
+
+(defun orgstruct-error ()
+ "Error when there is no default binding for a structure key."
+ (interactive)
+ (error "This key has no function outside structure elements"))
+
+(defun orgstruct-setup ()
+ "Setup orgstruct keymaps."
+ (let ((nfunc 0)
+ (bindings
+ (list
+ '([(meta up)] org-metaup)
+ '([(meta down)] org-metadown)
+ '([(meta left)] org-metaleft)
+ '([(meta right)] org-metaright)
+ '([(meta shift up)] org-shiftmetaup)
+ '([(meta shift down)] org-shiftmetadown)
+ '([(meta shift left)] org-shiftmetaleft)
+ '([(meta shift right)] org-shiftmetaright)
+ '([(shift up)] org-shiftup)
+ '([(shift down)] org-shiftdown)
+ '("\C-c\C-c" org-ctrl-c-ctrl-c)
+ '("\M-q" fill-paragraph)
+ '("\C-c^" org-sort)
+ '("\C-c-" org-cycle-list-bullet)))
+ elt key fun cmd)
+ (while (setq elt (pop bindings))
+ (setq nfunc (1+ nfunc))
+ (setq key (org-key (car elt))
+ fun (nth 1 elt)
+ cmd (orgstruct-make-binding fun nfunc key))
+ (org-defkey orgstruct-mode-map key cmd))
+
+ ;; Special treatment needed for TAB and RET
+ (org-defkey orgstruct-mode-map [(tab)]
+ (orgstruct-make-binding 'org-cycle 102 [(tab)] "\C-i"))
+ (org-defkey orgstruct-mode-map "\C-i"
+ (orgstruct-make-binding 'org-cycle 103 "\C-i" [(tab)]))
+
+ (org-defkey orgstruct-mode-map "\M-\C-m"
+ (orgstruct-make-binding 'org-insert-heading 105
+ "\M-\C-m" [(meta return)]))
+ (org-defkey orgstruct-mode-map [(meta return)]
+ (orgstruct-make-binding 'org-insert-heading 106
+ [(meta return)] "\M-\C-m"))
+
+ (org-defkey orgstruct-mode-map [(shift meta return)]
+ (orgstruct-make-binding 'org-insert-todo-heading 107
+ [(meta return)] "\M-\C-m"))
+
+ (unless org-local-vars
+ (setq org-local-vars (org-get-local-variables)))
+
+ t))
+
+(defun orgstruct-make-binding (fun n &rest keys)
+ "Create a function for binding in the structure minor mode.
+FUN is the command to call inside a table. N is used to create a unique
+command name. KEYS are keys that should be checked in for a command
+to execute outside of tables."
+ (eval
+ (list 'defun
+ (intern (concat "orgstruct-hijacker-command-" (int-to-string n)))
+ '(arg)
+ (concat "In Structure, run `" (symbol-name fun) "'.\n"
+ "Outside of structure, run the binding of `"
+ (mapconcat (lambda (x) (format "%s" x)) keys "' or `")
+ "'.")
+ '(interactive "p")
+ (list 'if
+ '(org-context-p 'headline 'item)
+ (list 'org-run-like-in-org-mode (list 'quote fun))
+ (list 'let '(orgstruct-mode)
+ (list 'call-interactively
+ (append '(or)
+ (mapcar (lambda (k)
+ (list 'key-binding k))
+ keys)
+ '('orgstruct-error))))))))
+
+(defun org-context-p (&rest contexts)
+ "Check if local context is and of CONTEXTS.
+Possible values in the list of contexts are `table', `headline', and `item'."
+ (let ((pos (point)))
+ (goto-char (point-at-bol))
+ (prog1 (or (and (memq 'table contexts)
+ (looking-at "[ \t]*|"))
+ (and (memq 'headline contexts)
+ (looking-at "\\*+"))
+ (and (memq 'item contexts)
+ (looking-at "[ \t]*\\([-+*] \\|[0-9]+[.)] \\)")))
+ (goto-char pos))))
+
+(defun org-get-local-variables ()
+ "Return a list of all local variables in an org-mode buffer."
+ (let (varlist)
+ (with-current-buffer (get-buffer-create "*Org tmp*")
+ (erase-buffer)
+ (org-mode)
+ (setq varlist (buffer-local-variables)))
+ (kill-buffer "*Org tmp*")
+ (delq nil
+ (mapcar
+ (lambda (x)
+ (setq x
+ (if (symbolp x)
+ (list x)
+ (list (car x) (list 'quote (cdr x)))))
+ (if (string-match
+ "^\\(org-\\|orgtbl-\\|outline-\\|comment-\\|paragraph-\\|auto-fill\\|fill-paragraph\\|adaptive-fill\\|indent-\\)"
+ (symbol-name (car x)))
+ x nil))
+ varlist))))
+
+;;;###autoload
+(defun org-run-like-in-org-mode (cmd)
+ (unless org-local-vars
+ (setq org-local-vars (org-get-local-variables)))
+ (eval (list 'let org-local-vars
+ (list 'call-interactively (list 'quote cmd)))))
+
;;;; Archiving
(defalias 'org-advertized-archive-subtree 'org-archive-subtree)
@@ -6043,32 +7674,56 @@ this heading."
(this-buffer (current-buffer))
(org-archive-location org-archive-location)
(re "^#\\+ARCHIVE:[ \t]+\\(\\S-.*\\S-\\)[ \t]*$")
- file heading buffer level newfile-p)
+ ;; 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)))
+ (time (format-time-string
+ (substring (cdr org-time-stamp-formats) 1 -1)
+ (current-time)))
+ afile heading buffer level newfile-p
+ category todo priority
+ ;; start of variables that will be used for savind context
+ ltags itags prop)
;; Try to find a local archive location
(save-excursion
(save-restriction
(widen)
- (if (or (re-search-backward re nil t) (re-search-forward re nil t))
- (setq org-archive-location (match-string 1)))))
+ (setq prop (org-entry-get nil "ARCHIVE" 'inherit))
+ (if (and prop (string-match "\\S-" prop))
+ (setq org-archive-location prop)
+ (if (or (re-search-backward re nil t)
+ (re-search-forward re nil t))
+ (setq org-archive-location (match-string 1))))))
(if (string-match "\\(.*\\)::\\(.*\\)" org-archive-location)
(progn
- (setq file (format (match-string 1 org-archive-location)
+ (setq afile (format (match-string 1 org-archive-location)
(file-name-nondirectory buffer-file-name))
heading (match-string 2 org-archive-location)))
(error "Invalid `org-archive-location'"))
- (if (> (length file) 0)
- (setq newfile-p (not (file-exists-p file))
- buffer (find-file-noselect file))
+ (if (> (length afile) 0)
+ (setq newfile-p (not (file-exists-p afile))
+ buffer (find-file-noselect afile))
(setq buffer (current-buffer)))
(unless buffer
- (error "Cannot access file \"%s\"" file))
+ (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
@@ -6099,8 +7754,8 @@ this heading."
(if heading
(progn
(if (re-search-forward
- (concat "\\(^\\|\r\\)"
- (regexp-quote heading) "[ \t]*\\(:[a-zA-Z0-9_@:]+:\\)?[ \t]*\\($\\|\r\\)")
+ (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
@@ -6118,16 +7773,26 @@ this heading."
(goto-char (point-max)) (insert "\n"))
;; Paste
(org-paste-subtree (org-get-legal-level level 1))
- ;; Mark the entry as done, i.e. set to last word in org-todo-keywords-1 FIXME: not right anymore!!!!!!!
- (if org-archive-mark-done
- (let (org-log-done)
- (org-todo (length org-todo-keywords-1))))
- ;; Move cursor to right after the TODO keyword
- (when org-archive-stamp-time
- (beginning-of-line 1)
- (looking-at org-todo-line-regexp)
- (goto-char (or (match-end 2) (match-beginning 3)))
- (org-insert-time-stamp (org-current-time) t t "(" ")"))
+
+ ;; 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
+ (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 the buffer, if it is not the same buffer.
(if (not (eq this-buffer buffer)) (save-buffer))))
;; Here we are back in the original buffer. Everything seems to have
@@ -6137,7 +7802,36 @@ this heading."
(message "Subtree archived %s"
(if (eq this-buffer buffer)
(concat "under heading: " heading)
- (concat "in file: " (abbreviate-file-name file)))))))
+ (concat "in file: " (abbreviate-file-name afile)))))))
+
+(defun org-refresh-category-properties ()
+ "Refresh category text properties in teh buffer."
+ (let ((def-cat (cond
+ ((null org-category)
+ (if buffer-file-name
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))
+ "???"))
+ ((symbolp org-category) (symbol-name org-category))
+ (t org-category)))
+ beg end cat pos optionp)
+ (org-unmodified
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (put-text-property (point) (point-max) 'org-category def-cat)
+ (while (re-search-forward
+ "^\\(#\\+CATEGORY:\\|[ \t]*:CATEGORY:\\)\\(.*\\)" nil t)
+ (setq pos (match-end 0)
+ optionp (equal (char-after (match-beginning 0)) ?#)
+ cat (org-trim (match-string 2)))
+ (if optionp
+ (setq beg (point-at-bol) end (point-max))
+ (org-back-to-heading t)
+ (setq beg (point) end (org-end-of-subtree t t)))
+ (put-text-property beg end 'org-category cat)
+ (goto-char pos)))))))
(defun org-archive-all-done (&optional tag)
"Archive sublevels of the current tree without open TODO items.
@@ -6182,6 +7876,29 @@ When TAG is non-nil, don't move trees, but mark them with the ARCHIVE tag."
(goto-char end)))))
(message "%d trees archived" cntarch)))
+(defun org-cycle-hide-drawers (state)
+ "Re-hide all drawers after a visibility state change."
+ (when (and (org-mode-p)
+ (not (memq state '(overview folded))))
+ (save-excursion
+ (let* ((globalp (memq state '(contents all)))
+ (beg (if globalp (point-min) (point)))
+ (end (if globalp (point-max) (org-end-of-subtree t))))
+ (goto-char beg)
+ (while (re-search-forward org-drawer-regexp end t)
+ (org-flag-drawer t))))))
+
+(defun org-flag-drawer (flag)
+ (save-excursion
+ (beginning-of-line 1)
+ (when (looking-at "^[ \t]*:[a-zA-Z][a-zA-Z0-9]*:")
+ (let ((b (match-end 0)))
+ (if (re-search-forward
+ "^[ \t]*:END:"
+ (save-excursion (outline-next-heading) (point)) t)
+ (outline-flag-region b (point-at-eol) flag)
+ (error ":END: line missing"))))))
+
(defun org-cycle-hide-archived-subtrees (state)
"Re-hide all archived subtrees after a visibility state change."
(when (and (not org-cycle-open-archived-trees)
@@ -6193,8 +7910,8 @@ When TAG is non-nil, don't move trees, but mark them with the ARCHIVE tag."
(org-hide-archived-subtrees beg end)
(goto-char beg)
(if (looking-at (concat ".*:" org-archive-tag ":"))
- (message (substitute-command-keys
- "Subtree is archived and stays closed. Use \\[org-force-cycle-archived] to cycle it anyway.")))))))
+ (message "%s" (substitute-command-keys
+ "Subtree is archived and stays closed. Use \\[org-force-cycle-archived] to cycle it anyway.")))))))
(defun org-force-cycle-archived ()
"Cycle subtree even if it is archived."
@@ -6219,7 +7936,7 @@ If ONOFF is `on' or `off', don't toggle but set to this state."
(let (res current)
(save-excursion
(beginning-of-line)
- (if (re-search-forward "[ \t]:\\([a-zA-Z0-9_@:]+\\):[ \t]*$"
+ (if (re-search-forward (org-re "[ \t]:\\([[:alnum:]_@:]+\\):[ \t]*$")
(point-at-eol) t)
(progn
(setq current (match-string 1))
@@ -6237,9 +7954,12 @@ If ONOFF is `on' or `off', don't toggle but set to this state."
(setq res t)
(push tag current))))
(end-of-line 1)
- (when current
- (insert " :" (mapconcat 'identity (nreverse current) ":") ":"))
- (org-set-tags nil t))
+ (if current
+ (progn
+ (insert " :" (mapconcat 'identity (nreverse current) ":") ":")
+ (org-set-tags nil t))
+ (delete-horizontal-space))
+ (run-hooks 'org-after-tags-change-hook))
res))
(defun org-toggle-archive-tag (&optional arg)
@@ -6354,7 +8074,9 @@ and table.el tables."
(defun org-table-create-or-convert-from-region (arg)
"Convert region to table, or create an empty table.
If there is an active region, convert it to a table, using the function
-`org-table-convert-region'.
+`org-table-convert-region'. See the documentation of that function
+to learn how the prefix argument is interpreted to determine the field
+separator.
If there is no such region, create an empty table with `org-table-create'."
(interactive "P")
(if (org-region-active-p)
@@ -6393,18 +8115,25 @@ SIZE is a string Columns x Rows like for example \"3x2\"."
(goto-char pos)))
(org-table-align)))
-(defun org-table-convert-region (beg0 end0 &optional nspace)
+(defun org-table-convert-region (beg0 end0 &optional separator)
"Convert region to a table.
The region goes from BEG0 to END0, but these borders will be moved
slightly, to make sure a beginning of line in the first line is included.
-When NSPACE is non-nil, it indicates the minimum number of spaces that
-separate columns. By default, the function first checks if every line
-contains at lease one TAB. If yes, it assumes that the material is TAB
-separated. If not, it assumes a single space as separator."
+
+SEPARATOR specifies the field separator in the lines. It can have the
+following values:
+
+'(4) Use the comma as a field separator
+'(16) Use a TAB as field separator
+integer When a number, use that many spaces as field separator
+nil When nil, the command tries to be smart and figure out the
+ separator in the following way:
+ - when each line contains a TAB, assume TAB-separated material
+ - when each line contains a comme, assume CSV material
+ - else, assume one or more SPACE charcters as separator."
(interactive "rP")
(let* ((beg (min beg0 end0))
(end (max beg0 end0))
- (tabsep t)
re)
(goto-char beg)
(beginning-of-line 1)
@@ -6412,17 +8141,20 @@ separated. If not, it assumes a single space as separator."
(goto-char end)
(if (bolp) (backward-char 1) (end-of-line 1))
(setq end (move-marker (make-marker) (point)))
- ;; Lets see if this is tab-separated material. If every nonempty line
- ;; contains a tab, we will assume that it is tab-separated material
- (if nspace
- (setq tabsep nil)
+ ;; Get the right field separator
+ (unless separator
(goto-char beg)
- (and (re-search-forward "^[^\n\t]+$" end t) (setq tabsep nil)))
- (if nspace (setq tabsep nil))
- (if tabsep
- (setq re "^\\|\t")
- (setq re (format "^ *\\| *\t *\\| \\{%d,\\}"
- (max 1 (prefix-numeric-value nspace)))))
+ (setq separator
+ (cond
+ ((not (re-search-forward "^[^\n\t]+$" end t)) '(16))
+ ((not (re-search-forward "^[^\n,]+$" end t)) '(4))
+ (t 1))))
+ (setq re (cond
+ ((equal separator '(4)) "^\\|\"?[ \t]*,[ \t]*\"?")
+ ((equal separator '(16)) "^\\|\t")
+ ((integerp separator)
+ (format "^ *\\| *\t *\\| \\{%d,\\}" separator))
+ (t (error "This should not happen"))))
(goto-char beg)
(while (re-search-forward re end t)
(replace-match "| " t t))
@@ -6521,19 +8253,23 @@ This is being used to correctly align a single field after TAB or RET.")
(make-string sp2 ?\ ) "%%%s%ds" (make-string sp1 ?\ ) "|"))
(hfmt1 (concat
(make-string sp2 ?-) "%s" (make-string sp1 ?-) "+"))
- emptystrings links dates narrow fmax f1 len c e)
+ emptystrings links dates emph narrow fmax f1 len c e)
(untabify beg end)
(remove-text-properties beg end '(org-cwidth t org-dwidth t display t))
;; Check if we have links or dates
(goto-char beg)
(setq links (re-search-forward org-bracket-link-regexp end t))
(goto-char beg)
+ (setq emph (and org-hide-emphasis-markers
+ (re-search-forward org-emph-re end t)))
+ (goto-char beg)
(setq dates (and org-display-custom-times
(re-search-forward org-ts-regexp-both end t)))
;; Make sure the link properties are right
(when links (goto-char beg) (while (org-activate-bracket-links end)))
;; Make sure the date properties are right
(when dates (goto-char beg) (while (org-activate-dates end)))
+ (when emph (goto-char beg) (while (org-do-emphasis-faces end)))
;; Check if we are narrowing any columns
(goto-char beg)
@@ -6614,13 +8350,14 @@ This is being used to correctly align a single field after TAB or RET.")
;; With invisible characters, `format' does not get the field width right
;; So we need to make these fields wide by hand.
- (when links
+ (when (or links emph)
(loop for i from 0 upto (1- maxfields) do
(setq len (nth i lengths))
(loop for j from 0 upto (1- (length fields)) do
(setq c (nthcdr i (car (nthcdr j fields))))
(if (and (stringp (car c))
- (string-match org-bracket-link-regexp (car c))
+ (text-property-any 0 (length (car c)) 'invisible 'org-link (car c))
+; (string-match org-bracket-link-regexp (car c))
(< (org-string-width (car c)) len))
(setcar c (concat (car c) (make-string (- len (org-string-width (car c))) ?\ )))))))
@@ -6740,7 +8477,7 @@ Optional argument NEW may specify text to replace the current field content."
(setq n (concat new "|") org-table-may-need-update t)))
(or (equal n o)
(let (org-table-may-need-update)
- (replace-match n))))
+ (replace-match n t t))))
(setq org-table-may-need-update t))
(goto-char pos))))))
@@ -6911,7 +8648,6 @@ is always the old value."
val)
(forward-char 1) ""))
-
(defun org-table-field-info (arg)
"Show info about the current field, and highlight any reference at point."
(interactive "P")
@@ -7280,7 +9016,6 @@ In particular, this does handle wide and invisible characters."
(org-table-fix-formulas "@" (list (cons (number-to-string dline) "INVALID"))
dline -1 dline)))
-
(defun org-table-sort-lines (with-case &optional sorting-type)
"Sort table lines according to the column at point.
@@ -7332,7 +9067,7 @@ should be done in reverse order."
(setq beg (point-at-bol 1)))
(goto-char pos)
(if (re-search-forward org-table-hline-regexp tend t)
- (setq end (point-at-bol 0))
+ (setq end (point-at-bol 1))
(goto-char tend)
(setq end (point-at-bol))))
(setq beg (move-marker (make-marker) beg)
@@ -7346,7 +9081,11 @@ should be done in reverse order."
(skip-chars-backward "^|")
(setq ecol (1- (current-column)))
(org-table-goto-column column)
- (setq lns (mapcar (lambda(x) (cons (org-trim (substring x bcol ecol)) x))
+ (setq lns (mapcar (lambda(x) (cons
+ (org-sort-remove-invisible
+ (nth (1- column)
+ (org-split-string x "[ \t]*|[ \t]*")))
+ x))
(org-split-string (buffer-substring beg end) "\n")))
(setq lns (org-do-sort lns "Table" with-case sorting-type))
(delete-region beg end)
@@ -7357,6 +9096,15 @@ should be done in reverse order."
(org-table-goto-column thiscol)
(message "%d lines sorted, based on column %d" (length lns) column)))
+;; FIXME: maybe we will not need this? Table sorting is broken....
+(defun org-sort-remove-invisible (s)
+ (remove-text-properties 0 (length s) org-rm-props s)
+ (while (string-match org-bracket-link-regexp s)
+ (setq s (replace-match (if (match-end 2)
+ (match-string 3 s)
+ (match-string 1 s)) t t s)))
+ s)
+
(defun org-table-cut-region (beg end)
"Copy region in table to the clipboard and blank all relevant fields."
(interactive "r")
@@ -7555,7 +9303,7 @@ it can be edited in place."
(field (org-table-get-field))
(cw (current-window-configuration))
p)
- (switch-to-buffer-other-window "*Org tmp*")
+ (org-switch-to-buffer-other-window "*Org tmp*")
(erase-buffer)
(insert "#\n# Edit field and finish with C-c C-c\n#\n")
(let ((org-inhibit-startup t)) (org-mode))
@@ -7595,8 +9343,8 @@ the table and kill the editing buffer."
(defun org-trim (s)
"Remove whitespace at beginning and end of string."
- (if (string-match "^[ \t\n\r]+" s) (setq s (replace-match "" t t s)))
- (if (string-match "[ \t\n\r]+$" s) (setq s (replace-match "" t t s)))
+ (if (string-match "\\`[ \t\n\r]+" s) (setq s (replace-match "" t t s)))
+ (if (string-match "[ \t\n\r]+\\'" s) (setq s (replace-match "" t t s)))
s)
(defun org-wrap (string &optional width lines)
@@ -7939,7 +9687,7 @@ For all numbers larger than LIMIT, shift them by DELTA."
(while (re-search-forward "^[ \t]*| *\\$ *\\(|.*\\)" end t)
(setq fields (org-split-string (match-string 1) " *| *"))
(while (setq field (pop fields))
- (if (string-match "^\\([a-zA-Z][a-zA-Z0-9]*\\|%\\) *= *\\(.*\\)" field)
+ (if (string-match "^\\([a-zA-Z][_a-zA-Z0-9]*\\|%\\) *= *\\(.*\\)" field)
(push (cons (match-string 1 field) (match-string 2 field))
org-table-local-parameters))))
(goto-char beg)
@@ -8059,7 +9807,7 @@ of the new mark."
(goto-line l1)))
(if (not (= epos (point-at-eol))) (org-table-align))
(goto-line l)
- (and (interactive-p) (message (cdr (assoc new org-recalc-marks))))))
+ (and (interactive-p) (message "%s" (cdr (assoc new org-recalc-marks))))))
(defun org-table-maybe-recalculate-line ()
"Recompute the current line if marked for it, and if we haven't just done it."
@@ -8168,8 +9916,8 @@ not overwrite the stored one."
n))))
(setq fmt (replace-match "" t t fmt)))
(if (string-match "[NT]" fmt)
- (setq numbers (equal (match-string 0 fmt) "N"))
- fmt (replace-match "" t t fmt))
+ (setq numbers (equal (match-string 0 fmt) "N")
+ fmt (replace-match "" t t fmt)))
(if (string-match "L" fmt)
(setq literal t
fmt (replace-match "" t t fmt)))
@@ -8273,6 +10021,12 @@ $1-> %s\n" orig formula form0 form))
(or suppress-align (and org-table-may-need-update
(org-table-align))))))
+(defun org-table-put-field-property (prop value)
+ (save-excursion
+ (put-text-property (progn (skip-chars-backward "^|") (point))
+ (progn (skip-chars-forward "^|") (point))
+ prop value)))
+
(defun org-table-get-range (desc &optional tbeg col highlight)
"Get a calc vector from a column, accorting to descriptor DESC.
Optional arguments TBEG and COL can give the beginning of the table and
@@ -8312,7 +10066,7 @@ HIGHLIGHT means, just highlight the range."
(goto-line r1)
(while (not (looking-at org-table-dataline-regexp))
(beginning-of-line 2))
- (prog1 (org-table-get-field c1)
+ (prog1 (org-trim (org-table-get-field c1))
(if highlight (org-table-highlight-rectangle (point) (point)))))
;; A range, return a vector
;; First sort the numbers to get a regular ractangle
@@ -8332,7 +10086,8 @@ HIGHLIGHT means, just highlight the range."
(org-table-highlight-rectangle
beg (progn (skip-chars-forward "^|\n") (point))))
;; return string representation of calc vector
- (apply 'append (org-table-copy-region beg end))))))
+ (mapcar 'org-trim
+ (apply 'append (org-table-copy-region beg end)))))))
(defun org-table-get-descriptor-line (desc &optional cline bline table)
"Analyze descriptor DESC and retrieve the corresponding line number.
@@ -8412,7 +10167,7 @@ LISPP means to return something appropriate for a Lisp list."
(if (eq lispp 'literal)
x
(prin1-to-string (if numbers (string-to-number x) x))))
- " ")
+ elements " ")
(concat "[" (mapconcat
(lambda (x)
(if numbers (number-to-string (string-to-number x)) x))
@@ -8435,7 +10190,7 @@ With prefix arg ALL, do this for all lines in the table."
(line-re org-table-dataline-regexp)
(thisline (org-current-line))
(thiscol (org-table-current-column))
- beg end entry eqlnum eqlname eql (cnt 0) eq a name)
+ beg end entry eqlnum eqlname eqlname1 eql (cnt 0) eq a name)
;; Insert constants in all formulas
(setq eqlist
(mapcar (lambda (x)
@@ -8465,6 +10220,28 @@ With prefix arg ALL, do this for all lines in the table."
end (move-marker (make-marker) (1+ (point-at-eol)))))
(goto-char beg)
(and all (message "Re-applying formulas to full table..."))
+
+ ;; First find the named fields, and mark them untouchanble
+ (remove-text-properties beg end '(org-untouchable t))
+ (while (setq eq (pop eqlname))
+ (setq name (car eq)
+ a (assoc name org-table-named-field-locations))
+ (and (not a)
+ (string-match "@\\([0-9]+\\)\\$\\([0-9]+\\)" name)
+ (setq a (list name
+ (aref org-table-dlines
+ (string-to-number (match-string 1 name)))
+ (string-to-number (match-string 2 name)))))
+ (when (and a (or all (equal (nth 1 a) thisline)))
+ (message "Re-applying formula to field: %s" name)
+ (goto-line (nth 1 a))
+ (org-table-goto-column (nth 2 a))
+ (push (append a (list (cdr eq))) eqlname1)
+ (org-table-put-field-property :org-untouchable t)))
+
+ ;; Now evauluate the column formulas, but skip fields covered by
+ ;; field formulas
+ (goto-char beg)
(while (re-search-forward line-re end t)
(unless (string-match "^ *[_^!$/] *$" (org-table-get-field 1))
;; Unprotected line, recalculate
@@ -8475,30 +10252,24 @@ With prefix arg ALL, do this for all lines in the table."
(while (setq entry (pop eql))
(goto-line org-last-recalc-line)
(org-table-goto-column (string-to-number (car entry)) nil 'force)
- (org-table-eval-formula nil (cdr entry)
- 'noalign 'nocst 'nostore 'noanalysis))))
+ (unless (get-text-property (point) :org-untouchable)
+ (org-table-eval-formula nil (cdr entry)
+ 'noalign 'nocst 'nostore 'noanalysis)))))
+
+ ;; Now evaluate the field formulas
+ (while (setq eq (pop eqlname1))
+ (message "Re-applying formula to field: %s" (car eq))
+ (goto-line (nth 1 eq))
+ (org-table-goto-column (nth 2 eq))
+ (org-table-eval-formula nil (nth 3 eq) 'noalign 'nocst
+ 'nostore 'noanalysis))
+
(goto-line thisline)
(org-table-goto-column thiscol)
+ (remove-text-properties (point-min) (point-max) '(org-untouchable t))
(or noalign (and org-table-may-need-update (org-table-align))
(and all (message "Re-applying formulas to %d lines...done" cnt)))
- ;; Now do the named fields
- (while (setq eq (pop eqlname))
- (setq name (car eq)
- a (assoc name org-table-named-field-locations))
- (and (not a)
- (string-match "@\\([0-9]+\\)\\$\\([0-9]+\\)" name)
- (setq a
- (list
- name
- (aref org-table-dlines
- (string-to-number (match-string 1 name)))
- (string-to-number (match-string 2 name)))))
- (when (and a (or all (equal (nth 1 a) thisline)))
- (message "Re-applying formula to field: %s" name)
- (goto-line (nth 1 a))
- (org-table-goto-column (nth 2 a))
- (org-table-eval-formula nil (cdr eq) 'noalign 'nocst
- 'nostore 'noanalysis)))
+
;; back to initial position
(message "Re-applying formulas...done")
(goto-line thisline)
@@ -8528,7 +10299,7 @@ With prefix arg ALL, do this for all lines in the table."
(defun org-table-formula-substitute-names (f)
"Replace $const with values in string F."
- (let ((start 0) a (f1 f))
+ (let ((start 0) a (f1 f) (pp (/= (string-to-char f) ?')))
;; First, check for column names
(while (setq start (string-match org-table-column-name-regexp f start))
(setq start (1+ start))
@@ -8536,11 +10307,12 @@ With prefix arg ALL, do this for all lines in the table."
(setq f (replace-match (concat "$" (cdr a)) t t f)))
;; Parameters and constants
(setq start 0)
- (while (setq start (string-match "\\$\\([a-zA-Z][a-zA-Z0-9]*\\)" f start))
+ (while (setq start (string-match "\\$\\([a-zA-Z][_a-zA-Z0-9]*\\)" f start))
(setq start (1+ start))
(if (setq a (save-match-data
(org-table-get-constant (match-string 1 f))))
- (setq f (replace-match (concat "(" a ")") t t f))))
+ (setq f (replace-match
+ (concat (if pp "(") a (if pp ")")) t t f))))
(if org-table-formula-debug
(put-text-property 0 (length f) :orig-formula f1 f))
f))
@@ -8549,30 +10321,35 @@ With prefix arg ALL, do this for all lines in the table."
"Find the value for a parameter or constant in a formula.
Parameters get priority."
(or (cdr (assoc const org-table-local-parameters))
+ (cdr (assoc const org-table-formula-constants-local))
(cdr (assoc const org-table-formula-constants))
(and (fboundp 'constants-get) (constants-get const))
+ (and (string= (substring const 0 (min 5 (length const))) "PROP_")
+ (org-entry-get nil (substring const 5) 'inherit))
"#UNDEFINED_NAME"))
-(defvar org-table-fedit-map (make-sparse-keymap))
-(org-defkey org-table-fedit-map "\C-x\C-s" 'org-table-fedit-finish)
-(org-defkey org-table-fedit-map "\C-c\C-s" 'org-table-fedit-finish)
-(org-defkey org-table-fedit-map "\C-c\C-c" 'org-table-fedit-finish)
-(org-defkey org-table-fedit-map "\C-c\C-q" 'org-table-fedit-abort)
-(org-defkey org-table-fedit-map "\C-c?" 'org-table-show-reference)
-(org-defkey org-table-fedit-map [(meta shift up)] 'org-table-fedit-line-up)
-(org-defkey org-table-fedit-map [(meta shift down)] 'org-table-fedit-line-down)
-(org-defkey org-table-fedit-map [(shift up)] 'org-table-fedit-ref-up)
-(org-defkey org-table-fedit-map [(shift down)] 'org-table-fedit-ref-down)
-(org-defkey org-table-fedit-map [(shift left)] 'org-table-fedit-ref-left)
-(org-defkey org-table-fedit-map [(shift right)] 'org-table-fedit-ref-right)
-(org-defkey org-table-fedit-map [(meta up)] 'org-table-fedit-scroll-down)
-(org-defkey org-table-fedit-map [(meta down)] 'org-table-fedit-scroll)
-(org-defkey org-table-fedit-map [(meta tab)] 'lisp-complete-symbol)
-(org-defkey org-table-fedit-map "\M-\C-i" 'lisp-complete-symbol)
-(org-defkey org-table-fedit-map [(tab)] 'org-table-fedit-lisp-indent)
-(org-defkey org-table-fedit-map "\C-i" 'org-table-fedit-lisp-indent)
-(org-defkey org-table-fedit-map "\C-c\C-r" 'org-table-fedit-toggle-ref-type)
-(org-defkey org-table-fedit-map "\C-c}" 'org-table-fedit-toggle-coordinates)
+(defvar org-table-fedit-map
+ (let ((map (make-sparse-keymap)))
+ (org-defkey map "\C-x\C-s" 'org-table-fedit-finish)
+ (org-defkey map "\C-c\C-s" 'org-table-fedit-finish)
+ (org-defkey map "\C-c\C-c" 'org-table-fedit-finish)
+ (org-defkey map "\C-c\C-q" 'org-table-fedit-abort)
+ (org-defkey map "\C-c?" 'org-table-show-reference)
+ (org-defkey map [(meta shift up)] 'org-table-fedit-line-up)
+ (org-defkey map [(meta shift down)] 'org-table-fedit-line-down)
+ (org-defkey map [(shift up)] 'org-table-fedit-ref-up)
+ (org-defkey map [(shift down)] 'org-table-fedit-ref-down)
+ (org-defkey map [(shift left)] 'org-table-fedit-ref-left)
+ (org-defkey map [(shift right)] 'org-table-fedit-ref-right)
+ (org-defkey map [(meta up)] 'org-table-fedit-scroll-down)
+ (org-defkey map [(meta down)] 'org-table-fedit-scroll)
+ (org-defkey map [(meta tab)] 'lisp-complete-symbol)
+ (org-defkey map "\M-\C-i" 'lisp-complete-symbol)
+ (org-defkey map [(tab)] 'org-table-fedit-lisp-indent)
+ (org-defkey map "\C-i" 'org-table-fedit-lisp-indent)
+ (org-defkey map "\C-c\C-r" 'org-table-fedit-toggle-ref-type)
+ (org-defkey map "\C-c}" 'org-table-fedit-toggle-coordinates)
+ map))
(easy-menu-define org-table-fedit-menu org-table-fedit-map "Org Edit Formulas Menu"
'("Edit-Formulas"
@@ -8621,7 +10398,7 @@ Parameters get priority."
(field . "# Field Formulas\n")
(named . "# Named Field Formulas\n")))
entry s type title)
- (switch-to-buffer-other-window "*Edit Formulas*")
+ (org-switch-to-buffer-other-window "*Edit Formulas*")
(erase-buffer)
;; Keep global-font-lock-mode from turning on font-lock-mode
(let ((font-lock-global-modes '(not fundamental-mode)))
@@ -8684,8 +10461,9 @@ full TBLFM line."
;; format match, just advance
(setq start (match-end 0)))
((and (> (match-beginning 0) 0)
- (equal ?. (aref s (max (1- (match-beginning 0)) 0))))
- ;; 3.e5 or something like this. FIXME: is this ok????
+ (equal ?. (aref s (max (1- (match-beginning 0)) 0)))
+ (not (equal ?. (aref s (max (- (match-beginning 0) 2) 0)))))
+ ;; 3.e5 or something like this.
(setq start (match-end 0)))
(t
(setq start (match-beginning 0)
@@ -8702,7 +10480,7 @@ full TBLFM line."
"Convert spreadsheet references from to @7$28 to AB7.
Works for single references, but also for entire formulas and even the
full TBLFM line."
- (while (string-match "@\\([0-9]+\\)$\\([0-9]+\\)" s)
+ (while (string-match "@\\([0-9]+\\)\\$\\([0-9]+\\)" s)
(setq s (replace-match
(format "%s%d"
(org-number-to-letters
@@ -8895,10 +10673,10 @@ With prefix ARG, apply the new formulas to the table."
((looking-at "[ \t]")
(goto-char pos)
(call-interactively 'lisp-indent-line))
- ((looking-at "[$@0-9a-zA-Z]+ *= *[^ \t\n']") (goto-char pos))
+ ((looking-at "[$&@0-9a-zA-Z]+ *= *[^ \t\n']") (goto-char pos))
((not (fboundp 'pp-buffer))
(error "Cannot pretty-print. Command `pp-buffer' is not available."))
- ((looking-at "[$@0-9a-zA-Z]+ *= *'(")
+ ((looking-at "[$&@0-9a-zA-Z]+ *= *'(")
(goto-char (- (match-end 0) 2))
(setq beg (point))
(setq ind (make-string (current-column) ?\ ))
@@ -8975,7 +10753,7 @@ With prefix ARG, apply the new formulas to the table."
(if (and (markerp pos) (marker-buffer pos))
(if (get-buffer-window (marker-buffer pos))
(select-window (get-buffer-window (marker-buffer pos)))
- (switch-to-buffer-other-window (get-buffer-window
+ (org-switch-to-buffer-other-window (get-buffer-window
(marker-buffer pos)))))
(goto-char pos)
(org-table-force-dataline)
@@ -9034,6 +10812,9 @@ With prefix ARG, apply the new formulas to the table."
(t
(cond
((not var) (error "No reference at point"))
+ ((setq e (assoc var org-table-formula-constants-local))
+ (message "Local Constant: $%s=%s in #+CONSTANTS line."
+ var (cdr e)))
((setq e (assoc var org-table-formula-constants))
(message "Constant: $%s=%s in `org-table-formula-constants'."
var (cdr e)))
@@ -9076,7 +10857,7 @@ With prefix ARG, apply the new formulas to the table."
(defun org-table-fedit-line-down ()
"Move cursor one line down in the window showing the table."
(interactive)
- (org-table-fedit-move 'next-line))
+ (org-table-fedit-move 'next-line))
(defun org-table-fedit-move (command)
"Move the cursor in the window shoinw the table.
@@ -9338,7 +11119,7 @@ to execute outside of tables."
(defun orgtbl-error ()
"Error when there is no default binding for a table key."
(interactive)
- (error "This key is has no function outside tables"))
+ (error "This key has no function outside tables"))
(defun orgtbl-setup ()
"Setup orgtbl keymaps."
@@ -9888,7 +11669,7 @@ this function is called."
(defun org-link-expand-abbrev (link)
"Apply replacements as defined in `org-link-abbrev-alist."
- (if (string-match "^\\([a-zA-Z]+\\)\\(::?\\(.*\\)\\)?$" link)
+ (if (string-match "^\\([a-zA-Z][-_a-zA-Z0-9]*\\)\\(::?\\(.*\\)\\)?$" link)
(let* ((key (match-string 1 link))
(as (or (assoc key org-link-abbrev-alist-local)
(assoc key org-link-abbrev-alist)))
@@ -9914,6 +11695,53 @@ this function is called."
(defvar org-store-link-plist nil
"Plist with info about the most recently link created with `org-store-link'.")
+(defvar org-link-protocols nil
+ "Link protocols added to Org-mode using `org-add-link-type'.")
+
+(defvar org-store-link-functions nil
+ "List of functions that are called to create and store a link.
+Each function will be called in turn until one returns a non-nil
+value. Each function should check if it is responsible for creating
+this link (for example by looking at the major mode).
+If not, it must exit and return nil.
+If yes, it should return a non-nil value after a calling
+`org-store-link-props' with a list of properties and values.
+Special properties are:
+
+:type The link prefix. like \"http\". This must be given.
+:link The link, like \"http://www.astro.uva.nl/~dominik\".
+ This is obligatory as well.
+:description Optional default description for the second pair
+ of brackets in an Org-mode link. The user can still change
+ this when inserting this link into an Org-mode buffer.
+
+In addition to these, any additional properties can be specified
+and then used in remember templates.")
+
+(defun org-add-link-type (type &optional follow publish)
+ "Add TYPE to the list of `org-link-types'.
+Re-compute all regular expressions depending on `org-link-types'
+FOLLOW and PUBLISH are two functions. Both take the link path as
+an argument.
+FOLLOW should do whatever is necessary to follow the link, for example
+to find a file or display a mail message.
+
+PUBLISH takes the path and retuns the string that should be used when
+this document is published. FIMXE: This is actually not yet implemented."
+ (add-to-list 'org-link-types type t)
+ (org-make-link-regexps)
+ (add-to-list 'org-link-protocols
+ (list type follow publish)))
+
+(defun org-add-agenda-custom-command (entry)
+ "Replace or add a command in `org-agenda-custom-commands'.
+This is mostly for hacking and trying a new command - once the command
+works you probably want to add it to `org-agenda-custom-commands' for good."
+ (let ((ass (assoc (car entry) org-agenda-custom-commands)))
+ (if ass
+ (setcdr ass (cdr entry))
+ (push entry org-agenda-custom-commands))))
+
;;;###autoload
(defun org-store-link (arg)
"\\<org-mode-map>Store an org-link to the current location.
@@ -9927,6 +11755,10 @@ For file links, arg negates `org-context-in-file-links'."
(let (link cpltxt desc description search txt)
(cond
+ ((run-hook-with-args-until-success 'org-store-link-functions)
+ (setq link (plist-get org-store-link-plist :link)
+ desc (or (plist-get org-store-link-plist :description) link)))
+
((eq major-mode 'bbdb-mode)
(let ((name (bbdb-record-name (bbdb-current-record)))
(company (bbdb-record-getprop (bbdb-current-record) 'company)))
@@ -9983,8 +11815,8 @@ For file links, arg negates `org-context-in-file-links'."
(if (fboundp 'elmo-message-entity)
(elmo-message-entity
wl-summary-buffer-elmo-folder msgnum)
- (elmo-msgdb-overview-get-entity
- msgnum (wl-summary-buffer-msgdb))))
+ (elmo-msgdb-overview-get-entity
+ msgnum (wl-summary-buffer-msgdb))))
(from (wl-summary-line-from))
(to (car (elmo-message-entity-field wl-message-entity 'to)))
(subject (let (wl-thr-indent-string wl-parent-message-entity)
@@ -10112,10 +11944,11 @@ For file links, arg negates `org-context-in-file-links'."
(setq cpltxt (substring cpltxt 0 -2)))
(setq link (org-make-link cpltxt)))
- (buffer-file-name
+ ((buffer-file-name (buffer-base-buffer))
;; Just link to this file here.
(setq cpltxt (concat "file:"
- (abbreviate-file-name buffer-file-name)))
+ (abbreviate-file-name
+ (buffer-file-name (buffer-base-buffer)))))
;; Add a context string
(when (org-xor org-context-in-file-links arg)
(setq txt (if (org-region-active-p)
@@ -10141,9 +11974,9 @@ For file links, arg negates `org-context-in-file-links'."
(if (and (interactive-p) link)
(progn
(setq org-stored-links
- (cons (list cpltxt link desc) org-stored-links))
- (message "Stored: %s" (or cpltxt link)))
- (org-make-link-string link desc))))
+ (cons (list link desc) org-stored-links))
+ (message "Stored: %s" (or desc link)))
+ (and link (org-make-link-string link desc)))))
(defun org-store-link-props (&rest plist)
"Store link properties, extract names and addresses."
@@ -10198,7 +12031,7 @@ according to FMT (default from `org-email-link-description-format')."
;; We are using a headline, clean up garbage in there.
(if (string-match org-todo-regexp s)
(setq s (replace-match "" t t s)))
- (if (string-match ":[a-zA-Z0-9_@:]+:[ \t]*$" s)
+ (if (string-match (org-re ":[[:alnum:]_@:]+:[ \t]*$") s)
(setq s (replace-match "" t t s)))
(setq s (org-trim s))
(if (string-match (concat "^\\(" org-quote-string "\\|"
@@ -10212,15 +12045,19 @@ according to FMT (default from `org-email-link-description-format')."
(mapconcat 'identity (org-split-string s "[ \t]+") " ")))
(defun org-make-link (&rest strings)
- "Concatenate STRINGS, format resulting string with `org-link-format'."
+ "Concatenate STRINGS."
(apply 'concat strings))
(defun org-make-link-string (link &optional description)
"Make a link with brackets, consisting of LINK and DESCRIPTION."
+ (unless (string-match "\\S-" link)
+ (error "Empty link"))
(when (stringp description)
;; Remove brackets from the description, they are fatal.
- (while (string-match "\\[\\|\\]" description)
- (setq description (replace-match "" t t description))))
+ (while (string-match "\\[" description)
+ (setq description (replace-match "{" t t description)))
+ (while (string-match "\\]" description)
+ (setq description (replace-match "}" t t description))))
(when (equal (org-link-escape link) description)
;; No description needed, it is identical
(setq description nil))
@@ -10231,30 +12068,58 @@ according to FMT (default from `org-email-link-description-format')."
(if description (concat "[" description "]") "")
"]"))
-(defconst org-link-escape-chars '(("[" . "%5B") ("]" . "%5D") (" " . "%20"))
- "Association list of escapes for some characters problematic in links.")
+(defconst org-link-escape-chars
+ '((?\ . "%20")
+ (?\[ . "%5B")
+ (?\] . "%5D")
+ (?\340 . "%E0") ; `a
+ (?\342 . "%E2") ; ^a
+ (?\347 . "%E7") ; ,c
+ (?\350 . "%E8") ; `e
+ (?\351 . "%E9") ; 'e
+ (?\352 . "%EA") ; ^e
+ (?\356 . "%EE") ; ^i
+ (?\364 . "%F4") ; ^o
+ (?\371 . "%F9") ; `u
+ (?\373 . "%FB") ; ^u
+ (?\; . "%3B")
+ (?? . "%3F")
+ (?= . "%3D")
+ (?+ . "%2B")
+ )
+ "Association list of escapes for some characters problematic in links.
+This is the list that is used for internal purposes.")
+
+(defconst org-link-escape-chars-browser
+ '((?\ . "%20")) ; 32 for the SPC char
+ "Association list of escapes for some characters problematic in links.
+This is the list that is used before handing over to the browser.")
-(defun org-link-escape (text)
+(defun org-link-escape (text &optional table)
"Escape charaters in TEXT that are problematic for links."
+ (setq table (or table org-link-escape-chars))
(when text
- (let ((re (mapconcat (lambda (x) (regexp-quote (car x)))
- org-link-escape-chars "\\|")))
+ (let ((re (mapconcat (lambda (x) (regexp-quote
+ (char-to-string (car x))))
+ table "\\|")))
(while (string-match re text)
(setq text
(replace-match
- (cdr (assoc (match-string 0 text) org-link-escape-chars))
+ (cdr (assoc (string-to-char (match-string 0 text))
+ table))
t t text)))
text)))
-(defun org-link-unescape (text)
+(defun org-link-unescape (text &optional table)
"Reverse the action of `org-link-escape'."
+ (setq table (or table org-link-escape-chars))
(when text
(let ((re (mapconcat (lambda (x) (regexp-quote (cdr x)))
- org-link-escape-chars "\\|")))
+ table "\\|")))
(while (string-match re text)
(setq text
(replace-match
- (car (rassoc (match-string 0 text) org-link-escape-chars))
+ (char-to-string (car (rassoc (match-string 0 text) table)))
t t text)))
text)))
@@ -10296,6 +12161,13 @@ according to FMT (default from `org-email-link-description-format')."
(setq s (replace-match "%40" t t s)))
s)
+;;;###autoload
+(defun org-insert-link-global ()
+ "Insert a link like Org-mode does.
+This command can be called in any mode to insert a link in Org-mode syntax."
+ (interactive)
+ (org-run-like-in-org-mode 'org-insert-link))
+
(defun org-insert-link (&optional complete-file)
"Insert a link. At the prompt, enter the link.
@@ -10322,12 +12194,13 @@ is in the current directory or below.
With three \\[universal-argument] prefixes, negate the meaning of
`org-keep-stored-link-after-insertion'."
(interactive "P")
- (let ((wcf (current-window-configuration))
- (region (if (org-region-active-p)
- (prog1 (buffer-substring (region-beginning) (region-end))
- (delete-region (region-beginning) (region-end)))))
- tmphist ; byte-compile incorrectly complains about this
- link desc entry remove file)
+ (let* ((wcf (current-window-configuration))
+ (region (if (org-region-active-p)
+ (buffer-substring (region-beginning) (region-end))))
+ (remove (and region (list (region-beginning) (region-end))))
+ (desc region)
+ tmphist ; byte-compile incorrectly complains about this
+ link entry file)
(cond
((org-in-regexp org-bracket-link-regexp 1)
;; We do have a link at point, and we are going to edit it.
@@ -10365,8 +12238,11 @@ With three \\[universal-argument] prefixes, negate the meaning of
(with-output-to-temp-buffer "*Org Links*"
(princ "Insert a link. Use TAB to complete valid link prefixes.\n")
(when org-stored-links
- (princ "\nStored links are available with <up>/<down> (most recent with RET):\n\n")
- (princ (mapconcat 'car (reverse org-stored-links) "\n"))))
+ (princ "\nStored links are available with <up>/<down> or M-p/n (most recent with RET):\n\n")
+ (princ (mapconcat
+ (lambda (x)
+ (if (nth 1 x) (concat (car x) " (" (nth 1 x) ")") (car x)))
+ (reverse org-stored-links) "\n"))))
(let ((cw (selected-window)))
(select-window (get-buffer-window "*Org Links*"))
(shrink-window-if-larger-than-buffer)
@@ -10379,9 +12255,10 @@ With three \\[universal-argument] prefixes, negate the meaning of
(setq link (org-completing-read
"Link: "
(append
- (mapcar (lambda (x) (concat (car x) ":"))
+ (mapcar (lambda (x) (list (concat (car x) ":")))
(append org-link-abbrev-alist-local org-link-abbrev-alist))
- (mapcar (lambda (x) (concat x ":")) org-link-types))
+ (mapcar (lambda (x) (list (concat x ":")))
+ org-link-types))
nil nil nil
'tmphist
(or (car (car org-stored-links)))))
@@ -10393,8 +12270,7 @@ With three \\[universal-argument] prefixes, negate the meaning of
(not org-keep-stored-link-after-insertion))
(setq org-stored-links (delq (assoc link org-stored-links)
org-stored-links)))
- (setq link (if entry (nth 1 entry) link)
- desc (or region desc (nth 2 entry)))))
+ (setq desc (or desc (nth 1 entry)))))
(if (string-match org-plain-link-re link)
;; URL-like link, normalize the use of angular brackets.
@@ -10415,6 +12291,8 @@ With three \\[universal-argument] prefixes, negate the meaning of
;; Check if we can/should use a relative path. If yes, simplify the link
(when (string-match "\\<file:\\(.*\\)" link)
(let* ((path (match-string 1 link))
+ (origpath path)
+ (desc-is-link (equal link desc))
(case-fold-search nil))
(cond
((eq org-link-file-path-type 'absolute)
@@ -10432,7 +12310,9 @@ With three \\[universal-argument] prefixes, negate the meaning of
;; We are linking a file with relative path name.
(setq path (substring (expand-file-name path)
(match-end 0)))))))
- (setq link (concat "file:" path))))
+ (setq link (concat "file:" path))
+ (if (equal desc origpath)
+ (setq desc path))))
(setq desc (read-string "Description: " desc))
(unless (string-match "\\S-" desc) (setq desc nil))
@@ -10507,6 +12387,14 @@ This is saved in case the need arises to restore it.")
(defvar org-open-link-marker (make-marker)
"Marker pointing to the location where `org-open-at-point; was called.")
+;;;###autoload
+(defun org-open-at-point-global ()
+ "Follow a link like Org-mode does.
+This command can be called in any mode to follow a link that has
+Org-mode syntax."
+ (interactive)
+ (org-run-like-in-org-mode 'org-open-at-point))
+
(defun org-open-at-point (&optional in-emacs)
"Open link at or after point.
If there is no link at point, this function will search forward up to
@@ -10514,184 +12402,189 @@ the end of the current subtree.
Normally, files will be opened by an appropriate application. If the
optional argument IN-EMACS is non-nil, Emacs will visit the file."
(interactive "P")
- (move-marker org-open-link-marker (point))
- (setq org-window-config-before-follow-link (current-window-configuration))
- (org-remove-occur-highlights nil nil t)
- (if (org-at-timestamp-p t)
- (org-follow-timestamp-link)
- (let (type path link line search (pos (point)))
- (catch 'match
- (save-excursion
- (skip-chars-forward "^]\n\r")
- (when (org-in-regexp org-bracket-link-regexp)
- (setq link (org-link-unescape (org-match-string-no-properties 1)))
- (while (string-match " *\n *" link)
- (setq link (replace-match " " t t link)))
- (setq link (org-link-expand-abbrev link))
- (if (string-match org-link-re-with-space2 link)
- (setq type (match-string 1 link) path (match-string 2 link))
- (setq type "thisfile" path link))
- (throw 'match t)))
-
- (when (get-text-property (point) 'org-linked-text)
- (setq type "thisfile"
- pos (if (get-text-property (1+ (point)) 'org-linked-text)
- (1+ (point)) (point))
- path (buffer-substring
- (previous-single-property-change pos 'org-linked-text)
- (next-single-property-change pos 'org-linked-text)))
- (throw 'match t))
+ (catch 'abort
+ (move-marker org-open-link-marker (point))
+ (setq org-window-config-before-follow-link (current-window-configuration))
+ (org-remove-occur-highlights nil nil t)
+ (if (org-at-timestamp-p t)
+ (org-follow-timestamp-link)
+ (let (type path link line search (pos (point)))
+ (catch 'match
+ (save-excursion
+ (skip-chars-forward "^]\n\r")
+ (when (org-in-regexp org-bracket-link-regexp)
+ (setq link (org-link-unescape (org-match-string-no-properties 1)))
+ (while (string-match " *\n *" link)
+ (setq link (replace-match " " t t link)))
+ (setq link (org-link-expand-abbrev link))
+ (if (string-match org-link-re-with-space2 link)
+ (setq type (match-string 1 link) path (match-string 2 link))
+ (setq type "thisfile" path link))
+ (throw 'match t)))
+
+ (when (get-text-property (point) 'org-linked-text)
+ (setq type "thisfile"
+ pos (if (get-text-property (1+ (point)) 'org-linked-text)
+ (1+ (point)) (point))
+ path (buffer-substring
+ (previous-single-property-change pos 'org-linked-text)
+ (next-single-property-change pos 'org-linked-text)))
+ (throw 'match t))
- (save-excursion
- (when (or (org-in-regexp org-angle-link-re)
- (org-in-regexp org-plain-link-re))
- (setq type (match-string 1) path (match-string 2))
- (throw 'match t)))
- (when (org-in-regexp "\\<\\([^><\n]+\\)\\>")
- (setq type "tree-match"
- path (match-string 1))
- (throw 'match t))
- (save-excursion
- (when (org-in-regexp "\\(:[a-zA-Z0-9_@:]+\\):[ \t]*$")
- (setq type "tags"
+ (save-excursion
+ (when (or (org-in-regexp org-angle-link-re)
+ (org-in-regexp org-plain-link-re))
+ (setq type (match-string 1) path (match-string 2))
+ (throw 'match t)))
+ (when (org-in-regexp "\\<\\([^><\n]+\\)\\>")
+ (setq type "tree-match"
path (match-string 1))
- (while (string-match ":" path)
- (setq path (replace-match "+" t t path)))
- (throw 'match t))))
- (unless path
- (error "No link found"))
- ;; Remove any trailing spaces in path
- (if (string-match " +\\'" path)
- (setq path (replace-match "" t t path)))
-
- (cond
+ (throw 'match t))
+ (save-excursion
+ (when (org-in-regexp (org-re "\\(:[[:alnum:]_@:]+\\):[ \t]*$"))
+ (setq type "tags"
+ path (match-string 1))
+ (while (string-match ":" path)
+ (setq path (replace-match "+" t t path)))
+ (throw 'match t))))
+ (unless path
+ (error "No link found"))
+ ;; Remove any trailing spaces in path
+ (if (string-match " +\\'" path)
+ (setq path (replace-match "" t t path)))
- ((equal type "mailto")
- (let ((cmd (car org-link-mailto-program))
- (args (cdr org-link-mailto-program)) args1
- (address path) (subject "") a)
- (if (string-match "\\(.*\\)::\\(.*\\)" path)
- (setq address (match-string 1 path)
- subject (org-link-escape (match-string 2 path))))
- (while args
- (cond
- ((not (stringp (car args))) (push (pop args) args1))
- (t (setq a (pop args))
- (if (string-match "%a" a)
- (setq a (replace-match address t t a)))
- (if (string-match "%s" a)
- (setq a (replace-match subject t t a)))
- (push a args1))))
- (apply cmd (nreverse args1))))
-
- ((member type '("http" "https" "ftp" "news"))
- (browse-url (concat type ":" path)))
-
- ((string= type "tags")
- (org-tags-view in-emacs path))
- ((string= type "thisfile")
- (if in-emacs
- (switch-to-buffer-other-window
- (org-get-buffer-for-internal-link (current-buffer)))
- (org-mark-ring-push))
- (org-link-search
- path
- (cond ((equal in-emacs '(4)) 'occur)
- ((equal in-emacs '(16)) 'org-occur)
- (t nil))
- pos))
-
- ((string= type "tree-match")
- (org-occur (concat "\\[" (regexp-quote path) "\\]")))
-
- ((string= type "file")
- (if (string-match "::\\([0-9]+\\)\\'" path)
- (setq line (string-to-number (match-string 1 path))
- path (substring path 0 (match-beginning 0)))
- (if (string-match "::\\(.+\\)\\'" path)
- (setq search (match-string 1 path)
- path (substring path 0 (match-beginning 0)))))
- (org-open-file path in-emacs line search))
-
- ((string= type "news")
- (org-follow-gnus-link path))
-
- ((string= type "bbdb")
- (org-follow-bbdb-link path))
-
- ((string= type "info")
- (org-follow-info-link path))
-
- ((string= type "gnus")
- (let (group article)
- (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
- (error "Error in Gnus link"))
- (setq group (match-string 1 path)
- article (match-string 3 path))
- (org-follow-gnus-link group article)))
-
- ((string= type "vm")
- (let (folder article)
- (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
- (error "Error in VM link"))
- (setq folder (match-string 1 path)
- article (match-string 3 path))
- ;; in-emacs is the prefix arg, will be interpreted as read-only
- (org-follow-vm-link folder article in-emacs)))
-
- ((string= type "wl")
- (let (folder article)
- (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
- (error "Error in Wanderlust link"))
- (setq folder (match-string 1 path)
- article (match-string 3 path))
- (org-follow-wl-link folder article)))
-
- ((string= type "mhe")
- (let (folder article)
- (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
- (error "Error in MHE link"))
- (setq folder (match-string 1 path)
- article (match-string 3 path))
- (org-follow-mhe-link folder article)))
-
- ((string= type "rmail")
- (let (folder article)
- (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
- (error "Error in RMAIL link"))
- (setq folder (match-string 1 path)
- article (match-string 3 path))
- (org-follow-rmail-link folder article)))
-
- ((string= type "shell")
- (let ((cmd path))
- ;; FIXME: the following is only for backward compatibility
- (while (string-match "@{" cmd) (setq cmd (replace-match "<" t t cmd)))
- (while (string-match "@}" cmd) (setq cmd (replace-match ">" t t cmd)))
- (if (or (not org-confirm-shell-link-function)
- (funcall org-confirm-shell-link-function
- (format "Execute \"%s\" in shell? "
- (org-add-props cmd nil
- 'face 'org-warning))))
- (progn
- (message "Executing %s" cmd)
- (shell-command cmd))
- (error "Abort"))))
-
- ((string= type "elisp")
- (let ((cmd path))
- (if (or (not org-confirm-elisp-link-function)
- (funcall org-confirm-elisp-link-function
- (format "Execute \"%s\" as elisp? "
- (org-add-props cmd nil
- 'face 'org-warning))))
- (message "%s => %s" cmd (eval (read cmd)))
- (error "Abort"))))
+ (cond
- (t
- (browse-url-at-point)))))
- (move-marker org-open-link-marker nil))
+ ((assoc type org-link-protocols)
+ (funcall (nth 1 (assoc type org-link-protocols)) path))
+
+ ((equal type "mailto")
+ (let ((cmd (car org-link-mailto-program))
+ (args (cdr org-link-mailto-program)) args1
+ (address path) (subject "") a)
+ (if (string-match "\\(.*\\)::\\(.*\\)" path)
+ (setq address (match-string 1 path)
+ subject (org-link-escape (match-string 2 path))))
+ (while args
+ (cond
+ ((not (stringp (car args))) (push (pop args) args1))
+ (t (setq a (pop args))
+ (if (string-match "%a" a)
+ (setq a (replace-match address t t a)))
+ (if (string-match "%s" a)
+ (setq a (replace-match subject t t a)))
+ (push a args1))))
+ (apply cmd (nreverse args1))))
+
+ ((member type '("http" "https" "ftp" "news"))
+ (browse-url (concat type ":" (org-link-escape
+ path org-link-escape-chars-browser))))
+
+ ((string= type "tags")
+ (org-tags-view in-emacs path))
+ ((string= type "thisfile")
+ (if in-emacs
+ (switch-to-buffer-other-window
+ (org-get-buffer-for-internal-link (current-buffer)))
+ (org-mark-ring-push))
+ (let ((cmd `(org-link-search
+ ,path
+ ,(cond ((equal in-emacs '(4)) 'occur)
+ ((equal in-emacs '(16)) 'org-occur)
+ (t nil))
+ ,pos)))
+ (condition-case nil (eval cmd)
+ (error (progn (widen) (eval cmd))))))
+
+ ((string= type "tree-match")
+ (org-occur (concat "\\[" (regexp-quote path) "\\]")))
+
+ ((string= type "file")
+ (if (string-match "::\\([0-9]+\\)\\'" path)
+ (setq line (string-to-number (match-string 1 path))
+ path (substring path 0 (match-beginning 0)))
+ (if (string-match "::\\(.+\\)\\'" path)
+ (setq search (match-string 1 path)
+ path (substring path 0 (match-beginning 0)))))
+ (if (string-match "[*?{]" (file-name-nondirectory path))
+ (dired path)
+ (org-open-file path in-emacs line search)))
+
+ ((string= type "news")
+ (org-follow-gnus-link path))
+
+ ((string= type "bbdb")
+ (org-follow-bbdb-link path))
+
+ ((string= type "info")
+ (org-follow-info-link path))
+
+ ((string= type "gnus")
+ (let (group article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in Gnus link"))
+ (setq group (match-string 1 path)
+ article (match-string 3 path))
+ (org-follow-gnus-link group article)))
+
+ ((string= type "vm")
+ (let (folder article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in VM link"))
+ (setq folder (match-string 1 path)
+ article (match-string 3 path))
+ ;; in-emacs is the prefix arg, will be interpreted as read-only
+ (org-follow-vm-link folder article in-emacs)))
+
+ ((string= type "wl")
+ (let (folder article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in Wanderlust link"))
+ (setq folder (match-string 1 path)
+ article (match-string 3 path))
+ (org-follow-wl-link folder article)))
+
+ ((string= type "mhe")
+ (let (folder article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in MHE link"))
+ (setq folder (match-string 1 path)
+ article (match-string 3 path))
+ (org-follow-mhe-link folder article)))
+
+ ((string= type "rmail")
+ (let (folder article)
+ (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path))
+ (error "Error in RMAIL link"))
+ (setq folder (match-string 1 path)
+ article (match-string 3 path))
+ (org-follow-rmail-link folder article)))
+
+ ((string= type "shell")
+ (let ((cmd path))
+ (if (or (not org-confirm-shell-link-function)
+ (funcall org-confirm-shell-link-function
+ (format "Execute \"%s\" in shell? "
+ (org-add-props cmd nil
+ 'face 'org-warning))))
+ (progn
+ (message "Executing %s" cmd)
+ (shell-command cmd))
+ (error "Abort"))))
+
+ ((string= type "elisp")
+ (let ((cmd path))
+ (if (or (not org-confirm-elisp-link-function)
+ (funcall org-confirm-elisp-link-function
+ (format "Execute \"%s\" as elisp? "
+ (org-add-props cmd nil
+ 'face 'org-warning))))
+ (message "%s => %s" cmd (eval (read cmd)))
+ (error "Abort"))))
+ (t
+ (browse-url-at-point)))))
+ (move-marker org-open-link-marker nil)))
;;; File search
@@ -10749,7 +12642,7 @@ in all files. If AVOID-POS is given, ignore matches near that position."
(let ((case-fold-search t)
(s0 (mapconcat 'identity (org-split-string s "[ \t\r\n]+") " "))
(markers (concat "\\(?:" (mapconcat (lambda (x) (regexp-quote (car x)))
- (append '((" ") ("\t") ("\n"))
+ (append '(("") (" ") ("\t") ("\n"))
org-emphasis-alist)
"\\|") "\\)"))
(pos (point))
@@ -10776,11 +12669,11 @@ in all files. If AVOID-POS is given, ignore matches near that position."
;; (grep (concat "grep -n -e '" (match-string 1 s) "' *")))
(t (org-do-occur (match-string 1 s)))))
(t
- ;; A normal search string
+ ;; A normal search strings
(when (equal (string-to-char s) ?*)
;; Anchor on headlines, post may include tags.
- (setq pre "^\\*+[ \t]*\\(?:\\sw+\\)?[ \t]*"
- post "[ \t]*\\(?:[ \t]+:[a-zA-Z0-9_@:+]:[ \t]*\\)?$"
+ (setq pre "^\\*+[ \t]+\\(?:\\sw+\\)?[ \t]*"
+ post (org-re "[ \t]*\\(?:[ \t]+:[[:alnum:]_@:+]:[ \t]*\\)?$")
s (substring s 1)))
(remove-text-properties
0 (length s)
@@ -10875,7 +12768,7 @@ to read."
(setq beg (match-end 0))
(if (re-search-forward "^[ \t]*[0-9]+" nil t)
(setq end (1- (match-beginning 0)))))
- (and beg end (let ((buffer-read-only)) (delete-region beg end)))
+ (and beg end (let ((inhibit-read-only t)) (delete-region beg end)))
(goto-char (point-min))
(select-window cwin))))
@@ -10900,7 +12793,7 @@ to read."
(move-marker (car org-mark-ring)
(or pos (point))
(or buffer (current-buffer)))
- (message
+ (message "%s"
(substitute-command-keys
"Position saved to mark ring, go back with \\[org-mark-ring-goto].")))
@@ -10982,7 +12875,7 @@ onto the ring."
(if (match-string 2 name) ; If there isn't a node, choose "Top"
(Info-find-node (match-string 1 name) (match-string 2 name))
(Info-find-node (match-string 1 name) "Top")))
- (message (concat "Could not open: " name))))
+ (message "Could not open: %s" name)))
(defun org-follow-gnus-link (&optional group article)
"Follow a Gnus link to GROUP and ARTICLE."
@@ -11088,12 +12981,13 @@ sequences, it will now work."
(string= mh-index-folder (substring folder 0 end-index)))
(if (equal major-mode 'mh-show-mode)
(save-window-excursion
- (when (buffer-live-p (get-buffer folder))
- (progn
- (pop-to-buffer folder)
- (org-mhe-get-message-folder-from-index)
- )
- ))
+ (let (pop-up-frames)
+ (when (buffer-live-p (get-buffer folder))
+ (progn
+ (pop-to-buffer folder)
+ (org-mhe-get-message-folder-from-index)
+ )
+ )))
(org-mhe-get-message-folder-from-index)
)
folder
@@ -11105,7 +12999,7 @@ sequences, it will now work."
(save-excursion
(mh-index-previous-folder)
(re-search-forward "^\\(+.*\\)$" nil t)
- (message (match-string 1))))
+ (message "%s" (match-string 1))))
(defun org-mhe-get-message-folder ()
"Return the name of the current message folder. Be careful if you
@@ -11278,14 +13172,16 @@ If the file does not exist, an error is thrown."
(cond
((and (stringp cmd) (not (string-match "^\\s-*$" cmd)))
;; Remove quotes around the file name - we'll use shell-quote-argument.
- (if (string-match "['\"]%s['\"]" cmd)
- (setq cmd (replace-match "%s" t t cmd)))
- (setq cmd (format cmd (shell-quote-argument file)))
+ (while (string-match "['\"]%s['\"]" cmd)
+ (setq cmd (replace-match "%s" t t cmd)))
+ (while (string-match "%s" cmd)
+ (setq cmd (replace-match (shell-quote-argument file) t t cmd)))
(save-window-excursion
- (shell-command (concat cmd " &"))))
+ (start-process-shell-command cmd nil cmd)))
((or (stringp cmd)
(eq cmd 'emacs))
(funcall (cdr (assq 'file org-link-frame-setup)) file)
+ (widen)
(if line (goto-line line)
(if search (org-link-search search))))
((consp cmd)
@@ -11322,7 +13218,18 @@ on the system \"/user@host:\"."
(t nil)))
-;;;; Hooks for remember.el
+;;;; Hooks for remember.el, and refiling
+
+(defvar annotation) ; from remember.el, dynamically scoped in `remember-mode'
+(defvar initial) ; from remember.el, dynamically scoped in `remember-mode'
+
+;;;###autoload
+(defun org-remember-insinuate ()
+ "Setup remember.el for use wiht Org-mode."
+ (require 'remember)
+ (setq remember-annotation-functions '(org-remember-annotation))
+ (setq remember-handler-functions '(org-remember-handler))
+ (add-hook 'remember-mode-hook 'org-remember-apply-template))
;;;###autoload
(defun org-remember-annotation ()
@@ -11335,26 +13242,61 @@ conventions in Org-mode. This function returns such a link."
(defconst org-remember-help
"Select a destination location for the note.
UP/DOWN=headline TAB=cycle visibility [Q]uit RET/<left>/<right>=Store
-RET at beg-of-buf -> Append to file as level 2 headline
RET on headline -> Store as sublevel entry to current headline
+RET at beg-of-buf -> Append to file as level 2 headline
<left>/<right> -> before/after current headline, same headings level")
+(defvar org-remember-previous-location nil)
+(defvar org-force-remember-template-char) ;; dynamically scoped
+
+(defun org-select-remember-template (&optional use-char)
+ (when org-remember-templates
+ (let* ((templates (mapcar (lambda (x)
+ (if (stringp (car x))
+ (append (list (nth 1 x) (car x)) (cddr x))
+ (append (list (car x) "") (cdr x))))
+ org-remember-templates))
+ (char (or use-char
+ (cond
+ ((= (length templates) 1)
+ (caar templates))
+ ((and (boundp 'org-force-remember-template-char)
+ org-force-remember-template-char)
+ (if (stringp org-force-remember-template-char)
+ (string-to-char org-force-remember-template-char)
+ org-force-remember-template-char))
+ (t
+ (message "Select template: %s"
+ (mapconcat
+ (lambda (x)
+ (cond
+ ((not (string-match "\\S-" (nth 1 x)))
+ (format "[%c]" (car x)))
+ ((equal (downcase (car x))
+ (downcase (aref (nth 1 x) 0)))
+ (format "[%c]%s" (car x)
+ (substring (nth 1 x) 1)))
+ (t (format "[%c]%s" (car x) (nth 1 x)))))
+ templates " "))
+ (let ((inhibit-quit t) (char0 (read-char-exclusive)))
+ (when (equal char0 ?\C-g)
+ (jump-to-register remember-register)
+ (kill-buffer remember-buffer))
+ char0))))))
+ (cddr (assoc char templates)))))
+
+(defvar x-last-selected-text)
+(defvar x-last-selected-text-primary)
+
;;;###autoload
(defun org-remember-apply-template (&optional use-char skip-interactive)
"Initialize *remember* buffer with template, invoke `org-mode'.
This function should be placed into `remember-mode-hook' and in fact requires
-to be run from that hook to fucntion properly."
+to be run from that hook to function properly."
+ (unless (fboundp 'remember-finalize)
+ (defalias 'remember-finalize 'remember-buffer))
(if org-remember-templates
-
- (let* ((char (or use-char
- (if (= (length org-remember-templates) 1)
- (caar org-remember-templates)
- (message "Select template: %s"
- (mapconcat
- (lambda (x) (char-to-string (car x)))
- org-remember-templates " "))
- (read-char-exclusive))))
- (entry (cdr (assoc char org-remember-templates)))
+ (let* ((entry (org-select-remember-template use-char))
(tpl (car entry))
(plist-p (if org-store-link-plist t nil))
(file (if (and (nth 1 entry) (stringp (nth 1 entry))
@@ -11362,29 +13304,50 @@ to be run from that hook to fucntion properly."
(nth 1 entry)
org-default-notes-file))
(headline (nth 2 entry))
+ (v-c (or (and (eq window-system 'x)
+ (fboundp 'x-cut-buffer-or-selection-value)
+ (x-cut-buffer-or-selection-value))
+ (org-bound-and-true-p x-last-selected-text)
+ (org-bound-and-true-p x-last-selected-text-primary)
+ (and (> (length kill-ring) 0) (current-kill 0))))
(v-t (format-time-string (car org-time-stamp-formats) (org-current-time)))
(v-T (format-time-string (cdr org-time-stamp-formats) (org-current-time)))
(v-u (concat "[" (substring v-t 1 -1) "]"))
(v-U (concat "[" (substring v-T 1 -1) "]"))
- (v-i initial) ; defined in `remember-mode'
- (v-a (if (equal annotation "[[]]") "" annotation)) ; likewise
+ ;; `initial' and `annotation' are bound in `remember'
+ (v-i (if (boundp 'initial) initial))
+ (v-a (if (and (boundp 'annotation) annotation)
+ (if (equal annotation "[[]]") "" annotation)
+ ""))
+ (v-A (if (and v-a
+ (string-match "\\[\\(\\[.*?\\]\\)\\(\\[.*?\\]\\)?\\]" v-a))
+ (replace-match "[\\1[%^{Link description}]]" nil nil v-a)
+ v-a))
(v-n user-full-name)
(org-startup-folded nil)
- org-time-was-given org-end-time-was-given x prompt char time)
+ org-time-was-given org-end-time-was-given x
+ prompt completions char time pos default histvar)
(setq org-store-link-plist
- (append (list :annotation v-a :initial v-i)))
- (unless tpl (setq tpl "") (message "No template") (ding))
+ (append (list :annotation v-a :initial v-i)
+ org-store-link-plist))
+ (unless tpl (setq tpl "") (message "No template") (ding) (sit-for 1))
(erase-buffer)
(insert (substitute-command-keys
(format
- "## `C-c C-c' to file interactively, `C-u C-c C-c' to file directly.
-## Target file \"%s\", headline \"%s\"
-## To switch templates, use `\\[org-remember]'.\n\n"
+"## Filing location: Select interactively, default, or last used:
+## %s to select file and header location interactively.
+## %s \"%s\" -> \"* %s\"
+## C-u C-u C-c C-c \"%s\" -> \"* %s\"
+## To switch templates, use `\\[org-remember]'. To abort use `C-c C-k'.\n\n"
+ (if org-remember-store-without-prompt " C-u C-c C-c" " C-c C-c")
+ (if org-remember-store-without-prompt " C-c C-c" " C-u C-c C-c")
(abbreviate-file-name (or file org-default-notes-file))
- (or headline ""))))
+ (or headline "")
+ (or (car org-remember-previous-location) "???")
+ (or (cdr org-remember-previous-location) "???"))))
(insert tpl) (goto-char (point-min))
;; Simple %-escapes
- (while (re-search-forward "%\\([tTuUai]\\)" nil t)
+ (while (re-search-forward "%\\([tTuUaiAc]\\)" nil t)
(when (and initial (equal (match-string 0) "%i"))
(save-match-data
(let* ((lead (buffer-substring
@@ -11395,62 +13358,176 @@ to be run from that hook to fucntion properly."
(replace-match
(or (eval (intern (concat "v-" (match-string 1)))) "")
t t))
+
+ ;; %[] Insert contents of a file.
+ (goto-char (point-min))
+ (while (re-search-forward "%\\[\\(.+\\)\\]" nil t)
+ (let ((start (match-beginning 0))
+ (end (match-end 0))
+ (filename (expand-file-name (match-string 1))))
+ (goto-char start)
+ (delete-region start end)
+ (condition-case error
+ (insert-file-contents filename)
+ (error (insert (format "%%![Couldn't insert %s: %s]"
+ filename error))))))
+ ;; %() embedded elisp
+ (goto-char (point-min))
+ (while (re-search-forward "%\\((.+)\\)" nil t)
+ (goto-char (match-beginning 0))
+ (let ((template-start (point)))
+ (forward-char 1)
+ (let ((result
+ (condition-case error
+ (eval (read (current-buffer)))
+ (error (format "%%![Error: %s]" error)))))
+ (delete-region template-start (point))
+ (insert result))))
+
;; From the property list
(when plist-p
(goto-char (point-min))
(while (re-search-forward "%\\(:[-a-zA-Z]+\\)" nil t)
- (and (setq x (plist-get org-store-link-plist
- (intern (match-string 1))))
+ (and (setq x (or (plist-get org-store-link-plist
+ (intern (match-string 1))) ""))
(replace-match x t t))))
+
;; Turn on org-mode in the remember buffer, set local variables
(org-mode)
- (org-set-local 'org-finish-function 'remember-buffer)
+ (org-set-local 'org-finish-function 'remember-finalize)
(if (and file (string-match "\\S-" file) (not (file-directory-p file)))
(org-set-local 'org-default-notes-file file))
(if (and headline (stringp headline) (string-match "\\S-" headline))
(org-set-local 'org-remember-default-headline headline))
;; Interactive template entries
(goto-char (point-min))
- (while (re-search-forward "%^\\({\\([^}]*\\)}\\)?\\([uUtT]\\)?" nil t)
+ (while (re-search-forward "%^\\({\\([^}]*\\)}\\)?\\([guUtT]\\)?" nil t)
(setq char (if (match-end 3) (match-string 3))
prompt (if (match-end 2) (match-string 2)))
(goto-char (match-beginning 0))
(replace-match "")
- (if char
- (progn
- (setq org-time-was-given (equal (upcase char) char))
- (setq time (org-read-date (equal (upcase char) "U") t nil
- prompt))
- (org-insert-time-stamp time org-time-was-given
- (member char '("u" "U"))
- nil nil (list org-end-time-was-given)))
- (insert (read-string
- (if prompt (concat prompt ": ") "Enter string")))))
+ (setq completions nil default nil)
+ (when prompt
+ (setq completions (org-split-string prompt "|")
+ prompt (pop completions)
+ default (car completions)
+ histvar (intern (concat
+ "org-remember-template-prompt-history::"
+ (or prompt "")))
+ completions (mapcar 'list completions)))
+ (cond
+ ((member char '("G" "g"))
+ (let* ((org-last-tags-completion-table
+ (org-global-tags-completion-table
+ (if (equal char "G") (org-agenda-files) (and file (list file)))))
+ (org-add-colon-after-tag-completion t)
+ (ins (completing-read
+ (if prompt (concat prompt ": ") "Tags: ")
+ 'org-tags-completion-function nil nil nil
+ 'org-tags-history)))
+ (setq ins (mapconcat 'identity
+ (org-split-string ins (org-re "[^[:alnum:]]+"))
+ ":"))
+ (when (string-match "\\S-" ins)
+ (or (equal (char-before) ?:) (insert ":"))
+ (insert ins)
+ (or (equal (char-after) ?:) (insert ":")))))
+ (char
+ (setq org-time-was-given (equal (upcase char) char))
+ (setq time (org-read-date (equal (upcase char) "U") t nil
+ prompt))
+ (org-insert-time-stamp time org-time-was-given
+ (member char '("u" "U"))
+ nil nil (list org-end-time-was-given)))
+ (t
+ (insert (org-completing-read
+ (concat (if prompt prompt "Enter string")
+ (if default (concat " [" default "]"))
+ ": ")
+ completions nil nil nil histvar default)))))
(goto-char (point-min))
(if (re-search-forward "%\\?" nil t)
(replace-match "")
(and (re-search-forward "^[^#\n]" nil t) (backward-char 1))))
(org-mode)
- (org-set-local 'org-finish-function 'remember-buffer)))
+ (org-set-local 'org-finish-function 'remember-finalize))
+ (when (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "%!" nil t))
+ (replace-match "")
+ (add-hook 'post-command-hook 'org-remember-finish-immediately 'append)))
+
+(defun org-remember-finish-immediately ()
+ "File remember note immediately.
+This should be run in `post-command-hook' and will remove itself
+from that hook."
+ (remove-hook 'post-command-hook 'org-remember-finish-immediately)
+ (when org-finish-function
+ (funcall org-finish-function)))
+
;;;###autoload
-(defun org-remember ()
+(defun org-remember (&optional goto org-force-remember-template-char)
"Call `remember'. If this is already a remember buffer, re-apply template.
If there is an active region, make sure remember uses it as initial content
-of the remember buffer."
+of the remember buffer.
+
+When called interactively with a `C-u' prefix argument GOTO, don't remember
+anything, just go to the file/headline where the selected templated usually
+stores its notes. With a double prefix arg `C-u C-u', got to the last
+note stored by remember.
+
+Lisp programs can set ORG-FORCE-REMEMBER-TEMPLATE-CHAR to a character
+associated with a template in `org-remember-tempates'."
+ (interactive "P")
+ (cond
+ ((equal goto '(4)) (org-go-to-remember-target))
+ ((equal goto '(16)) (org-remember-goto-last-stored))
+ (t
+ (if (memq org-finish-function '(remember-buffer remember-finalize))
+ (progn
+ (when (< (length org-remember-templates) 2)
+ (error "No other template available"))
+ (erase-buffer)
+ (let ((annotation (plist-get org-store-link-plist :annotation))
+ (initial (plist-get org-store-link-plist :initial)))
+ (org-remember-apply-template))
+ (message "Press C-c C-c to remember data"))
+ (if (org-region-active-p)
+ (remember (buffer-substring (point) (mark)))
+ (call-interactively 'remember))))))
+
+(defun org-remember-goto-last-stored ()
+ "Go to the location where the last remember note was stored."
(interactive)
- (if (eq org-finish-function 'remember-buffer)
- (progn
- (when (< (length org-remember-templates) 2)
- (error "No other template available"))
- (erase-buffer)
- (let ((annotation (plist-get org-store-link-plist :annotation))
- (initial (plist-get org-store-link-plist :initial)))
- (org-remember-apply-template))
- (message "Press C-c C-c to remember data"))
- (if (org-region-active-p)
- (remember (buffer-substring (point) (mark)))
- (call-interactively 'remember))))
+ (bookmark-jump "org-remember-last-stored")
+ (message "This is the last note stored by remember"))
+
+(defun org-go-to-remember-target (&optional template-key)
+ "Go to the target location of a remember template.
+The user is queried for the template."
+ (interactive)
+ (let* ((entry (org-select-remember-template template-key))
+ (file (nth 1 entry))
+ (heading (nth 2 entry))
+ visiting)
+ (unless (and file (stringp file) (string-match "\\S-" file))
+ (setq file org-default-notes-file))
+ (unless (and heading (stringp heading) (string-match "\\S-" heading))
+ (setq heading org-remember-default-headline))
+ (setq visiting (org-find-base-buffer-visiting file))
+ (if (not visiting) (find-file-noselect file))
+ (switch-to-buffer (or visiting (get-file-buffer file)))
+ (widen)
+ (goto-char (point-min))
+ (if (re-search-forward
+ (concat "^\\*+[ \t]+" (regexp-quote heading)
+ (org-re "\\([ \t]+:[[:alnum:]@_:]*\\)?[ \t]*$"))
+ nil t)
+ (goto-char (match-beginning 0))
+ (error "Target headline not found: %s" heading))))
+
+(defvar org-note-abort nil) ; dynamically scoped
;;;###autoload
(defun org-remember-handler ()
@@ -11465,7 +13542,7 @@ find a better place. Then press RET or <left> or <right> in insert the note.
Key Cursor position Note gets inserted
-----------------------------------------------------------------------------
-RET buffer-start as level 2 heading at end of file
+RET buffer-start as level 1 heading at end of file
RET on headline as sublevel of the heading at cursor
RET no heading at cursor position, level taken from context.
Or use prefix arg to specify level manually.
@@ -11474,8 +13551,10 @@ RET no heading at cursor position, level taken from context.
So the fastest way to store the note is to press RET RET to append it to
the default file. This way your current train of thought is not
-interrupted, in accordance with the principles of remember.el. But with
-little extra effort, you can push it directly to the correct location.
+interrupted, in accordance with the principles of remember.el.
+You can also get the fast execution without prompting by using
+C-u C-c C-c to exit the remember buffer. See also the variable
+`org-remember-store-without-prompt'.
Before being stored away, the function ensures that the text has a
headline, i.e. a first line that starts with a \"*\". If not, a headline
@@ -11489,23 +13568,35 @@ See also the variable `org-reverse-note-order'."
(goto-char (point-min))
(while (looking-at "^[ \t]*\n\\|^##.*\n")
(replace-match ""))
+ (goto-char (point-max))
+ (beginning-of-line 1)
+ (while (looking-at "[ \t]*$\\|##.*")
+ (delete-region (1- (point)) (point-max))
+ (beginning-of-line 1))
(catch 'quit
+ (if org-note-abort (throw 'quit nil))
(let* ((txt (buffer-substring (point-min) (point-max)))
- (fastp (equal current-prefix-arg '(4)))
+ (fastp (org-xor (equal current-prefix-arg '(4))
+ org-remember-store-without-prompt))
(file (if fastp org-default-notes-file (org-get-org-file)))
(heading org-remember-default-headline)
(visiting (org-find-base-buffer-visiting file))
(org-startup-folded nil)
(org-startup-align-all-tables nil)
(org-goto-start-pos 1)
- spos level indent reversed)
+ spos exitcmd level indent reversed)
+ (if (and (equal current-prefix-arg '(16)) org-remember-previous-location)
+ (setq file (car org-remember-previous-location)
+ heading (cdr org-remember-previous-location)))
(setq current-prefix-arg nil)
+ (if (string-match "[ \t\n]+\\'" txt)
+ (setq txt (replace-match "" t t txt)))
;; Modify text so that it becomes a nice subtree which can be inserted
;; into an org tree.
(let* ((lines (split-string txt "\n"))
first)
(setq first (car lines) lines (cdr lines))
- (if (string-match "^\\*+" first)
+ (if (string-match "^\\*+ " first)
;; Is already a headline
(setq indent nil)
;; We need to add a headline: Use time and first buffer line
@@ -11514,18 +13605,28 @@ See also the variable `org-reverse-note-order'."
" (" (remember-buffer-desc) ")")
indent " "))
(if (and org-adapt-indentation indent)
- (setq lines (mapcar (lambda (x) (concat indent x)) lines)))
+ (setq lines (mapcar
+ (lambda (x)
+ (if (string-match "\\S-" x)
+ (concat indent x) x))
+ lines)))
(setq txt (concat first "\n"
(mapconcat 'identity lines "\n"))))
+ (if (string-match "\n[ \t]*\n[ \t\n]*\\'" txt)
+ (setq txt (replace-match "\n\n" t t txt))
+ (if (string-match "[ \t\n]*\\'" txt)
+ (setq txt (replace-match "\n" t t txt))))
;; Find the file
(if (not visiting) (find-file-noselect file))
(with-current-buffer (or visiting (get-file-buffer file))
+ (unless (org-mode-p)
+ (error "Target files for remember notes must be in Org-mode"))
(save-excursion
(save-restriction
(widen)
(and (goto-char (point-min))
(not (re-search-forward "^\\* " nil t))
- (insert "\n* Notes\n"))
+ (insert "\n* " (or heading "Notes") "\n"))
(setq reversed (org-notes-order-reversed-p))
;; Find the default location
@@ -11533,51 +13634,84 @@ See also the variable `org-reverse-note-order'."
(goto-char (point-min))
(if (re-search-forward
(concat "^\\*+[ \t]+" (regexp-quote heading)
- "\\([ \t]+:[a-zA-Z0-9@_:]*\\)?[ \t]*$")
+ (org-re "\\([ \t]+:[[:alnum:]@_:]*\\)?[ \t]*$"))
nil t)
- (setq org-goto-start-pos (match-beginning 0))))
+ (setq org-goto-start-pos (match-beginning 0))
+ (when fastp
+ (goto-char (point-max))
+ (unless (bolp) (newline))
+ (insert "* " heading "\n")
+ (setq org-goto-start-pos (point-at-bol 0)))))
;; Ask the User for a location
- (setq spos (if fastp
- org-goto-start-pos
- (org-get-location (current-buffer) org-remember-help)))
+ (if fastp
+ (setq spos org-goto-start-pos
+ exitcmd 'return)
+ (setq spos (org-get-location (current-buffer) org-remember-help)
+ exitcmd (cdr spos)
+ spos (car spos)))
(if (not spos) (throw 'quit nil)) ; return nil to show we did
; not handle this note
(goto-char spos)
- (cond ((and (bobp) (not reversed))
+ (cond ((org-on-heading-p t)
+ (org-back-to-heading t)
+ (setq level (funcall outline-level))
+ (cond
+ ((eq exitcmd 'return)
+ ;; sublevel of current
+ (setq org-remember-previous-location
+ (cons (abbreviate-file-name file)
+ (org-get-heading 'notags)))
+ (if reversed
+ (outline-next-heading)
+ (org-end-of-subtree)
+ (if (not (bolp))
+ (if (looking-at "[ \t]*\n")
+ (beginning-of-line 2)
+ (end-of-line 1)
+ (insert "\n"))))
+ (bookmark-set "org-remember-last-stored")
+ (org-paste-subtree (org-get-legal-level level 1) txt))
+ ((eq exitcmd 'left)
+ ;; before current
+ (bookmark-set "org-remember-last-stored")
+ (org-paste-subtree level txt))
+ ((eq exitcmd 'right)
+ ;; after current
+ (org-end-of-subtree t)
+ (bookmark-set "org-remember-last-stored")
+ (org-paste-subtree level txt))
+ (t (error "This should not happen"))))
+
+ ((and (bobp) (not reversed))
;; Put it at the end, one level below level 1
(save-restriction
(widen)
(goto-char (point-max))
(if (not (bolp)) (newline))
+ (bookmark-set "org-remember-last-stored")
(org-paste-subtree (org-get-legal-level 1 1) txt)))
+
((and (bobp) reversed)
;; Put it at the start, as level 1
(save-restriction
(widen)
(goto-char (point-min))
- (re-search-forward "^\\*" nil t)
+ (re-search-forward "^\\*+ " nil t)
(beginning-of-line 1)
+ (bookmark-set "org-remember-last-stored")
(org-paste-subtree 1 txt)))
- ((and (org-on-heading-p t) (not current-prefix-arg))
- ;; Put it below this entry, at the beg/end of the subtree
- (org-back-to-heading t)
- (setq level (funcall outline-level))
- (if reversed
- (outline-next-heading)
- (org-end-of-subtree t))
- (if (not (bolp)) (newline))
- (beginning-of-line 1)
- (org-paste-subtree (org-get-legal-level level 1) txt))
(t
;; Put it right there, with automatic level determined by
;; org-paste-subtree or from prefix arg
+ (bookmark-set "org-remember-last-stored")
(org-paste-subtree
(if (numberp current-prefix-arg) current-prefix-arg)
txt)))
(when remember-save-after-remembering
(save-buffer)
(if (not visiting) (kill-buffer (current-buffer)))))))))
+
t) ;; return t to indicate that we took care of this note.
(defun org-get-org-file ()
@@ -11601,6 +13735,159 @@ See also the variable `org-reverse-note-order'."
(throw 'exit (cdr entry))))
nil)))))
+;;; Refiling
+
+(defvar org-refile-target-table nil
+ "The list of refile targets, created by `org-refile'.")
+
+(defvar org-agenda-new-buffers nil
+ "Buffers created to visit agenda files.")
+
+(defun org-get-refile-targets ()
+ "Produce a table with refile targets."
+ (let ((entries org-refile-targets)
+ org-agenda-new-files targets txt re files f desc descre)
+ (while (setq entry (pop entries))
+ (setq files (car entry) desc (cdr entry))
+ (cond
+ ((null files) (setq files (list (current-buffer))))
+ ((eq files 'org-agenda-files)
+ (setq files (org-agenda-files 'unrestricted)))
+ ((and (symbolp files) (fboundp files))
+ (setq files (funcall files)))
+ ((and (symbolp files) (boundp files))
+ (setq files (symbol-value files))))
+ (if (stringp files) (setq files (list files)))
+ (cond
+ ((eq (car desc) :tag)
+ (setq descre (concat "^\\*+[ \t]+.*?:" (regexp-quote (cdr desc)) ":")))
+ ((eq (car desc) :todo)
+ (setq descre (concat "^\\*+[ \t]+" (regexp-quote (cdr desc)) "[ \t]")))
+ ((eq (car desc) :regexp)
+ (setq descre (cdr desc)))
+ ((eq (car desc) :level)
+ (setq descre (concat "^\\*\\{" (number-to-string
+ (if org-odd-levels-only
+ (1- (* 2 (cdr desc)))
+ (cdr desc)))
+ "\\}[ \t]")))
+ ((eq (car desc) :maxlevel)
+ (setq descre (concat "^\\*\\{1," (number-to-string
+ (if org-odd-levels-only
+ (1- (* 2 (cdr desc)))
+ (cdr desc)))
+ "\\}[ \t]")))
+ (t (error "Bad refiling target description %s" desc)))
+ (while (setq f (pop files))
+ (save-excursion
+ (set-buffer (if (bufferp f) f (org-get-agenda-file-buffer f)))
+ (if (bufferp f) (setq f (buffer-file-name (buffer-base-buffer f))))
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (while (re-search-forward descre nil t)
+ (goto-char (point-at-bol))
+ (when (looking-at org-complex-heading-regexp)
+ (setq txt (match-string 4)
+ re (concat "^" (regexp-quote
+ (buffer-substring (match-beginning 1)
+ (match-end 4)))))
+ (if (match-end 5) (setq re (concat re "[ \t]+"
+ (regexp-quote
+ (match-string 5)))))
+ (setq re (concat re "[ \t]*$"))
+ (when org-refile-use-outline-path
+ (setq txt (mapconcat 'identity
+ (append
+ (if (eq org-refile-use-outline-path 'file)
+ (list (file-name-nondirectory
+ (buffer-file-name (buffer-base-buffer))))
+ (if (eq org-refile-use-outline-path 'full-file-path)
+ (list (buffer-file-name (buffer-base-buffer)))))
+ (org-get-outline-path)
+ (list txt))
+ "/")))
+ (push (list txt f re (point)) targets))
+ (goto-char (point-at-eol))))))))
+ (org-release-buffers org-agenda-new-buffers)
+ (nreverse targets)))
+
+(defun org-get-outline-path ()
+ (let (rtn)
+ (save-excursion
+ (while (org-up-heading-safe)
+ (when (looking-at org-complex-heading-regexp)
+ (push (org-match-string-no-properties 4) rtn)))
+ rtn)))
+
+(defvar org-refile-history nil
+ "History for refiling operations.")
+
+(defun org-refile (&optional reversed-or-update)
+ "Move the entry at point to another heading.
+The list of target headings is compiled using the information in
+`org-refile-targets', which see. This list is created upon first use, and
+you can update it by calling this command with a double prefix (`C-u C-u').
+
+At the target location, the entry is filed as a subitem of the target heading.
+Depending on `org-reverse-note-order', the new subitem will either be the
+first of the last subitem. A single C-u prefix will toggle the value of this
+variable for the duration of the command."
+ (interactive "P")
+ (if (equal reversed-or-update '(16))
+ (progn
+ (setq org-refile-target-table (org-get-refile-targets))
+ (message "Refile targets updated (%d targets)"
+ (length org-refile-target-table)))
+ (when (or (not org-refile-target-table)
+ (and (= (length org-refile-targets) 1)
+ (not (caar org-refile-targets))))
+ (setq org-refile-target-table (org-get-refile-targets)))
+ (unless org-refile-target-table
+ (error "No refile targets"))
+ (let* ((cbuf (current-buffer))
+ (filename (buffer-file-name (buffer-base-buffer cbuf)))
+ (fname (and filename (file-truename filename)))
+ (tbl (mapcar
+ (lambda (x)
+ (if (not (equal fname (file-truename (nth 1 x))))
+ (cons (concat (car x) " (" (file-name-nondirectory
+ (nth 1 x)) ")")
+ (cdr x))
+ x))
+ org-refile-target-table))
+ (completion-ignore-case t)
+ pos it nbuf file re level reversed)
+ (when (setq it (completing-read "Refile to: " tbl
+ nil t nil 'org-refile-history))
+ (setq it (assoc it tbl)
+ file (nth 1 it)
+ re (nth 2 it))
+ (org-copy-special)
+ (save-excursion
+ (set-buffer (setq nbuf (or (find-buffer-visiting file)
+ (find-file-noselect file))))
+ (setq reversed (org-notes-order-reversed-p))
+ (if (equal reversed-or-update '(16)) (setq reversed (not reversed)))
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (unless (re-search-forward re nil t)
+ (error "Cannot find target location - try again with `C-u' prefix."))
+ (goto-char (match-beginning 0))
+ (looking-at outline-regexp)
+ (setq level (org-get-legal-level (funcall outline-level) 1))
+ (goto-char (or (save-excursion
+ (if reversed
+ (outline-next-heading)
+ (outline-get-next-sibling)))
+ (point-max)))
+ (org-paste-subtree level))))
+ (org-cut-special)
+ (message "Entry refiled to \"%s\"" (car it))))))
+
;;;; Dynamic blocks
(defun org-find-dblock (name)
@@ -11642,7 +13929,7 @@ the property list including an extra property :name with the block name."
(unless (looking-at org-dblock-start-re)
(error "Not at a dynamic block"))
(let* ((begdel (1+ (match-end 0)))
- (name (match-string 1))
+ (name (org-no-properties (match-string 1)))
(params (append (list :name name)
(read (concat "(" (match-string 3) ")")))))
(unless (re-search-forward org-dblock-end-re nil t)
@@ -11683,12 +13970,16 @@ blocks in the buffer."
"Update the dynamic block at point
This means to empty the block, parse for parameters and then call
the correct writing function."
- (let* ((pos (point))
- (params (org-prepare-dblock))
- (name (plist-get params :name))
- (cmd (intern (concat "org-dblock-write:" name))))
- (funcall cmd params)
- (goto-char pos)))
+ (save-window-excursion
+ (let* ((pos (point))
+ (line (org-current-line))
+ (params (org-prepare-dblock))
+ (name (plist-get params :name))
+ (cmd (intern (concat "org-dblock-write:" name))))
+ (message "Updating dynamic block `%s' at line %d..." name line)
+ (funcall cmd params)
+ (message "Updating dynamic block `%s' at line %d...done" name line)
+ (goto-char pos))))
(defun org-beginning-of-dblock ()
"Find the beginning of the dynamic block at point.
@@ -11713,6 +14004,11 @@ This function can be used in a hook."
;;;; Completion
+(defconst org-additional-option-like-keywords
+ '("BEGIN_HTML" "BEGIN_LaTeX" "END_HTML" "END_LaTeX"
+ "ORGTBL" "HTML:" "LaTeX:" "BEGIN:" "END:" "DATE:" "TBLFM"
+ "BEGIN_EXAMPLE" "END_EXAMPLE"))
+
(defun org-complete (&optional arg)
"Perform completion on word at point.
At the beginning of a headline, this completes TODO keywords as given in
@@ -11722,94 +14018,108 @@ that are supported for HTML support.
If the current word is preceded by \"#+\", completes special words for
setting file options.
In the line after \"#+STARTUP:, complete valid keywords.\"
-At all other locations, this simply calls `ispell-complete-word'."
+At all other locations, this simply calls the value of
+`org-completion-fallback-command'."
(interactive "P")
- (catch 'exit
- (let* ((end (point))
- (beg1 (save-excursion
- (skip-chars-backward "a-zA-Z0-9_@")
+ (org-without-partial-completion
+ (catch 'exit
+ (let* ((end (point))
+ (beg1 (save-excursion
+ (skip-chars-backward (org-re "[:alnum:]_@"))
+ (point)))
+ (beg (save-excursion
+ (skip-chars-backward "a-zA-Z0-9_:$")
(point)))
- (beg (save-excursion
- (skip-chars-backward "a-zA-Z0-9_:$")
- (point)))
- (confirm (lambda (x) (stringp (car x))))
- (searchhead (equal (char-before beg) ?*))
- (tag (equal (char-before beg1) ?:))
- (texp (equal (char-before beg) ?\\))
- (link (equal (char-before beg) ?\[))
- (opt (equal (buffer-substring (max (point-at-bol) (- beg 2))
- beg)
- "#+"))
- (startup (string-match "^#\\+STARTUP:.*"
- (buffer-substring (point-at-bol) (point))))
- (completion-ignore-case opt)
- (type nil)
- (tbl nil)
- (table (cond
- (opt
- (setq type :opt)
- (mapcar (lambda (x)
- (string-match "^#\\+\\(\\([A-Z_]+:?\\).*\\)" x)
- (cons (match-string 2 x) (match-string 1 x)))
- (org-split-string (org-get-current-options) "\n")))
- (startup
- (setq type :startup)
- org-startup-options)
- (link (append org-link-abbrev-alist-local
- org-link-abbrev-alist))
- (texp
- (setq type :tex)
- org-html-entities)
- ((string-match "\\`\\*+[ \t]*\\'"
- (buffer-substring (point-at-bol) beg))
- (setq type :todo)
- (mapcar 'list org-todo-keywords-1))
- (searchhead
- (setq type :searchhead)
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward org-todo-line-regexp nil t)
- (push (list
- (org-make-org-heading-search-string
- (match-string 3) t))
- tbl)))
- tbl)
- (tag (setq type :tag beg beg1)
- (or org-tag-alist (org-get-buffer-tags)))
- (t (progn (ispell-complete-word arg) (throw 'exit nil)))))
- (pattern (buffer-substring-no-properties beg end))
- (completion (try-completion pattern table confirm)))
- (cond ((eq completion t)
- (if (equal type :opt)
- (insert (substring (cdr (assoc (upcase pattern) table))
- (length pattern)))
- (if (equal type :tag) (insert ":"))))
- ((null completion)
- (message "Can't find completion for \"%s\"" pattern)
- (ding))
- ((not (string= pattern completion))
- (delete-region beg end)
- (if (string-match " +$" completion)
- (setq completion (replace-match "" t t completion)))
- (insert completion)
- (if (get-buffer-window "*Completions*")
- (delete-window (get-buffer-window "*Completions*")))
- (if (assoc completion table)
- (if (eq type :todo) (insert " ")
- (if (eq type :tag) (insert ":"))))
- (if (and (equal type :opt) (assoc completion table))
- (message "%s" (substitute-command-keys
- "Press \\[org-complete] again to insert example settings"))))
- (t
- (message "Making completion list...")
- (let ((list (sort (all-completions pattern table confirm)
- 'string<)))
- (with-output-to-temp-buffer "*Completions*"
- (condition-case nil
- ;; Protection needed for XEmacs and emacs 21
- (display-completion-list list pattern)
- (error (display-completion-list list)))))
- (message "Making completion list...%s" "done"))))))
+ (confirm (lambda (x) (stringp (car x))))
+ (searchhead (equal (char-before beg) ?*))
+ (tag (and (equal (char-before beg1) ?:)
+ (equal (char-after (point-at-bol)) ?*)))
+ (prop (and (equal (char-before beg1) ?:)
+ (not (equal (char-after (point-at-bol)) ?*))))
+ (texp (equal (char-before beg) ?\\))
+ (link (equal (char-before beg) ?\[))
+ (opt (equal (buffer-substring (max (point-at-bol) (- beg 2))
+ beg)
+ "#+"))
+ (startup (string-match "^#\\+STARTUP:.*"
+ (buffer-substring (point-at-bol) (point))))
+ (completion-ignore-case opt)
+ (type nil)
+ (tbl nil)
+ (table (cond
+ (opt
+ (setq type :opt)
+ (append
+ (mapcar
+ (lambda (x)
+ (string-match "^#\\+\\(\\([A-Z_]+:?\\).*\\)" x)
+ (cons (match-string 2 x) (match-string 1 x)))
+ (org-split-string (org-get-current-options) "\n"))
+ (mapcar 'list org-additional-option-like-keywords)))
+ (startup
+ (setq type :startup)
+ org-startup-options)
+ (link (append org-link-abbrev-alist-local
+ org-link-abbrev-alist))
+ (texp
+ (setq type :tex)
+ org-html-entities)
+ ((string-match "\\`\\*+[ \t]+\\'"
+ (buffer-substring (point-at-bol) beg))
+ (setq type :todo)
+ (mapcar 'list org-todo-keywords-1))
+ (searchhead
+ (setq type :searchhead)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward org-todo-line-regexp nil t)
+ (push (list
+ (org-make-org-heading-search-string
+ (match-string 3) t))
+ tbl)))
+ tbl)
+ (tag (setq type :tag beg beg1)
+ (or org-tag-alist (org-get-buffer-tags)))
+ (prop (setq type :prop beg beg1)
+ (mapcar 'list (org-buffer-property-keys)))
+ (t (progn
+ (call-interactively org-completion-fallback-command)
+ (throw 'exit nil)))))
+ (pattern (buffer-substring-no-properties beg end))
+ (completion (try-completion pattern table confirm)))
+ (cond ((eq completion t)
+ (if (not (assoc (upcase pattern) table))
+ (message "Already complete")
+ (if (equal type :opt)
+ (insert (substring (cdr (assoc (upcase pattern) table))
+ (length pattern)))
+ (if (memq type '(:tag :prop)) (insert ":")))))
+ ((null completion)
+ (message "Can't find completion for \"%s\"" pattern)
+ (ding))
+ ((not (string= pattern completion))
+ (delete-region beg end)
+ (if (string-match " +$" completion)
+ (setq completion (replace-match "" t t completion)))
+ (insert completion)
+ (if (get-buffer-window "*Completions*")
+ (delete-window (get-buffer-window "*Completions*")))
+ (if (assoc completion table)
+ (if (eq type :todo) (insert " ")
+ (if (memq type '(:tag :prop)) (insert ":"))))
+ (if (and (equal type :opt) (assoc completion table))
+ (message "%s" (substitute-command-keys
+ "Press \\[org-complete] again to insert example settings"))))
+ (t
+ (message "Making completion list...")
+ (let ((list (sort (all-completions pattern table confirm)
+ 'string<)))
+ (with-output-to-temp-buffer "*Completions*"
+ (condition-case nil
+ ;; Protection needed for XEmacs and emacs 21
+ (display-completion-list list pattern)
+ (error (display-completion-list list)))))
+ (message "Making completion list...%s" "done")))))))
;;;; TODO, DEADLINE, Comments
@@ -11818,19 +14128,81 @@ At all other locations, this simply calls `ispell-complete-word'."
(interactive)
(save-excursion
(org-back-to-heading)
- (if (looking-at (concat outline-regexp
- "\\( +\\<" org-comment-string "\\>\\)"))
- (replace-match "" t t nil 1)
- (if (looking-at outline-regexp)
- (progn
- (goto-char (match-end 0))
- (insert " " org-comment-string))))))
+ (let (case-fold-search)
+ (if (looking-at (concat outline-regexp
+ "\\( *\\<" org-comment-string "\\>[ \t]*\\)"))
+ (replace-match "" t t nil 1)
+ (if (looking-at outline-regexp)
+ (progn
+ (goto-char (match-end 0))
+ (insert org-comment-string " ")))))))
(defvar org-last-todo-state-is-todo nil
"This is non-nil when the last TODO state change led to a TODO state.
If the last change removed the TODO tag or switched to DONE, then
this is nil.")
+(defvar org-setting-tags nil) ; dynamically skiped
+
+;; FIXME: better place
+(defun org-property-or-variable-value (var &optional inherit)
+ "Check if there is a property fixing the value of VAR.
+If yes, return this value. If not, return the current value of the variable."
+ (let ((prop (org-entry-get nil (symbol-name var) inherit)))
+ (if (and prop (stringp prop) (string-match "\\S-" prop))
+ (read prop)
+ (symbol-value var))))
+
+(defun org-parse-local-options (string var)
+ "Parse STRING for startup setting relevant for variable VAR."
+ (let ((rtn (symbol-value var))
+ e opts)
+ (save-match-data
+ (if (or (not string) (not (string-match "\\S-" string)))
+ rtn
+ (setq opts (delq nil (mapcar (lambda (x)
+ (setq e (assoc x org-startup-options))
+ (if (eq (nth 1 e) var) e nil))
+ (org-split-string string "[ \t]+"))))
+ (if (not opts)
+ rtn
+ (setq rtn nil)
+ (while (setq e (pop opts))
+ (if (not (nth 3 e))
+ (setq rtn (nth 2 e))
+ (if (not (listp rtn)) (setq rtn nil))
+ (push (nth 2 e) rtn)))
+ rtn)))))
+
+(defvar org-blocker-hook nil
+ "Hook for functions that are allowed to block a state change.
+
+Each function gets as its single argument a property list, see
+`org-trigger-hook' for more information about this list.
+
+If any of the functions in this hook returns nil, the state change
+is blocked.")
+
+(defvar org-trigger-hook nil
+ "Hook for functions that are triggered by a state change.
+
+Each function gets as its single argument a property list with at least
+the following elements:
+
+ (:type type-of-change :position pos-at-entry-start
+ :from old-state :to new-state)
+
+Depending on the type, more properties may be present.
+
+This mechanism is currently implemented for:
+
+TODO state changes
+------------------
+:type todo-state-change
+:from previous state (keyword as a string), or nil
+:to new state (keyword as a string), or nil")
+
+
(defun org-todo (&optional arg)
"Change the TODO state of an item.
The state of an item is given by a keyword at the start of the heading,
@@ -11857,109 +14229,153 @@ For calling through lisp, arg is also interpreted in the following way:
really is a member of `org-todo-keywords'."
(interactive "P")
(save-excursion
- (org-back-to-heading)
- (if (looking-at outline-regexp) (goto-char (match-end 0)))
- (or (looking-at (concat " +" org-todo-regexp " *"))
- (looking-at " *"))
- (let* ((this (match-string 1))
- (head (org-get-todo-sequence-head this))
- (ass (assoc head org-todo-kwd-alist))
- (interpret (nth 1 ass))
- (done-word (nth 3 ass))
- (final-done-word (nth 4 ass))
- (last-state (or this ""))
- (completion-ignore-case t)
- (member (member this org-todo-keywords-1))
- (tail (cdr member))
- (state (cond
- ((equal arg '(4))
- ;; Read a state with completion
- (completing-read "State: " (mapcar (lambda(x) (list x))
- org-todo-keywords-1)
- nil t))
- ((eq arg 'right)
- (if this
- (if tail (car tail) nil)
- (car org-todo-keywords-1)))
- ((eq arg 'left)
- (if (equal member org-todo-keywords-1)
- nil
+ (catch 'exit
+ (org-back-to-heading)
+ (if (looking-at outline-regexp) (goto-char (1- (match-end 0))))
+ (or (looking-at (concat " +" org-todo-regexp " *"))
+ (looking-at " *"))
+ (let* ((match-data (match-data))
+ (startpos (point-at-bol))
+ (logging (save-match-data (org-entry-get nil "LOGGING" t)))
+ (org-log-done (org-parse-local-options logging 'org-log-done))
+ (org-log-repeat (org-parse-local-options logging 'org-log-repeat))
+ (this (match-string 1))
+ (hl-pos (match-beginning 0))
+ (head (org-get-todo-sequence-head this))
+ (ass (assoc head org-todo-kwd-alist))
+ (interpret (nth 1 ass))
+ (done-word (nth 3 ass))
+ (final-done-word (nth 4 ass))
+ (last-state (or this ""))
+ (completion-ignore-case t)
+ (member (member this org-todo-keywords-1))
+ (tail (cdr member))
+ (state (cond
+ ((and org-todo-key-trigger
+ (or (and (equal arg '(4)) (eq org-use-fast-todo-selection 'prefix))
+ (and (not arg) org-use-fast-todo-selection
+ (not (eq org-use-fast-todo-selection 'prefix)))))
+ ;; Use fast selection
+ (org-fast-todo-selection))
+ ((and (equal arg '(4))
+ (or (not org-use-fast-todo-selection)
+ (not org-todo-key-trigger)))
+ ;; Read a state with completion
+ (completing-read "State: " (mapcar (lambda(x) (list x))
+ org-todo-keywords-1)
+ nil t))
+ ((eq arg 'right)
(if this
- (nth (- (length org-todo-keywords-1) (length tail) 2)
- org-todo-keywords-1)
- (org-last org-todo-keywords-1))))
- (arg
- ;; user or caller requests a specific state
- (cond
- ((equal arg "") nil)
- ((eq arg 'none) nil)
- ((eq arg 'done) (or done-word (car org-done-keywords)))
- ((eq arg 'nextset)
- (or (car (cdr (member head org-todo-heads)))
- (car org-todo-heads)))
- ((eq arg 'previousset)
- (let ((org-todo-heads (reverse org-todo-heads)))
+ (if tail (car tail) nil)
+ (car org-todo-keywords-1)))
+ ((eq arg 'left)
+ (if (equal member org-todo-keywords-1)
+ nil
+ (if this
+ (nth (- (length org-todo-keywords-1) (length tail) 2)
+ org-todo-keywords-1)
+ (org-last org-todo-keywords-1))))
+ ((and (eq org-use-fast-todo-selection t) (equal arg '(4))
+ (setq arg nil))) ; hack to fall back to cycling
+ (arg
+ ;; user or caller requests a specific state
+ (cond
+ ((equal arg "") nil)
+ ((eq arg 'none) nil)
+ ((eq arg 'done) (or done-word (car org-done-keywords)))
+ ((eq arg 'nextset)
(or (car (cdr (member head org-todo-heads)))
- (car org-todo-heads))))
- ((car (member arg org-todo-keywords-1)))
- ((nth (1- (prefix-numeric-value arg))
+ (car org-todo-heads)))
+ ((eq arg 'previousset)
+ (let ((org-todo-heads (reverse org-todo-heads)))
+ (or (car (cdr (member head org-todo-heads)))
+ (car org-todo-heads))))
+ ((car (member arg org-todo-keywords-1)))
+ ((nth (1- (prefix-numeric-value arg))
org-todo-keywords-1))))
- ((null member) (or head (car org-todo-keywords-1)))
- ((equal this final-done-word) nil) ;; -> make empty
- ((null tail) nil) ;; -> first entry
- ((eq interpret 'sequence)
- (car tail))
- ((memq interpret '(type priority))
- (if (eq this-command last-command)
- (car tail)
- (if (> (length tail) 0)
- (or done-word (car org-done-keywords))
- nil)))
- (t nil)))
- (next (if state (concat " " state " ") " "))
- dostates)
- (replace-match next t t)
- (unless head
- (setq head (org-get-todo-sequence-head state)
- ass (assoc head org-todo-kwd-alist)
- interpret (nth 1 ass)
- done-word (nth 3 ass)
- final-done-word (nth 4 ass)))
- (when (memq arg '(nextset previousset))
- (message "Keyword set: %s"
- (mapconcat 'identity (assoc state org-todo-sets) " ")))
- (setq org-last-todo-state-is-todo
- (not (member state org-done-keywords)))
- (when (and org-log-done (not (memq arg '(nextset previousset))))
- (setq dostates (and (eq interpret 'sequence)
- (listp org-log-done) (memq 'state org-log-done)))
- (cond
- ((and state (not this))
- (org-add-planning-info nil nil 'closed)
- (and dostates (org-add-log-maybe 'state state 'findpos)))
- ((and state dostates)
- (org-add-log-maybe 'state state 'findpos))
- ((member state org-done-keywords)
- ;; Planning info calls the note-setting command.
- (org-add-planning-info 'closed (org-current-time)
- (if (org-get-repeat) nil 'scheduled))
- (org-add-log-maybe 'done state 'findpos))))
- ;; Fixup tag positioning
- (and org-auto-align-tags (org-set-tags nil t))
- (run-hooks 'org-after-todo-state-change-hook)
- (and (member state org-done-keywords) (org-auto-repeat-maybe))
- (if (and arg (not (member state org-done-keywords)))
- (setq head (org-get-todo-sequence-head state)))
- (put-text-property (point-at-bol) (point-at-eol) 'org-todo-head head)))
- ;; Fixup cursor location if close to the keyword
- (if (and (outline-on-heading-p)
- (not (bolp))
- (save-excursion (beginning-of-line 1)
- (looking-at org-todo-line-regexp))
- (< (point) (+ 2 (or (match-end 2) (match-end 1)))))
- (progn
- (goto-char (or (match-end 2) (match-end 1)))
- (just-one-space))))
+ ((null member) (or head (car org-todo-keywords-1)))
+ ((equal this final-done-word) nil) ;; -> make empty
+ ((null tail) nil) ;; -> first entry
+ ((eq interpret 'sequence)
+ (car tail))
+ ((memq interpret '(type priority))
+ (if (eq this-command last-command)
+ (car tail)
+ (if (> (length tail) 0)
+ (or done-word (car org-done-keywords))
+ nil)))
+ (t nil)))
+ (next (if state (concat " " state " ") " "))
+ (change-plist (list :type 'todo-state-change :from this :to state
+ :position startpos))
+ dostates)
+ (when org-blocker-hook
+ (unless (save-excursion
+ (save-match-data
+ (run-hook-with-args-until-failure
+ 'org-blocker-hook change-plist)))
+ (if (interactive-p)
+ (error "TODO state change from %s to %s blocked" this state)
+ ;; fail silently
+ (message "TODO state change from %s to %s blocked" this state)
+ (throw 'exit nil))))
+ (store-match-data match-data)
+ (replace-match next t t)
+ (unless (pos-visible-in-window-p hl-pos)
+ (message "TODO state changed to %s" (org-trim next)))
+ (unless head
+ (setq head (org-get-todo-sequence-head state)
+ ass (assoc head org-todo-kwd-alist)
+ interpret (nth 1 ass)
+ done-word (nth 3 ass)
+ final-done-word (nth 4 ass)))
+ (when (memq arg '(nextset previousset))
+ (message "Keyword-Set %d/%d: %s"
+ (- (length org-todo-sets) -1
+ (length (memq (assoc state org-todo-sets) org-todo-sets)))
+ (length org-todo-sets)
+ (mapconcat 'identity (assoc state org-todo-sets) " ")))
+ (setq org-last-todo-state-is-todo
+ (not (member state org-done-keywords)))
+ (when (and org-log-done (not (memq arg '(nextset previousset))))
+ (setq dostates (and (listp org-log-done) (memq 'state org-log-done)
+ (or (not org-todo-log-states)
+ (member state org-todo-log-states))))
+
+ (cond
+ ((and state (member state org-not-done-keywords)
+ (not (member this org-not-done-keywords)))
+ ;; This is now a todo state and was not one before
+ ;; Remove any CLOSED timestamp, and possibly log the state change
+ (org-add-planning-info nil nil 'closed)
+ (and dostates (org-add-log-maybe 'state state 'findpos)))
+ ((and state dostates)
+ ;; This is a non-nil state, and we need to log it
+ (org-add-log-maybe 'state state 'findpos))
+ ((and (member state org-done-keywords)
+ (not (member this org-done-keywords)))
+ ;; It is now done, and it was not done before
+ (org-add-planning-info 'closed (org-current-time))
+ (org-add-log-maybe 'done state 'findpos))))
+ ;; Fixup tag positioning
+ (and org-auto-align-tags (not org-setting-tags) (org-set-tags nil t))
+ (run-hooks 'org-after-todo-state-change-hook)
+ (and (member state org-done-keywords) (org-auto-repeat-maybe))
+ (if (and arg (not (member state org-done-keywords)))
+ (setq head (org-get-todo-sequence-head state)))
+ (put-text-property (point-at-bol) (point-at-eol) 'org-todo-head head)
+ ;; Fixup cursor location if close to the keyword
+ (if (and (outline-on-heading-p)
+ (not (bolp))
+ (save-excursion (beginning-of-line 1)
+ (looking-at org-todo-line-regexp))
+ (< (point) (+ 2 (or (match-end 2) (match-end 1)))))
+ (progn
+ (goto-char (or (match-end 2) (match-end 1)))
+ (just-one-space)))
+ (when org-trigger-hook
+ (save-excursion
+ (run-hook-with-args 'org-trigger-hook change-plist)))))))
(defun org-get-todo-sequence-head (kwd)
"Return the head of the TODO sequence to which KWD belongs.
@@ -11977,6 +14393,65 @@ right sequence."
(car org-todo-keywords-1))
(t (nth 2 (assoc kwd org-todo-kwd-alist))))))
+(defun org-fast-todo-selection ()
+ "Fast TODO keyword selection with single keys.
+Returns the new TODO keyword, or nil if no state change should occur."
+ (let* ((fulltable org-todo-key-alist)
+ (done-keywords org-done-keywords) ;; needed for the faces.
+ (maxlen (apply 'max (mapcar
+ (lambda (x)
+ (if (stringp (car x)) (string-width (car x)) 0))
+ fulltable)))
+ (expert nil)
+ (fwidth (+ maxlen 3 1 3))
+ (ncol (/ (- (window-width) 4) fwidth))
+ tg cnt e c tbl
+ groups ingroup)
+ (save-window-excursion
+ (if expert
+ (set-buffer (get-buffer-create " *Org todo*"))
+ (org-switch-to-buffer-other-window (get-buffer-create " *Org todo*")))
+ (erase-buffer)
+ (org-set-local 'org-done-keywords done-keywords)
+ (setq tbl fulltable cnt 0)
+ (while (setq e (pop tbl))
+ (cond
+ ((equal e '(:startgroup))
+ (push '() groups) (setq ingroup t)
+ (when (not (= cnt 0))
+ (setq cnt 0)
+ (insert "\n"))
+ (insert "{ "))
+ ((equal e '(:endgroup))
+ (setq ingroup nil cnt 0)
+ (insert "}\n"))
+ (t
+ (setq tg (car e) c (cdr e))
+ (if ingroup (push tg (car groups)))
+ (setq tg (org-add-props tg nil 'face
+ (org-get-todo-face tg)))
+ (if (and (= cnt 0) (not ingroup)) (insert " "))
+ (insert "[" c "] " tg (make-string
+ (- fwidth 4 (length tg)) ?\ ))
+ (when (= (setq cnt (1+ cnt)) ncol)
+ (insert "\n")
+ (if ingroup (insert " "))
+ (setq cnt 0)))))
+ (insert "\n")
+ (goto-char (point-min))
+ (if (and (not expert) (fboundp 'fit-window-to-buffer))
+ (fit-window-to-buffer))
+ (message "[a-z..]:Set [SPC]:clear")
+ (setq c (let ((inhibit-quit t)) (read-char-exclusive)))
+ (cond
+ ((or (= c ?\C-g)
+ (and (= c ?q) (not (rassoc c fulltable))))
+ (setq quit-flag t))
+ ((= c ?\ ) nil)
+ ((setq e (rassoc c fulltable) tg (car e))
+ tg)
+ (t (setq quit-flag t))))))
+
(defun org-get-repeat ()
"Check if tere is a deadline/schedule with repeater in this entry."
(save-match-data
@@ -12027,7 +14502,7 @@ This function should be run in the `org-after-todo-state-change-hook'."
(org-timestamp-change n (cdr (assoc what whata))))
(setq msg (concat msg type org-last-changed-timestamp " ")))
(setq org-log-post-message msg)
- (message msg))))
+ (message "%s" msg))))
(defun org-show-todo-tree (arg)
"Make a compact tree which shows all headlines marked with TODO.
@@ -12051,21 +14526,27 @@ of `org-todo-keywords-1'."
org-todo-keywords-1)))
(t (error "Invalid prefix argument: %s" arg)))))
(message "%d TODO entries found"
- (org-occur (concat "^" outline-regexp " +" kwd-re )))))
+ (org-occur (concat "^" outline-regexp " *" kwd-re )))))
-(defun org-deadline ()
- "Insert the DEADLINE: string to make a deadline.
-A timestamp is also inserted - use \\[org-timestamp-up] and \\[org-timestamp-down]
-to modify it to the correct date."
- (interactive)
- (org-add-planning-info 'deadline nil 'closed))
+(defun org-deadline (&optional remove)
+ "Insert the \"DEADLINE:\" string with a timestamp to make a deadline.
+With argument REMOVE, remove any deadline from the item."
+ (interactive "P")
+ (if remove
+ (progn
+ (org-add-planning-info nil nil 'deadline)
+ (message "Item no longer has a deadline."))
+ (org-add-planning-info 'deadline nil 'closed)))
-(defun org-schedule ()
- "Insert the SCHEDULED: string to schedule a TODO item.
-A timestamp is also inserted - use \\[org-timestamp-up] and \\[org-timestamp-down]
-to modify it to the correct date."
- (interactive)
- (org-add-planning-info 'scheduled nil 'closed))
+(defun org-schedule (&optional remove)
+ "Insert the SCHEDULED: string with a timestamp to schedule a TODO item.
+With argument REMOVE, remove any scheduling date from the item."
+ (interactive "P")
+ (if remove
+ (progn
+ (org-add-planning-info nil nil 'scheduled)
+ (message "Item is no longer scheduled."))
+ (org-add-planning-info 'scheduled nil 'closed)))
(defun org-add-planning-info (what &optional time &rest remove)
"Insert new timestamp with keyword in the line directly after the headline.
@@ -12090,13 +14571,14 @@ be removed."
(looking-at (concat outline-regexp "\\( *\\)[^\r\n]*"))
(goto-char (match-end 1))
(setq col (current-column))
- (goto-char (1+ (match-end 0)))
+ (goto-char (match-end 0))
+ (if (eobp) (insert "\n") (forward-char 1))
(if (and (not (looking-at outline-regexp))
(looking-at (concat "[^\r\n]*?" org-keyword-time-regexp
"[^\r\n]*"))
(not (equal (match-string 1) org-clock-string)))
(narrow-to-region (match-beginning 0) (match-end 0))
- (insert "\n")
+ (insert-before-markers "\n")
(backward-char 1)
(narrow-to-region (point) (point))
(indent-to-column col))
@@ -12122,12 +14604,12 @@ be removed."
((eq what 'deadline) org-deadline-string)
((eq what 'closed) org-closed-string))
" ")
- (org-insert-time-stamp
- time
- (or org-time-was-given
- (and (eq what 'closed) org-log-done-with-time))
- (eq what 'closed)
- nil nil (list org-end-time-was-given))
+ (setq ts (org-insert-time-stamp
+ time
+ (or org-time-was-given
+ (and (eq what 'closed) org-log-done-with-time))
+ (eq what 'closed)
+ nil nil (list org-end-time-was-given)))
(end-of-line 1))
(goto-char (point-min))
(widen)
@@ -12154,12 +14636,24 @@ The auto-repeater uses this.")
(looking-at (concat outline-regexp "\\( *\\)[^\r\n]*"
"\\(\n[^\r\n]*?" org-keyword-time-not-clock-regexp
"[^\r\n]*\\)?"))
- (goto-char (match-end 0)))
+ (goto-char (match-end 0))
+ (unless org-log-states-order-reversed
+ (and (= (char-after) ?\n) (forward-char 1))
+ (org-skip-over-state-notes)
+ (skip-chars-backward " \t\n\r")))
(move-marker org-log-note-marker (point))
(setq org-log-note-purpose purpose)
(setq org-log-note-state state)
(add-hook 'post-command-hook 'org-add-log-note 'append))))
+(defun org-skip-over-state-notes ()
+ "Skip past the list of State notes in an entry."
+ (if (looking-at "\n[ \t]*- State") (forward-char 1))
+ (while (looking-at "[ \t]*- State")
+ (condition-case nil
+ (org-next-item)
+ (error (org-end-of-item)))))
+
(defun org-add-log-note (&optional purpose)
"Pop up a window for taking a note, and add this note later at point."
(remove-hook 'post-command-hook 'org-add-log-note)
@@ -12168,14 +14662,16 @@ The auto-repeater uses this.")
(move-marker org-log-note-return-to (point))
(switch-to-buffer (marker-buffer org-log-note-marker))
(goto-char org-log-note-marker)
- (switch-to-buffer-other-window "*Org Note*")
+ (org-switch-to-buffer-other-window "*Org Note*")
(erase-buffer)
(let ((org-inhibit-startup t)) (org-mode))
- (insert (format "# Insert note for %s, finish with C-c C-c.\n\n"
+ (insert (format "# Insert note for %s.
+# Finish with C-c C-c, or cancel with C-c C-k.\n\n"
(cond
((eq org-log-note-purpose 'clock-out) "stopped clock")
((eq org-log-note-purpose 'done) "closed todo item")
- ((eq org-log-note-purpose 'state) "state change")
+ ((eq org-log-note-purpose 'state)
+ (format "state change to \"%s\"" org-log-note-state))
(t (error "This should not happen")))))
(org-set-local 'org-finish-function 'org-store-log-note))
@@ -12185,8 +14681,8 @@ The auto-repeater uses this.")
(note (cdr (assq org-log-note-purpose org-log-note-headings)))
lines ind)
(kill-buffer (current-buffer))
- (if (string-match "^#.*\n[ \t\n]*" txt)
- (setq txt (replace-match "" t t txt)))
+ (while (string-match "\\`#.*\n[ \t\n]*" txt)
+ (setq txt (replace-match "" t t txt)))
(if (string-match "\\s-+\\'" txt)
(setq txt (replace-match "" t t txt)))
(setq lines (org-split-string txt "\n"))
@@ -12204,6 +14700,7 @@ The auto-repeater uses this.")
"")))))
(if lines (setq note (concat note " \\\\")))
(push note lines))
+ (when (or current-prefix-arg org-note-abort) (setq lines nil))
(when lines
(save-excursion
(set-buffer (marker-buffer org-log-note-marker))
@@ -12211,16 +14708,60 @@ The auto-repeater uses this.")
(goto-char org-log-note-marker)
(move-marker org-log-note-marker nil)
(end-of-line 1)
- (if (not (bolp)) (insert "\n")) (indent-relative nil)
- (setq ind (concat (buffer-substring (point-at-bol) (point)) " "))
- (insert " - " (pop lines))
- (while lines
- (insert "\n" ind (pop lines)))))))
+ (if (not (bolp)) (let ((inhibit-read-only t)) (insert "\n")))
+ (indent-relative nil)
+ (insert "- " (pop lines))
+ (org-indent-line-function)
+ (beginning-of-line 1)
+ (looking-at "[ \t]*")
+ (setq ind (concat (match-string 0) " "))
+ (end-of-line 1)
+ (while lines (insert "\n" ind (pop lines)))))))
(set-window-configuration org-log-note-window-configuration)
(with-current-buffer (marker-buffer org-log-note-return-to)
(goto-char org-log-note-return-to))
(move-marker org-log-note-return-to nil)
- (and org-log-post-message (message org-log-post-message)))
+ (and org-log-post-message (message "%s" org-log-post-message)))
+
+;; FIXME: what else would be useful?
+;; - priority
+;; - date
+
+(defun org-sparse-tree (&optional arg)
+ "Create a sparse tree, prompt for the details.
+This command can create sparse trees. You first need to select the type
+of match used to create the tree:
+
+t Show entries with a specific TODO keyword.
+T Show entries selected by a tags match.
+p Enter a property name and its value (both with completion on existing
+ names/values) and show entries with that property.
+r Show entries matching a regular expression
+d Show deadlines due within `org-deadline-warning-days'."
+ (interactive "P")
+ (let (ans kwd value)
+ (message "Sparse tree: [/]regexp [t]odo-kwd [T]ag [p]roperty [d]eadlines [b]efore-date")
+ (setq ans (read-char-exclusive))
+ (cond
+ ((equal ans ?d)
+ (call-interactively 'org-check-deadlines))
+ ((equal ans ?b)
+ (call-interactively 'org-check-before-date))
+ ((equal ans ?t)
+ (org-show-todo-tree '(4)))
+ ((equal ans ?T)
+ (call-interactively 'org-tags-sparse-tree))
+ ((member ans '(?p ?P))
+ (setq kwd (completing-read "Property: "
+ (mapcar 'list (org-buffer-property-keys))))
+ (setq value (completing-read "Value: "
+ (mapcar 'list (org-property-values kwd))))
+ (unless (string-match "\\`{.*}\\'" value)
+ (setq value (concat "\"" value "\"")))
+ (org-tags-sparse-tree arg (concat kwd "=" value)))
+ ((member ans '(?r ?R ?/))
+ (call-interactively 'org-occur))
+ (t (error "No such sparse tree command \"%c\"" ans)))))
(defvar org-occur-highlights nil)
(make-variable-buffer-local 'org-occur-highlights)
@@ -12269,12 +14810,13 @@ How much context is shown depends upon the variables
(let ((heading-p (org-on-heading-p t))
(hierarchy-p (org-get-alist-option org-show-hierarchy-above key))
(following-p (org-get-alist-option org-show-following-heading key))
+ (entry-p (org-get-alist-option org-show-entry-below key))
(siblings-p (org-get-alist-option org-show-siblings key)))
(catch 'exit
;; Show heading or entry text
- (if heading-p
+ (if (and heading-p (not entry-p))
(org-flag-heading nil) ; only show the heading
- (and (or (org-invisible-p) (org-invisible-p2))
+ (and (or entry-p (org-invisible-p) (org-invisible-p2))
(org-show-hidden-entry))) ; show entire entry
(when following-p
;; Show next sibling, or heading below text
@@ -12344,7 +14886,7 @@ from the `before-change-functions' in the current buffer."
(defun org-priority (&optional action)
"Change the priority of an item by ARG.
-ACTION can be set, up, or down."
+ACTION can be `set', `up', `down', or a character."
(interactive)
(setq action (or action 'set))
(let (current new news have remove)
@@ -12355,19 +14897,32 @@ ACTION can be set, up, or down."
have t)
(setq current org-default-priority))
(cond
- ((eq action 'set)
- (message "Priority %c-%c, SPC to remove: " org-highest-priority org-lowest-priority)
- (setq new (read-char-exclusive))
+ ((or (eq action 'set) (integerp action))
+ (if (integerp action)
+ (setq new action)
+ (message "Priority %c-%c, SPC to remove: " org-highest-priority org-lowest-priority)
+ (setq new (read-char-exclusive)))
+ (if (and (= (upcase org-highest-priority) org-highest-priority)
+ (= (upcase org-lowest-priority) org-lowest-priority))
+ (setq new (upcase new)))
(cond ((equal new ?\ ) (setq remove t))
((or (< (upcase new) org-highest-priority) (> (upcase new) org-lowest-priority))
(error "Priority must be between `%c' and `%c'"
org-highest-priority org-lowest-priority))))
((eq action 'up)
- (setq new (1- current)))
+ (if (and (not have) (eq last-command this-command))
+ (setq new org-lowest-priority)
+ (setq new (if (and org-priority-start-cycle-with-default (not have))
+ org-default-priority (1- current)))))
((eq action 'down)
- (setq new (1+ current)))
+ (if (and (not have) (eq last-command this-command))
+ (setq new org-highest-priority)
+ (setq new (if (and org-priority-start-cycle-with-default (not have))
+ org-default-priority (1+ current)))))
(t (error "Invalid action")))
- (setq new (min (max org-highest-priority (upcase new)) org-lowest-priority))
+ (if (or (< (upcase new) org-highest-priority)
+ (> (upcase new) org-lowest-priority))
+ (setq remove t))
(setq news (format "%c" new))
(if have
(if remove
@@ -12382,6 +14937,7 @@ ACTION can be set, up, or down."
(insert " [#" news "]"))
(goto-char (match-beginning 3))
(insert "[#" news "] ")))))
+ (org-preserve-lc (org-set-tags nil 'align))
(if remove
(message "Priority removed")
(message "Priority of current item set to %s" news))))
@@ -12405,7 +14961,8 @@ inclusion. When TODO-ONLY is non-nil, only lines with a TODO keyword
are included in the output."
(let* ((re (concat "[\n\r]" outline-regexp " *\\(\\<\\("
(mapconcat 'regexp-quote org-todo-keywords-1 "\\|")
- "\\>\\)\\)? *\\(.*?\\)\\(:[a-zA-Z0-9_@:]+:\\)?[ \t]*$"))
+ (org-re
+ "\\>\\)\\)? *\\(.*?\\)\\(:[[:alnum:]_@:]+:\\)?[ \t]*$")))
(props (list 'face nil
'done-face 'org-done
'undone-face nil
@@ -12415,20 +14972,24 @@ are included in the output."
'keymap org-agenda-keymap
'help-echo
(format "mouse-2 or RET jump to org file %s"
- (abbreviate-file-name buffer-file-name))))
+ (abbreviate-file-name
+ (or (buffer-file-name (buffer-base-buffer))
+ (buffer-name (buffer-base-buffer)))))))
(case-fold-search nil)
lspos
tags tags-list tags-alist (llast 0) rtn level category i txt
todo marker entry priority)
(save-excursion
(goto-char (point-min))
- (when (eq action 'sparse-tree) (org-overview))
+ (when (eq action 'sparse-tree)
+ (org-overview)
+ (org-remove-occur-highlights))
(while (re-search-forward re nil t)
(catch :skip
(setq todo (if (match-end 1) (match-string 2))
tags (if (match-end 4) (match-string 4)))
(goto-char (setq lspos (1+ (match-beginning 0))))
- (setq level (funcall outline-level)
+ (setq level (org-reduced-level (funcall outline-level))
category (org-get-category))
(setq i llast llast level)
;; remove tag lists from same and sublevels
@@ -12452,8 +15013,13 @@ are included in the output."
(not (member org-archive-tag tags-list))))
(and (eq action 'agenda) (org-agenda-skip))
;; list this headline
+
(if (eq action 'sparse-tree)
(progn
+ (and org-highlight-sparse-tree-matches
+ (org-get-heading) (match-end 0)
+ (org-highlight-new-match
+ (match-beginning 0) (match-beginning 1)))
(org-show-context 'tags-tree))
(setq txt (org-format-agenda-item
""
@@ -12485,27 +15051,51 @@ MATCH can contain positive and negative selection of tags, like
If optional argument TODO_ONLY is non-nil, only select lines that are
also TODO lines."
(interactive "P")
+ (org-prepare-agenda-buffers (list (current-buffer)))
(org-scan-tags 'sparse-tree (cdr (org-make-tags-matcher match)) todo-only))
+(defvar org-cached-props nil)
+(defun org-cached-entry-get (pom property)
+ (if (or (eq t org-use-property-inheritance)
+ (member property org-use-property-inheritance))
+ ;; Caching is not possible, check it directly
+ (org-entry-get pom property 'inherit)
+ ;; Get all properties, so that we can do complicated checks easily
+ (cdr (assoc property (or org-cached-props
+ (setq org-cached-props
+ (org-entry-properties pom)))))))
+
+(defun org-global-tags-completion-table (&optional files)
+ "Return the list of all tags in all agenda buffer/files."
+ (save-excursion
+ (org-uniquify
+ (apply 'append
+ (mapcar
+ (lambda (file)
+ (set-buffer (find-file-noselect file))
+ (org-get-buffer-tags))
+ (if (and files (car files))
+ files
+ (org-agenda-files)))))))
+
(defun org-make-tags-matcher (match)
"Create the TAGS//TODO matcher form for the selection string MATCH."
;; todo-only is scoped dynamically into this function, and the function
;; may change it it the matcher asksk for it.
(unless match
;; Get a new match request, with completion
- (setq org-last-tags-completion-table
- (or org-tag-alist
- org-last-tags-completion-table))
- (setq match (completing-read
- "Match: " 'org-tags-completion-function nil nil nil
- 'org-tags-history)))
+ (let ((org-last-tags-completion-table
+ (org-global-tags-completion-table)))
+ (setq match (completing-read
+ "Match: " 'org-tags-completion-function nil nil nil
+ 'org-tags-history))))
;; Parse the string and create a lisp form
(let ((match0 match)
- (re "^&?\\([-+:]\\)?\\({[^}]+}\\|LEVEL=\\([0-9]+\\)\\|[a-zA-Z0-9_@]+\\)")
+ (re (org-re "^&?\\([-+:]\\)?\\({[^}]+}\\|LEVEL=\\([0-9]+\\)\\|\\([[:alnum:]_]+\\)=\\({[^}]+}\\|\"[^\"]+\"\\)\\|[[:alnum:]_@]+\\)"))
minus tag mm
tagsmatch todomatch tagsmatcher todomatcher kwd matcher
- orterms term orlist re-p level-p)
+ orterms term orlist re-p level-p prop-p pn pv cat-p gv)
(if (string-match "/+" match)
;; match contains also a todo-matching request
(progn
@@ -12531,10 +15121,23 @@ also TODO lines."
tag (match-string 2 term)
re-p (equal (string-to-char tag) ?{)
level-p (match-end 3)
+ prop-p (match-end 4)
mm (cond
(re-p `(org-match-any-p ,(substring tag 1 -1) tags-list))
(level-p `(= level ,(string-to-number
(match-string 3 term))))
+ (prop-p
+ (setq pn (match-string 4 term)
+ pv (match-string 5 term)
+ cat-p (equal pn "CATEGORY")
+ re-p (equal (string-to-char pv) ?{)
+ pv (substring pv 1 -1))
+ (if (equal pn "CATEGORY")
+ (setq gv '(get-text-property (point) 'org-category))
+ (setq gv `(org-cached-entry-get nil ,pn)))
+ (if re-p
+ `(string-match ,pv (or ,gv ""))
+ `(equal ,pv ,gv)))
(t `(member ,(downcase tag) tags-list)))
mm (if minus (list 'not mm) mm)
term (substring term (match-end 0)))
@@ -12544,7 +15147,9 @@ also TODO lines."
(car tagsmatcher))
orlist)
(setq tagsmatcher nil))
- (setq tagsmatcher (if (> (length orlist) 1) (cons 'or orlist) (car orlist))))
+ (setq tagsmatcher (if (> (length orlist) 1) (cons 'or orlist) (car orlist)))
+ (setq tagsmatcher
+ (list 'progn '(setq org-cached-props nil) tagsmatcher)))
;; Make the todo matcher
(if (or (not todomatch) (not (string-match "\\S-" todomatch)))
@@ -12585,12 +15190,37 @@ also TODO lines."
(defvar org-tags-overlay (org-make-overlay 1 1))
(org-detach-overlay org-tags-overlay)
+(defun org-align-tags-here (to-col)
+ ;; Assumes that this is a headline
+ (let ((pos (point)) (col (current-column)) tags)
+ (beginning-of-line 1)
+ (if (and (looking-at (org-re ".*?\\([ \t]+\\)\\(:[[:alnum:]_@:]+:\\)[ \t]*$"))
+ (< pos (match-beginning 2)))
+ (progn
+ (setq tags (match-string 2))
+ (goto-char (match-beginning 1))
+ (insert " ")
+ (delete-region (point) (1+ (match-end 0)))
+ (backward-char 1)
+ (move-to-column
+ (max (1+ (current-column))
+ (1+ col)
+ (if (> to-col 0)
+ to-col
+ (- (abs to-col) (length tags))))
+ t)
+ (insert tags)
+ (move-to-column (min (current-column) col) t))
+ (goto-char pos))))
+
(defun org-set-tags (&optional arg just-align)
"Set the tags for the current headline.
With prefix ARG, realign all tags in headings in the current buffer."
(interactive "P")
(let* ((re (concat "^" outline-regexp))
- (current (org-get-tags))
+ (current (org-get-tags-string))
+ (col (current-column))
+ (org-setting-tags t)
table current-tags inherited-tags ; computed below when needed
tags p0 c0 c1 rpl)
(if arg
@@ -12615,11 +15245,14 @@ With prefix ARG, realign all tags in headings in the current buffer."
(if (or (eq t org-use-fast-tag-selection)
(and org-use-fast-tag-selection
(delq nil (mapcar 'cdr table))))
- (org-fast-tag-selection current-tags inherited-tags table)
+ (org-fast-tag-selection
+ current-tags inherited-tags table
+ (if org-fast-tag-selection-include-todo org-todo-key-alist))
(let ((org-add-colon-after-tag-completion t))
(org-trim
- (completing-read "Tags: " 'org-tags-completion-function
- nil nil current 'org-tags-history))))))
+ (org-without-partial-completion
+ (completing-read "Tags: " 'org-tags-completion-function
+ nil nil current 'org-tags-history)))))))
(while (string-match "[-+&]+" tags)
;; No boolean logic, just a list
(setq tags (replace-match ":" t t tags))))
@@ -12631,22 +15264,65 @@ With prefix ARG, realign all tags in headings in the current buffer."
;; Insert new tags at the correct column
(beginning-of-line 1)
- (if (re-search-forward
- (concat "\\([ \t]*" (regexp-quote current) "\\)[ \t]*$")
- (point-at-eol) t)
- (progn
- (if (equal tags "")
- (setq rpl "")
- (goto-char (match-beginning 0))
- (setq c0 (current-column) p0 (point)
- c1 (max (1+ c0) (if (> org-tags-column 0)
- org-tags-column
- (- (- org-tags-column) (length tags))))
- rpl (concat (make-string (max 0 (- c1 c0)) ?\ ) tags)))
- (replace-match rpl t t)
- (and (not (featurep 'xemacs)) c0 (tabify p0 (point)))
- tags)
- (error "Tags alignment failed")))))
+ (cond
+ ((and (equal current "") (equal tags "")))
+ ((re-search-forward
+ (concat "\\([ \t]*" (regexp-quote current) "\\)[ \t]*$")
+ (point-at-eol) t)
+ (if (equal tags "")
+ (setq rpl "")
+ (goto-char (match-beginning 0))
+ (setq c0 (current-column) p0 (point)
+ c1 (max (1+ c0) (if (> org-tags-column 0)
+ org-tags-column
+ (- (- org-tags-column) (length tags))))
+ rpl (concat (make-string (max 0 (- c1 c0)) ?\ ) tags)))
+ (replace-match rpl t t)
+ (and (not (featurep 'xemacs)) c0 (tabify p0 (point)))
+ tags)
+ (t (error "Tags alignment failed")))
+ (move-to-column col)
+ (unless just-align
+ (run-hooks 'org-after-tags-change-hook)))))
+
+(defun org-change-tag-in-region (beg end tag off)
+ "Add or remove TAG for each entry in the region.
+This works in the agenda, and also in an org-mode buffer."
+ (interactive
+ (list (region-beginning) (region-end)
+ (let ((org-last-tags-completion-table
+ (if (org-mode-p)
+ (org-get-buffer-tags)
+ (org-global-tags-completion-table))))
+ (completing-read
+ "Tag: " 'org-tags-completion-function nil nil nil
+ 'org-tags-history))
+ (progn
+ (message "[s]et or [r]emove? ")
+ (equal (read-char-exclusive) ?r))))
+ (if (fboundp 'deactivate-mark) (deactivate-mark))
+ (let ((agendap (equal major-mode 'org-agenda-mode))
+ l1 l2 m buf pos newhead (cnt 0))
+ (goto-char end)
+ (setq l2 (1- (org-current-line)))
+ (goto-char beg)
+ (setq l1 (org-current-line))
+ (loop for l from l1 to l2 do
+ (goto-line l)
+ (setq m (get-text-property (point) 'org-hd-marker))
+ (when (or (and (org-mode-p) (org-on-heading-p))
+ (and agendap m))
+ (setq buf (if agendap (marker-buffer m) (current-buffer))
+ pos (if agendap m (point)))
+ (with-current-buffer buf
+ (save-excursion
+ (save-restriction
+ (goto-char pos)
+ (setq cnt (1+ cnt))
+ (org-toggle-tag tag (if off 'off 'on))
+ (setq newhead (org-get-heading)))))
+ (and agendap (org-agenda-change-all-lines newhead m))))
+ (message "Tag :%s: %s in %d headings" tag (if off "removed" "set") cnt)))
(defun org-tags-completion-function (string predicate &optional flag)
(let (s1 s2 rtn (ctable org-last-tags-completion-table)
@@ -12660,11 +15336,12 @@ With prefix ARG, realign all tags in headings in the current buffer."
;; try completion
(setq rtn (try-completion s2 ctable confirm))
(if (stringp rtn)
- (concat s1 s2 (substring rtn (length s2))
- (if (and org-add-colon-after-tag-completion
- (assoc rtn ctable))
- ":" "")))
- )
+ (setq rtn
+ (concat s1 s2 (substring rtn (length s2))
+ (if (and org-add-colon-after-tag-completion
+ (assoc rtn ctable))
+ ":" ""))))
+ rtn)
((eq flag t)
;; all-completions
(all-completions s2 ctable confirm)
@@ -12698,17 +15375,19 @@ With prefix ARG, realign all tags in headings in the current buffer."
(put-text-property 0 (length s) 'face '(secondary-selection org-tag) s)
(org-overlay-display org-tags-overlay (concat prefix s)))))
-(defun org-fast-tag-selection (current inherited table)
+(defun org-fast-tag-selection (current inherited table &optional todo-table)
"Fast tag selection with single keys.
CURRENT is the current list of tags in the headline, INHERITED is the
list of inherited tags, and TABLE is an alist of tags and corresponding keys,
-possibly with grouping information.
+possibly with grouping information. TODO-TABLE is a similar table with
+TODO keywords, should these have keys assigned to them.
If the keys are nil, a-z are automatically assigned.
Returns the new tags string, or nil to not change the current settings."
- (let* ((maxlen (apply 'max (mapcar
+ (let* ((fulltable (append table todo-table))
+ (maxlen (apply 'max (mapcar
(lambda (x)
(if (stringp (car x)) (string-width (car x)) 0))
- table)))
+ fulltable)))
(buf (current-buffer))
(expert (eq org-fast-tag-selection-single-key 'expert))
(buffer-tags nil)
@@ -12719,10 +15398,12 @@ Returns the new tags string, or nil to not change the current settings."
tg cnt e c char c1 c2 ntable tbl rtn
ov-start ov-end ov-prefix
(exit-after-next org-fast-tag-selection-single-key)
+ (done-keywords org-done-keywords)
groups ingroup)
(save-excursion
(beginning-of-line 1)
- (if (looking-at ".*[ \t]\\(:[a-zA-Z0-9_@:]+:\\)[ \t]*\\(\r\\|$\\)")
+ (if (looking-at
+ (org-re ".*[ \t]\\(:[[:alnum:]_@:]+:\\)[ \t]*$"))
(setq ov-start (match-beginning 1)
ov-end (match-end 1)
ov-prefix "")
@@ -12741,13 +15422,14 @@ Returns the new tags string, or nil to not change the current settings."
(set-buffer (get-buffer-create " *Org tags*"))
(delete-other-windows)
(split-window-vertically)
- (switch-to-buffer-other-window (get-buffer-create " *Org tags*")))
+ (org-switch-to-buffer-other-window (get-buffer-create " *Org tags*")))
(erase-buffer)
+ (org-set-local 'org-done-keywords done-keywords)
(org-fast-tag-insert "Inherited" inherited i-face "\n")
(org-fast-tag-insert "Current" current c-face "\n\n")
(org-fast-tag-show-exit exit-after-next)
(org-set-current-tags-overlay current ov-prefix)
- (setq tbl table char ?a cnt 0)
+ (setq tbl fulltable char ?a cnt 0)
(while (setq e (pop tbl))
(cond
((equal e '(:startgroup))
@@ -12775,6 +15457,8 @@ Returns the new tags string, or nil to not change the current settings."
(if ingroup (push tg (car groups)))
(setq tg (org-add-props tg nil 'face
(cond
+ ((not (assoc tg table))
+ (org-get-todo-face tg))
((member tg current) c-face)
((member tg inherited) i-face)
(t nil))))
@@ -12811,7 +15495,7 @@ Returns the new tags string, or nil to not change the current settings."
(setq expert nil)
(delete-other-windows)
(split-window-vertically)
- (switch-to-buffer-other-window " *Org tags*")
+ (org-switch-to-buffer-other-window " *Org tags*")
(and (fboundp 'fit-window-to-buffer)
(fit-window-to-buffer))))
((or (= c ?\C-g)
@@ -12835,14 +15519,18 @@ Returns the new tags string, or nil to not change the current settings."
(setq current (delete tg current))
(push tg current)))
(if exit-after-next (setq exit-after-next 'now)))
+ ((setq e (rassoc c todo-table) tg (car e))
+ (with-current-buffer buf
+ (save-excursion (org-todo tg)))
+ (if exit-after-next (setq exit-after-next 'now)))
((setq e (rassoc c ntable) tg (car e))
(if (member tg current)
(setq current (delete tg current))
(loop for g in groups do
(if (member tg g)
- (mapcar (lambda (x)
- (setq current (delete x current)))
- g)))
+ (mapc (lambda (x)
+ (setq current (delete x current)))
+ g)))
(push tg current))
(if exit-after-next (setq exit-after-next 'now))))
@@ -12857,40 +15545,1529 @@ Returns the new tags string, or nil to not change the current settings."
(delete-region (point) (point-at-eol))
(org-fast-tag-insert "Current" current c-face)
(org-set-current-tags-overlay current ov-prefix)
- (while (re-search-forward "\\[.\\] \\([a-zA-Z0-9_@]+\\)" nil t)
+ (while (re-search-forward
+ (org-re "\\[.\\] \\([[:alnum:]_@]+\\)") nil t)
(setq tg (match-string 1))
- (add-text-properties (match-beginning 1) (match-end 1)
- (list 'face
- (cond
- ((member tg current) c-face)
- ((member tg inherited) i-face)
- (t nil)))))
+ (add-text-properties
+ (match-beginning 1) (match-end 1)
+ (list 'face
+ (cond
+ ((member tg current) c-face)
+ ((member tg inherited) i-face)
+ (t (get-text-property (match-beginning 1) 'face))))))
(goto-char (point-min)))))
(org-detach-overlay org-tags-overlay)
(if rtn
(mapconcat 'identity current ":")
nil))))
-(defun org-get-tags ()
+(defun org-get-tags-string ()
"Get the TAGS string in the current headline."
(unless (org-on-heading-p t)
(error "Not on a heading"))
(save-excursion
(beginning-of-line 1)
- (if (looking-at ".*[ \t]\\(:[a-zA-Z0-9_@:]+:\\)[ \t]*\\(\r\\|$\\)")
+ (if (looking-at (org-re ".*[ \t]\\(:[[:alnum:]_@:]+:\\)[ \t]*$"))
(org-match-string-no-properties 1)
"")))
+(defun org-get-tags ()
+ "Get the list of tags specified in the current headline."
+ (org-split-string (org-get-tags-string) ":"))
+
(defun org-get-buffer-tags ()
"Get a table of all tags used in the buffer, for completion."
(let (tags)
(save-excursion
(goto-char (point-min))
- (while (re-search-forward "[ \t]:\\([a-zA-Z0-9_@:]+\\):[ \t\r\n]" nil t)
- (mapc (lambda (x) (add-to-list 'tags x))
- (org-split-string (org-match-string-no-properties 1) ":"))))
+ (while (re-search-forward
+ (org-re "[ \t]:\\([[:alnum:]_@:]+\\):[ \t\r\n]") nil t)
+ (when (equal (char-after (point-at-bol 0)) ?*)
+ (mapc (lambda (x) (add-to-list 'tags x))
+ (org-split-string (org-match-string-no-properties 1) ":")))))
(mapcar 'list tags)))
+
+;;;; Properties
+
+;;; Setting and retrieving properties
+
+(defconst org-special-properties
+ '("TODO" "TAGS" "ALLTAGS" "DEADLINE" "SCHEDULED" "CLOCK" "PRIORITY"
+ "TIMESTAMP" "TIMESTAMP_IA")
+ "The special properties valid in Org-mode.
+
+These are properties that are not defined in the property drawer,
+but in some other way.")
+
+(defconst org-default-properties
+ '("ARCHIVE" "CATEGORY" "SUMMARY" "DESCRIPTION"
+ "LOCATION" "LOGGING" "COLUMNS")
+ "Some properties that are used by Org-mode for various purposes.
+Being in this list makes sure that they are offered for completion.")
+
+(defconst org-property-start-re "^[ \t]*:PROPERTIES:[ \t]*$"
+ "Regular expression matching the first line of a property drawer.")
+
+(defconst org-property-end-re "^[ \t]*:END:[ \t]*$"
+ "Regular expression matching the first line of a property drawer.")
+
+(defun org-property-action ()
+ "Do an action on properties."
+ (interactive)
+ (let (c)
+ (org-at-property-p)
+ (message "Property Action: [s]et [d]elete [D]elete globally [c]ompute")
+ (setq c (read-char-exclusive))
+ (cond
+ ((equal c ?s)
+ (call-interactively 'org-set-property))
+ ((equal c ?d)
+ (call-interactively 'org-delete-property))
+ ((equal c ?D)
+ (call-interactively 'org-delete-property-globally))
+ ((equal c ?c)
+ (call-interactively 'org-compute-property-at-point))
+ (t (error "No such property action %c" c)))))
+
+(defun org-at-property-p ()
+ "Is the cursor in a property line?"
+ ;; FIXME: Does not check if we are actually in the drawer.
+ ;; FIXME: also returns true on any drawers.....
+ ;; This is used by C-c C-c for property action.
+ (save-excursion
+ (beginning-of-line 1)
+ (looking-at (org-re "^[ \t]*\\(:\\([[:alpha:]][[:alnum:]_-]*\\):\\)[ \t]*\\(.*\\)"))))
+
+(defmacro org-with-point-at (pom &rest body)
+ "Move to buffer and point of point-or-marker POM for the duration of BODY."
+ (declare (indent 1) (debug t))
+ `(save-excursion
+ (if (markerp pom) (set-buffer (marker-buffer pom)))
+ (save-excursion
+ (goto-char (or pom (point)))
+ ,@body)))
+
+(defun org-get-property-block (&optional beg end force)
+ "Return the (beg . end) range of the body of the property drawer.
+BEG and END can be beginning and end of subtree, if not given
+they will be found.
+If the drawer does not exist and FORCE is non-nil, create the drawer."
+ (catch 'exit
+ (save-excursion
+ (let* ((beg (or beg (progn (org-back-to-heading t) (point))))
+ (end (or end (progn (outline-next-heading) (point)))))
+ (goto-char beg)
+ (if (re-search-forward org-property-start-re end t)
+ (setq beg (1+ (match-end 0)))
+ (if force
+ (save-excursion
+ (org-insert-property-drawer)
+ (setq end (progn (outline-next-heading) (point))))
+ (throw 'exit nil))
+ (goto-char beg)
+ (if (re-search-forward org-property-start-re end t)
+ (setq beg (1+ (match-end 0)))))
+ (if (re-search-forward org-property-end-re end t)
+ (setq end (match-beginning 0))
+ (or force (throw 'exit nil))
+ (goto-char beg)
+ (setq end beg)
+ (org-indent-line-function)
+ (insert ":END:\n"))
+ (cons beg end)))))
+
+(defun org-entry-properties (&optional pom which)
+ "Get all properties of the entry at point-or-marker POM.
+This includes the TODO keyword, the tags, time strings for deadline,
+scheduled, and clocking, and any additional properties defined in the
+entry. The return value is an alist, keys may occur multiple times
+if the property key was used several times.
+POM may also be nil, in which case the current entry is used.
+If WHICH is nil or `all', get all properties. If WHICH is
+`special' or `standard', only get that subclass."
+ (setq which (or which 'all))
+ (org-with-point-at pom
+ (let ((clockstr (substring org-clock-string 0 -1))
+ (excluded '("TODO" "TAGS" "ALLTAGS" "PRIORITY"))
+ beg end range props sum-props key value string)
+ (save-excursion
+ (when (condition-case nil (org-back-to-heading t) (error nil))
+ (setq beg (point))
+ (setq sum-props (get-text-property (point) 'org-summaries))
+ (outline-next-heading)
+ (setq end (point))
+ (when (memq which '(all special))
+ ;; Get the special properties, like TODO and tags
+ (goto-char beg)
+ (when (and (looking-at org-todo-line-regexp) (match-end 2))
+ (push (cons "TODO" (org-match-string-no-properties 2)) props))
+ (when (looking-at org-priority-regexp)
+ (push (cons "PRIORITY" (org-match-string-no-properties 2)) props))
+ (when (and (setq value (org-get-tags-string))
+ (string-match "\\S-" value))
+ (push (cons "TAGS" value) props))
+ (when (setq value (org-get-tags-at))
+ (push (cons "ALLTAGS" (concat ":" (mapconcat 'identity value ":") ":"))
+ props))
+ (while (re-search-forward org-maybe-keyword-time-regexp end t)
+ (setq key (if (match-end 1) (substring (org-match-string-no-properties 1) 0 -1))
+ string (if (equal key clockstr)
+ (org-no-properties
+ (org-trim
+ (buffer-substring
+ (match-beginning 3) (goto-char (point-at-eol)))))
+ (substring (org-match-string-no-properties 3) 1 -1)))
+ (unless key
+ (if (= (char-after (match-beginning 3)) ?\[)
+ (setq key "TIMESTAMP_IA")
+ (setq key "TIMESTAMP")))
+ (when (or (equal key clockstr) (not (assoc key props)))
+ (push (cons key string) props)))
+
+ )
+
+ (when (memq which '(all standard))
+ ;; Get the standard properties, like :PORP: ...
+ (setq range (org-get-property-block beg end))
+ (when range
+ (goto-char (car range))
+ (while (re-search-forward
+ (org-re "^[ \t]*:\\([[:alpha:]][[:alnum:]_-]*\\):[ \t]*\\(\\S-.*\\)?")
+ (cdr range) t)
+ (setq key (org-match-string-no-properties 1)
+ value (org-trim (or (org-match-string-no-properties 2) "")))
+ (unless (member key excluded)
+ (push (cons key (or value "")) props)))))
+ (append sum-props (nreverse props)))))))
+
+(defun org-entry-get (pom property &optional inherit)
+ "Get value of PROPERTY for entry at point-or-marker POM.
+If INHERIT is non-nil and the entry does not have the property,
+then also check higher levels of the hierarchy.
+If the property is present but empty, the return value is the empty string.
+If the property is not present at all, nil is returned."
+ (org-with-point-at pom
+ (if inherit
+ (org-entry-get-with-inheritance property)
+ (if (member property org-special-properties)
+ ;; We need a special property. Use brute force, get all properties.
+ (cdr (assoc property (org-entry-properties nil 'special)))
+ (let ((range (org-get-property-block)))
+ (if (and range
+ (goto-char (car range))
+ (re-search-forward
+ (concat "^[ \t]*:" property ":[ \t]*\\(.*\\S-\\)?")
+ (cdr range) t))
+ ;; Found the property, return it.
+ (if (match-end 1)
+ (org-match-string-no-properties 1)
+ "")))))))
+
+(defun org-entry-delete (pom property)
+ "Delete the property PROPERTY from entry at point-or-marker POM."
+ (org-with-point-at pom
+ (if (member property org-special-properties)
+ nil ; cannot delete these properties.
+ (let ((range (org-get-property-block)))
+ (if (and range
+ (goto-char (car range))
+ (re-search-forward
+ (concat "^[ \t]*:" property ":[ \t]*\\(.*\\S-\\)")
+ (cdr range) t))
+ (progn
+ (delete-region (match-beginning 0) (1+ (point-at-eol)))
+ t)
+ nil)))))
+
+;; Multi-values properties are properties that contain multiple values
+;; These values are assumed to be single words, separated by whitespace.
+(defun org-entry-add-to-multivalued-property (pom property value)
+ "Add VALUE to the words in the PROPERTY in entry at point-or-marker POM."
+ (let* ((old (org-entry-get pom property))
+ (values (and old (org-split-string old "[ \t]"))))
+ (unless (member value values)
+ (setq values (cons value values))
+ (org-entry-put pom property
+ (mapconcat 'identity values " ")))))
+
+(defun org-entry-remove-from-multivalued-property (pom property value)
+ "Remove VALUE from words in the PROPERTY in entry at point-or-marker POM."
+ (let* ((old (org-entry-get pom property))
+ (values (and old (org-split-string old "[ \t]"))))
+ (when (member value values)
+ (setq values (delete value values))
+ (org-entry-put pom property
+ (mapconcat 'identity values " ")))))
+
+(defun org-entry-member-in-multivalued-property (pom property value)
+ "Is VALUE one of the words in the PROPERTY in entry at point-or-marker POM?"
+ (let* ((old (org-entry-get pom property))
+ (values (and old (org-split-string old "[ \t]"))))
+ (member value values)))
+
+(defvar org-entry-property-inherited-from (make-marker))
+
+(defun org-entry-get-with-inheritance (property)
+ "Get entry property, and search higher levels if not present."
+ (let (tmp)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (catch 'ex
+ (while t
+ (when (setq tmp (org-entry-get nil property))
+ (org-back-to-heading t)
+ (move-marker org-entry-property-inherited-from (point))
+ (throw 'ex tmp))
+ (or (org-up-heading-safe) (throw 'ex nil)))))
+ (or tmp (cdr (assoc property org-local-properties))
+ (cdr (assoc property org-global-properties))))))
+
+(defun org-entry-put (pom property value)
+ "Set PROPERTY to VALUE for entry at point-or-marker POM."
+ (org-with-point-at pom
+ (org-back-to-heading t)
+ (let ((beg (point)) (end (save-excursion (outline-next-heading) (point)))
+ range)
+ (cond
+ ((equal property "TODO")
+ (when (and (stringp value) (string-match "\\S-" value)
+ (not (member value org-todo-keywords-1)))
+ (error "\"%s\" is not a valid TODO state" value))
+ (if (or (not value)
+ (not (string-match "\\S-" value)))
+ (setq value 'none))
+ (org-todo value)
+ (org-set-tags nil 'align))
+ ((equal property "PRIORITY")
+ (org-priority (if (and value (stringp value) (string-match "\\S-" value))
+ (string-to-char value) ?\ ))
+ (org-set-tags nil 'align))
+ ((equal property "SCHEDULED")
+ (if (re-search-forward org-scheduled-time-regexp end t)
+ (cond
+ ((eq value 'earlier) (org-timestamp-change -1 'day))
+ ((eq value 'later) (org-timestamp-change 1 'day))
+ (t (call-interactively 'org-schedule)))
+ (call-interactively 'org-schedule)))
+ ((equal property "DEADLINE")
+ (if (re-search-forward org-deadline-time-regexp end t)
+ (cond
+ ((eq value 'earlier) (org-timestamp-change -1 'day))
+ ((eq value 'later) (org-timestamp-change 1 'day))
+ (t (call-interactively 'org-deadline)))
+ (call-interactively 'org-deadline)))
+ ((member property org-special-properties)
+ (error "The %s property can not yet be set with `org-entry-put'"
+ property))
+ (t ; a non-special property
+ (let ((buffer-invisibility-spec (org-inhibit-invisibility))) ; Emacs 21
+ (setq range (org-get-property-block beg end 'force))
+ (goto-char (car range))
+ (if (re-search-forward
+ (concat "^[ \t]*:" property ":\\(.*\\)") (cdr range) t)
+ (progn
+ (delete-region (match-beginning 1) (match-end 1))
+ (goto-char (match-beginning 1)))
+ (goto-char (cdr range))
+ (insert "\n")
+ (backward-char 1)
+ (org-indent-line-function)
+ (insert ":" property ":"))
+ (and value (insert " " value))
+ (org-indent-line-function)))))))
+
+(defun org-buffer-property-keys (&optional include-specials include-defaults)
+ "Get all property keys in the current buffer.
+With INCLUDE-SPECIALS, also list the special properties that relect things
+like tags and TODO state.
+With INCLUDE-DEFAULTS, also include properties that has special meaning
+internally: ARCHIVE, CATEGORY, SUMMARY, DESCRIPTION, LOCATION, and LOGGING."
+ (let (rtn range)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (while (re-search-forward org-property-start-re nil t)
+ (setq range (org-get-property-block))
+ (goto-char (car range))
+ (while (re-search-forward
+ (org-re "^[ \t]*:\\([[:alnum:]_-]+\\):")
+ (cdr range) t)
+ (add-to-list 'rtn (org-match-string-no-properties 1)))
+ (outline-next-heading))))
+
+ (when include-specials
+ (setq rtn (append org-special-properties rtn)))
+
+ (when include-defaults
+ (mapc (lambda (x) (add-to-list 'rtn x)) org-default-properties))
+
+ (sort rtn (lambda (a b) (string< (upcase a) (upcase b))))))
+
+(defun org-property-values (key)
+ "Return a list of all values of property KEY."
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (let ((re (concat "^[ \t]*:" key ":[ \t]*\\(\\S-.*\\)"))
+ values)
+ (while (re-search-forward re nil t)
+ (add-to-list 'values (org-trim (match-string 1))))
+ (delete "" values)))))
+
+(defun org-insert-property-drawer ()
+ "Insert a property drawer into the current entry."
+ (interactive)
+ (org-back-to-heading t)
+ (looking-at outline-regexp)
+ (let ((indent (- (match-end 0)(match-beginning 0)))
+ (beg (point))
+ (re (concat "^[ \t]*" org-keyword-time-regexp))
+ end hiddenp)
+ (outline-next-heading)
+ (setq end (point))
+ (goto-char beg)
+ (while (re-search-forward re end t))
+ (setq hiddenp (org-invisible-p))
+ (end-of-line 1)
+ (and (equal (char-after) ?\n) (forward-char 1))
+ (org-skip-over-state-notes)
+ (skip-chars-backward " \t\n\r")
+ (if (eq (char-before) ?*) (forward-char 1))
+ (let ((inhibit-read-only t)) (insert "\n:PROPERTIES:\n:END:"))
+ (beginning-of-line 0)
+ (indent-to-column indent)
+ (beginning-of-line 2)
+ (indent-to-column indent)
+ (beginning-of-line 0)
+ (if hiddenp
+ (save-excursion
+ (org-back-to-heading t)
+ (hide-entry))
+ (org-flag-drawer t))))
+
+(defun org-set-property (property value)
+ "In the current entry, set PROPERTY to VALUE.
+When called interactively, this will prompt for a property name, offering
+completion on existing and default properties. And then it will prompt
+for a value, offering competion either on allowed values (via an inherited
+xxx_ALL property) or on existing values in other instances of this property
+in the current file."
+ (interactive
+ (let* ((prop (completing-read
+ "Property: " (mapcar 'list (org-buffer-property-keys nil t))))
+ (cur (org-entry-get nil prop))
+ (allowed (org-property-get-allowed-values nil prop 'table))
+ (existing (mapcar 'list (org-property-values prop)))
+ (val (if allowed
+ (completing-read "Value: " allowed nil 'req-match)
+ (completing-read
+ (concat "Value" (if (and cur (string-match "\\S-" cur))
+ (concat "[" cur "]") "")
+ ": ")
+ existing nil nil "" nil cur))))
+ (list prop (if (equal val "") cur val))))
+ (unless (equal (org-entry-get nil property) value)
+ (org-entry-put nil property value)))
+
+(defun org-delete-property (property)
+ "In the current entry, delete PROPERTY."
+ (interactive
+ (let* ((prop (completing-read
+ "Property: " (org-entry-properties nil 'standard))))
+ (list prop)))
+ (message "Property %s %s" property
+ (if (org-entry-delete nil property)
+ "deleted"
+ "was not present in the entry")))
+
+(defun org-delete-property-globally (property)
+ "Remove PROPERTY globally, from all entries."
+ (interactive
+ (let* ((prop (completing-read
+ "Globally remove property: "
+ (mapcar 'list (org-buffer-property-keys)))))
+ (list prop)))
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (let ((cnt 0))
+ (while (re-search-forward
+ (concat "^[ \t]*:" (regexp-quote property) ":.*\n?")
+ nil t)
+ (setq cnt (1+ cnt))
+ (replace-match ""))
+ (message "Property \"%s\" removed from %d entries" property cnt)))))
+
+(defvar org-columns-current-fmt-compiled) ; defined below
+
+(defun org-compute-property-at-point ()
+ "Compute the property at point.
+This looks for an enclosing column format, extracts the operator and
+then applies it to the proerty in the column format's scope."
+ (interactive)
+ (unless (org-at-property-p)
+ (error "Not at a property"))
+ (let ((prop (org-match-string-no-properties 2)))
+ (org-columns-get-format-and-top-level)
+ (unless (nth 3 (assoc prop org-columns-current-fmt-compiled))
+ (error "No operator defined for property %s" prop))
+ (org-columns-compute prop)))
+
+(defun org-property-get-allowed-values (pom property &optional table)
+ "Get allowed values for the property PROPERTY.
+When TABLE is non-nil, return an alist that can directly be used for
+completion."
+ (let (vals)
+ (cond
+ ((equal property "TODO")
+ (setq vals (org-with-point-at pom
+ (append org-todo-keywords-1 '("")))))
+ ((equal property "PRIORITY")
+ (let ((n org-lowest-priority))
+ (while (>= n org-highest-priority)
+ (push (char-to-string n) vals)
+ (setq n (1- n)))))
+ ((member property org-special-properties))
+ (t
+ (setq vals (org-entry-get pom (concat property "_ALL") 'inherit))
+
+ (when (and vals (string-match "\\S-" vals))
+ (setq vals (car (read-from-string (concat "(" vals ")"))))
+ (setq vals (mapcar (lambda (x)
+ (cond ((stringp x) x)
+ ((numberp x) (number-to-string x))
+ ((symbolp x) (symbol-name x))
+ (t "???")))
+ vals)))))
+ (if table (mapcar 'list vals) vals)))
+
+(defun org-property-previous-allowed-value (&optional previous)
+ "Switch to the next allowed value for this property."
+ (interactive)
+ (org-property-next-allowed-value t))
+
+(defun org-property-next-allowed-value (&optional previous)
+ "Switch to the next allowed value for this property."
+ (interactive)
+ (unless (org-at-property-p)
+ (error "Not at a property"))
+ (let* ((key (match-string 2))
+ (value (match-string 3))
+ (allowed (or (org-property-get-allowed-values (point) key)
+ (and (member value '("[ ]" "[-]" "[X]"))
+ '("[ ]" "[X]"))))
+ nval)
+ (unless allowed
+ (error "Allowed values for this property have not been defined"))
+ (if previous (setq allowed (reverse allowed)))
+ (if (member value allowed)
+ (setq nval (car (cdr (member value allowed)))))
+ (setq nval (or nval (car allowed)))
+ (if (equal nval value)
+ (error "Only one allowed value for this property"))
+ (org-at-property-p)
+ (replace-match (concat " :" key ": " nval) t t)
+ (org-indent-line-function)
+ (beginning-of-line 1)
+ (skip-chars-forward " \t")))
+
+(defun org-find-entry-with-id (ident)
+ "Locate the entry that contains the ID property with exact value IDENT.
+IDENT can be a string, a symbol or a number, this function will search for
+the string representation of it.
+Return the position where this entry starts, or nil if there is no such entry."
+ (let ((id (cond
+ ((stringp ident) ident)
+ ((symbol-name ident) (symbol-name ident))
+ ((numberp ident) (number-to-string ident))
+ (t (error "IDENT %s must be a string, symbol or number" ident))))
+ (case-fold-search nil))
+ (save-excursion
+ (save-restriction
+ (goto-char (point-min))
+ (when (re-search-forward
+ (concat "^[ \t]*:ID:[ \t]+" (regexp-quote id) "[ \t]*$")
+ nil t)
+ (org-back-to-heading)
+ (point))))))
+
+;;; Column View
+
+(defvar org-columns-overlays nil
+ "Holds the list of current column overlays.")
+
+(defvar org-columns-current-fmt nil
+ "Local variable, holds the currently active column format.")
+(defvar org-columns-current-fmt-compiled nil
+ "Local variable, holds the currently active column format.
+This is the compiled version of the format.")
+(defvar org-columns-current-widths nil
+ "Loval variable, holds the currently widths of fields.")
+(defvar org-columns-current-maxwidths nil
+ "Loval variable, holds the currently active maximum column widths.")
+(defvar org-columns-begin-marker (make-marker)
+ "Points to the position where last a column creation command was called.")
+(defvar org-columns-top-level-marker (make-marker)
+ "Points to the position where current columns region starts.")
+
+(defvar org-columns-map (make-sparse-keymap)
+ "The keymap valid in column display.")
+
+(defun org-columns-content ()
+ "Switch to contents view while in columns view."
+ (interactive)
+ (org-overview)
+ (org-content))
+
+(org-defkey org-columns-map "c" 'org-columns-content)
+(org-defkey org-columns-map "o" 'org-overview)
+(org-defkey org-columns-map "e" 'org-columns-edit-value)
+(org-defkey org-columns-map "\C-c\C-t" 'org-columns-todo)
+(org-defkey org-columns-map "\C-c\C-c" 'org-columns-set-tags-or-toggle)
+(org-defkey org-columns-map "\C-c\C-o" 'org-columns-open-link)
+(org-defkey org-columns-map "v" 'org-columns-show-value)
+(org-defkey org-columns-map "q" 'org-columns-quit)
+(org-defkey org-columns-map "r" 'org-columns-redo)
+(org-defkey org-columns-map [left] 'backward-char)
+(org-defkey org-columns-map "\M-b" 'backward-char)
+(org-defkey org-columns-map "a" 'org-columns-edit-allowed)
+(org-defkey org-columns-map "s" 'org-columns-edit-attributes)
+(org-defkey org-columns-map "\M-f" (lambda () (interactive) (goto-char (1+ (point)))))
+(org-defkey org-columns-map [right] (lambda () (interactive) (goto-char (1+ (point)))))
+(org-defkey org-columns-map [(shift right)] 'org-columns-next-allowed-value)
+(org-defkey org-columns-map "n" 'org-columns-next-allowed-value)
+(org-defkey org-columns-map [(shift left)] 'org-columns-previous-allowed-value)
+(org-defkey org-columns-map "p" 'org-columns-previous-allowed-value)
+(org-defkey org-columns-map "<" 'org-columns-narrow)
+(org-defkey org-columns-map ">" 'org-columns-widen)
+(org-defkey org-columns-map [(meta right)] 'org-columns-move-right)
+(org-defkey org-columns-map [(meta left)] 'org-columns-move-left)
+(org-defkey org-columns-map [(shift meta right)] 'org-columns-new)
+(org-defkey org-columns-map [(shift meta left)] 'org-columns-delete)
+
+(easy-menu-define org-columns-menu org-columns-map "Org Column Menu"
+ '("Column"
+ ["Edit property" org-columns-edit-value t]
+ ["Next allowed value" org-columns-next-allowed-value t]
+ ["Previous allowed value" org-columns-previous-allowed-value t]
+ ["Show full value" org-columns-show-value t]
+ ["Edit allowed values" org-columns-edit-allowed t]
+ "--"
+ ["Edit column attributes" org-columns-edit-attributes t]
+ ["Increase column width" org-columns-widen t]
+ ["Decrease column width" org-columns-narrow t]
+ "--"
+ ["Move column right" org-columns-move-right t]
+ ["Move column left" org-columns-move-left t]
+ ["Add column" org-columns-new t]
+ ["Delete column" org-columns-delete t]
+ "--"
+ ["CONTENTS" org-columns-content t]
+ ["OVERVIEW" org-overview t]
+ ["Refresh columns display" org-columns-redo t]
+ "--"
+ ["Open link" org-columns-open-link t]
+ "--"
+ ["Quit" org-columns-quit t]))
+
+(defun org-columns-new-overlay (beg end &optional string face)
+ "Create a new column overlay and add it to the list."
+ (let ((ov (org-make-overlay beg end)))
+ (org-overlay-put ov 'face (or face 'secondary-selection))
+ (org-overlay-display ov string face)
+ (push ov org-columns-overlays)
+ ov))
+
+(defun org-columns-display-here (&optional props)
+ "Overlay the current line with column display."
+ (interactive)
+ (let* ((fmt org-columns-current-fmt-compiled)
+ (beg (point-at-bol))
+ (level-face (save-excursion
+ (beginning-of-line 1)
+ (and (looking-at "\\(\\**\\)\\(\\* \\)")
+ (org-get-level-face 2))))
+ (color (list :foreground
+ (face-attribute (or level-face 'default) :foreground)))
+ props pom property ass width f string ov column val modval)
+ ;; Check if the entry is in another buffer.
+ (unless props
+ (if (eq major-mode 'org-agenda-mode)
+ (setq pom (or (get-text-property (point) 'org-hd-marker)
+ (get-text-property (point) 'org-marker))
+ props (if pom (org-entry-properties pom) nil))
+ (setq props (org-entry-properties nil))))
+ ;; Walk the format
+ (while (setq column (pop fmt))
+ (setq property (car column)
+ ass (if (equal property "ITEM")
+ (cons "ITEM"
+ (save-match-data
+ (org-no-properties
+ (org-remove-tabs
+ (buffer-substring-no-properties
+ (point-at-bol) (point-at-eol))))))
+ (assoc property props))
+ width (or (cdr (assoc property org-columns-current-maxwidths))
+ (nth 2 column)
+ (length property))
+ f (format "%%-%d.%ds | " width width)
+ val (or (cdr ass) "")
+ modval (if (equal property "ITEM")
+ (org-columns-cleanup-item val org-columns-current-fmt-compiled))
+ string (format f (or modval val)))
+ ;; Create the overlay
+ (org-unmodified
+ (setq ov (org-columns-new-overlay
+ beg (setq beg (1+ beg)) string
+ (list color 'org-column)))
+;;; (list (get-text-property (point-at-bol) 'face) 'org-column)))
+ (org-overlay-put ov 'keymap org-columns-map)
+ (org-overlay-put ov 'org-columns-key property)
+ (org-overlay-put ov 'org-columns-value (cdr ass))
+ (org-overlay-put ov 'org-columns-value-modified modval)
+ (org-overlay-put ov 'org-columns-pom pom)
+ (org-overlay-put ov 'org-columns-format f))
+ (if (or (not (char-after beg))
+ (equal (char-after beg) ?\n))
+ (let ((inhibit-read-only t))
+ (save-excursion
+ (goto-char beg)
+ (org-unmodified (insert " ")))))) ;; FIXME: add props and remove later?
+ ;; Make the rest of the line disappear.
+ (org-unmodified
+ (setq ov (org-columns-new-overlay beg (point-at-eol)))
+ (org-overlay-put ov 'invisible t)
+ (org-overlay-put ov 'keymap org-columns-map)
+ (org-overlay-put ov 'intangible t)
+ (push ov org-columns-overlays)
+ (setq ov (org-make-overlay (1- (point-at-eol)) (1+ (point-at-eol))))
+ (org-overlay-put ov 'keymap org-columns-map)
+ (push ov org-columns-overlays)
+ (let ((inhibit-read-only t))
+ (put-text-property (max (point-min) (1- (point-at-bol)))
+ (min (point-max) (1+ (point-at-eol)))
+ 'read-only "Type `e' to edit property")))))
+
+(defvar org-previous-header-line-format nil
+ "The header line format before column view was turned on.")
+(defvar org-columns-inhibit-recalculation nil
+ "Inhibit recomputing of columns on column view startup.")
+
+
+(defvar header-line-format)
+(defun org-columns-display-here-title ()
+ "Overlay the newline before the current line with the table title."
+ (interactive)
+ (let ((fmt org-columns-current-fmt-compiled)
+ string (title "")
+ property width f column str widths)
+ (while (setq column (pop fmt))
+ (setq property (car column)
+ str (or (nth 1 column) property)
+ width (or (cdr (assoc property org-columns-current-maxwidths))
+ (nth 2 column)
+ (length str))
+ widths (push width widths)
+ f (format "%%-%d.%ds | " width width)
+ string (format f str)
+ title (concat title string)))
+ (setq title (concat
+ (org-add-props " " nil 'display '(space :align-to 0))
+ (org-add-props title nil 'face '(:weight bold :underline t))))
+ (org-set-local 'org-previous-header-line-format header-line-format)
+ (org-set-local 'org-columns-current-widths (nreverse widths))
+ (setq header-line-format title)))
+
+(defun org-columns-remove-overlays ()
+ "Remove all currently active column overlays."
+ (interactive)
+ (when (marker-buffer org-columns-begin-marker)
+ (with-current-buffer (marker-buffer org-columns-begin-marker)
+ (when (local-variable-p 'org-previous-header-line-format)
+ (setq header-line-format org-previous-header-line-format)
+ (kill-local-variable 'org-previous-header-line-format))
+ (move-marker org-columns-begin-marker nil)
+ (move-marker org-columns-top-level-marker nil)
+ (org-unmodified
+ (mapc 'org-delete-overlay org-columns-overlays)
+ (setq org-columns-overlays nil)
+ (let ((inhibit-read-only t))
+ (remove-text-properties (point-min) (point-max) '(read-only t)))))))
+
+(defun org-columns-cleanup-item (item fmt)
+ "Remove from ITEM what is a column in the format FMT."
+ (if (not org-complex-heading-regexp)
+ item
+ (when (string-match org-complex-heading-regexp item)
+ (concat
+ (org-add-props (concat (match-string 1 item) " ") nil
+ 'org-whitespace (* 2 (1- (org-reduced-level (- (match-end 1) (match-beginning 1))))))
+ (and (match-end 2) (not (assoc "TODO" fmt)) (concat " " (match-string 2 item)))
+ (and (match-end 3) (not (assoc "PRIORITY" fmt)) (concat " " (match-string 3 item)))
+ " " (match-string 4 item)
+ (and (match-end 5) (not (assoc "TAGS" fmt)) (concat " " (match-string 5 item)))))))
+
+(defun org-columns-show-value ()
+ "Show the full value of the property."
+ (interactive)
+ (let ((value (get-char-property (point) 'org-columns-value)))
+ (message "Value is: %s" (or value ""))))
+
+(defun org-columns-quit ()
+ "Remove the column overlays and in this way exit column editing."
+ (interactive)
+ (org-unmodified
+ (org-columns-remove-overlays)
+ (let ((inhibit-read-only t))
+ (remove-text-properties (point-min) (point-max) '(read-only t))))
+ (when (eq major-mode 'org-agenda-mode)
+ (message
+ "Modification not yet reflected in Agenda buffer, use `r' to refresh")))
+
+(defun org-columns-check-computed ()
+ "Check if this column value is computed.
+If yes, throw an error indicating that changing it does not make sense."
+ (let ((val (get-char-property (point) 'org-columns-value)))
+ (when (and (stringp val)
+ (get-char-property 0 'org-computed val))
+ (error "This value is computed from the entry's children"))))
+
+(defun org-columns-todo (&optional arg)
+ "Change the TODO state during column view."
+ (interactive "P")
+ (org-columns-edit-value "TODO"))
+
+(defun org-columns-set-tags-or-toggle (&optional arg)
+ "Toggle checkbox at point, or set tags for current headline."
+ (interactive "P")
+ (if (string-match "\\`\\[[ xX-]\\]\\'"
+ (get-char-property (point) 'org-columns-value))
+ (org-columns-next-allowed-value)
+ (org-columns-edit-value "TAGS")))
+
+(defun org-columns-edit-value (&optional key)
+ "Edit the value of the property at point in column view.
+Where possible, use the standard interface for changing this line."
+ (interactive)
+ (org-columns-check-computed)
+ (let* ((external-key key)
+ (col (current-column))
+ (key (or key (get-char-property (point) 'org-columns-key)))
+ (value (get-char-property (point) 'org-columns-value))
+ (bol (point-at-bol)) (eol (point-at-eol))
+ (pom (or (get-text-property bol 'org-hd-marker)
+ (point))) ; keep despite of compiler waring
+ (line-overlays
+ (delq nil (mapcar (lambda (x)
+ (and (eq (overlay-buffer x) (current-buffer))
+ (>= (overlay-start x) bol)
+ (<= (overlay-start x) eol)
+ x))
+ org-columns-overlays)))
+ nval eval allowed)
+ (cond
+ ((equal key "ITEM")
+ (setq eval '(org-with-point-at pom
+ (org-edit-headline))))
+ ((equal key "TODO")
+ (setq eval '(org-with-point-at pom
+ (let ((current-prefix-arg
+ (if external-key current-prefix-arg '(4))))
+ (call-interactively 'org-todo)))))
+ ((equal key "PRIORITY")
+ (setq eval '(org-with-point-at pom
+ (call-interactively 'org-priority))))
+ ((equal key "TAGS")
+ (setq eval '(org-with-point-at pom
+ (let ((org-fast-tag-selection-single-key
+ (if (eq org-fast-tag-selection-single-key 'expert)
+ t org-fast-tag-selection-single-key)))
+ (call-interactively 'org-set-tags)))))
+ ((equal key "DEADLINE")
+ (setq eval '(org-with-point-at pom
+ (call-interactively 'org-deadline))))
+ ((equal key "SCHEDULED")
+ (setq eval '(org-with-point-at pom
+ (call-interactively 'org-schedule))))
+ (t
+ (setq allowed (org-property-get-allowed-values pom key 'table))
+ (if allowed
+ (setq nval (completing-read "Value: " allowed nil t))
+ (setq nval (read-string "Edit: " value)))
+ (setq nval (org-trim nval))
+ (when (not (equal nval value))
+ (setq eval '(org-entry-put pom key nval)))))
+ (when eval
+ (let ((inhibit-read-only t))
+ (remove-text-properties (max (point-min) (1- bol)) eol '(read-only t))
+ (unwind-protect
+ (progn
+ (setq org-columns-overlays
+ (org-delete-all line-overlays org-columns-overlays))
+ (mapc 'org-delete-overlay line-overlays)
+ (org-columns-eval eval))
+ (org-columns-display-here))))
+ (move-to-column col)
+ (if (nth 3 (assoc key org-columns-current-fmt-compiled))
+ (org-columns-update key))))
+
+(defun org-edit-headline () ; FIXME: this is not columns specific
+ "Edit the current headline, the part without TODO keyword, TAGS."
+ (org-back-to-heading)
+ (when (looking-at org-todo-line-regexp)
+ (let ((pre (buffer-substring (match-beginning 0) (match-beginning 3)))
+ (txt (match-string 3))
+ (post "")
+ txt2)
+ (if (string-match (org-re "[ \t]+:[[:alnum:]:_@]+:[ \t]*$") txt)
+ (setq post (match-string 0 txt)
+ txt (substring txt 0 (match-beginning 0))))
+ (setq txt2 (read-string "Edit: " txt))
+ (when (not (equal txt txt2))
+ (beginning-of-line 1)
+ (insert pre txt2 post)
+ (delete-region (point) (point-at-eol))
+ (org-set-tags nil t)))))
+
+(defun org-columns-edit-allowed ()
+ "Edit the list of allowed values for the current property."
+ (interactive)
+ (let* ((key (get-char-property (point) 'org-columns-key))
+ (key1 (concat key "_ALL"))
+ (allowed (org-entry-get (point) key1 t))
+ nval)
+ ;; FIXME: Cover editing TODO, TAGS etc in-buffer settings.????
+ (setq nval (read-string "Allowed: " allowed))
+ (org-entry-put
+ (cond ((marker-position org-entry-property-inherited-from)
+ org-entry-property-inherited-from)
+ ((marker-position org-columns-top-level-marker)
+ org-columns-top-level-marker))
+ key1 nval)))
+
+(defmacro org-no-warnings (&rest body)
+ (cons (if (fboundp 'with-no-warnings) 'with-no-warnings 'progn) body))
+
+(defun org-columns-eval (form)
+ (let (hidep)
+ (save-excursion
+ (beginning-of-line 1)
+ ;; `next-line' is needed here, because it skips invisible line.
+ (condition-case nil (org-no-warnings (next-line 1)) (error nil))
+ (setq hidep (org-on-heading-p 1)))
+ (eval form)
+ (and hidep (hide-entry))))
+
+(defun org-columns-previous-allowed-value ()
+ "Switch to the previous allowed value for this column."
+ (interactive)
+ (org-columns-next-allowed-value t))
+
+(defun org-columns-next-allowed-value (&optional previous)
+ "Switch to the next allowed value for this column."
+ (interactive)
+ (org-columns-check-computed)
+ (let* ((col (current-column))
+ (key (get-char-property (point) 'org-columns-key))
+ (value (get-char-property (point) 'org-columns-value))
+ (bol (point-at-bol)) (eol (point-at-eol))
+ (pom (or (get-text-property bol 'org-hd-marker)
+ (point))) ; keep despite of compiler waring
+ (line-overlays
+ (delq nil (mapcar (lambda (x)
+ (and (eq (overlay-buffer x) (current-buffer))
+ (>= (overlay-start x) bol)
+ (<= (overlay-start x) eol)
+ x))
+ org-columns-overlays)))
+ (allowed (or (org-property-get-allowed-values pom key)
+ (and (equal
+ (nth 4 (assoc key org-columns-current-fmt-compiled))
+ 'checkbox) '("[ ]" "[X]"))))
+ nval)
+ (when (equal key "ITEM")
+ (error "Cannot edit item headline from here"))
+ (unless (or allowed (member key '("SCHEDULED" "DEADLINE")))
+ (error "Allowed values for this property have not been defined"))
+ (if (member key '("SCHEDULED" "DEADLINE"))
+ (setq nval (if previous 'earlier 'later))
+ (if previous (setq allowed (reverse allowed)))
+ (if (member value allowed)
+ (setq nval (car (cdr (member value allowed)))))
+ (setq nval (or nval (car allowed)))
+ (if (equal nval value)
+ (error "Only one allowed value for this property")))
+ (let ((inhibit-read-only t))
+ (remove-text-properties (1- bol) eol '(read-only t))
+ (unwind-protect
+ (progn
+ (setq org-columns-overlays
+ (org-delete-all line-overlays org-columns-overlays))
+ (mapc 'org-delete-overlay line-overlays)
+ (org-columns-eval '(org-entry-put pom key nval)))
+ (org-columns-display-here)))
+ (move-to-column col)
+ (if (nth 3 (assoc key org-columns-current-fmt-compiled))
+ (org-columns-update key))))
+
+(defun org-verify-version (task)
+ (cond
+ ((eq task 'columns)
+ (if (or (featurep 'xemacs)
+ (< emacs-major-version 22))
+ (error "Emacs 22 is required for the columns feature")))))
+
+(defun org-columns-open-link (&optional arg)
+ (interactive "P")
+ (let ((key (get-char-property (point) 'org-columns-key))
+ (value (get-char-property (point) 'org-columns-value)))
+ (org-open-link-from-string arg)))
+
+(defun org-open-link-from-string (s &optional arg)
+ "Open a link in the string S, as if it was in Org-mode."
+ (interactive)
+ (with-temp-buffer
+ (let ((org-inhibit-startup t))
+ (org-mode)
+ (insert s)
+ (goto-char (point-min))
+ (org-open-at-point arg))))
+
+(defun org-columns-get-format-and-top-level ()
+ (let (fmt)
+ (when (condition-case nil (org-back-to-heading) (error nil))
+ (move-marker org-entry-property-inherited-from nil)
+ (setq fmt (org-entry-get nil "COLUMNS" t)))
+ (setq fmt (or fmt org-columns-default-format))
+ (org-set-local 'org-columns-current-fmt fmt)
+ (org-columns-compile-format fmt)
+ (if (marker-position org-entry-property-inherited-from)
+ (move-marker org-columns-top-level-marker
+ org-entry-property-inherited-from)
+ (move-marker org-columns-top-level-marker (point)))
+ fmt))
+
+(defun org-columns ()
+ "Turn on column view on an org-mode file."
+ (interactive)
+ (org-verify-version 'columns)
+ (org-columns-remove-overlays)
+ (move-marker org-columns-begin-marker (point))
+ (let (beg end fmt cache maxwidths)
+ (setq fmt (org-columns-get-format-and-top-level))
+ (save-excursion
+ (goto-char org-columns-top-level-marker)
+ (setq beg (point))
+ (unless org-columns-inhibit-recalculation
+ (org-columns-compute-all))
+ (setq end (or (condition-case nil (org-end-of-subtree t t) (error nil))
+ (point-max)))
+ (goto-char beg)
+ ;; Get and cache the properties
+ (while (re-search-forward (concat "^" outline-regexp) end t)
+ (push (cons (org-current-line) (org-entry-properties)) cache))
+ (when cache
+ (setq maxwidths (org-columns-get-autowidth-alist fmt cache))
+ (org-set-local 'org-columns-current-maxwidths maxwidths)
+ (org-columns-display-here-title)
+ (mapc (lambda (x)
+ (goto-line (car x))
+ (org-columns-display-here (cdr x)))
+ cache)))))
+
+(defun org-columns-new (&optional prop title width op fmt)
+ "Insert a new column, to the leeft o the current column."
+ (interactive)
+ (let ((editp (and prop (assoc prop org-columns-current-fmt-compiled)))
+ cell)
+ (setq prop (completing-read
+ "Property: " (mapcar 'list (org-buffer-property-keys t))
+ nil nil prop))
+ (setq title (read-string (concat "Column title [" prop "]: ") (or title prop)))
+ (setq width (read-string "Column width: " (if width (number-to-string width))))
+ (if (string-match "\\S-" width)
+ (setq width (string-to-number width))
+ (setq width nil))
+ (setq fmt (completing-read "Summary [none]: "
+ '(("none") ("add_numbers") ("currency") ("add_times") ("checkbox"))
+ nil t))
+ (if (string-match "\\S-" fmt)
+ (setq fmt (intern fmt))
+ (setq fmt nil))
+ (if (eq fmt 'none) (setq fmt nil))
+ (if editp
+ (progn
+ (setcar editp prop)
+ (setcdr editp (list title width nil fmt)))
+ (setq cell (nthcdr (1- (current-column))
+ org-columns-current-fmt-compiled))
+ (setcdr cell (cons (list prop title width nil fmt)
+ (cdr cell))))
+ (org-columns-store-format)
+ (org-columns-redo)))
+
+(defun org-columns-delete ()
+ "Delete the column at point from columns view."
+ (interactive)
+ (let* ((n (current-column))
+ (title (nth 1 (nth n org-columns-current-fmt-compiled))))
+ (when (y-or-n-p
+ (format "Are you sure you want to remove column \"%s\"? " title))
+ (setq org-columns-current-fmt-compiled
+ (delq (nth n org-columns-current-fmt-compiled)
+ org-columns-current-fmt-compiled))
+ (org-columns-store-format)
+ (org-columns-redo)
+ (if (>= (current-column) (length org-columns-current-fmt-compiled))
+ (backward-char 1)))))
+
+(defun org-columns-edit-attributes ()
+ "Edit the attributes of the current column."
+ (interactive)
+ (let* ((n (current-column))
+ (info (nth n org-columns-current-fmt-compiled)))
+ (apply 'org-columns-new info)))
+
+(defun org-columns-widen (arg)
+ "Make the column wider by ARG characters."
+ (interactive "p")
+ (let* ((n (current-column))
+ (entry (nth n org-columns-current-fmt-compiled))
+ (width (or (nth 2 entry)
+ (cdr (assoc (car entry) org-columns-current-maxwidths)))))
+ (setq width (max 1 (+ width arg)))
+ (setcar (nthcdr 2 entry) width)
+ (org-columns-store-format)
+ (org-columns-redo)))
+
+(defun org-columns-narrow (arg)
+ "Make the column nrrower by ARG characters."
+ (interactive "p")
+ (org-columns-widen (- arg)))
+
+(defun org-columns-move-right ()
+ "Swap this column with the one to the right."
+ (interactive)
+ (let* ((n (current-column))
+ (cell (nthcdr n org-columns-current-fmt-compiled))
+ e)
+ (when (>= n (1- (length org-columns-current-fmt-compiled)))
+ (error "Cannot shift this column further to the right"))
+ (setq e (car cell))
+ (setcar cell (car (cdr cell)))
+ (setcdr cell (cons e (cdr (cdr cell))))
+ (org-columns-store-format)
+ (org-columns-redo)
+ (forward-char 1)))
+
+(defun org-columns-move-left ()
+ "Swap this column with the one to the left."
+ (interactive)
+ (let* ((n (current-column)))
+ (when (= n 0)
+ (error "Cannot shift this column further to the left"))
+ (backward-char 1)
+ (org-columns-move-right)
+ (backward-char 1)))
+
+(defun org-columns-store-format ()
+ "Store the text version of the current columns format in appropriate place.
+This is either in the COLUMNS property of the node starting the current column
+display, or in the #+COLUMNS line of the current buffer."
+ (let (fmt (cnt 0))
+ (setq fmt (org-columns-uncompile-format org-columns-current-fmt-compiled))
+ (org-set-local 'org-columns-current-fmt fmt)
+ (if (marker-position org-columns-top-level-marker)
+ (save-excursion
+ (goto-char org-columns-top-level-marker)
+ (if (and (org-at-heading-p)
+ (org-entry-get nil "COLUMNS"))
+ (org-entry-put nil "COLUMNS" fmt)
+ (goto-char (point-min))
+ ;; Overwrite all #+COLUMNS lines....
+ (while (re-search-forward "^#\\+COLUMNS:.*" nil t)
+ (setq cnt (1+ cnt))
+ (replace-match (concat "#+COLUMNS: " fmt) t t))
+ (unless (> cnt 0)
+ (goto-char (point-min))
+ (or (org-on-heading-p t) (outline-next-heading))
+ (let ((inhibit-read-only t))
+ (insert-before-markers "#+COLUMNS: " fmt "\n")))
+ (org-set-local 'org-columns-default-format fmt))))))
+
+(defvar org-overriding-columns-format nil
+ "When set, overrides any other definition.")
+(defvar org-agenda-view-columns-initially nil
+ "When set, switch to columns view immediately after creating the agenda.")
+
+(defun org-agenda-columns ()
+ "Turn on column view in the agenda."
+ (interactive)
+ (org-verify-version 'columns)
+ (org-columns-remove-overlays)
+ (move-marker org-columns-begin-marker (point))
+ (let (fmt cache maxwidths m)
+ (cond
+ ((and (local-variable-p 'org-overriding-columns-format)
+ org-overriding-columns-format)
+ (setq fmt org-overriding-columns-format))
+ ((setq m (get-text-property (point-at-bol) 'org-hd-marker))
+ (setq fmt (org-entry-get m "COLUMNS" t)))
+ ((and (boundp 'org-columns-current-fmt)
+ (local-variable-p 'org-columns-current-fmt)
+ org-columns-current-fmt)
+ (setq fmt org-columns-current-fmt))
+ ((setq m (next-single-property-change (point-min) 'org-hd-marker))
+ (setq m (get-text-property m 'org-hd-marker))
+ (setq fmt (org-entry-get m "COLUMNS" t))))
+ (setq fmt (or fmt org-columns-default-format))
+ (org-set-local 'org-columns-current-fmt fmt)
+ (org-columns-compile-format fmt)
+ (save-excursion
+ ;; Get and cache the properties
+ (goto-char (point-min))
+ (while (not (eobp))
+ (when (setq m (or (get-text-property (point) 'org-hd-marker)
+ (get-text-property (point) 'org-marker)))
+ (push (cons (org-current-line) (org-entry-properties m)) cache))
+ (beginning-of-line 2))
+ (when cache
+ (setq maxwidths (org-columns-get-autowidth-alist fmt cache))
+ (org-set-local 'org-columns-current-maxwidths maxwidths)
+ (org-columns-display-here-title)
+ (mapc (lambda (x)
+ (goto-line (car x))
+ (org-columns-display-here (cdr x)))
+ cache)))))
+
+(defun org-columns-get-autowidth-alist (s cache)
+ "Derive the maximum column widths from the format and the cache."
+ (let ((start 0) rtn)
+ (while (string-match (org-re "%\\([[:alpha:]]\\S-*\\)") s start)
+ (push (cons (match-string 1 s) 1) rtn)
+ (setq start (match-end 0)))
+ (mapc (lambda (x)
+ (setcdr x (apply 'max
+ (mapcar
+ (lambda (y)
+ (length (or (cdr (assoc (car x) (cdr y))) " ")))
+ cache))))
+ rtn)
+ rtn))
+
+(defun org-columns-compute-all ()
+ "Compute all columns that have operators defined."
+ (org-unmodified
+ (remove-text-properties (point-min) (point-max) '(org-summaries t)))
+ (let ((columns org-columns-current-fmt-compiled) col)
+ (while (setq col (pop columns))
+ (when (nth 3 col)
+ (save-excursion
+ (org-columns-compute (car col)))))))
+
+(defun org-columns-update (property)
+ "Recompute PROPERTY, and update the columns display for it."
+ (org-columns-compute property)
+ (let (fmt val pos)
+ (save-excursion
+ (mapc (lambda (ov)
+ (when (equal (org-overlay-get ov 'org-columns-key) property)
+ (setq pos (org-overlay-start ov))
+ (goto-char pos)
+ (when (setq val (cdr (assoc property
+ (get-text-property
+ (point-at-bol) 'org-summaries))))
+ (setq fmt (org-overlay-get ov 'org-columns-format))
+ (org-overlay-put ov 'org-columns-value val)
+ (org-overlay-put ov 'display (format fmt val)))))
+ org-columns-overlays))))
+
+(defun org-columns-compute (property)
+ "Sum the values of property PROPERTY hierarchically, for the entire buffer."
+ (interactive)
+ (let* ((re (concat "^" outline-regexp))
+ (lmax 30) ; Does anyone use deeper levels???
+ (lsum (make-vector lmax 0))
+ (lflag (make-vector lmax nil))
+ (level 0)
+ (ass (assoc property org-columns-current-fmt-compiled))
+ (format (nth 4 ass))
+ (printf (nth 5 ass))
+ (beg org-columns-top-level-marker)
+ last-level val valflag flag end sumpos sum-alist sum str str1 useval)
+ (save-excursion
+ ;; Find the region to compute
+ (goto-char beg)
+ (setq end (condition-case nil (org-end-of-subtree t) (error (point-max))))
+ (goto-char end)
+ ;; Walk the tree from the back and do the computations
+ (while (re-search-backward re beg t)
+ (setq sumpos (match-beginning 0)
+ last-level level
+ level (org-outline-level)
+ val (org-entry-get nil property)
+ valflag (and val (string-match "\\S-" val)))
+ (cond
+ ((< level last-level)
+ ;; put the sum of lower levels here as a property
+ (setq sum (aref lsum last-level) ; current sum
+ flag (aref lflag last-level) ; any valid entries from children?
+ str (org-column-number-to-string sum format printf)
+ str1 (org-add-props (copy-sequence str) nil 'org-computed t 'face 'bold)
+ useval (if flag str1 (if valflag val ""))
+ sum-alist (get-text-property sumpos 'org-summaries))
+ (if (assoc property sum-alist)
+ (setcdr (assoc property sum-alist) useval)
+ (push (cons property useval) sum-alist)
+ (org-unmodified
+ (add-text-properties sumpos (1+ sumpos)
+ (list 'org-summaries sum-alist))))
+ (when val
+ (org-entry-put nil property (if flag str val)))
+ ;; add current to current level accumulator
+ (when (or flag valflag)
+ (aset lsum level (+ (aref lsum level)
+ (if flag sum (org-column-string-to-number
+ (if flag str val) format))))
+ (aset lflag level t))
+ ;; clear accumulators for deeper levels
+ (loop for l from (1+ level) to (1- lmax) do
+ (aset lsum l 0)
+ (aset lflag l nil)))
+ ((>= level last-level)
+ ;; add what we have here to the accumulator for this level
+ (aset lsum level (+ (aref lsum level)
+ (org-column-string-to-number (or val "0") format)))
+ (and valflag (aset lflag level t)))
+ (t (error "This should not happen")))))))
+
+(defun org-columns-redo ()
+ "Construct the column display again."
+ (interactive)
+ (message "Recomputing columns...")
+ (save-excursion
+ (if (marker-position org-columns-begin-marker)
+ (goto-char org-columns-begin-marker))
+ (org-columns-remove-overlays)
+ (if (org-mode-p)
+ (call-interactively 'org-columns)
+ (call-interactively 'org-agenda-columns)))
+ (message "Recomputing columns...done"))
+
+(defun org-columns-not-in-agenda ()
+ (if (eq major-mode 'org-agenda-mode)
+ (error "This command is only allowed in Org-mode buffers")))
+
+
+(defun org-string-to-number (s)
+ "Convert string to number, and interpret hh:mm:ss."
+ (if (not (string-match ":" s))
+ (string-to-number s)
+ (let ((l (nreverse (org-split-string s ":"))) (sum 0.0))
+ (while l
+ (setq sum (+ (string-to-number (pop l)) (/ sum 60))))
+ sum)))
+
+(defun org-column-number-to-string (n fmt printf)
+ "Convert a computed column number to a string value, according to FMT."
+ (cond
+ ((eq fmt 'add_times)
+ (let* ((h (floor n)) (m (floor (+ 0.5 (* 60 (- n h))))))
+ (format "%d:%02d" h m)))
+ ((eq fmt 'checkbox)
+ (cond ((= n (floor n)) "[X]")
+ ((> n 1.) "[-]")
+ (t "[ ]")))
+ (printf (format printf n))
+ ((eq fmt 'currency)
+ (format "%.2f" n))
+ (t (number-to-string n))))
+
+(defun org-column-string-to-number (s fmt)
+ "Convert a column value to a number that can be used for column computing."
+ (cond
+ ((string-match ":" s)
+ (let ((l (nreverse (org-split-string s ":"))) (sum 0.0))
+ (while l
+ (setq sum (+ (string-to-number (pop l)) (/ sum 60))))
+ sum))
+ ((eq fmt 'checkbox)
+ (if (equal s "[X]") 1. 0.000001))
+ (t (string-to-number s))))
+
+(defun org-columns-uncompile-format (cfmt)
+ "Turn the compiled columns format back into a string representation."
+ (let ((rtn "") e s prop title op width fmt printf)
+ (while (setq e (pop cfmt))
+ (setq prop (car e)
+ title (nth 1 e)
+ width (nth 2 e)
+ op (nth 3 e)
+ fmt (nth 4 e)
+ printf (nth 5 e))
+ (cond
+ ((eq fmt 'add_times) (setq op ":"))
+ ((eq fmt 'checkbox) (setq op "X"))
+ ((eq fmt 'add_numbers) (setq op "+"))
+ ((eq fmt 'currency) (setq op "$")))
+ (if (and op printf) (setq op (concat op ";" printf)))
+ (if (equal title prop) (setq title nil))
+ (setq s (concat "%" (if width (number-to-string width))
+ prop
+ (if title (concat "(" title ")"))
+ (if op (concat "{" op "}"))))
+ (setq rtn (concat rtn " " s)))
+ (org-trim rtn)))
+
+(defun org-columns-compile-format (fmt)
+ "Turn a column format string into an alist of specifications.
+The alist has one entry for each column in the format. The elements of
+that list are:
+property the property
+title the title field for the columns
+width the column width in characters, can be nil for automatic
+operator the operator if any
+format the output format for computed results, derived from operator
+printf a printf format for computed values"
+ (let ((start 0) width prop title op f printf)
+ (setq org-columns-current-fmt-compiled nil)
+ (while (string-match
+ (org-re "%\\([0-9]+\\)?\\([[:alnum:]_-]+\\)\\(?:(\\([^)]+\\))\\)?\\(?:{\\([^}]+\\)}\\)?\\s-*")
+ fmt start)
+ (setq start (match-end 0)
+ width (match-string 1 fmt)
+ prop (match-string 2 fmt)
+ title (or (match-string 3 fmt) prop)
+ op (match-string 4 fmt)
+ f nil
+ printf nil)
+ (if width (setq width (string-to-number width)))
+ (when (and op (string-match ";" op))
+ (setq printf (substring op (match-end 0))
+ op (substring op 0 (match-beginning 0))))
+ (cond
+ ((equal op "+") (setq f 'add_numbers))
+ ((equal op "$") (setq f 'currency))
+ ((equal op ":") (setq f 'add_times))
+ ((equal op "X") (setq f 'checkbox)))
+ (push (list prop title width op f printf) org-columns-current-fmt-compiled))
+ (setq org-columns-current-fmt-compiled
+ (nreverse org-columns-current-fmt-compiled))))
+
+
+;;; Dynamic block for Column view
+
+(defun org-columns-capture-view ()
+ "Get the column view of the current buffer and return it as a list.
+The list will contains the title row and all other rows. Each row is
+a list of fields."
+ (save-excursion
+ (let* ((title (mapcar 'cadr org-columns-current-fmt-compiled))
+ (n (length title)) row tbl)
+ (goto-char (point-min))
+ (while (re-search-forward "^\\*+ " nil t)
+ (when (get-char-property (match-beginning 0) 'org-columns-key)
+ (setq row nil)
+ (loop for i from 0 to (1- n) do
+ (push (or (get-char-property (+ (match-beginning 0) i) 'org-columns-value-modified)
+ (get-char-property (+ (match-beginning 0) i) 'org-columns-value)
+ "")
+ row))
+ (setq row (nreverse row))
+ (push row tbl)))
+ (append (list title 'hline) (nreverse tbl)))))
+
+(defun org-dblock-write:columnview (params)
+ "Write the column view table.
+PARAMS is a property list of parameters:
+
+:width enforce same column widths with <N> specifiers.
+:id the :ID: property of the entry where the columns view
+ should be built, as a string. When `local', call locally.
+ When `global' call column view with the cursor at the beginning
+ of the buffer (usually this means that the whole buffer switches
+ to column view).
+:hlines When t, insert a hline before each item. When a number, insert
+ a hline before each level <= that number.
+:vlines When t, make each column a colgroup to enforce vertical lines."
+ (let ((pos (move-marker (make-marker) (point)))
+ (hlines (plist-get params :hlines))
+ (vlines (plist-get params :vlines))
+ tbl id idpos nfields tmp)
+ (save-excursion
+ (save-restriction
+ (when (setq id (plist-get params :id))
+ (cond ((not id) nil)
+ ((eq id 'global) (goto-char (point-min)))
+ ((eq id 'local) nil)
+ ((setq idpos (org-find-entry-with-id id))
+ (goto-char idpos))
+ (t (error "Cannot find entry with :ID: %s" id))))
+ (org-columns)
+ (setq tbl (org-columns-capture-view))
+ (setq nfields (length (car tbl)))
+ (org-columns-quit)))
+ (goto-char pos)
+ (move-marker pos nil)
+ (when tbl
+ (when (plist-get params :hlines)
+ (setq tmp nil)
+ (while tbl
+ (if (eq (car tbl) 'hline)
+ (push (pop tbl) tmp)
+ (if (string-match "\\` *\\(\\*+\\)" (caar tbl))
+ (if (and (not (eq (car tmp) 'hline))
+ (or (eq hlines t)
+ (and (numberp hlines) (<= (- (match-end 1) (match-beginning 1)) hlines))))
+ (push 'hline tmp)))
+ (push (pop tbl) tmp)))
+ (setq tbl (nreverse tmp)))
+ (when vlines
+ (setq tbl (mapcar (lambda (x)
+ (if (eq 'hline x) x (cons "" x)))
+ tbl))
+ (setq tbl (append tbl (list (cons "/" (make-list nfields "<>"))))))
+ (setq pos (point))
+ (insert (org-listtable-to-string tbl))
+ (when (plist-get params :width)
+ (insert "\n|" (mapconcat (lambda (x) (format "<%d>" (max 3 x)))
+ org-columns-current-widths "|")))
+ (goto-char pos)
+ (org-table-align))))
+
+(defun org-listtable-to-string (tbl)
+ "Convert a listtable TBL to a string that contains the Org-mode table.
+The table still need to be alligned. The resulting string has no leading
+and tailing newline characters."
+ (mapconcat
+ (lambda (x)
+ (cond
+ ((listp x)
+ (concat "|" (mapconcat 'identity x "|") "|"))
+ ((eq x 'hline) "|-|")
+ (t (error "Garbage in listtable: %s" x))))
+ tbl "\n"))
+
+(defun org-insert-columns-dblock ()
+ "Create a dynamic block capturing a column view table."
+ (interactive)
+ (let ((defaults '(:name "columnview" :hlines 1))
+ (id (completing-read
+ "Capture columns (local, global, entry with :ID: property) [local]: "
+ (append '(("global") ("local"))
+ (mapcar 'list (org-property-values "ID"))))))
+ (if (equal id "") (setq id 'local))
+ (if (equal id "global") (setq id 'global))
+ (setq defaults (append defaults (list :id id)))
+ (org-create-dblock defaults)
+ (org-update-dblock)))
+
;;;; Timestamps
(defvar org-last-changed-timestamp nil)
@@ -12908,18 +17085,30 @@ So if you press just return without typing anything, the time stamp
will represent the current date/time. If there is already a timestamp
at the cursor, it will be modified."
(interactive "P")
- (let (org-time-was-given org-end-time-was-given time)
+ (let* ((ts nil)
+ (default-time
+ ;; Default time is either today, or, when entering a range,
+ ;; the range start.
+ (if (or (and (org-at-timestamp-p t) (setq ts (match-string 0)))
+ (save-excursion
+ (re-search-backward
+ (concat org-ts-regexp "--?-?\\=") ; 1-3 minuses
+ (- (point) 20) t)))
+ (apply 'encode-time (org-parse-time-string (match-string 1)))
+ (current-time)))
+ (default-input (and ts (org-get-compact-tod ts)))
+ org-time-was-given org-end-time-was-given time)
(cond
((and (org-at-timestamp-p)
(eq last-command 'org-time-stamp)
(eq this-command 'org-time-stamp))
(insert "--")
(setq time (let ((this-command this-command))
- (org-read-date arg 'totime)))
+ (org-read-date arg 'totime nil nil default-time default-input)))
(org-insert-time-stamp time (or org-time-was-given arg)))
((org-at-timestamp-p)
(setq time (let ((this-command this-command))
- (org-read-date arg 'totime)))
+ (org-read-date arg 'totime nil nil default-time default-input)))
(when (org-at-timestamp-p) ; just to get the match data
(replace-match "")
(setq org-last-changed-timestamp
@@ -12929,9 +17118,27 @@ at the cursor, it will be modified."
(message "Timestamp updated"))
(t
(setq time (let ((this-command this-command))
- (org-read-date arg 'totime)))
+ (org-read-date arg 'totime nil nil default-time default-input)))
(org-insert-time-stamp time (or org-time-was-given arg)
- nil nil nil (list org-end-time-was-given))))))
+ nil nil nil (list org-end-time-was-given))))))
+
+;; FIXME: can we use this for something else????
+;; like computing time differences?????
+(defun org-get-compact-tod (s)
+ (when (string-match "\\(\\([012]?[0-9]\\):\\([0-5][0-9]\\)\\)\\(-\\(\\([012]?[0-9]\\):\\([0-5][0-9]\\)\\)\\)?" s)
+ (let* ((t1 (match-string 1 s))
+ (h1 (string-to-number (match-string 2 s)))
+ (m1 (string-to-number (match-string 3 s)))
+ (t2 (and (match-end 4) (match-string 5 s)))
+ (h2 (and t2 (string-to-number (match-string 6 s))))
+ (m2 (and t2 (string-to-number (match-string 7 s))))
+ dh dm)
+ (if (not t2)
+ t1
+ (setq dh (- h2 h1) dm (- m2 m1))
+ (if (< dm 0) (setq dm (+ dm 60) dh (1- dh)))
+ (concat t1 "+" (number-to-string dh)
+ (if (/= 0 dm) (concat ":" (number-to-string dm))))))))
(defun org-time-stamp-inactive (&optional arg)
"Insert an inactive time stamp.
@@ -12953,12 +17160,19 @@ So these are more for recording a certain time/date."
(defvar org-ans2) ; dynamically scoped parameter
(defvar org-plain-time-of-day-regexp) ; defined below
-(defun org-read-date (&optional with-time to-time from-string prompt)
- "Read a date and make things smooth for the user.
+
+(defvar org-read-date-overlay nil)
+(defvar org-dcst nil) ; dynamically scoped
+
+(defun org-read-date (&optional with-time to-time from-string prompt
+ default-time default-input)
+ "Read a date, possibly a time, and make things smooth for the user.
The prompt will suggest to enter an ISO date, but you can also enter anything
which will at least partially be understood by `parse-time-string'.
Unrecognized parts of the date will default to the current day, month, year,
-hour and minute. For example,
+hour and minute. If this command is called to replace a timestamp at point,
+of to enter the second timestamp of a range, the default time is taken from the
+existing stamp. For example,
3-2-5 --> 2003-02-05
feb 15 --> currentyear-02-15
sep 12 9 --> 2009-09-12
@@ -12966,8 +17180,18 @@ hour and minute. For example,
22 sept 0:34 --> currentyear-09-22 0:34
12 --> currentyear-currentmonth-12
Fri --> nearest Friday (today or later)
- +4 --> four days from today (only if +N is the only thing given)
etc.
+
+Furthermore you can specify a relative date by giving, as the *first* thing
+in the input: a plus/minus sign, a number and a letter [dwmy] to indicate
+change in days weeks, months, years.
+With a single plus or minus, the date is relative to today. With a double
+plus or minus, it is relative to the date in DEFAULT-TIME. E.g.
+ +4d --> four days from today
+ +4 --> same as above
+ +2w --> two weeks from today
+ ++5 --> five days from default date
+
The function understands only English month and weekday abbreviations,
but this can be configured with the variables `parse-time-months' and
`parse-time-weekdays'.
@@ -12976,7 +17200,7 @@ While prompting, a calendar is popped up - you can also select the
date with the mouse (button 1). The calendar shows a period of three
months. To scroll it to other months, use the keys `>' and `<'.
If you don't like the calendar, turn it off with
- \(setq org-popup-calendar-for-date-prompt nil)
+ \(setq org-read-date-popup-calendar nil)
With optional argument TO-TIME, the date will immediately be converted
to an internal time.
@@ -12984,40 +17208,40 @@ With an optional argument WITH-TIME, the prompt will suggest to also
insert a time. Note that when WITH-TIME is not set, you can still
enter a time, and this function will inform the calling routine about
this change. The calling routine may then choose to change the format
-used to insert the time stamp into the buffer to include the time."
+used to insert the time stamp into the buffer to include the time.
+With optional argument FROM-STRING, read from this string instead from
+the user. PROMPT can overwrite the default prompt. DEFAULT-TIME is
+the time/date that is used for everything that is not specified by the
+user."
(require 'parse-time)
(let* ((org-time-stamp-rounding-minutes
(if (equal with-time '(16)) 0 org-time-stamp-rounding-minutes))
+ (org-dcst org-display-custom-times)
(ct (org-current-time))
- (default-time
- ;; Default time is either today, or, when entering a range,
- ;; the range start.
- (if (save-excursion
- (re-search-backward
- (concat org-ts-regexp "--?-?\\=") ; 1-3 minuses
- (- (point) 20) t))
- (apply
- 'encode-time
- (mapcar (lambda(x) (or x 0))
- (parse-time-string (match-string 1))))
- ct))
+ (def (or default-time ct))
+ (defdecode (decode-time def))
+ (dummy (progn
+ (when (< (nth 2 defdecode) org-extend-today-until)
+ (setcar (nthcdr 2 defdecode) -1)
+ (setcar (nthcdr 1 defdecode) 59)
+ (setq def (apply 'encode-time defdecode)
+ defdecode (decode-time def)))))
(calendar-move-hook nil)
(view-diary-entries-initially nil)
(view-calendar-holidays-initially nil)
(timestr (format-time-string
- (if with-time "%Y-%m-%d %H:%M" "%Y-%m-%d") default-time))
+ (if with-time "%Y-%m-%d %H:%M" "%Y-%m-%d") def))
(prompt (concat (if prompt (concat prompt " ") "")
- (format "Date and/or time (default [%s]): " timestr)))
- ans (org-ans0 "") org-ans1 org-ans2 (deltadays 0)
- second minute hour day month year tl wday wday1 pm)
+ (format "Date+time [%s]: " timestr)))
+ ans (org-ans0 "") org-ans1 org-ans2 final)
(cond
(from-string (setq ans from-string))
- (org-popup-calendar-for-date-prompt
+ (org-read-date-popup-calendar
(save-excursion
(save-window-excursion
(calendar)
- (calendar-forward-day (- (time-to-days default-time)
+ (calendar-forward-day (- (time-to-days def)
(calendar-absolute-from-gregorian
(calendar-current-date))))
(org-eval-in-calendar nil t)
@@ -13035,6 +17259,12 @@ used to insert the time stamp into the buffer to include the time."
(org-defkey minibuffer-local-map [(meta shift right)]
(lambda () (interactive)
(org-eval-in-calendar '(calendar-forward-month 1))))
+ (org-defkey minibuffer-local-map [(meta shift up)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-backward-year 1))))
+ (org-defkey minibuffer-local-map [(meta shift down)]
+ (lambda () (interactive)
+ (org-eval-in-calendar '(calendar-forward-year 1))))
(org-defkey minibuffer-local-map [(shift up)]
(lambda () (interactive)
(org-eval-in-calendar '(calendar-backward-week 1))))
@@ -13056,18 +17286,81 @@ used to insert the time stamp into the buffer to include the time."
(unwind-protect
(progn
(use-local-map map)
- (setq org-ans0 (read-string prompt "" nil nil))
+ (add-hook 'post-command-hook 'org-read-date-display)
+ (setq org-ans0 (read-string prompt default-input nil nil))
;; org-ans0: from prompt
;; org-ans1: from mouse click
;; org-ans2: from calendar motion
(setq ans (concat org-ans0 " " (or org-ans1 org-ans2))))
- (use-local-map old-map))))))
+ (remove-hook 'post-command-hook 'org-read-date-display)
+ (use-local-map old-map)
+ (when org-read-date-overlay
+ (org-delete-overlay org-read-date-overlay)
+ (setq org-read-date-overlay nil)))))))
+
(t ; Naked prompt only
- (setq ans (read-string prompt "" nil timestr))))
- (org-detach-overlay org-date-ovl)
+ (unwind-protect
+ (setq ans (read-string prompt default-input nil timestr))
+ (when org-read-date-overlay
+ (org-delete-overlay org-read-date-overlay)
+ (setq org-read-date-overlay nil)))))
+
+ (setq final (org-read-date-analyze ans def defdecode))
- (if (string-match "^[ \t]*[-+][0-9]+[ \t]*$" org-ans0)
- (setq deltadays (string-to-number ans) ans ""))
+ (if to-time
+ (apply 'encode-time final)
+ (if (and (boundp 'org-time-was-given) org-time-was-given)
+ (format "%04d-%02d-%02d %02d:%02d"
+ (nth 5 final) (nth 4 final) (nth 3 final)
+ (nth 2 final) (nth 1 final))
+ (format "%04d-%02d-%02d" (nth 5 final) (nth 4 final) (nth 3 final))))))
+(defvar def)
+(defvar defdecode)
+(defvar with-time)
+(defun org-read-date-display ()
+ "Display the currrent date prompt interpretation in the minibuffer."
+ (when org-read-date-display-live
+ (when org-read-date-overlay
+ (org-delete-overlay org-read-date-overlay))
+ (let ((p (point)))
+ (end-of-line 1)
+ (while (not (equal (buffer-substring
+ (max (point-min) (- (point) 4)) (point))
+ " "))
+ (insert " "))
+ (goto-char p))
+ (let* ((ans (concat (buffer-substring (point-at-bol) (point-max))
+ " " (or org-ans1 org-ans2)))
+ (org-end-time-was-given nil)
+ (f (org-read-date-analyze ans def defdecode))
+ (fmts (if org-dcst
+ org-time-stamp-custom-formats
+ org-time-stamp-formats))
+ (fmt (if (or with-time
+ (and (boundp 'org-time-was-given) org-time-was-given))
+ (cdr fmts)
+ (car fmts)))
+ (txt (concat "=> " (format-time-string fmt (apply 'encode-time f)))))
+ (when (and org-end-time-was-given
+ (string-match org-plain-time-of-day-regexp txt))
+ (setq txt (concat (substring txt 0 (match-end 0)) "-"
+ org-end-time-was-given
+ (substring txt (match-end 0)))))
+ (setq org-read-date-overlay
+ (make-overlay (1- (point-at-eol)) (point-at-eol)))
+ (org-overlay-display org-read-date-overlay txt 'secondary-selection))))
+
+(defun org-read-date-analyze (ans def defdecode)
+ "Analyze the combined answer of the date prompt."
+ ;; FIXME: cleanup and comment
+ (let (delta deltan deltaw deltadef year month day
+ hour minute second wday pm h2 m2 tl wday1)
+
+ (when (setq delta (org-read-date-get-relative ans (current-time) def))
+ (setq ans (replace-match "" t t ans)
+ deltan (car delta)
+ deltaw (nth 1 delta)
+ deltadef (nth 2 delta)))
;; Help matching ISO dates with single digit month ot day, like 2006-8-11.
(when (string-match
@@ -13083,34 +17376,63 @@ used to insert the time stamp into the buffer to include the time."
;; Help matching am/pm times, because `parse-time-string' does not do that.
;; If there is a time with am/pm, and *no* time without it, we convert
;; so that matching will be successful.
- ;; FIXME: make this replace twoce, so that we catch the end time.
- (when (and (not (string-match "[012]?[0-9]:[0-9][0-9]\\([ \t\n]\\|$\\)" ans))
- (string-match "\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\(am\\|AM\\|pm\\|PM\\)\\>" ans))
+ (loop for i from 1 to 2 do ; twice, for end time as well
+ (when (and (not (string-match "\\(\\`\\|[^+]\\)[012]?[0-9]:[0-9][0-9]\\([ \t\n]\\|$\\)" ans))
+ (string-match "\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\(am\\|AM\\|pm\\|PM\\)\\>" ans))
+ (setq hour (string-to-number (match-string 1 ans))
+ minute (if (match-end 3)
+ (string-to-number (match-string 3 ans))
+ 0)
+ pm (equal ?p
+ (string-to-char (downcase (match-string 4 ans)))))
+ (if (and (= hour 12) (not pm))
+ (setq hour 0)
+ (if (and pm (< hour 12)) (setq hour (+ 12 hour))))
+ (setq ans (replace-match (format "%02d:%02d" hour minute)
+ t t ans))))
+
+ ;; Check if a time range is given as a duration
+ (when (string-match "\\([012]?[0-9]\\):\\([0-6][0-9]\\)\\+\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?" ans)
(setq hour (string-to-number (match-string 1 ans))
- minute (if (match-end 3) (string-to-number (match-string 3 ans)) 0)
- pm (equal ?p (string-to-char (downcase (match-string 4 ans)))))
- (if (and (= hour 12) (not pm))
- (setq hour 0)
- (if (and pm (< hour 12)) (setq hour (+ 12 hour))))
- (setq ans (replace-match (format "%02d:%02d" hour minute) t t ans)))
+ h2 (+ hour (string-to-number (match-string 3 ans)))
+ minute (string-to-number (match-string 2 ans))
+ m2 (+ minute (if (match-end 5) (string-to-number (match-string 5 ans))0)))
+ (if (>= m2 60) (setq h2 (1+ h2) m2 (- m2 60)))
+ (setq ans (replace-match (format "%02d:%02d-%02d:%02d" hour minute h2 m2) t t ans)))
;; Check if there is a time range
- (when (and (boundp 'org-end-time-was-given)
- (string-match org-plain-time-of-day-regexp ans)
- (match-end 8))
- (setq org-end-time-was-given (match-string 8 ans))
- (setq ans (concat (substring ans 0 (match-beginning 7))
- (substring ans (match-end 7)))))
+ (when (boundp 'org-end-time-was-given)
+ (setq org-time-was-given nil)
+ (when (and (string-match org-plain-time-of-day-regexp ans)
+ (match-end 8))
+ (setq org-end-time-was-given (match-string 8 ans))
+ (setq ans (concat (substring ans 0 (match-beginning 7))
+ (substring ans (match-end 7))))))
(setq tl (parse-time-string ans)
- year (or (nth 5 tl) (string-to-number (format-time-string "%Y" ct)))
- month (or (nth 4 tl) (string-to-number (format-time-string "%m" ct)))
- day (or (nth 3 tl) (string-to-number (format-time-string "%d" ct)))
- hour (or (nth 2 tl) (string-to-number (format-time-string "%H" ct)))
- minute (or (nth 1 tl) (string-to-number (format-time-string "%M" ct)))
+ day (or (nth 3 tl) (nth 3 defdecode))
+ month (or (nth 4 tl)
+ (if (and org-read-date-prefer-future
+ (nth 3 tl) (< (nth 3 tl) (nth 3 defdecode)))
+ (1+ (nth 4 defdecode))
+ (nth 4 defdecode)))
+ year (or (nth 5 tl)
+ (if (and org-read-date-prefer-future
+ (nth 4 tl) (< (nth 4 tl) (nth 4 defdecode)))
+ (1+ (nth 5 defdecode))
+ (nth 5 defdecode)))
+ hour (or (nth 2 tl) (nth 2 defdecode))
+ minute (or (nth 1 tl) (nth 1 defdecode))
second (or (nth 0 tl) 0)
wday (nth 6 tl))
- (setq day (+ day deltadays))
+ (when deltan
+ (unless deltadef
+ (let ((now (decode-time (current-time))))
+ (setq day (nth 3 now) month (nth 4 now) year (nth 5 now))))
+ (cond ((member deltaw '("d" "")) (setq day (+ day deltan)))
+ ((equal deltaw "w") (setq day (+ day (* 7 deltan))))
+ ((equal deltaw "m") (setq month (+ month deltan)))
+ ((equal deltaw "y") (setq year (+ year deltan)))))
(when (and wday (not (nth 3 tl)))
;; Weekday was given, but no day, so pick that day in the week
;; on or after the derived date.
@@ -13121,11 +17443,42 @@ used to insert the time stamp into the buffer to include the time."
(nth 2 tl))
(setq org-time-was-given t))
(if (< year 100) (setq year (+ 2000 year)))
- (if to-time
- (encode-time second minute hour day month year)
- (if (or (nth 1 tl) (nth 2 tl))
- (format "%04d-%02d-%02d %02d:%02d" year month day hour minute)
- (format "%04d-%02d-%02d" year month day)))))
+ (if (< year 1970) (setq year (nth 5 defdecode))) ; not representable
+ (list second minute hour day month year)))
+
+(defvar parse-time-weekdays)
+
+(defun org-read-date-get-relative (s today default)
+ "Check string S for special relative date string.
+TODAY and DEFAULT are internal times, for today and for a default.
+Return shift list (N what def-flag)
+WHAT is \"d\", \"w\", \"m\", or \"y\" for day. week, month, year.
+N is the number if WHATs to shift
+DEF-FLAG is t when a double ++ or -- indicates shift relative to
+ the DEFAULT date rather than TODAY."
+ (when (string-match
+ (concat
+ "\\`[ \t]*\\([-+]\\{1,2\\}\\)"
+ "\\([0-9]+\\)?"
+ "\\([dwmy]\\|\\(" (mapconcat 'car parse-time-weekdays "\\|") "\\)\\)?"
+ "\\([ \t]\\|$\\)") s)
+ (let* ((dir (if (match-end 1)
+ (string-to-char (substring (match-string 1 s) -1))
+ ?+))
+ (rel (and (match-end 1) (= 2 (- (match-end 1) (match-beginning 1)))))
+ (n (if (match-end 2) (string-to-number (match-string 2 s)) 1))
+ (what (if (match-end 3) (match-string 3 s) "d"))
+ (wday1 (cdr (assoc (downcase what) parse-time-weekdays)))
+ (date (if rel default today))
+ (wday (nth 6 (decode-time date)))
+ delta)
+ (if wday1
+ (progn
+ (setq delta (mod (+ 7 (- wday1 wday)) 7))
+ (if (= dir ?-) (setq delta (- delta 7)))
+ (if (> n 1) (setq delta (+ delta (* (1- n) (if (= dir ?-) -7 7)))))
+ (list delta "d" rel))
+ (list (* n (if (= dir ?-) -1 1)) what rel)))))
(defun org-eval-in-calendar (form &optional keepdate)
"Eval FORM in the calendar window and return to current window.
@@ -13138,17 +17491,18 @@ Also, store the cursor date in variable org-ans2."
(time (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date))))
(setq org-ans2 (format-time-string "%Y-%m-%d" time))))
(org-move-overlay org-date-ovl (1- (point)) (1+ (point)) (current-buffer))
- (select-window sw)
- ;; Update the prompt to show new default date
- (save-excursion
- (goto-char (point-min))
- (when (and org-ans2
- (re-search-forward "\\[[-0-9]+\\]" nil t)
- (get-text-property (match-end 0) 'field))
- (let ((inhibit-read-only t))
- (replace-match (concat "[" org-ans2 "]") t t)
- (add-text-properties (point-min) (1+ (match-end 0))
- (text-properties-at (1+ (point-min)))))))))
+ (select-window sw)))
+
+; ;; Update the prompt to show new default date
+; (save-excursion
+; (goto-char (point-min))
+; (when (and org-ans2
+; (re-search-forward "\\[[-0-9]+\\]" nil t)
+; (get-text-property (match-end 0) 'field))
+; (let ((inhibit-read-only t))
+; (replace-match (concat "[" org-ans2 "]") t t)
+; (add-text-properties (point-min) (1+ (match-end 0))
+; (text-properties-at (1+ (point-min)))))))))
(defun org-calendar-select ()
"Return to `org-read-date' with the date currently selected.
@@ -13171,8 +17525,8 @@ The command returns the inserted time stamp."
(let ((fmt (funcall (if with-hm 'cdr 'car) org-time-stamp-formats))
stamp)
(if inactive (setq fmt (concat "[" (substring fmt 1 -1) "]")))
- (insert (or pre ""))
- (insert (setq stamp (format-time-string fmt time)))
+ (insert-before-markers (or pre ""))
+ (insert-before-markers (setq stamp (format-time-string fmt time)))
(when (listp extra)
(setq extra (car extra))
(if (and (stringp extra)
@@ -13183,9 +17537,9 @@ The command returns the inserted time stamp."
(setq extra nil)))
(when extra
(backward-char 1)
- (insert extra)
+ (insert-before-markers extra)
(forward-char 1))
- (insert (or post ""))
+ (insert-before-markers (or post ""))
stamp))
(defun org-toggle-time-stamp-overlays ()
@@ -13276,10 +17630,25 @@ Don't touch the rest."
(defun org-deadline-close (timestamp-string &optional ndays)
"Is the time in TIMESTAMP-STRING close to the current date?"
- (and (< (org-days-to-time timestamp-string)
- (or ndays org-deadline-warning-days))
+ (setq ndays (or ndays (org-get-wdays timestamp-string)))
+ (and (< (org-days-to-time timestamp-string) ndays)
(not (org-entry-is-done-p))))
+(defun org-get-wdays (ts)
+ "Get the deadline lead time appropriate for timestring TS."
+ (cond
+ ((<= org-deadline-warning-days 0)
+ ;; 0 or negative, enforce this value no matter what
+ (- org-deadline-warning-days))
+ ((string-match "-\\([0-9]+\\)\\([dwmy]\\)\\(\\'\\|>\\)" ts)
+ ;; lead time is specified.
+ (floor (* (string-to-number (match-string 1 ts))
+ (cdr (assoc (match-string 2 ts)
+ '(("d" . 1) ("w" . 7)
+ ("m" . 30.4) ("y" . 365.25)))))))
+ ;; go for the default.
+ (t org-deadline-warning-days)))
+
(defun org-calendar-select-mouse (ev)
"Return to `org-read-date' with the date currently selected.
This is used by `org-read-date' in a temporary keymap for the calendar buffer."
@@ -13302,7 +17671,7 @@ days. If the prefix is a raw \\[universal-argument] prefix, all deadlines are s
(cond
((equal ndays '(4)) 100000)
(ndays (prefix-numeric-value ndays))
- (t org-deadline-warning-days)))
+ (t (abs org-deadline-warning-days))))
(case-fold-search nil)
(regexp (concat "\\<" org-deadline-string " *<\\([^>]+\\)>"))
(callback
@@ -13312,6 +17681,20 @@ days. If the prefix is a raw \\[universal-argument] prefix, all deadlines are s
(org-occur regexp nil callback)
org-warn-days)))
+(defun org-check-before-date (date)
+ "Check if there are deadlines or scheduled entries before DATE."
+ (interactive (list (org-read-date)))
+ (let ((case-fold-search nil)
+ (regexp (concat "\\<\\(" org-deadline-string
+ "\\|" org-scheduled-string
+ "\\) *<\\([^>]+\\)>"))
+ (callback
+ (lambda () (time-less-p
+ (org-time-string-to-time (match-string 2))
+ (org-time-string-to-time date)))))
+ (message "%d entries before %s"
+ (org-occur regexp nil callback) date)))
+
(defun org-evaluate-time-range (&optional to-buffer)
"Evaluate a time range by computing the difference between start and end.
Normally the result is just printed in the echo area, but with prefix arg
@@ -13324,10 +17707,10 @@ days in order to avoid rounding problems."
(or
(org-clock-update-time-maybe)
(save-excursion
- (unless (org-at-date-range-p)
+ (unless (org-at-date-range-p t)
(goto-char (point-at-bol))
- (re-search-forward org-tr-regexp (point-at-eol) t))
- (if (not (org-at-date-range-p))
+ (re-search-forward org-tr-regexp-both (point-at-eol) t))
+ (if (not (org-at-date-range-p t))
(error "Not at a time-stamp range, and none found in current line")))
(let* ((ts1 (match-string 1))
(ts2 (match-string 2))
@@ -13359,11 +17742,13 @@ days in order to avoid rounding problems."
d (floor (+ (/ diff ds) 0.5))
h 0 m 0))
(if (not to-buffer)
- (message (org-make-tdiff-string y d h m))
- (when (org-at-table-p)
- (goto-char match-end)
- (setq align t)
- (and (looking-at " *|") (goto-char (match-end 0))))
+ (message "%s" (org-make-tdiff-string y d h m))
+ (if (org-at-table-p)
+ (progn
+ (goto-char match-end)
+ (setq align t)
+ (and (looking-at " *|") (goto-char (match-end 0))))
+ (goto-char match-end))
(if (looking-at
"\\( *-? *[0-9]+y\\)?\\( *[0-9]+d\\)? *[0-9][0-9]:[0-9][0-9]")
(replace-match ""))
@@ -13393,7 +17778,7 @@ days in order to avoid rounding problems."
(defun org-time-string-to-absolute (s &optional daynr)
"Convert a time stamp to an absolute day number.
If there is a specifyer for a cyclic time stamp, get the closest date to
-DATE."
+DAYNR."
(cond
((and daynr (string-match "\\`%%\\((.*)\\)" s))
(if (org-diary-sexp-entry (match-string 1 s) "" date)
@@ -13404,13 +17789,23 @@ DATE."
(time-to-days (current-time))) (match-string 0 s)))
(t (time-to-days (apply 'encode-time (org-parse-time-string s))))))
+(defun org-time-from-absolute (d)
+ "Return the time corresponding to date D.
+D may be an absolute day number, or a calendar-type list (month day year)."
+ (if (numberp d) (setq d (calendar-gregorian-from-absolute d)))
+ (encode-time 0 0 0 (nth 1 d) (car d) (nth 2 d)))
+
(defun org-calendar-holiday ()
"List of holidays, for Diary display in Org-mode."
- (let ((hl (check-calendar-holidays date)))
+ (require 'holidays)
+ (let ((hl (funcall
+ (if (fboundp 'calendar-check-holidays)
+ 'calendar-check-holidays 'check-calendar-holidays) date)))
(if hl (mapconcat 'identity hl "; "))))
(defun org-diary-sexp-entry (sexp entry date)
"Process a SEXP diary ENTRY for DATE."
+ (require 'diary-lib)
(let ((result (if calendar-debug-sexp
(let ((stack-trace-on-error t))
(eval (car (read-from-string sexp))))
@@ -13429,7 +17824,8 @@ DATE."
(t nil))))
(defun org-diary-to-ical-string (frombuf)
- "FIXME"
+ "Get iCalendar entries from diary entries in buffer FROMBUF.
+This uses the icalendar.el library."
(let* ((tmpdir (if (featurep 'xemacs)
(temp-directory)
temporary-file-directory))
@@ -13462,7 +17858,10 @@ DATE."
d m y y1 y2 date1 date2 nmonths nm ny m2)
(setq start (org-date-to-gregorian start)
- current (org-date-to-gregorian current)
+ current (org-date-to-gregorian
+ (if org-agenda-repeating-timestamp-show-all
+ current
+ (time-to-days (current-time))))
sday (calendar-absolute-from-gregorian start)
cday (calendar-absolute-from-gregorian current))
@@ -13505,7 +17904,9 @@ DATE."
(if (> m2 12) (setq y2 (1+ y2) m2 (- m2 12)))
(setq n2 (calendar-absolute-from-gregorian (list m2 d y2))))))
- (if (> (abs (- cday n1)) (abs (- cday n2))) n2 n1))))
+ (if org-agenda-repeating-timestamp-show-all
+ (if (> (abs (- cday n1)) (abs (- cday n2))) n2 n1)
+ (if (= cday n1) n1 n2)))))
(defun org-date-to-gregorian (date)
"Turn any specification of DATE into a gregorian date for the calendar."
@@ -13581,23 +17982,39 @@ With prefix ARG, change that many days."
(ans (or (looking-at tsr)
(save-excursion
(skip-chars-backward "^[<\n\r\t")
- (if (> (point) 1) (backward-char 1))
+ (if (> (point) (point-min)) (backward-char 1))
(and (looking-at tsr)
(> (- (match-end 0) pos) -1))))))
- (and (boundp 'org-ts-what)
+ (and ans
+ (boundp 'org-ts-what)
(setq org-ts-what
(cond
+ ((= pos (match-beginning 0)) 'bracket)
+ ((= pos (1- (match-end 0))) 'bracket)
((org-pos-in-match-range pos 2) 'year)
((org-pos-in-match-range pos 3) 'month)
((org-pos-in-match-range pos 7) 'hour)
((org-pos-in-match-range pos 8) 'minute)
((or (org-pos-in-match-range pos 4)
(org-pos-in-match-range pos 5)) 'day)
- ((and (> pos (match-end 8)) (< pos (match-end 0)))
- (- pos (match-end 8)))
+ ((and (> pos (or (match-end 8) (match-end 5)))
+ (< pos (match-end 0)))
+ (- pos (or (match-end 8) (match-end 5))))
(t 'day))))
ans))
+(defun org-toggle-timestamp-type ()
+ ""
+ (interactive)
+ (when (org-at-timestamp-p t)
+ (save-excursion
+ (goto-char (match-beginning 0))
+ (insert (if (equal (char-after) ?<) "[" "<")) (delete-char 1)
+ (goto-char (1- (match-end 0)))
+ (insert (if (equal (char-after) ?>) "]" ">")) (delete-char 1))
+ (message "Timestamp is now %sactive"
+ (if (equal (char-before) ?>) "in" ""))))
+
(defun org-timestamp-change (n &optional what)
"Change the date in the time stamp at point.
The date will be changed by N times WHAT. WHAT can be `day', `month',
@@ -13610,59 +18027,56 @@ in the timestamp determines what will be changed."
ts time time0)
(if (not (org-at-timestamp-p t))
(error "Not at a timestamp"))
- (if (and (not what) (not (eq org-ts-what 'day))
- org-display-custom-times
- (get-text-property (point) 'display)
- (not (get-text-property (1- (point)) 'display)))
- (setq org-ts-what 'day))
- (setq org-ts-what (or what org-ts-what)
- inactive (= (char-after (match-beginning 0)) ?\[)
- ts (match-string 0))
- (replace-match "")
- (if (string-match
- "\\(\\(-[012][0-9]:[0-5][0-9]\\)?\\( \\+[0-9]+[dwmy]\\)?\\)[]>]"
- ts)
- (setq extra (match-string 1 ts)))
- (if (string-match "^.\\{10\\}.*?[0-9]+:[0-9][0-9]" ts)
- (setq with-hm t))
- (setq time0 (org-parse-time-string ts))
- (setq time
- (apply 'encode-time
- (append
- (list (or (car time0) 0))
- (list (+ (if (eq org-ts-what 'minute) n 0) (nth 1 time0)))
- (list (+ (if (eq org-ts-what 'hour) n 0) (nth 2 time0)))
- (list (+ (if (eq org-ts-what 'day) n 0) (nth 3 time0)))
- (list (+ (if (eq org-ts-what 'month) n 0) (nth 4 time0)))
- (list (+ (if (eq org-ts-what 'year) n 0) (nth 5 time0)))
- (nthcdr 6 time0))))
- (when (integerp org-ts-what)
- (setq extra (org-modify-ts-extra extra org-ts-what n)))
- (if (eq what 'calendar)
- (let ((cal-date
- (save-excursion
- (save-match-data
- (set-buffer "*Calendar*")
- (calendar-cursor-to-date)))))
- (setcar (nthcdr 4 time0) (nth 0 cal-date)) ; month
- (setcar (nthcdr 3 time0) (nth 1 cal-date)) ; day
- (setcar (nthcdr 5 time0) (nth 2 cal-date)) ; year
- (setcar time0 (or (car time0) 0))
- (setcar (nthcdr 1 time0) (or (nth 1 time0) 0))
- (setcar (nthcdr 2 time0) (or (nth 1 time0) 0))
- (setq time (apply 'encode-time time0))))
- (setq org-last-changed-timestamp
- (org-insert-time-stamp time with-hm inactive nil nil extra))
- (org-clock-update-time-maybe)
- (goto-char pos)
- ;; Try to recenter the calendar window, if any
- (if (and org-calendar-follow-timestamp-change
- (get-buffer-window "*Calendar*" t)
- (memq org-ts-what '(day month year)))
- (org-recenter-calendar (time-to-days time)))))
+ (if (and (not what) (eq org-ts-what 'bracket))
+ (org-toggle-timestamp-type)
+ (if (and (not what) (not (eq org-ts-what 'day))
+ org-display-custom-times
+ (get-text-property (point) 'display)
+ (not (get-text-property (1- (point)) 'display)))
+ (setq org-ts-what 'day))
+ (setq org-ts-what (or what org-ts-what)
+ inactive (= (char-after (match-beginning 0)) ?\[)
+ ts (match-string 0))
+ (replace-match "")
+ (if (string-match
+ "\\(\\(-[012][0-9]:[0-5][0-9]\\)?\\( [-+][0-9]+[dwmy]\\)*\\)[]>]"
+ ts)
+ (setq extra (match-string 1 ts)))
+ (if (string-match "^.\\{10\\}.*?[0-9]+:[0-9][0-9]" ts)
+ (setq with-hm t))
+ (setq time0 (org-parse-time-string ts))
+ (setq time
+ (encode-time (or (car time0) 0)
+ (+ (if (eq org-ts-what 'minute) n 0) (nth 1 time0))
+ (+ (if (eq org-ts-what 'hour) n 0) (nth 2 time0))
+ (+ (if (eq org-ts-what 'day) n 0) (nth 3 time0))
+ (+ (if (eq org-ts-what 'month) n 0) (nth 4 time0))
+ (+ (if (eq org-ts-what 'year) n 0) (nth 5 time0))
+ (nthcdr 6 time0)))
+ (when (integerp org-ts-what)
+ (setq extra (org-modify-ts-extra extra org-ts-what n)))
+ (if (eq what 'calendar)
+ (let ((cal-date (org-get-date-from-calendar)))
+ (setcar (nthcdr 4 time0) (nth 0 cal-date)) ; month
+ (setcar (nthcdr 3 time0) (nth 1 cal-date)) ; day
+ (setcar (nthcdr 5 time0) (nth 2 cal-date)) ; year
+ (setcar time0 (or (car time0) 0))
+ (setcar (nthcdr 1 time0) (or (nth 1 time0) 0))
+ (setcar (nthcdr 2 time0) (or (nth 2 time0) 0))
+ (setq time (apply 'encode-time time0))))
+ (setq org-last-changed-timestamp
+ (org-insert-time-stamp time with-hm inactive nil nil extra))
+ (org-clock-update-time-maybe)
+ (goto-char pos)
+ ;; Try to recenter the calendar window, if any
+ (if (and org-calendar-follow-timestamp-change
+ (get-buffer-window "*Calendar*" t)
+ (memq org-ts-what '(day month year)))
+ (org-recenter-calendar (time-to-days time))))))
+;; FIXME: does not yet work for lead times
(defun org-modify-ts-extra (s pos n)
- "FIXME"
+ "Change the different parts of the lead-time and repeat fields in timestamp."
(let ((idx '(("d" . 0) ("w" . 1) ("m" . 2) ("y" . 3) ("d" . -1) ("y" . 4)))
ng h m new)
(when (string-match "\\(-\\([012][0-9]\\):\\([0-5][0-9]\\)\\)?\\( \\+\\([0-9]+\\)\\([dmwy]\\)\\)?" s)
@@ -13682,7 +18096,7 @@ in the timestamp determines what will be changed."
(setq ng 6 new (car (rassoc (+ n (cdr (assoc (match-string 6 s) idx))) idx))))
((org-pos-in-match-range pos 5)
(setq ng 5 new (format "%d" (max 1 (+ n (string-to-number (match-string 5 s))))))))
-
+
(when ng
(setq s (concat
(substring s 0 (match-beginning ng))
@@ -13722,11 +18136,82 @@ A prefix ARG can be used to force the current date."
(calendar-goto-today)
(if (and diff (not arg)) (calendar-forward-day diff))))
+(defun org-get-date-from-calendar ()
+ "Return a list (month day year) of date at point in calendar."
+ (with-current-buffer "*Calendar*"
+ (save-match-data
+ (calendar-cursor-to-date))))
+
(defun org-date-from-calendar ()
"Insert time stamp corresponding to cursor date in *Calendar* buffer.
If there is already a time stamp at the cursor position, update it."
(interactive)
- (org-timestamp-change 0 'calendar))
+ (if (org-at-timestamp-p t)
+ (org-timestamp-change 0 'calendar)
+ (let ((cal-date (org-get-date-from-calendar)))
+ (org-insert-time-stamp
+ (encode-time 0 0 0 (nth 1 cal-date) (car cal-date) (nth 2 cal-date))))))
+
+;; Make appt aware of appointments from the agenda
+;;;###autoload
+(defun org-agenda-to-appt (&optional filter)
+ "Activate appointments found in `org-agenda-files'.
+When prefixed, prompt for a regular expression and use it as a
+filter: only add entries if they match this regular expression.
+
+FILTER can be a string. In this case, use this string as a
+regular expression to filter results.
+
+FILTER can also be an alist, with the car of each cell being
+either 'headline or 'category. For example:
+
+ '((headline \"IMPORTANT\")
+ (category \"Work\"))
+
+will only add headlines containing IMPORTANT or headlines
+belonging to the category \"Work\"."
+ (interactive "P")
+ (require 'calendar)
+ (if (equal filter '(4))
+ (setq filter (read-from-minibuffer "Regexp filter: ")))
+ (let* ((cnt 0) ; count added events
+ (org-agenda-new-buffers nil)
+ (today (org-date-to-gregorian
+ (time-to-days (current-time))))
+ (files (org-agenda-files)) entries file)
+ ;; Get all entries which may contain an appt
+ (while (setq file (pop files))
+ (setq entries
+ (append entries
+ (org-agenda-get-day-entries
+ file today
+ :timestamp :scheduled :deadline))))
+ (setq entries (delq nil entries))
+ ;; Map thru entries and find if they pass thru the filter
+ (mapc
+ (lambda(x)
+ (let* ((evt (org-trim (get-text-property 1 'txt x)))
+ (cat (get-text-property 1 'org-category x))
+ (tod (get-text-property 1 'time-of-day x))
+ (ok (or (null filter)
+ (and (stringp filter) (string-match filter evt))
+ (and (listp filter)
+ (or (string-match
+ (cadr (assoc 'category filter)) cat)
+ (string-match
+ (cadr (assoc 'headline filter)) evt))))))
+ ;; FIXME: Shall we remove text-properties for the appt text?
+ ;; (setq evt (set-text-properties 0 (length evt) nil evt))
+ (when (and ok tod)
+ (setq tod (number-to-string tod)
+ tod (when (string-match
+ "\\([0-9]\\{1,2\\}\\)\\([0-9]\\{2\\}\\)" tod)
+ (concat (match-string 1 tod) ":"
+ (match-string 2 tod))))
+ (appt-add tod evt)
+ (setq cnt (1+ cnt))))) entries)
+ (org-release-buffers org-agenda-new-buffers)
+ (message "Added %d event%s for today" cnt (if (> cnt 1) "s" ""))))
;;; The clock for measuring work time.
@@ -13760,16 +18245,20 @@ If necessary, clock-out of the currently active clock."
(let (ts)
(save-excursion
(org-back-to-heading t)
- (if (looking-at org-todo-line-regexp)
- (setq org-clock-heading (match-string 3))
- (setq org-clock-heading "???"))
+ (when (and org-clock-in-switch-to-state
+ (not (looking-at (concat outline-regexp "[ \t]*"
+ org-clock-in-switch-to-state
+ "\\>"))))
+ (org-todo org-clock-in-switch-to-state))
+ (if (and org-clock-heading-function
+ (functionp org-clock-heading-function))
+ (setq org-clock-heading (funcall org-clock-heading-function))
+ (if (looking-at org-complex-heading-regexp)
+ (setq org-clock-heading (match-string 4))
+ (setq org-clock-heading "???")))
(setq org-clock-heading (propertize org-clock-heading 'face nil))
- (beginning-of-line 2)
- (when (and (looking-at (concat "[ \t]*" org-keyword-time-regexp))
- (not (equal (match-string 1) org-clock-string)))
- ;; First line hast scheduling info, move one further
- (beginning-of-line 2)
- (or (bolp) (newline)))
+ (org-clock-find-position)
+
(insert "\n") (backward-char 1)
(indent-relative)
(insert org-clock-string " ")
@@ -13784,6 +18273,57 @@ If necessary, clock-out of the currently active clock."
(setq org-mode-line-timer (run-with-timer 60 60 'org-update-mode-line))
(message "Clock started at %s" ts))))
+(defun org-clock-find-position ()
+ "Find the location where the next clock line should be inserted."
+ (org-back-to-heading t)
+ (catch 'exit
+ (let ((beg (point-at-bol 2)) (end (progn (outline-next-heading) (point)))
+ (re (concat "^[ \t]*" org-clock-string))
+ (cnt 0)
+ first last)
+ (goto-char beg)
+ (when (eobp) (newline) (setq end (max (point) end)))
+ (when (re-search-forward "^[ \t]*:CLOCK:" end t)
+ ;; we seem to have a CLOCK drawer, so go there.
+ (beginning-of-line 2)
+ (throw 'exit t))
+ ;; Lets count the CLOCK lines
+ (goto-char beg)
+ (while (re-search-forward re end t)
+ (setq first (or first (match-beginning 0))
+ last (match-beginning 0)
+ cnt (1+ cnt)))
+ (when (and (integerp org-clock-into-drawer)
+ (>= (1+ cnt) org-clock-into-drawer))
+ ;; Wrap current entries into a new drawer
+ (goto-char last)
+ (beginning-of-line 2)
+ (if (org-at-item-p) (org-end-of-item))
+ (insert ":END:\n")
+ (beginning-of-line 0)
+ (org-indent-line-function)
+ (goto-char first)
+ (insert ":CLOCK:\n")
+ (beginning-of-line 0)
+ (org-indent-line-function)
+ (org-flag-drawer t)
+ (beginning-of-line 2)
+ (throw 'exit nil))
+
+ (goto-char beg)
+ (while (and (looking-at (concat "[ \t]*" org-keyword-time-regexp))
+ (not (equal (match-string 1) org-clock-string)))
+ ;; Planning info, skip to after it
+ (beginning-of-line 2)
+ (or (bolp) (newline)))
+ (when (eq t org-clock-into-drawer)
+ (insert ":CLOCK:\n:END:\n")
+ (beginning-of-line -1)
+ (org-indent-line-function)
+ (org-flag-drawer t)
+ (beginning-of-line 2)
+ (org-indent-line-function)))))
+
(defun org-clock-out (&optional fail-quietly)
"Stop the currently running clock.
If there is no running clock, throw an error, unless FAIL-QUIETLY is set."
@@ -13812,7 +18352,10 @@ If there is no running clock, throw an error, unless FAIL-QUIETLY is set."
s (- s (* 60 s)))
(insert " => " (format "%2d:%02d" h m))
(move-marker org-clock-marker nil)
- (org-add-log-maybe 'clock-out)
+ (let* ((logging (save-match-data (org-entry-get nil "LOGGING" t)))
+ (org-log-done (org-parse-local-options logging 'org-log-done))
+ (org-log-repeat (org-parse-local-options logging 'org-log-repeat)))
+ (org-add-log-maybe 'clock-out))
(when org-mode-line-timer
(cancel-timer org-mode-line-timer)
(setq org-mode-line-timer nil))
@@ -13830,8 +18373,24 @@ If there is no running clock, throw an error, unless FAIL-QUIETLY is set."
(set-buffer (marker-buffer org-clock-marker))
(goto-char org-clock-marker)
(delete-region (1- (point-at-bol)) (point-at-eol)))
+ (setq global-mode-string
+ (delq 'org-mode-line-string global-mode-string))
+ (force-mode-line-update)
(message "Clock canceled"))
+(defun org-clock-goto (&optional delete-windows)
+ "Go to the currently clocked-in entry."
+ (interactive "P")
+ (if (not (marker-buffer org-clock-marker))
+ (error "No active clock"))
+ (switch-to-buffer-other-window
+ (marker-buffer org-clock-marker))
+ (if delete-windows (delete-other-windows))
+ (goto-char org-clock-marker)
+ (org-show-entry)
+ (org-back-to-heading)
+ (recenter))
+
(defvar org-clock-file-total-minutes nil
"Holds the file total time in minutes, after a call to `org-clock-sum'.")
(make-variable-buffer-local 'org-clock-file-total-minutes)
@@ -13895,7 +18454,10 @@ in the echo area."
(unless total-only
(save-excursion
(goto-char (point-min))
- (while (setq p (next-single-property-change (point) :org-clock-minutes))
+ (while (or (and (equal (setq p (point)) (point-min))
+ (get-text-property p :org-clock-minutes))
+ (setq p (next-single-property-change
+ (point) :org-clock-minutes)))
(goto-char p)
(when (setq time (get-text-property p :org-clock-minutes))
(org-put-clock-overlay time (funcall outline-level))))
@@ -13950,8 +18512,10 @@ from the `before-change-functions' in the current buffer."
(defun org-clock-out-if-current ()
"Clock out if the current entry contains the running clock.
-This is used to stop the clock after a TODO entry is marked DONE."
- (when (and (member state org-done-keywords)
+This is used to stop the clock after a TODO entry is marked DONE,
+and is only done if the variable `org-clock-out-when-done' is not nil."
+ (when (and org-clock-out-when-done
+ (member state org-done-keywords)
(equal (marker-buffer org-clock-marker) (current-buffer))
(< (point) org-clock-marker)
(> (save-excursion (outline-next-heading) (point))
@@ -13976,25 +18540,32 @@ If yes, offer to stop it and to save the buffer with the changes."
(when (y-or-n-p "Save changed buffer?")
(save-buffer))))
-(defun org-clock-report ()
+(defun org-clock-report (&optional arg)
"Create a table containing a report about clocked time.
-If the buffer contains lines
-#+BEGIN: clocktable :maxlevel 3 :emphasize nil
-
-#+END: clocktable
-then the table will be inserted between these lines, replacing whatever
-is was there before. If these lines are not in the buffer, the table
-is inserted at point, surrounded by the special lines.
-The BEGIN line can contain parameters. Allowed are:
-:maxlevel The maximum level to be included in the table. Default is 3.
-:emphasize t/nil, if levell 1 and level 2 should be bold/italic in the table."
- (interactive)
+If the cursor is inside an existing clocktable block, then the table
+will be updated. If not, a new clocktable will be inserted.
+When called with a prefix argument, move to the first clock table in the
+buffer and update it."
+ (interactive "P")
(org-remove-clock-overlays)
- (unless (org-find-dblock "clocktable")
+ (when arg (org-find-dblock "clocktable"))
+ (if (org-in-clocktable-p)
+ (goto-char (org-in-clocktable-p))
(org-create-dblock (list :name "clocktable"
- :maxlevel 2 :emphasize nil)))
+ :maxlevel 2 :scope 'file)))
(org-update-dblock))
+(defun org-in-clocktable-p ()
+ "Check if the cursor is in a clocktable."
+ (let ((pos (point)) start)
+ (save-excursion
+ (end-of-line 1)
+ (and (re-search-backward "^#\\+BEGIN:[ \t]+clocktable" nil t)
+ (setq start (match-beginning 0))
+ (re-search-forward "^#\\+END:.*" nil t)
+ (>= (match-end 0) pos)
+ start))))
+
(defun org-clock-update-time-maybe ()
"If this is a CLOCK line, update it and return t.
Otherwise, return nil."
@@ -14068,12 +18639,16 @@ the returned times will be formatted strings."
(defun org-dblock-write:clocktable (params)
"Write the standard clocktable."
- (let ((hlchars '((1 . "*") (2 . ?/)))
+ (let ((hlchars '((1 . "*") (2 . "/")))
(emph nil)
(ins (make-marker))
+ (total-time nil)
ipos time h m p level hlc hdl maxlevel
- ts te cc block)
- (setq maxlevel (or (plist-get params :maxlevel) 3)
+ ts te cc block beg end pos scope tbl tostring multifile)
+ (setq scope (plist-get params :scope)
+ tostring (plist-get params :tostring)
+ multifile (plist-get params :multifile)
+ maxlevel (or (plist-get params :maxlevel) 3)
emph (plist-get params :emphasize)
ts (plist-get params :tstart)
te (plist-get params :tend)
@@ -14087,48 +18662,114 @@ the returned times will be formatted strings."
(apply 'encode-time (org-parse-time-string te)))))
(move-marker ins (point))
(setq ipos (point))
- (insert-before-markers "Clock summary at ["
- (substring
- (format-time-string (cdr org-time-stamp-formats))
- 1 -1)
- "]."
- (if block
- (format " Considered range is /%s/." block)
- "")
- "\n\n|L|Headline|Time|\n")
- (org-clock-sum ts te)
- (setq h (/ org-clock-file-total-minutes 60)
- m (- org-clock-file-total-minutes (* 60 h)))
- (insert-before-markers "|-\n|0|" "*Total file time*| "
- (format "*%d:%02d*" h m)
- "|\n")
- (goto-char (point-min))
- (while (setq p (next-single-property-change (point) :org-clock-minutes))
- (goto-char p)
- (when (setq time (get-text-property p :org-clock-minutes))
- (save-excursion
- (beginning-of-line 1)
- (when (and (looking-at "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[a-zA-Z0-9_@:]+:\\)?[ \t]*$")
- (setq level (- (match-end 1) (match-beginning 1)))
- (<= level maxlevel))
- (setq hlc (if emph (or (cdr (assoc level hlchars)) "") "")
- hdl (match-string 2)
- h (/ time 60)
- m (- time (* 60 h)))
- (goto-char ins)
- (if (= level 1) (insert-before-markers "|-\n"))
- (insert-before-markers
- "| " (int-to-string level) "|" hlc hdl hlc " |"
- (make-string (1- level) ?|)
- hlc
- (format "%d:%02d" h m)
- hlc
- " |\n")))))
- (goto-char ins)
- (backward-delete-char 1)
- (goto-char ipos)
- (skip-chars-forward "^|")
- (org-table-align)))
+
+ ;; Get the right scope
+ (setq pos (point))
+ (save-restriction
+ (cond
+ ((not scope))
+ ((eq scope 'file) (widen))
+ ((eq scope 'subtree) (org-narrow-to-subtree))
+ ((eq scope 'tree)
+ (while (org-up-heading-safe))
+ (org-narrow-to-subtree))
+ ((and (symbolp scope) (string-match "^tree\\([0-9]+\\)$"
+ (symbol-name scope)))
+ (setq level (string-to-number (match-string 1 (symbol-name scope))))
+ (catch 'exit
+ (while (org-up-heading-safe)
+ (looking-at outline-regexp)
+ (if (<= (org-reduced-level (funcall outline-level)) level)
+ (throw 'exit nil))))
+ (org-narrow-to-subtree))
+ ((or (listp scope) (eq scope 'agenda))
+ (let* ((files (if (listp scope) scope (org-agenda-files)))
+ (scope 'agenda)
+ (p1 (copy-sequence params))
+ file)
+ (plist-put p1 :tostring t)
+ (plist-put p1 :multifile t)
+ (plist-put p1 :scope 'file)
+ (org-prepare-agenda-buffers files)
+ (while (setq file (pop files))
+ (with-current-buffer (find-buffer-visiting file)
+ (push (org-clocktable-add-file
+ file (org-dblock-write:clocktable p1)) tbl)
+ (setq total-time (+ (or total-time 0)
+ org-clock-file-total-minutes)))))))
+ (goto-char pos)
+
+ (unless (eq scope 'agenda)
+ (org-clock-sum ts te)
+ (goto-char (point-min))
+ (while (setq p (next-single-property-change (point) :org-clock-minutes))
+ (goto-char p)
+ (when (setq time (get-text-property p :org-clock-minutes))
+ (save-excursion
+ (beginning-of-line 1)
+ (when (and (looking-at (org-re "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[[:alnum:]_@:]+:\\)?[ \t]*$"))
+ (setq level (org-reduced-level
+ (- (match-end 1) (match-beginning 1))))
+ (<= level maxlevel))
+ (setq hlc (if emph (or (cdr (assoc level hlchars)) "") "")
+ hdl (match-string 2)
+ h (/ time 60)
+ m (- time (* 60 h)))
+ (if (and (not multifile) (= level 1)) (push "|-" tbl))
+ (push (concat
+ "| " (int-to-string level) "|" hlc hdl hlc " |"
+ (make-string (1- level) ?|)
+ hlc (format "%d:%02d" h m) hlc
+ " |") tbl))))))
+ (setq tbl (nreverse tbl))
+ (if tostring
+ (if tbl (mapconcat 'identity tbl "\n") nil)
+ (goto-char ins)
+ (insert-before-markers
+ "Clock summary at ["
+ (substring
+ (format-time-string (cdr org-time-stamp-formats))
+ 1 -1)
+ "]."
+ (if block
+ (format " Considered range is /%s/." block)
+ "")
+ "\n\n"
+ (if (eq scope 'agenda) "|File" "")
+ "|L|Headline|Time|\n")
+ (setq total-time (or total-time org-clock-file-total-minutes)
+ h (/ total-time 60)
+ m (- total-time (* 60 h)))
+ (insert-before-markers
+ "|-\n|"
+ (if (eq scope 'agenda) "|" "")
+ "|"
+ "*Total time*| "
+ (format "*%d:%02d*" h m)
+ "|\n|-\n")
+ (setq tbl (delq nil tbl))
+ (if (and (stringp (car tbl)) (> (length (car tbl)) 1)
+ (equal (substring (car tbl) 0 2) "|-"))
+ (pop tbl))
+ (insert-before-markers (mapconcat
+ 'identity (delq nil tbl)
+ (if (eq scope 'agenda) "\n|-\n" "\n")))
+ (backward-delete-char 1)
+ (goto-char ipos)
+ (skip-chars-forward "^|")
+ (org-table-align)))))
+
+(defun org-clocktable-add-file (file table)
+ (if table
+ (let ((lines (org-split-string table "\n"))
+ (ff (file-name-nondirectory file)))
+ (mapconcat 'identity
+ (mapcar (lambda (x)
+ (if (string-match org-table-dataline-regexp x)
+ (concat "|" ff x)
+ x))
+ lines)
+ "\n"))))
;; FIXME: I don't think anybody uses this, ask David
(defun org-collect-clock-time-entries ()
@@ -14251,8 +18892,11 @@ The following commands are available:
(org-defkey org-agenda-mode-map "a" 'org-agenda-toggle-archive-tag)
(org-defkey org-agenda-mode-map ":" 'org-agenda-set-tags)
(org-defkey org-agenda-mode-map "." 'org-agenda-goto-today)
+(org-defkey org-agenda-mode-map "j" 'org-agenda-goto-date)
(org-defkey org-agenda-mode-map "d" 'org-agenda-day-view)
(org-defkey org-agenda-mode-map "w" 'org-agenda-week-view)
+(org-defkey org-agenda-mode-map "m" 'org-agenda-month-view)
+(org-defkey org-agenda-mode-map "y" 'org-agenda-year-view)
(org-defkey org-agenda-mode-map [(shift right)] 'org-agenda-date-later)
(org-defkey org-agenda-mode-map [(shift left)] 'org-agenda-date-earlier)
(org-defkey org-agenda-mode-map [?\C-c ?\C-x (right)] 'org-agenda-date-later)
@@ -14268,18 +18912,21 @@ The following commands are available:
(org-defkey org-agenda-mode-map "f" 'org-agenda-follow-mode)
(org-defkey org-agenda-mode-map "l" 'org-agenda-log-mode)
(org-defkey org-agenda-mode-map "D" 'org-agenda-toggle-diary)
-(org-defkey org-agenda-mode-map "g" 'org-agenda-toggle-time-grid)
+(org-defkey org-agenda-mode-map "G" 'org-agenda-toggle-time-grid)
(org-defkey org-agenda-mode-map "r" 'org-agenda-redo)
+(org-defkey org-agenda-mode-map "g" 'org-agenda-redo)
+(org-defkey org-agenda-mode-map "e" 'org-agenda-execute)
(org-defkey org-agenda-mode-map "q" 'org-agenda-quit)
(org-defkey org-agenda-mode-map "x" 'org-agenda-exit)
(org-defkey org-agenda-mode-map "\C-x\C-w" 'org-write-agenda)
(org-defkey org-agenda-mode-map "s" 'org-save-all-org-buffers)
+(org-defkey org-agenda-mode-map "\C-x\C-s" 'org-save-all-org-buffers)
(org-defkey org-agenda-mode-map "P" 'org-agenda-show-priority)
(org-defkey org-agenda-mode-map "T" 'org-agenda-show-tags)
(org-defkey org-agenda-mode-map "n" 'next-line)
(org-defkey org-agenda-mode-map "p" 'previous-line)
-(org-defkey org-agenda-mode-map "\C-n" 'org-agenda-next-date-line)
-(org-defkey org-agenda-mode-map "\C-p" 'org-agenda-previous-date-line)
+(org-defkey org-agenda-mode-map "\C-c\C-n" 'org-agenda-next-date-line)
+(org-defkey org-agenda-mode-map "\C-c\C-p" 'org-agenda-previous-date-line)
(org-defkey org-agenda-mode-map "," 'org-agenda-priority)
(org-defkey org-agenda-mode-map "\C-c," 'org-agenda-priority)
(org-defkey org-agenda-mode-map "i" 'org-agenda-diary-entry)
@@ -14288,14 +18935,18 @@ The following commands are available:
'(org-defkey calendar-mode-map org-calendar-to-agenda-key
'org-calendar-goto-agenda))
(org-defkey org-agenda-mode-map "C" 'org-agenda-convert-date)
-(org-defkey org-agenda-mode-map "m" 'org-agenda-phases-of-moon)
(org-defkey org-agenda-mode-map "M" 'org-agenda-phases-of-moon)
(org-defkey org-agenda-mode-map "S" 'org-agenda-sunrise-sunset)
(org-defkey org-agenda-mode-map "h" 'org-agenda-holidays)
(org-defkey org-agenda-mode-map "H" 'org-agenda-holidays)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-i" 'org-agenda-clock-in)
(org-defkey org-agenda-mode-map "I" 'org-agenda-clock-in)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-o" 'org-agenda-clock-out)
(org-defkey org-agenda-mode-map "O" 'org-agenda-clock-out)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-x" 'org-agenda-clock-cancel)
(org-defkey org-agenda-mode-map "X" 'org-agenda-clock-cancel)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-j" 'org-clock-goto)
+(org-defkey org-agenda-mode-map "J" 'org-clock-goto)
(org-defkey org-agenda-mode-map "+" 'org-agenda-priority-up)
(org-defkey org-agenda-mode-map "-" 'org-agenda-priority-down)
(org-defkey org-agenda-mode-map [(shift up)] 'org-agenda-priority-up)
@@ -14304,7 +18955,8 @@ The following commands are available:
(org-defkey org-agenda-mode-map [?\C-c ?\C-x (down)] 'org-agenda-priority-down)
(org-defkey org-agenda-mode-map [(right)] 'org-agenda-later)
(org-defkey org-agenda-mode-map [(left)] 'org-agenda-earlier)
-(org-defkey org-agenda-mode-map "\C-c\C-x\C-c" 'org-export-icalendar-combine-agenda-files)
+(org-defkey org-agenda-mode-map "\C-c\C-x\C-c" 'org-agenda-columns)
+
(defvar org-agenda-keymap (copy-keymap org-agenda-mode-map)
"Local keymap for agenda entries from Org-mode.")
@@ -14332,17 +18984,26 @@ The following commands are available:
["Goto Today" org-agenda-goto-today (org-agenda-check-type nil 'agenda 'timeline)]
["Next Dates" org-agenda-later (org-agenda-check-type nil 'agenda)]
["Previous Dates" org-agenda-earlier (org-agenda-check-type nil 'agenda)]
+ ["Jump to date" org-agenda-goto-date (org-agenda-check-type nil 'agenda)]
"--"
- ("Tags"
+ ("Tags and Properties"
["Show all Tags" org-agenda-show-tags t]
- ["Set Tags" org-agenda-set-tags t])
+ ["Set Tags current line" org-agenda-set-tags (not (org-region-active-p))]
+ ["Change tag in region" org-agenda-set-tags (org-region-active-p)]
+ "--"
+ ["Column View" org-columns t])
("Date/Schedule"
["Schedule" org-agenda-schedule t]
["Set Deadline" org-agenda-deadline t]
"--"
- ["Change date +1 day" org-agenda-date-later (org-agenda-check-type nil 'agenda 'timeline)]
- ["Change date -1 day" org-agenda-date-earlier (org-agenda-check-type nil 'agenda 'timeline)]
- ["Change date to ..." org-agenda-date-prompt (org-agenda-check-type nil 'agenda 'timeline)])
+ ["Change Date +1 day" org-agenda-date-later (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Change Date -1 day" org-agenda-date-earlier (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Change Date to ..." org-agenda-date-prompt (org-agenda-check-type nil 'agenda 'timeline)])
+ ("Clock"
+ ["Clock in" org-agenda-clock-in t]
+ ["Clock out" org-agenda-clock-out t]
+ ["Clock cancel" org-agenda-clock-cancel t]
+ ["Goto running clock" org-clock-goto t])
("Priority"
["Set Priority" org-agenda-priority t]
["Increase Priority" org-agenda-priority-up t]
@@ -14363,6 +19024,10 @@ The following commands are available:
:style radio :selected (equal org-agenda-ndays 1)]
["Week View" org-agenda-week-view :active (org-agenda-check-type nil 'agenda)
:style radio :selected (equal org-agenda-ndays 7)]
+ ["Month View" org-agenda-month-view :active (org-agenda-check-type nil 'agenda)
+ :style radio :selected (member org-agenda-ndays '(28 29 30 31))]
+ ["Year View" org-agenda-year-view :active (org-agenda-check-type nil 'agenda)
+ :style radio :selected (member org-agenda-ndays '(365 366))]
"--"
["Show Logbook entries" org-agenda-log-mode
:style toggle :selected org-agenda-show-log :active (org-agenda-check-type nil 'agenda 'timeline)]
@@ -14392,16 +19057,11 @@ The following commands are available:
"In a series of undo commands, this is the list of remaning undo items.")
(defmacro org-if-unprotected (&rest body)
- "Execute BODY if ther is no `org-protected' text property at point."
+ "Execute BODY if there is no `org-protected' text property at point."
(declare (debug t))
`(unless (get-text-property (point) 'org-protected)
,@body))
-(defmacro org-unmodified (&rest body)
- "Execute body without changing buffer-modified-p."
- `(set-buffer-modified-p
- (prog1 (buffer-modified-p) ,@body)))
-
(defmacro org-with-remote-undo (_buffer &rest _body)
"Execute BODY while recording undo information in two buffers."
(declare (indent 1) (debug t))
@@ -14447,7 +19107,7 @@ that have been changed along."
(if (pop entry)
(with-current-buffer buf
(let ((last-undo-buffer buf)
- buffer-read-only)
+ (inhibit-read-only t))
(unless (memq buf org-agenda-undo-has-started-in)
(push buf org-agenda-undo-has-started-in)
(make-local-variable 'pending-undo-list)
@@ -14472,13 +19132,14 @@ that have been changed along."
(defvar org-agenda-restrict-begin (make-marker))
(defvar org-agenda-restrict-end (make-marker))
(defvar org-agenda-last-dispatch-buffer nil)
+(defvar org-agenda-overriding-restriction nil)
;;;###autoload
-(defun org-agenda (arg)
+(defun org-agenda (arg &optional keys restriction)
"Dispatch agenda commands to collect entries to the agenda buffer.
-Prompts for a character to select a command. Any prefix arg will be passed
+Prompts for a command to execute. Any prefix arg will be passed
on to the selected command. The default selections are:
-g
+
a Call `org-agenda-list' to display the agenda for current day or week.
t Call `org-todo-list' to display the global todo list.
T Call `org-todo-list' to display the global todo list, select only
@@ -14486,7 +19147,7 @@ T Call `org-todo-list' to display the global todo list, select only
m Call `org-tags-view' to display headlines with tags matching
a condition (the user is prompted for the condition).
M Like `m', but select only TODO entries, no ordinary headlines.
-l Create a timeline for the current buffer.
+L Create a timeline for the current buffer.
e Export views to associated files.
More commands can be added by configuring the variable
@@ -14494,104 +19155,67 @@ More commands can be added by configuring the variable
searches can be pre-defined in this way.
If the current buffer is in Org-mode and visiting a file, you can also
-first press `1' to indicate that the agenda should be temporarily (until the
-next use of \\[org-agenda]) restricted to the current file."
+first press `<' once to indicate that the agenda should be temporarily
+\(until the next use of \\[org-agenda]) restricted to the current file.
+Pressing `<' twice means to restrict to the current subtree or region
+\(if active)."
(interactive "P")
(catch 'exit
- (let* ((buf (current-buffer))
+ (let* ((prefix-descriptions nil)
+ (org-agenda-custom-commands-orig org-agenda-custom-commands)
+ (org-agenda-custom-commands
+ ;; normalize different versions
+ (delq nil
+ (mapcar
+ (lambda (x)
+ (cond ((stringp (cdr x))
+ (push x prefix-descriptions)
+ nil)
+ ((stringp (nth 1 x)) x)
+ ((not (nth 1 x)) (cons (car x) (cons "" (cddr x))))
+ (t (cons (car x) (cons "" (cdr x))))))
+ org-agenda-custom-commands)))
+ (buf (current-buffer))
(bfn (buffer-file-name (buffer-base-buffer)))
- (restrict-ok (and bfn (org-mode-p)))
- (custom org-agenda-custom-commands)
- c entry key type match lprops)
- ;; Turn off restriction
- (put 'org-agenda-files 'org-restrict nil)
- (setq org-agenda-restrict nil)
- (move-marker org-agenda-restrict-begin nil)
- (move-marker org-agenda-restrict-end nil)
+ entry key type match lprops ans)
+ ;; Turn off restriction unless there is an overriding one
+ (unless org-agenda-overriding-restriction
+ (put 'org-agenda-files 'org-restrict nil)
+ (setq org-agenda-restrict nil)
+ (move-marker org-agenda-restrict-begin nil)
+ (move-marker org-agenda-restrict-end nil))
+ ;; Delete old local properties
+ (put 'org-agenda-redo-command 'org-lprops nil)
;; Remember where this call originated
(setq org-agenda-last-dispatch-buffer (current-buffer))
- (save-window-excursion
- (delete-other-windows)
- (switch-to-buffer-other-window " *Agenda Commands*")
- (erase-buffer)
- (insert (eval-when-compile
- (let ((header
-"Press key for an agenda command:
--------------------------------- C Configure custom agenda commands
-a Agenda for current week or day e Export agenda views
-t List of all TODO entries T Entries with special TODO kwd
-m Match a TAGS query M Like m, but only TODO entries
-L Timeline for current buffer # List stuck projects (!=configure)
-")
- (start 0))
- (while (string-match "\\(^\\| \\|(\\)\\(\\S-\\)\\( \\|=\\)" header start)
- (setq start (match-end 0))
- (add-text-properties (match-beginning 2) (match-end 2)
- '(face bold) header))
- header)))
- (while (setq entry (pop custom))
- (setq key (car entry) type (nth 1 entry) match (nth 2 entry))
- (insert (format "\n%-4s%-14s: %s"
- (org-add-props (copy-sequence key)
- '(face bold))
- (cond
- ((stringp type) type)
- ((eq type 'agenda) "Agenda for current week or day")
- ((eq type 'alltodo) "List of all TODO entries")
- ((eq type 'stuck) "List of stuck projects")
- ((eq type 'todo) "TODO keyword")
- ((eq type 'tags) "Tags query")
- ((eq type 'tags-todo) "Tags (TODO)")
- ((eq type 'tags-tree) "Tags tree")
- ((eq type 'todo-tree) "TODO kwd tree")
- ((eq type 'occur-tree) "Occur tree")
- ((functionp type) (symbol-name type))
- (t "???"))
- (if (stringp match)
- (org-add-props match nil 'face 'org-warning)
- (format "set of %d commands" (length match))))))
- (if restrict-ok
- (insert "\n"
- (org-add-props "1 Restrict call to current buffer 0 Restrict call to region or subtree" nil 'face 'org-table)))
- (goto-char (point-min))
- (if (fboundp 'fit-window-to-buffer) (fit-window-to-buffer))
- (message "Press key for agenda command%s"
- (if restrict-ok ", or [1] or [0] to restrict" ""))
- (setq c (read-char-exclusive))
- (message "")
- (when (memq c '(?L ?1 ?0))
- (if restrict-ok
- (put 'org-agenda-files 'org-restrict (list bfn))
- (error "Cannot restrict agenda to current buffer"))
- (with-current-buffer " *Agenda Commands*"
- (goto-char (point-max))
- (delete-region (point-at-bol) (point))
- (goto-char (point-min)))
- (when (eq c ?0)
+ (unless keys
+ (setq ans (org-agenda-get-restriction-and-command prefix-descriptions)
+ keys (car ans)
+ restriction (cdr ans)))
+ ;; Estabish the restriction, if any
+ (when (and (not org-agenda-overriding-restriction) restriction)
+ (put 'org-agenda-files 'org-restrict (list bfn))
+ (cond
+ ((eq restriction 'region)
+ (setq org-agenda-restrict t)
+ (move-marker org-agenda-restrict-begin (region-beginning))
+ (move-marker org-agenda-restrict-end (region-end)))
+ ((eq restriction 'subtree)
+ (save-excursion
(setq org-agenda-restrict t)
- (with-current-buffer buf
- (if (org-region-active-p)
- (progn
- (move-marker org-agenda-restrict-begin (region-beginning))
- (move-marker org-agenda-restrict-end (region-end)))
- (save-excursion
- (org-back-to-heading t)
- (move-marker org-agenda-restrict-begin (point))
- (move-marker org-agenda-restrict-end
- (progn (org-end-of-subtree t)))))))
- (unless (eq c ?L)
- (message "Press key for agenda command%s"
- (if restrict-ok " (restricted to current file)" ""))
- (setq c (read-char-exclusive)))
- (message "")))
+ (org-back-to-heading t)
+ (move-marker org-agenda-restrict-begin (point))
+ (move-marker org-agenda-restrict-end
+ (progn (org-end-of-subtree t)))))))
+
(require 'calendar) ; FIXME: can we avoid this for some commands?
;; For example the todo list should not need it (but does...)
(cond
- ((setq entry (assoc (char-to-string c) org-agenda-custom-commands))
- (if (symbolp (nth 1 entry))
+ ((setq entry (assoc keys org-agenda-custom-commands))
+ (if (or (symbolp (nth 2 entry)) (functionp (nth 2 entry)))
(progn
- (setq type (nth 1 entry) match (nth 2 entry) lprops (nth 3 entry)
- lprops (nth 3 entry))
+ (setq type (nth 2 entry) match (nth 3 entry) lprops (nth 4 entry))
+ (put 'org-agenda-redo-command 'org-lprops lprops)
(cond
((eq type 'agenda)
(org-let lprops '(org-agenda-list current-prefix-arg)))
@@ -14617,24 +19241,190 @@ L Timeline for current buffer # List stuck projects (!=configure)
((eq type 'occur-tree)
(org-check-for-org-mode)
(org-let lprops '(org-occur match)))
+ ((functionp type)
+ (org-let lprops '(funcall type match)))
((fboundp type)
(org-let lprops '(funcall type match)))
(t (error "Invalid custom agenda command type %s" type))))
(org-run-agenda-series (nth 1 entry) (cddr entry))))
- ((equal c ?C) (customize-variable 'org-agenda-custom-commands))
- ((equal c ?a) (call-interactively 'org-agenda-list))
- ((equal c ?t) (call-interactively 'org-todo-list))
- ((equal c ?T) (org-call-with-arg 'org-todo-list (or arg '(4))))
- ((equal c ?m) (call-interactively 'org-tags-view))
- ((equal c ?M) (org-call-with-arg 'org-tags-view (or arg '(4))))
- ((equal c ?e) (call-interactively 'org-store-agenda-views))
- ((equal c ?L)
- (unless restrict-ok
+ ((equal keys "C")
+ (setq org-agenda-custom-commands org-agenda-custom-commands-orig)
+ (customize-variable 'org-agenda-custom-commands))
+ ((equal keys "a") (call-interactively 'org-agenda-list))
+ ((equal keys "t") (call-interactively 'org-todo-list))
+ ((equal keys "T") (org-call-with-arg 'org-todo-list (or arg '(4))))
+ ((equal keys "m") (call-interactively 'org-tags-view))
+ ((equal keys "M") (org-call-with-arg 'org-tags-view (or arg '(4))))
+ ((equal keys "e") (call-interactively 'org-store-agenda-views))
+ ((equal keys "L")
+ (unless (org-mode-p)
(error "This is not an Org-mode file"))
- (org-call-with-arg 'org-timeline arg))
- ((equal c ?#) (call-interactively 'org-agenda-list-stuck-projects))
- ((equal c ?!) (customize-variable 'org-stuck-projects))
- (t (error "Invalid key"))))))
+ (unless restriction
+ (put 'org-agenda-files 'org-restrict (list bfn))
+ (org-call-with-arg 'org-timeline arg)))
+ ((equal keys "#") (call-interactively 'org-agenda-list-stuck-projects))
+ ((equal keys "/") (call-interactively 'org-occur-in-agenda-files))
+ ((equal keys "!") (customize-variable 'org-stuck-projects))
+ (t (error "Invalid agenda key"))))))
+
+(defun org-agenda-normalize-custom-commands (cmds)
+ (delq nil
+ (mapcar
+ (lambda (x)
+ (cond ((stringp (cdr x)) nil)
+ ((stringp (nth 1 x)) x)
+ ((not (nth 1 x)) (cons (car x) (cons "" (cddr x))))
+ (t (cons (car x) (cons "" (cdr x))))))
+ cmds)))
+
+(defun org-agenda-get-restriction-and-command (prefix-descriptions)
+ "The user interface for selecting an agenda command."
+ (catch 'exit
+ (let* ((bfn (buffer-file-name (buffer-base-buffer)))
+ (restrict-ok (and bfn (org-mode-p)))
+ (region-p (org-region-active-p))
+ (custom org-agenda-custom-commands)
+ (selstring "")
+ restriction second-time
+ c entry key type match prefixes rmheader header-end custom1 desc)
+ (save-window-excursion
+ (delete-other-windows)
+ (org-switch-to-buffer-other-window " *Agenda Commands*")
+ (erase-buffer)
+ (insert (eval-when-compile
+ (let ((header
+"
+Press key for an agenda command: < Buffer,subtree/region restriction
+-------------------------------- > Remove restriction
+a Agenda for current week or day e Export agenda views
+t List of all TODO entries T Entries with special TODO kwd
+m Match a TAGS query M Like m, but only TODO entries
+L Timeline for current buffer # List stuck projects (!=configure)
+/ Multi-occur C Configure custom agenda commands
+")
+ (start 0))
+ (while (string-match
+ "\\(^\\| \\|(\\)\\(\\S-\\)\\( \\|=\\)"
+ header start)
+ (setq start (match-end 0))
+ (add-text-properties (match-beginning 2) (match-end 2)
+ '(face bold) header))
+ header)))
+ (setq header-end (move-marker (make-marker) (point)))
+ (while t
+ (setq custom1 custom)
+ (when (eq rmheader t)
+ (goto-line 1)
+ (re-search-forward ":" nil t)
+ (delete-region (match-end 0) (point-at-eol))
+ (forward-char 1)
+ (looking-at "-+")
+ (delete-region (match-end 0) (point-at-eol))
+ (move-marker header-end (match-end 0)))
+ (goto-char header-end)
+ (delete-region (point) (point-max))
+ (while (setq entry (pop custom1))
+ (setq key (car entry) desc (nth 1 entry)
+ type (nth 2 entry) match (nth 3 entry))
+ (if (> (length key) 1)
+ (add-to-list 'prefixes (string-to-char key))
+ (insert
+ (format
+ "\n%-4s%-14s: %s"
+ (org-add-props (copy-sequence key)
+ '(face bold))
+ (cond
+ ((string-match "\\S-" desc) desc)
+ ((eq type 'agenda) "Agenda for current week or day")
+ ((eq type 'alltodo) "List of all TODO entries")
+ ((eq type 'stuck) "List of stuck projects")
+ ((eq type 'todo) "TODO keyword")
+ ((eq type 'tags) "Tags query")
+ ((eq type 'tags-todo) "Tags (TODO)")
+ ((eq type 'tags-tree) "Tags tree")
+ ((eq type 'todo-tree) "TODO kwd tree")
+ ((eq type 'occur-tree) "Occur tree")
+ ((functionp type) (if (symbolp type)
+ (symbol-name type)
+ "Lambda expression"))
+ (t "???"))
+ (cond
+ ((stringp match)
+ (org-add-props match nil 'face 'org-warning))
+ (match
+ (format "set of %d commands" (length match)))
+ (t ""))))))
+ (when prefixes
+ (mapc (lambda (x)
+ (insert
+ (format "\n%s %s"
+ (org-add-props (char-to-string x)
+ nil 'face 'bold)
+ (or (cdr (assoc (concat selstring (char-to-string x))
+ prefix-descriptions))
+ "Prefix key"))))
+ prefixes))
+ (goto-char (point-min))
+ (when (fboundp 'fit-window-to-buffer)
+ (if second-time
+ (if (not (pos-visible-in-window-p (point-max)))
+ (fit-window-to-buffer))
+ (setq second-time t)
+ (fit-window-to-buffer)))
+ (message "Press key for agenda command%s:"
+ (if (or restrict-ok org-agenda-overriding-restriction)
+ (if org-agenda-overriding-restriction
+ " (restriction lock active)"
+ (if restriction
+ (format " (restricted to %s)" restriction)
+ " (unrestricted)"))
+ ""))
+ (setq c (read-char-exclusive))
+ (message "")
+ (cond
+ ((assoc (char-to-string c) custom)
+ (setq selstring (concat selstring (char-to-string c)))
+ (throw 'exit (cons selstring restriction)))
+ ((memq c prefixes)
+ (setq selstring (concat selstring (char-to-string c))
+ prefixes nil
+ rmheader (or rmheader t)
+ custom (delq nil (mapcar
+ (lambda (x)
+ (if (or (= (length (car x)) 1)
+ (/= (string-to-char (car x)) c))
+ nil
+ (cons (substring (car x) 1) (cdr x))))
+ custom))))
+ ((and (not restrict-ok) (memq c '(?1 ?0 ?<)))
+ (message "Restriction is only possible in Org-mode buffers")
+ (ding) (sit-for 1))
+ ((eq c ?1)
+ (org-agenda-remove-restriction-lock 'noupdate)
+ (setq restriction 'buffer))
+ ((eq c ?0)
+ (org-agenda-remove-restriction-lock 'noupdate)
+ (setq restriction (if region-p 'region 'subtree)))
+ ((eq c ?<)
+ (org-agenda-remove-restriction-lock 'noupdate)
+ (setq restriction
+ (cond
+ ((eq restriction 'buffer)
+ (if region-p 'region 'subtree))
+ ((memq restriction '(subtree region))
+ nil)
+ (t 'buffer))))
+ ((eq c ?>)
+ (org-agenda-remove-restriction-lock 'noupdate)
+ (setq restriction nil))
+ ((and (equal selstring "") (memq c '(?a ?t ?m ?L ?C ?e ?T ?M ?# ?! ?/)))
+ (throw 'exit (cons (setq selstring (char-to-string c)) restriction)))
+ ((and (> (length selstring) 0) (eq c ?\d))
+ (delete-window)
+ (org-agenda-get-restriction-and-command prefix-descriptions))
+
+ ((equal c ?q) (error "Abort"))
+ (t (error "Invalid key %c" c))))))))
(defun org-run-agenda-series (name series)
(org-prepare-agenda name)
@@ -14685,12 +19475,11 @@ before running the agenda command."
(let (pars)
(while parameters
(push (list (pop parameters) (if parameters (pop parameters))) pars))
- (if (> (length cmd-key) 1)
+ (if (> (length cmd-key) 2)
(eval (list 'let (nreverse pars)
(list 'org-tags-view nil cmd-key)))
- (flet ((read-char-exclusive () (string-to-char cmd-key)))
- (eval (list 'let (nreverse pars) '(org-agenda nil)))))
- (set-buffer "*Org Agenda*")
+ (eval (list 'let (nreverse pars) (list 'org-agenda nil cmd-key))))
+ (set-buffer org-agenda-buffer-name)
(princ (org-encode-for-stdout (buffer-string)))))
(defun org-encode-for-stdout (string)
@@ -14740,12 +19529,11 @@ agenda-day The day in the agenda where this is listed"
(while parameters
(push (list (pop parameters) (if parameters (pop parameters))) pars))
(push (list 'org-agenda-remove-tags t) pars)
- (if (> (length cmd-key) 1)
+ (if (> (length cmd-key) 2)
(eval (list 'let (nreverse pars)
(list 'org-tags-view nil cmd-key)))
- (flet ((read-char-exclusive () (string-to-char cmd-key)))
- (eval (list 'let (nreverse pars) '(org-agenda nil)))))
- (set-buffer "*Org Agenda*")
+ (eval (list 'let (nreverse pars) (list 'org-agenda nil cmd-key))))
+ (set-buffer org-agenda-buffer-name)
(let* ((lines (org-split-string (buffer-string) "\n"))
line)
(while (setq line (pop lines))
@@ -14762,7 +19550,8 @@ agenda-day The day in the agenda where this is listed"
(princ "\n"))))))
(defun org-fix-agenda-info (props)
- "FIXME"
+ "Make sure all properties on an agenda item have a canonical form,
+so the the export commands caneasily use it."
(let (tmp re)
(when (setq tmp (plist-get props 'tags))
(setq props (plist-put props 'tags (mapconcat 'identity tmp ":"))))
@@ -14808,14 +19597,13 @@ agenda-day The day in the agenda where this is listed"
(interactive)
(eval (list 'org-batch-store-agenda-views)))
-(defvar org-agenda-buffer-name)
-
;; FIXME, why is this a macro?????
;;;###autoload
(defmacro org-batch-store-agenda-views (&rest parameters)
"Run all custom agenda commands that have a file argument."
- (let ((cmds org-agenda-custom-commands)
- (dir (default-directory))
+ (let ((cmds (org-agenda-normalize-custom-commands org-agenda-custom-commands))
+ (pop-up-frames nil)
+ (dir default-directory)
pars cmd thiscmdkey files opts)
(while parameters
(push (list (pop parameters) (if parameters (pop parameters))) pars))
@@ -14824,19 +19612,19 @@ agenda-day The day in the agenda where this is listed"
(while cmds
(setq cmd (pop cmds)
thiscmdkey (car cmd)
- opts (nth 3 cmd)
- files (org-last cmd))
+ opts (nth 4 cmd)
+ files (nth 5 cmd))
(if (stringp files) (setq files (list files)))
(when files
- (flet ((read-char-exclusive () (string-to-char thiscmdkey)))
- (eval (list 'let (append org-agenda-exporter-settings opts pars)
- '(org-agenda nil))))
- (set-buffer "*Org Agenda*")
+ (eval (list 'let (append org-agenda-exporter-settings opts pars)
+ (list 'org-agenda nil thiscmdkey)))
+ (set-buffer org-agenda-buffer-name)
(while files
(eval (list 'let (append org-agenda-exporter-settings opts pars)
(list 'org-write-agenda
- (expand-file-name (pop files) dir) t)))))
- (kill-buffer org-agenda-buffer-name)))))
+ (expand-file-name (pop files) dir) t))))
+ (and (get-buffer org-agenda-buffer-name)
+ (kill-buffer org-agenda-buffer-name)))))))
(defun org-write-agenda (file &optional nosettings)
"Write the current buffer (an agenda view) as a file.
@@ -14895,8 +19683,10 @@ higher priority settings."
"Fit the window to the buffer size."
(and (memq org-agenda-window-setup '(reorganize-frame))
(fboundp 'fit-window-to-buffer)
- (fit-window-to-buffer nil (/ (* (frame-height) 3) 4)
- (/ (frame-height) 2))))
+ (fit-window-to-buffer
+ nil
+ (floor (* (frame-height) (cdr org-agenda-window-frame-fractions)))
+ (floor (* (frame-height) (car org-agenda-window-frame-fractions))))))
;;; Agenda file list
@@ -14904,11 +19694,26 @@ higher priority settings."
"Get the list of agenda files.
Optional UNRESTRICTED means return the full list even if a restriction
is currently in place."
- (cond
- ((and (not unrestricted) (get 'org-agenda-files 'org-restrict)))
- ((stringp org-agenda-files) (org-read-agenda-file-list))
- ((listp org-agenda-files) org-agenda-files)
- (t (error "Invalid value of `org-agenda-files'"))))
+ (let ((files
+ (cond
+ ((and (not unrestricted) (get 'org-agenda-files 'org-restrict)))
+ ((stringp org-agenda-files) (org-read-agenda-file-list))
+ ((listp org-agenda-files) org-agenda-files)
+ (t (error "Invalid value of `org-agenda-files'")))))
+ (setq files (apply 'append
+ (mapcar (lambda (f)
+ (if (file-directory-p f)
+ (directory-files f t
+ org-agenda-file-regexp)
+ (list f)))
+ files)))
+ (if org-agenda-skip-unavailable-files
+ (delq nil
+ (mapcar (function
+ (lambda (file)
+ (and (file-readable-p file) file)))
+ files))
+ files))) ; `org-check-agenda-file' will remove them from the list
(defun org-edit-agenda-file-list ()
"Edit the list of agenda files.
@@ -14929,8 +19734,8 @@ the buffer and restores the previous window configuration."
(org-install-agenda-files-menu)
(message "New agenda file list installed"))
nil 'local)
- (message (substitute-command-keys
- "Edit list and finish with \\[save-buffer]")))
+ (message "%s" (substitute-command-keys
+ "Edit list and finish with \\[save-buffer]")))
(customize-variable 'org-agenda-files)))
(defun org-store-new-agenda-file-list (list)
@@ -14978,7 +19783,8 @@ If the file is not present in the list, it is added to the front. If it is
present, it is moved there. With optional argument TO-END, add/move to the
end of the list."
(interactive "P")
- (let ((file-alist (mapcar (lambda (x)
+ (let ((org-agenda-skip-unavailable-files nil)
+ (file-alist (mapcar (lambda (x)
(cons (file-truename x) x))
(org-agenda-files t)))
(ctf (file-truename buffer-file-name))
@@ -14999,7 +19805,8 @@ end of the list."
These are the files which are being checked for agenda entries.
Optional argument FILE means, use this file instead of the current."
(interactive)
- (let* ((file (or file buffer-file-name))
+ (let* ((org-agenda-skip-unavailable-files nil)
+ (file (or file buffer-file-name))
(true-file (file-truename file))
(afile (abbreviate-file-name file))
(files (delq nil (mapcar
@@ -15013,7 +19820,7 @@ Optional argument FILE means, use this file instead of the current."
(org-store-new-agenda-file-list files)
(org-install-agenda-files-menu)
(message "Removed file: %s" afile))
- (message "File was not in list: %s" afile))))
+ (message "File was not in list: %s (not removed)" afile))))
(defun org-file-menu-entry (file)
(vector file (list 'find-file file) t))
@@ -15043,7 +19850,7 @@ Optional argument FILE means, use this file instead of the current."
(progn
(setq buffer-read-only nil)
(goto-char (point-max))
- (unless (= (point) 1)
+ (unless (or (bobp) org-agenda-compact-blocks)
(insert "\n" (make-string (window-width) ?=) "\n"))
(narrow-to-region (point) (point-max)))
(org-agenda-maybe-reset-markers 'force)
@@ -15061,12 +19868,12 @@ Optional argument FILE means, use this file instead of the current."
((equal org-agenda-window-setup 'current-window)
(switch-to-buffer abuf))
((equal org-agenda-window-setup 'other-window)
- (switch-to-buffer-other-window abuf))
+ (org-switch-to-buffer-other-window abuf))
((equal org-agenda-window-setup 'other-frame)
(switch-to-buffer-other-frame abuf))
((equal org-agenda-window-setup 'reorganize-frame)
(delete-other-windows)
- (switch-to-buffer-other-window abuf))))
+ (org-switch-to-buffer-other-window abuf))))
(setq buffer-read-only nil)
(erase-buffer)
(org-agenda-mode)
@@ -15077,32 +19884,71 @@ Optional argument FILE means, use this file instead of the current."
(defun org-finalize-agenda ()
"Finishing touch for the agenda buffer, called just before displaying it."
(unless org-agenda-multi
- (org-agenda-align-tags)
(save-excursion
- (let ((buffer-read-only))
+ (let ((inhibit-read-only t))
(goto-char (point-min))
(while (org-activate-bracket-links (point-max))
(add-text-properties (match-beginning 0) (match-end 0)
'(face org-link)))
+ (org-agenda-align-tags)
(unless org-agenda-with-colors
(remove-text-properties (point-min) (point-max) '(face nil))))
+ (if (and (boundp 'org-overriding-columns-format)
+ org-overriding-columns-format)
+ (org-set-local 'org-overriding-columns-format
+ org-overriding-columns-format))
+ (if (and (boundp 'org-agenda-view-columns-initially)
+ org-agenda-view-columns-initially)
+ (org-agenda-columns))
+ (when org-agenda-fontify-priorities
+ (org-fontify-priorities))
(run-hooks 'org-finalize-agenda-hook))))
+(defun org-fontify-priorities ()
+ "Make highest priority lines bold, and lowest italic."
+ (interactive)
+ (mapc (lambda (o) (if (eq (org-overlay-get o 'org-type) 'org-priority)
+ (org-delete-overlay o)))
+ (org-overlays-in (point-min) (point-max)))
+ (save-excursion
+ (let ((inhibit-read-only t)
+ b e p ov h l)
+ (goto-char (point-min))
+ (while (re-search-forward "\\[#\\(.\\)\\]" nil t)
+ (setq h (or (get-char-property (point) 'org-highest-priority)
+ org-highest-priority)
+ l (or (get-char-property (point) 'org-lowest-priority)
+ org-lowest-priority)
+ p (string-to-char (match-string 1))
+ b (match-beginning 0) e (point-at-eol)
+ ov (org-make-overlay b e))
+ (org-overlay-put
+ ov 'face
+ (cond ((listp org-agenda-fontify-priorities)
+ (cdr (assoc p org-agenda-fontify-priorities)))
+ ((equal p l) 'italic)
+ ((equal p h) 'bold)))
+ (org-overlay-put ov 'org-type 'org-priority)))))
+
(defun org-prepare-agenda-buffers (files)
"Create buffers for all agenda files, protect archived trees and comments."
(interactive)
(let ((pa '(:org-archived t))
(pc '(:org-comment t))
(pall '(:org-archived t :org-comment t))
+ (inhibit-read-only t)
(rea (concat ":" org-archive-tag ":"))
bmp file re)
(save-excursion
(save-restriction
(while (setq file (pop files))
- (org-check-agenda-file file)
- (set-buffer (org-get-agenda-file-buffer file))
+ (if (bufferp file)
+ (set-buffer file)
+ (org-check-agenda-file file)
+ (set-buffer (org-get-agenda-file-buffer file)))
(widen)
(setq bmp (buffer-modified-p))
+ (org-refresh-category-properties)
(setq org-todo-keywords-for-agenda
(append org-todo-keywords-for-agenda org-todo-keywords-1))
(setq org-done-keywords-for-agenda
@@ -15123,18 +19969,20 @@ Optional argument FILE means, use this file instead of the current."
(defvar org-agenda-skip-function nil
"Function to be called at each match during agenda construction.
-If this function return nil, the current match should not be skipped.
+If this function returns nil, the current match should not be skipped.
Otherwise, the function must return a position from where the search
should be continued.
+This may also be a Lisp form, it will be evaluated.
Never set this variable using `setq' or so, because then it will apply
to all future agenda commands. Instead, bind it with `let' to scope
-it dynamically into the agenda-constructing command.")
+it dynamically into the agenda-constructing command. A good way to set
+it is through options in org-agenda-custom-commands.")
(defun org-agenda-skip ()
"Throw to `:skip' in places that should be skipped.
Also moves point to the end of the skipped region, so that search can
continue from there."
- (let ((p (point-at-bol)) to)
+ (let ((p (point-at-bol)) to fp)
(and org-agenda-skip-archived-trees
(get-text-property p :org-archived)
(org-end-of-subtree t)
@@ -15143,10 +19991,13 @@ continue from there."
(org-end-of-subtree t)
(throw :skip t))
(if (equal (char-after p) ?#) (throw :skip t))
- (when (and (functionp org-agenda-skip-function)
+ (when (and (or (setq fp (functionp org-agenda-skip-function))
+ (consp org-agenda-skip-function))
(setq to (save-excursion
(save-match-data
- (funcall org-agenda-skip-function)))))
+ (if fp
+ (funcall org-agenda-skip-function)
+ (eval org-agenda-skip-function))))))
(goto-char to)
(throw :skip t))))
@@ -15173,9 +20024,6 @@ no longer in use."
(while org-agenda-markers
(move-marker (pop org-agenda-markers) nil))))
-(defvar org-agenda-new-buffers nil
- "Buffers created to visit agenda files.")
-
(defun org-get-agenda-file-buffer (file)
"Get a buffer visiting FILE. If the buffer needs to be created, add
it to the list of buffers which might be released later."
@@ -15200,40 +20048,14 @@ When a buffer is unmodified, it is just killed. When modified, it is saved
(with-current-buffer buf (save-buffer)))
(kill-buffer buf))))
-(defvar org-category-table nil)
-(defun org-get-category-table ()
- "Get the table of categories and positions in current buffer."
- (let (tbl)
- (save-excursion
- (save-restriction
- (widen)
- (goto-char (point-min))
- (while (re-search-forward "^#\\+CATEGORY:[ \t]*\\(.*\\)"
- nil t)
- (push (cons (match-beginning 1)
- (org-trim (match-string 1))) tbl))))
- tbl))
-
(defun org-get-category (&optional pos)
"Get the category applying to position POS."
- (if (not org-category-table)
- (cond
- ((null org-category)
- (setq org-category
- (if buffer-file-name
- (file-name-sans-extension
- (file-name-nondirectory buffer-file-name))
- "???")))
- ((symbolp org-category) (symbol-name org-category))
- (t org-category))
- (let ((tbl org-category-table)
- (pos (or pos (point))))
- (while (and tbl (> (caar tbl) pos))
- (pop tbl))
- (or (cdar tbl) (cdr (nth (1- (length org-category-table))
- org-category-table))))))
+ (get-text-property (or pos (point)) 'org-category))
+
;;; Agenda timeline
+(defvar org-agenda-only-exact-dates nil) ; dynamically scoped
+
(defun org-timeline (&optional include-all)
"Show a time-sorted view of the entries in the current org file.
Only entries with a time stamp of today or later will be listed. With
@@ -15255,13 +20077,15 @@ dates."
(day-numbers (org-get-all-dates beg end 'no-ranges
t doclosed ; always include today
org-timeline-show-empty-dates))
+ (org-deadline-warning-days 0)
+ (org-agenda-only-exact-dates t)
(today (time-to-days (current-time)))
(past t)
args
s e rtn d emptyp)
(setq org-agenda-redo-command
(list 'progn
- (list 'switch-to-buffer-other-window (current-buffer))
+ (list 'org-switch-to-buffer-other-window (current-buffer))
(list 'org-timeline (list 'quote include-all))))
(if (not dopast)
;; Remove past dates from the list of dates.
@@ -15272,6 +20096,8 @@ dates."
(file-name-nondirectory buffer-file-name)))
(if doclosed (push :closed args))
(push :timestamp args)
+ (push :deadline args)
+ (push :scheduled args)
(push :sexp args)
(if dotodo (push :todo args))
(while (setq d (pop day-numbers))
@@ -15290,18 +20116,16 @@ dates."
(setq date (calendar-gregorian-from-absolute d))
(setq s (point))
(setq rtn (and (not emptyp)
- (apply 'org-agenda-get-day-entries
- entry date args)))
+ (apply 'org-agenda-get-day-entries entry
+ date args)))
(if (or rtn (equal d today) org-timeline-show-empty-dates)
(progn
- (insert (calendar-day-name date) " "
- (number-to-string (extract-calendar-day date)) " "
- (calendar-month-name (extract-calendar-month date)) " "
- (number-to-string (extract-calendar-year date)) "\n")
-; FIXME: this gives a timezone problem
-; (insert (format-time-string org-agenda-date-format
-; (calendar-time-from-absolute d 0))
-; "\n")
+ (insert
+ (if (stringp org-agenda-format-date)
+ (format-time-string org-agenda-format-date
+ (org-time-from-absolute date))
+ (funcall org-agenda-format-date date))
+ "\n")
(put-text-property s (1- (point)) 'face 'org-agenda-structure)
(put-text-property s (1- (point)) 'org-date-line t)
(if (equal d today)
@@ -15362,23 +20186,30 @@ When EMPTY is non-nil, also include days without any entries."
(defvar org-agenda-last-arguments nil
"The arguments of the previous call to org-agenda")
(defvar org-starting-day nil) ; local variable in the agenda buffer
+(defvar org-agenda-span nil) ; local variable in the agenda buffer
(defvar org-include-all-loc nil) ; local variable
-
+(defvar org-agenda-remove-date nil) ; dynamically scoped
;;;###autoload
(defun org-agenda-list (&optional include-all start-day ndays)
- "Produce a weekly view from all files in variable `org-agenda-files'.
-The view will be for the current week, but from the overview buffer you
-will be able to go to other weeks.
-With one \\[universal-argument] prefix argument INCLUDE-ALL, all unfinished TODO items will
-also be shown, under the current date.
-With two \\[universal-argument] prefix argument INCLUDE-ALL, all TODO entries marked DONE
-on the days are also shown. See the variable `org-log-done' for how
-to turn on logging.
+ "Produce a daily/weekly view from all files in variable `org-agenda-files'.
+The view will be for the current day or week, but from the overview buffer
+you will be able to go to other days/weeks.
+
+With one \\[universal-argument] prefix argument INCLUDE-ALL,
+all unfinished TODO items will also be shown, before the agenda.
+This feature is considered obsolete, please use the TODO list or a block
+agenda instead.
+
+With a numeric prefix argument in an interactive call, the agenda will
+span INCLUDE-ALL days. Lisp programs should instead specify NDAYS to change
+the number of days. NDAYS defaults to `org-agenda-ndays'.
+
START-DAY defaults to TODAY, or to the most recent match for the weekday
-given in `org-agenda-start-on-weekday'.
-NDAYS defaults to `org-agenda-ndays'."
+given in `org-agenda-start-on-weekday'."
(interactive "P")
+ (if (and (integerp include-all) (> include-all 0))
+ (setq ndays include-all include-all nil))
(setq ndays (or ndays org-agenda-ndays)
start-day (or start-day org-agenda-start-day))
(if org-agenda-overriding-arguments
@@ -15393,12 +20224,13 @@ NDAYS defaults to `org-agenda-ndays'."
(org-set-sorting-strategy 'agenda)
(require 'calendar)
(let* ((org-agenda-start-on-weekday
- (if (or (equal ndays 1)
- (and (null ndays) (equal 1 org-agenda-ndays)))
- nil org-agenda-start-on-weekday))
+ (if (or (equal ndays 7) (and (null ndays) (equal 7 org-agenda-ndays)))
+ org-agenda-start-on-weekday nil))
(thefiles (org-agenda-files))
(files thefiles)
- (today (time-to-days (current-time)))
+ (today (time-to-days
+ (time-subtract (current-time)
+ (list 0 (* 3600 org-extend-today-until) 0))))
(sd (or start-day today))
(start (if (or (null org-agenda-start-on-weekday)
(< org-agenda-ndays 7))
@@ -15409,6 +20241,7 @@ NDAYS defaults to `org-agenda-ndays'."
(d (- nt n1)))
(- sd (+ (if (< d 0) 7 0) d)))))
(day-numbers (list start))
+ (day-cnt 0)
(inhibit-redisplay (not debug-on-error))
s e rtn rtnall file date d start-pos end-pos todayp nd)
(setq org-agenda-redo-command
@@ -15423,6 +20256,8 @@ NDAYS defaults to `org-agenda-ndays'."
(org-prepare-agenda "Day/Week")
(org-set-local 'org-starting-day (car day-numbers))
(org-set-local 'org-include-all-loc include-all)
+ (org-set-local 'org-agenda-span
+ (org-agenda-ndays-to-span nd))
(when (and (or include-all org-agenda-include-all-todo)
(member today day-numbers))
(setq files thefiles
@@ -15439,10 +20274,12 @@ NDAYS defaults to `org-agenda-ndays'."
(add-text-properties (point-min) (1- (point))
(list 'face 'org-agenda-structure))
(insert (org-finalize-agenda-entries rtnall) "\n")))
- (setq s (point))
- (insert (if (= nd 7) "Week-" "Day-") "agenda:\n")
- (add-text-properties s (1- (point)) (list 'face 'org-agenda-structure
- 'org-date-line t))
+ (unless org-agenda-compact-blocks
+ (setq s (point))
+ (insert (capitalize (symbol-name (org-agenda-ndays-to-span nd)))
+ "-agenda:\n")
+ (add-text-properties s (1- (point)) (list 'face 'org-agenda-structure
+ 'org-date-line t)))
(while (setq d (pop day-numbers))
(setq date (calendar-gregorian-from-absolute d)
s (point))
@@ -15471,23 +20308,24 @@ NDAYS defaults to `org-agenda-ndays'."
(setq rtnall (append rtnall rtn))))
(if (or rtnall org-agenda-show-all-dates)
(progn
- (insert (format "%-9s %2d %s %4d\n"
- (calendar-day-name date)
- (extract-calendar-day date)
- (calendar-month-name (extract-calendar-month date))
- (extract-calendar-year date)))
-; FIXME: this gives a timezone problem
-; (insert (format-time-string org-agenda-date-format
-; (calendar-time-from-absolute d 0)) "\n")
+ (setq day-cnt (1+ day-cnt))
+ (insert
+ (if (stringp org-agenda-format-date)
+ (format-time-string org-agenda-format-date
+ (org-time-from-absolute date))
+ (funcall org-agenda-format-date date))
+ "\n")
(put-text-property s (1- (point)) 'face 'org-agenda-structure)
(put-text-property s (1- (point)) 'org-date-line t)
+ (put-text-property s (1- (point)) 'org-day-cnt day-cnt)
(if todayp (put-text-property s (1- (point)) 'org-today t))
(if rtnall (insert
(org-finalize-agenda-entries
(org-agenda-add-time-grid-maybe
rtnall nd todayp))
"\n"))
- (put-text-property s (1- (point)) 'day d))))
+ (put-text-property s (1- (point)) 'day d)
+ (put-text-property s (1- (point)) 'org-day-cnt day-cnt))))
(goto-char (point-min))
(org-fit-agenda-window)
(unless (and (pos-visible-in-window-p (point-min))
@@ -15504,6 +20342,9 @@ NDAYS defaults to `org-agenda-ndays'."
(setq buffer-read-only t)
(message "")))
+(defun org-agenda-ndays-to-span (n)
+ (cond ((< n 7) 'day) ((= n 7) 'week) ((< n 32) 'month) (t 'year)))
+
;;; Agenda TODO list
(defvar org-select-this-todo-keyword nil)
@@ -15536,7 +20377,6 @@ for a keyword. A numeric prefix directly selects the Nth keyword in
(mapcar 'list kwds) nil nil)))
(and (equal 0 arg) (setq org-select-this-todo-keyword nil))
(org-set-local 'org-last-arg arg)
-;FIXME (org-set-local 'org-todo-keywords-for-agenda kwds)
(setq org-agenda-redo-command
'(org-todo-list (or current-prefix-arg org-last-arg)))
(setq files (org-agenda-files)
@@ -15562,7 +20402,7 @@ for a keyword. A numeric prefix directly selects the Nth keyword in
(mapc (lambda (x)
(setq s (format "(%d)%s" (setq n (1+ n)) x))
(if (> (+ (current-column) (string-width s) 1) (frame-width))
- (insert "\n "))
+ (insert "\n "))
(insert " " s))
kwds))
(insert "\n"))
@@ -15611,7 +20451,6 @@ The prefix arg TODO-ONLY limits the search to TODO entries."
(with-current-buffer buffer
(unless (org-mode-p)
(error "Agenda file %s is not in `org-mode'" file))
- (setq org-category-table (org-get-category-table))
(save-excursion
(save-restriction
(if org-agenda-restrict
@@ -15656,13 +20495,69 @@ used by user-defined selections using `org-agenda-skip-function'.")
If yes, it returns the end position of this tree, causing agenda commands
to skip this subtree. This is a function that can be put into
`org-agenda-skip-function' for the duration of a command."
- (save-match-data
- (let ((end (save-excursion (org-end-of-subtree t)))
- skip)
- (save-excursion
- (setq skip (re-search-forward org-agenda-skip-regexp end t)))
- (and skip end))))
+ (let ((end (save-excursion (org-end-of-subtree t)))
+ skip)
+ (save-excursion
+ (setq skip (re-search-forward org-agenda-skip-regexp end t)))
+ (and skip end)))
+
+(defun org-agenda-skip-entry-if (&rest conditions)
+ "Skip entry if any of CONDITIONS is true.
+See `org-agenda-skip-if' for details."
+ (org-agenda-skip-if nil conditions))
+
+(defun org-agenda-skip-subtree-if (&rest conditions)
+ "Skip entry if any of CONDITIONS is true.
+See `org-agenda-skip-if' for details."
+ (org-agenda-skip-if t conditions))
+
+(defun org-agenda-skip-if (subtree conditions)
+ "Checks current entity for CONDITIONS.
+If SUBTREE is non-nil, the entire subtree is checked. Otherwise, only
+the entry, i.e. the text before the next heading is checked.
+
+CONDITIONS is a list of symbols, boolean OR is used to combine the results
+from different tests. Valid conditions are:
+
+scheduled Check if there is a scheduled cookie
+notscheduled Check if there is no scheduled cookie
+deadline Check if there is a deadline
+notdeadline Check if there is no deadline
+regexp Check if regexp matches
+notregexp Check if regexp does not match.
+
+The regexp is taken from the conditions list, it must come right after
+the `regexp' or `notregexp' element.
+
+If any of these conditions is met, this function returns the end point of
+the entity, causing the search to continue from there. This is a function
+that can be put into `org-agenda-skip-function' for the duration of a command."
+ (let (beg end m)
+ (org-back-to-heading t)
+ (setq beg (point)
+ end (if subtree
+ (progn (org-end-of-subtree t) (point))
+ (progn (outline-next-heading) (1- (point)))))
+ (goto-char beg)
+ (and
+ (or
+ (and (memq 'scheduled conditions)
+ (re-search-forward org-scheduled-time-regexp end t))
+ (and (memq 'notscheduled conditions)
+ (not (re-search-forward org-scheduled-time-regexp end t)))
+ (and (memq 'deadline conditions)
+ (re-search-forward org-deadline-time-regexp end t))
+ (and (memq 'notdeadline conditions)
+ (not (re-search-forward org-deadline-time-regexp end t)))
+ (and (setq m (memq 'regexp conditions))
+ (stringp (nth 1 m))
+ (re-search-forward (nth 1 m) end t))
+ (and (setq m (memq 'notregexp conditions))
+ (stringp (nth 1 m))
+ (not (re-search-forward (nth 1 m) end t))))
+ end)))
+;;;###autoload
(defun org-agenda-list-stuck-projects (&rest ignore)
"Create agenda view for projects that are stuck.
Stuck projects are project that have no next actions. For the definitions
@@ -15671,6 +20566,7 @@ of what a project is and how to check if it stuck, customize the variable
MATCH is being ignored."
(interactive)
(let* ((org-agenda-skip-function 'org-agenda-skip-subtree-when-regexp-matches)
+ ;; FIXME: we could have used org-agenda-skip-if here.
(org-agenda-overriding-header "List of stuck projects: ")
(matcher (nth 0 org-stuck-projects))
(todo (nth 1 org-stuck-projects))
@@ -15686,10 +20582,10 @@ MATCH is being ignored."
"\\)\\>"))
(tags (nth 2 org-stuck-projects))
(tags-re (if (member "*" tags)
- "^\\*+.*:[a-zA-Z0-9_@]+:[ \t]*$"
- (concat "^\\*+.*:\\("
+ (org-re "^\\*+ .*:[[:alnum:]_@]+:[ \t]*$")
+ (concat "^\\*+ .*:\\("
(mapconcat 'identity tags "\\|")
- "\\):[a-zA-Z0-9_@:]*[ \t]*$")))
+ (org-re "\\):[[:alnum:]_@:]*[ \t]*$"))))
(gen-re (nth 3 org-stuck-projects))
(re-list
(delq nil
@@ -15716,6 +20612,7 @@ MATCH is being ignored."
"Get the (Emacs Calendar) diary entries for DATE."
(let* ((fancy-diary-buffer "*temporary-fancy-diary-buffer*")
(diary-display-hook '(fancy-diary-display))
+ (pop-up-frames nil)
(list-diary-entries-hook
(cons 'org-diary-default-entry list-diary-entries-hook))
(diary-file-name-prefix-function nil) ; turn this feature off
@@ -15724,18 +20621,20 @@ MATCH is being ignored."
(org-disable-agenda-to-diary t))
(save-excursion
(save-window-excursion
- (list-diary-entries date 1))) ;; Keep this name for now, compatibility
+ (funcall (if (fboundp 'diary-list-entries)
+ 'diary-list-entries 'list-diary-entries)
+ date 1)))
(if (not (get-buffer fancy-diary-buffer))
(setq entries nil)
(with-current-buffer fancy-diary-buffer
(setq buffer-read-only nil)
- (if (= (point-max) 1)
+ (if (zerop (buffer-size))
;; No entries
(setq entries nil)
;; Omit the date and other unnecessary stuff
(org-agenda-cleanup-fancy-diary)
;; Add prefix to each line and extend the text properties
- (if (= (point-max) 1)
+ (if (zerop (buffer-size))
(setq entries nil)
(setq entries (buffer-substring (point-min) (- (point-max) 1)))))
(set-buffer-modified-p nil)
@@ -15819,7 +20718,7 @@ items should be listed. The following arguments are allowed:
date range matching the selected date. Deadlines will
also be listed, on the expiration day.
- :sexp FIXME
+ :sexp List entries resulting from diary-like sexps.
:deadline List any deadlines past due, or due within
`org-deadline-warning-days'. The listing occurs only
@@ -15892,7 +20791,6 @@ the documentation of `org-diary'."
(with-current-buffer buffer
(unless (org-mode-p)
(error "Agenda file %s is not in `org-mode'" file))
- (setq org-category-table (org-get-category-table))
(let ((case-fold-search nil))
(save-excursion
(save-restriction
@@ -15921,17 +20819,23 @@ the documentation of `org-diary'."
((eq arg :closed)
(setq rtn (org-agenda-get-closed))
(setq results (append results rtn)))
- ((and (eq arg :deadline)
- (equal date (calendar-current-date)))
+ ((eq arg :deadline)
(setq rtn (org-agenda-get-deadlines))
(setq results (append results rtn))))))))
results))))
+(defun org-entry-is-todo-p ()
+ (member (org-get-todo-state) org-not-done-keywords))
+
(defun org-entry-is-done-p ()
- "Is the current entry marked DONE?"
+ (member (org-get-todo-state) org-done-keywords))
+
+(defun org-get-todo-state ()
(save-excursion
- (and (re-search-backward "[\r\n]\\*" nil t)
- (looking-at org-nl-done-regexp))))
+ (org-back-to-heading t)
+ (and (looking-at org-todo-line-regexp)
+ (match-end 2)
+ (match-string 2))))
(defun org-at-date-range-p (&optional inactive-ok)
"Is the cursor inside a date range?"
@@ -15963,7 +20867,7 @@ the documentation of `org-diary'."
(format "mouse-2 or RET jump to org file %s"
(abbreviate-file-name buffer-file-name))))
;; FIXME: get rid of the \n at some point but watch out
- (regexp (concat "[\n\r]\\*+ *\\("
+ (regexp (concat "^\\*+[ \t]+\\("
(if org-select-this-todo-keyword
(if (equal org-select-this-todo-keyword "*")
org-todo-regexp
@@ -15980,18 +20884,20 @@ the documentation of `org-diary'."
(save-match-data
(beginning-of-line)
(setq beg (point) end (progn (outline-next-heading) (point)))
- (when (or (and org-agenda-todo-ignore-scheduled (goto-char beg)
+ (when (or (and org-agenda-todo-ignore-with-date (goto-char beg)
+ (re-search-forward org-ts-regexp end t))
+ (and org-agenda-todo-ignore-scheduled (goto-char beg)
(re-search-forward org-scheduled-time-regexp end t))
(and org-agenda-todo-ignore-deadlines (goto-char beg)
(re-search-forward org-deadline-time-regexp end t)
(org-deadline-close (match-string 1))))
- (goto-char beg)
+ (goto-char (1+ beg))
(or org-agenda-todo-list-sublevels (org-end-of-subtree 'invisible))
(throw :skip nil)))
(goto-char beg)
(org-agenda-skip)
(goto-char (match-beginning 1))
- (setq marker (org-agenda-new-marker (1+ (match-beginning 0)))
+ (setq marker (org-agenda-new-marker (match-beginning 0))
category (org-get-category)
tags (org-get-tags-at (point))
txt (org-format-agenda-item "" (match-string 1) category tags)
@@ -16019,14 +20925,14 @@ the documentation of `org-diary'."
'help-echo
(format "mouse-2 or RET jump to org file %s"
(abbreviate-file-name buffer-file-name))))
-;???? (regexp (regexp-quote
-; (substring
-; (format-time-string
-; (car org-time-stamp-formats)
-; (apply 'encode-time ; DATE bound by calendar
-; (list 0 0 0 (nth 1 date) (car date) (nth 2 date))))
-; 0 11)))
(d1 (calendar-absolute-from-gregorian date))
+ (remove-re
+ (concat
+ (regexp-quote
+ (format-time-string
+ "<%Y-%m-%d"
+ (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date))))
+ ".*?>"))
(regexp
(concat
(regexp-quote
@@ -16039,7 +20945,7 @@ the documentation of `org-diary'."
"\\|\\(<[0-9]+-[0-9]+-[0-9]+[^>\n]+?\\+[0-9]+[dwmy]>\\)"
"\\|\\(<%%\\(([^>\n]+)\\)>\\)"))
marker hdmarker deadlinep scheduledp donep tmp priority category
- ee txt timestr tags b0 b3 e3)
+ ee txt timestr tags b0 b3 e3 head)
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(setq b0 (match-beginning 0)
@@ -16062,46 +20968,29 @@ the documentation of `org-diary'."
deadlinep (string-match org-deadline-regexp tmp)
scheduledp (string-match org-scheduled-regexp tmp)
donep (org-entry-is-done-p))
- (and org-agenda-skip-scheduled-if-done
- scheduledp donep
- (throw :skip t))
- (and org-agenda-skip-deadline-if-done
- deadlinep donep
- (throw :skip t))
+ (if (or scheduledp deadlinep) (throw :skip t))
(if (string-match ">" timestr)
;; substring should only run to end of time stamp
(setq timestr (substring timestr 0 (match-end 0))))
(save-excursion
- (if (re-search-backward "\\(^\\|\r\\)\\*+" nil t)
+ (if (re-search-backward "^\\*+ " nil t)
(progn
- (goto-char (match-end 1))
+ (goto-char (match-beginning 0))
(setq hdmarker (org-agenda-new-marker)
tags (org-get-tags-at))
- (looking-at "\\*+[ \t]*\\([^\r\n]+\\)")
+ (looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
+ (setq head (match-string 1))
+ (and org-agenda-skip-timestamp-if-done donep (throw :skip t))
(setq txt (org-format-agenda-item
- (format "%s%s"
- (if deadlinep "Deadline: " "")
- (if scheduledp "Scheduled: " ""))
- (match-string 1) category tags timestr)))
+ nil head category tags timestr nil
+ remove-re)))
(setq txt org-agenda-no-heading-message))
(setq priority (org-get-priority txt))
(org-add-props txt props
'org-marker marker 'org-hd-marker hdmarker)
- (if deadlinep
- (org-add-props txt nil
- 'face (if donep 'org-done 'org-warning)
- 'type "deadline" 'date date
- 'undone-face 'org-warning 'done-face 'org-done
- 'org-category category 'priority (+ 100 priority))
- (if scheduledp
- (org-add-props txt nil
- 'face 'org-scheduled-today
- 'type "scheduled" 'date date
- 'undone-face 'org-scheduled-today 'done-face 'org-done
- 'org-category category 'priority (+ 99 priority))
- (org-add-props txt nil 'priority priority
- 'org-category category 'date date
- 'type "timestamp")))
+ (org-add-props txt nil 'priority priority
+ 'org-category category 'date date
+ 'type "timestamp")
(push txt ee))
(outline-next-heading)))
(nreverse ee)))
@@ -16181,12 +21070,12 @@ the documentation of `org-diary'."
;; substring should only run to end of time stamp
(setq timestr (substring timestr 0 (match-end 0))))
(save-excursion
- (if (re-search-backward "\\(^\\|\r\\)\\*+" nil t)
+ (if (re-search-backward "^\\*+ " nil t)
(progn
- (goto-char (match-end 1))
+ (goto-char (match-beginning 0))
(setq hdmarker (org-agenda-new-marker)
tags (org-get-tags-at))
- (looking-at "\\*+[ \t]*\\([^\r\n]+\\)")
+ (looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
(setq txt (org-format-agenda-item
(if closedp "Closed: " "Clocked: ")
(match-string 1) category tags timestr)))
@@ -16203,8 +21092,7 @@ the documentation of `org-diary'."
(defun org-agenda-get-deadlines ()
"Return the deadline information for agenda display."
- (let* ((wdays org-deadline-warning-days)
- (props (list 'mouse-face 'highlight
+ (let* ((props (list 'mouse-face 'highlight
'org-not-done-regexp org-not-done-regexp
'org-todo-regexp org-todo-regexp
'keymap org-agenda-keymap
@@ -16214,57 +21102,79 @@ the documentation of `org-diary'."
(regexp org-deadline-time-regexp)
(todayp (equal date (calendar-current-date))) ; DATE bound by calendar
(d1 (calendar-absolute-from-gregorian date)) ; DATE bound by calendar
- d2 diff pos pos1 category tags
- ee txt head face)
+ d2 diff dfrac wdays pos pos1 category tags
+ ee txt head face s upcomingp donep timestr)
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(catch :skip
(org-agenda-skip)
- (setq pos (1- (match-beginning 1))
-;??? d2 (time-to-days
-;??? (org-time-string-to-time (match-string 1)))
+ (setq s (match-string 1)
+ pos (1- (match-beginning 1))
d2 (org-time-string-to-absolute (match-string 1) d1)
- diff (- d2 d1))
+ diff (- d2 d1)
+ wdays (org-get-wdays s)
+ dfrac (/ (* 1.0 (- wdays diff)) wdays)
+ upcomingp (and todayp (> diff 0)))
;; When to show a deadline in the calendar:
;; If the expiration is within wdays warning time.
;; Past-due deadlines are only shown on the current date
- (if (and (< diff wdays) todayp (not (= diff 0)))
+ (if (or (and (<= diff wdays)
+ (and todayp (not org-agenda-only-exact-dates)))
+ (= diff 0))
(save-excursion
(setq category (org-get-category))
- (if (re-search-backward "\\(^\\|\r\\)\\*+[ \t]*" nil t)
+ (if (re-search-backward "^\\*+[ \t]+" nil t)
(progn
(goto-char (match-end 0))
- (setq pos1 (match-end 1))
+ (setq pos1 (match-beginning 0))
(setq tags (org-get-tags-at pos1))
(setq head (buffer-substring-no-properties
(point)
(progn (skip-chars-forward "^\r\n")
(point))))
- (if (string-match org-looking-at-done-regexp head)
+ (setq donep (string-match org-looking-at-done-regexp head))
+ (if (string-match " \\([012]?[0-9]:[0-9][0-9]\\)" s)
+ (setq timestr
+ (concat (substring s (match-beginning 1)) " "))
+ (setq timestr 'time))
+ (if (and donep
+ (or org-agenda-skip-deadline-if-done
+ (not (= diff 0))))
(setq txt nil)
(setq txt (org-format-agenda-item
- (format "In %3d d.: " diff) head category tags))))
+ (if (= diff 0)
+ (car org-agenda-deadline-leaders)
+ (format (nth 1 org-agenda-deadline-leaders)
+ diff))
+ head category tags timestr))))
(setq txt org-agenda-no-heading-message))
(when txt
- (setq face (cond ((<= diff 0) 'org-warning)
- ((<= diff 5) 'org-upcoming-deadline)
- (t nil)))
+ (setq face (org-agenda-deadline-face dfrac))
(org-add-props txt props
'org-marker (org-agenda-new-marker pos)
'org-hd-marker (org-agenda-new-marker pos1)
- 'priority (+ (- 10 diff) (org-get-priority txt))
+ 'priority (+ (if upcomingp (floor (* dfrac 10.)) 100)
+ (org-get-priority txt))
'org-category category
- 'type "upcoming-deadline" 'date d2
- 'face face 'undone-face face 'done-face 'org-done)
+ 'type (if upcomingp "upcoming-deadline" "deadline")
+ 'date (if upcomingp date d2)
+ 'face (if donep 'org-done face)
+ 'undone-face face 'done-face 'org-done)
(push txt ee))))))
- ee))
+ (nreverse ee)))
+
+(defun org-agenda-deadline-face (fraction)
+ "Return the face to displaying a deadline item.
+FRACTION is what fraction of the head-warning time has passed."
+ (let ((faces org-agenda-deadline-faces) f)
+ (catch 'exit
+ (while (setq f (pop faces))
+ (if (>= fraction (car f)) (throw 'exit (cdr f)))))))
(defun org-agenda-get-scheduled ()
"Return the scheduled information for agenda display."
- (let* ((props (list 'face 'org-scheduled-previously
- 'org-not-done-regexp org-not-done-regexp
+ (let* ((props (list 'org-not-done-regexp org-not-done-regexp
'org-todo-regexp org-todo-regexp
- 'undone-face 'org-scheduled-previously
'done-face 'org-done
'mouse-face 'highlight
'keymap org-agenda-keymap
@@ -16275,44 +21185,62 @@ the documentation of `org-diary'."
(todayp (equal date (calendar-current-date))) ; DATE bound by calendar
(d1 (calendar-absolute-from-gregorian date)) ; DATE bound by calendar
d2 diff pos pos1 category tags
- ee txt head)
+ ee txt head pastschedp donep face timestr s)
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(catch :skip
(org-agenda-skip)
- (setq pos (1- (match-beginning 1))
+ (setq s (match-string 1)
+ pos (1- (match-beginning 1))
d2 (org-time-string-to-absolute (match-string 1) d1)
-;??? d2 (time-to-days
-;??? (org-time-string-to-time (match-string 1)))
diff (- d2 d1))
+ (setq pastschedp (and todayp (< diff 0)))
;; When to show a scheduled item in the calendar:
;; If it is on or past the date.
- (if (and (< diff 0) todayp)
+ (if (or (and (< diff 0)
+ (and todayp (not org-agenda-only-exact-dates)))
+ (= diff 0))
(save-excursion
(setq category (org-get-category))
- (if (re-search-backward "\\(^\\|\r\\)\\*+[ \t]*" nil t)
+ (if (re-search-backward "^\\*+[ \t]+" nil t)
(progn
(goto-char (match-end 0))
- (setq pos1 (match-end 1))
+ (setq pos1 (match-beginning 0))
(setq tags (org-get-tags-at))
(setq head (buffer-substring-no-properties
(point)
(progn (skip-chars-forward "^\r\n") (point))))
- (if (string-match org-looking-at-done-regexp head)
+ (setq donep (string-match org-looking-at-done-regexp head))
+ (if (string-match " \\([012]?[0-9]:[0-9][0-9]\\)" s)
+ (setq timestr
+ (concat (substring s (match-beginning 1)) " "))
+ (setq timestr 'time))
+ (if (and donep
+ (or org-agenda-skip-scheduled-if-done
+ (not (= diff 0))))
(setq txt nil)
(setq txt (org-format-agenda-item
- (format "Sched.%2dx: " (- 1 diff)) head
- category tags))))
+ (if (= diff 0)
+ (car org-agenda-scheduled-leaders)
+ (format (nth 1 org-agenda-scheduled-leaders)
+ (- 1 diff)))
+ head category tags timestr))))
(setq txt org-agenda-no-heading-message))
(when txt
+ (setq face (if pastschedp
+ 'org-scheduled-previously
+ 'org-scheduled-today))
(org-add-props txt props
+ 'undone-face face
+ 'face (if donep 'org-done face)
'org-marker (org-agenda-new-marker pos)
'org-hd-marker (org-agenda-new-marker pos1)
- 'type "past-scheduled" 'date d2
- 'priority (+ (- 5 diff) (org-get-priority txt))
+ 'type (if pastschedp "past-scheduled" "scheduled")
+ 'date (if pastschedp d2 date)
+ 'priority (+ 94 (- 5 diff) (org-get-priority txt))
'org-category category)
(push txt ee))))))
- ee))
+ (nreverse ee)))
(defun org-agenda-get-blocks ()
"Return the date-range information for agenda display."
@@ -16326,7 +21254,8 @@ the documentation of `org-diary'."
(abbreviate-file-name buffer-file-name))))
(regexp org-tr-regexp)
(d0 (calendar-absolute-from-gregorian date))
- marker hdmarker ee txt d1 d2 s1 s2 timestr category tags pos)
+ marker hdmarker ee txt d1 d2 s1 s2 timestr category tags pos
+ donep head)
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(catch :skip
@@ -16343,16 +21272,20 @@ the documentation of `org-diary'."
(save-excursion
(setq marker (org-agenda-new-marker (point)))
(setq category (org-get-category))
- (if (re-search-backward "\\(^\\|\r\\)\\*+" nil t)
+ (if (re-search-backward "^\\*+ " nil t)
(progn
- (setq hdmarker (org-agenda-new-marker (match-end 1)))
- (goto-char (match-end 1))
+ (goto-char (match-beginning 0))
+ (setq hdmarker (org-agenda-new-marker (point)))
(setq tags (org-get-tags-at))
- (looking-at "\\*+[ \t]*\\([^\r\n]+\\)")
+ (looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
+ (setq head (match-string 1))
+ (and org-agenda-skip-timestamp-if-done
+ (org-entry-is-done-p)
+ (throw :skip t))
(setq txt (org-format-agenda-item
(format (if (= d1 d2) "" "(%d/%d): ")
(1+ (- d0 d1)) (1+ (- d2 d1)))
- (match-string 1) category tags
+ head category tags
(if (= d0 d1) timestr))))
(setq txt org-agenda-no-heading-message))
(org-add-props txt props
@@ -16381,6 +21314,18 @@ groups carry important information:
1 the first time, range or not
8 the second time, if it is a range.")
+(defconst org-plain-time-extension-regexp
+ (concat
+ "\\(\\<[012]?[0-9]"
+ "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
+ "\\+\\([0-9]+\\)\\(:\\([0-5][0-9]\\)\\)?")
+ "Regular expression to match a time range like 13:30+2:10 = 13:30-15:40.
+Examples: 11:45 or 8am-13:15 or 2:45-2:45pm. After a match, the following
+groups carry important information:
+0 the full match
+7 hours of duration
+9 minutes of duration")
+
(defconst org-stamp-time-of-day-regexp
(concat
"<\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} +\\sw+ +\\)"
@@ -16402,7 +21347,7 @@ The flag is set if the currently compiled format contains a `%t'.")
The flag is set if the currently compiled format contains a `%T'.")
(defun org-format-agenda-item (extra txt &optional category tags dotime
- noprefix)
+ noprefix remove-re)
"Format TXT to be inserted into the agenda buffer.
In particular, it adds the prefix and corresponding text properties. EXTRA
must be a string and replaces the `%s' specifier in the prefix format.
@@ -16413,7 +21358,8 @@ time-of-day should be extracted from TXT for sorting of this entry, and for
the `%t' specifier in the format. When DOTIME is a string, this string is
searched for a time before TXT is. NOPREFIX is a flag and indicates that
only the correctly processes TXT should be returned - this is used by
-`org-agenda-change-all-lines'. TAGS can be the tags of the headline."
+`org-agenda-change-all-lines'. TAGS can be the tags of the headline.
+Any match of REMOVE-RE will be removed from TXT."
(save-match-data
;; Diary entries sometimes have extra whitespace at the beginning
(if (string-match "^ +" txt) (setq txt (replace-match "" nil nil txt)))
@@ -16442,6 +21388,7 @@ only the correctly processes TXT should be returned - this is used by
;; The user can turn this off with a variable.
(if (and org-agenda-remove-times-when-in-prefix (or stamp plain)
(string-match (concat (regexp-quote s0) " *") txt)
+ (not (equal ?\] (string-to-char (substring txt (match-end 0)))))
(if (eq org-agenda-remove-times-when-in-prefix 'beg)
(= (match-beginning 0) 0)
t))
@@ -16450,7 +21397,17 @@ only the correctly processes TXT should be returned - this is used by
(if s1 (setq s1 (org-get-time-of-day s1 'string t)))
(if s2 (setq s2 (org-get-time-of-day s2 'string t))))
- (when (string-match "\\([ \t]+\\)\\(:[a-zA-Z0-9_@:]+:\\)[ \t]*$" txt)
+ (when (and s1 (not s2) org-agenda-default-appointment-duration
+ (string-match "\\([0-9]+\\):\\([0-9]+\\)" s1))
+ (let ((m (+ (string-to-number (match-string 2 s1))
+ (* 60 (string-to-number (match-string 1 s1)))
+ org-agenda-default-appointment-duration))
+ h)
+ (setq h (/ m 60) m (- m (* h 60)))
+ (setq s2 (format "%02d:%02d" h m))))
+
+ (when (string-match (org-re "\\([ \t]+\\)\\(:[[:alnum:]_@:]+:\\)[ \t]*$")
+ txt)
;; Tags are in the string
(if (or (eq org-agenda-remove-tags t)
(and org-agenda-remove-tags
@@ -16461,6 +21418,10 @@ only the correctly processes TXT should be returned - this is used by
(match-string 2 txt))
t t txt))))
+ (when remove-re
+ (while (string-match remove-re txt)
+ (setq txt (replace-match "" t t txt))))
+
;; Create the final string
(if noprefix
(setq rtn txt)
@@ -16476,6 +21437,8 @@ only the correctly processes TXT should be returned - this is used by
;; And finally add the text properties
(org-add-props rtn nil
'org-category (downcase category) 'tags tags
+ 'org-highest-priority org-highest-priority
+ 'org-lowest-priority org-lowest-priority
'prefix-length (- (length rtn) (length txt))
'time-of-day time-of-day
'txt txt
@@ -16483,7 +21446,7 @@ only the correctly processes TXT should be returned - this is used by
'extra extra
'dotime dotime))))
-(defvar org-agenda-sorting-strategy) ;; FIXME: can be removed?
+(defvar org-agenda-sorting-strategy) ;; because the def is in a let form
(defvar org-agenda-sorting-strategy-selected nil)
(defun org-agenda-add-time-grid-maybe (list ndays todayp)
@@ -16569,11 +21532,8 @@ The optional STRING argument forces conversion into a 5 character wide string
HH:MM."
(save-match-data
(when
- (or
- (string-match
- "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)\\([AaPp][Mm]\\)?\\> *" s)
- (string-match
- "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\([AaPp][Mm]\\)\\> *" s))
+ (or (string-match "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)\\([AaPp][Mm]\\)?\\> *" s)
+ (string-match "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\([AaPp][Mm]\\)\\> *" s))
(let* ((h (string-to-number (match-string 1 s)))
(m (if (match-end 3) (string-to-number (match-string 3 s)) 0))
(ampm (if (match-end 4) (downcase (match-string 4 s))))
@@ -16602,16 +21562,18 @@ HH:MM."
(if (eq x 'line)
(save-excursion
(beginning-of-line 1)
- (setq re (get-text-property (point) 'org-not-done-regexp))
+ (setq re (get-text-property (point) 'org-todo-regexp))
(goto-char (+ (point) (or (get-text-property (point) 'prefix-length) 0)))
(and (looking-at (concat "[ \t]*\\.*" re))
(add-text-properties (match-beginning 0) (match-end 0)
- '(face org-todo))))
- (setq re (concat (get-text-property 0 'org-not-done-regexp x))
+ (list 'face (org-get-todo-face 0)))))
+ (setq re (concat (get-text-property 0 'org-todo-regexp x))
pl (get-text-property 0 'prefix-length x))
(and re (equal (string-match (concat "\\(\\.*\\)" re) x (or pl 0)) pl)
- (add-text-properties (or (match-end 1) (match-end 0)) (match-end 0)
- '(face org-todo) x))
+ (add-text-properties
+ (or (match-end 1) (match-end 0)) (match-end 0)
+ (list 'face (org-get-todo-face (match-string 2 x)))
+ x))
x)))
(defsubst org-cmp-priority (a b)
@@ -16624,8 +21586,8 @@ HH:MM."
(defsubst org-cmp-category (a b)
"Compare the string values of categories of strings A and B."
- (let ((ca (or (get-text-property 1 'category a) ""))
- (cb (or (get-text-property 1 'category b) "")))
+ (let ((ca (or (get-text-property 1 'org-category a) ""))
+ (cb (or (get-text-property 1 'org-category b) "")))
(cond ((string-lessp ca cb) -1)
((string-lessp cb ca) +1)
(t nil))))
@@ -16666,6 +21628,85 @@ HH:MM."
(eval (cons 'or org-agenda-sorting-strategy-selected))
'((-1 . t) (1 . nil) (nil . nil))))))
+;;; Agenda restriction lock
+
+(defvar org-agenda-restriction-lock-overlay (org-make-overlay 1 1)
+ "Overlay to mark the headline to which arenda commands are restricted.")
+(org-overlay-put org-agenda-restriction-lock-overlay
+ 'face 'org-agenda-restriction-lock)
+(org-overlay-put org-agenda-restriction-lock-overlay
+ 'help-echo "Agendas are currently limited to this subtree.")
+(org-detach-overlay org-agenda-restriction-lock-overlay)
+(defvar org-speedbar-restriction-lock-overlay (org-make-overlay 1 1)
+ "Overlay marking the agenda restriction line in speedbar.")
+(org-overlay-put org-speedbar-restriction-lock-overlay
+ 'face 'org-agenda-restriction-lock)
+(org-overlay-put org-speedbar-restriction-lock-overlay
+ 'help-echo "Agendas are currently limited to this item.")
+(org-detach-overlay org-speedbar-restriction-lock-overlay)
+
+(defun org-agenda-set-restriction-lock (&optional type)
+ "Set restriction lock for agenda, to current subtree or file.
+Restriction will be the file if TYPE is `file', or if type is the
+universal prefix '(4), or if the cursor is before the first headline
+in the file. Otherwise, restriction will be to the current subtree."
+ (interactive "P")
+ (and (equal type '(4)) (setq type 'file))
+ (setq type (cond
+ (type type)
+ ((org-at-heading-p) 'subtree)
+ ((condition-case nil (org-back-to-heading t) (error nil))
+ 'subtree)
+ (t 'file)))
+ (if (eq type 'subtree)
+ (progn
+ (setq org-agenda-restrict t)
+ (setq org-agenda-overriding-restriction 'subtree)
+ (put 'org-agenda-files 'org-restrict
+ (list (buffer-file-name (buffer-base-buffer))))
+ (org-back-to-heading t)
+ (org-move-overlay org-agenda-restriction-lock-overlay (point) (point-at-eol))
+ (move-marker org-agenda-restrict-begin (point))
+ (move-marker org-agenda-restrict-end
+ (save-excursion (org-end-of-subtree t)))
+ (message "Locking agenda restriction to subtree"))
+ (put 'org-agenda-files 'org-restrict
+ (list (buffer-file-name (buffer-base-buffer))))
+ (setq org-agenda-restrict nil)
+ (setq org-agenda-overriding-restriction 'file)
+ (move-marker org-agenda-restrict-begin nil)
+ (move-marker org-agenda-restrict-end nil)
+ (message "Locking agenda restriction to file"))
+ (setq current-prefix-arg nil)
+ (org-agenda-maybe-redo))
+
+(defun org-agenda-remove-restriction-lock (&optional noupdate)
+ "Remove the agenda restriction lock."
+ (interactive "P")
+ (org-detach-overlay org-agenda-restriction-lock-overlay)
+ (org-detach-overlay org-speedbar-restriction-lock-overlay)
+ (setq org-agenda-overriding-restriction nil)
+ (setq org-agenda-restrict nil)
+ (put 'org-agenda-files 'org-restrict nil)
+ (move-marker org-agenda-restrict-begin nil)
+ (move-marker org-agenda-restrict-end nil)
+ (setq current-prefix-arg nil)
+ (message "Agenda restriction lock removed")
+ (or noupdate (org-agenda-maybe-redo)))
+
+(defun org-agenda-maybe-redo ()
+ "If there is any window showing the agenda view, update it."
+ (let ((w (get-buffer-window org-agenda-buffer-name t))
+ (w0 (selected-window)))
+ (when w
+ (select-window w)
+ (org-agenda-redo)
+ (select-window w0)
+ (if org-agenda-overriding-restriction
+ (message "Agenda view shifted to new %s restriction"
+ org-agenda-overriding-restriction)
+ (message "Agenda restriction lock removed")))))
+
;;; Agenda commands
(defun org-agenda-check-type (error &rest types)
@@ -16683,7 +21724,8 @@ If ERROR is non-nil, throw an error, otherwise just return nil."
(let ((buf (current-buffer)))
(if (not (one-window-p)) (delete-window))
(kill-buffer buf)
- (org-agenda-maybe-reset-markers 'force))
+ (org-agenda-maybe-reset-markers 'force)
+ (org-columns-remove-overlays))
;; Maybe restore the pre-agenda window configuration.
(and org-agenda-restore-windows-after-quit
(not (eq org-agenda-window-setup 'other-frame))
@@ -16699,6 +21741,13 @@ Org-mode buffers visited directly by the user will not be touched."
(setq org-agenda-new-buffers nil)
(org-agenda-quit))
+(defun org-agenda-execute (arg)
+ "Execute another agenda command, keeping same window.\\<global-map>
+So this is just a shortcut for `\\[org-agenda]', available in the agenda."
+ (interactive "P")
+ (let ((org-agenda-window-setup 'current-window))
+ (org-agenda arg)))
+
(defun org-save-all-org-buffers ()
"Save all Org-mode buffers without user confirmation."
(interactive)
@@ -16712,15 +21761,21 @@ When this is the global TODO list, a prefix argument will be interpreted."
(interactive)
(let* ((org-agenda-keep-modes t)
(line (org-current-line))
- (window-line (- line (org-current-line (window-start)))))
+ (window-line (- line (org-current-line (window-start))))
+ (lprops (get 'org-agenda-redo-command 'org-lprops)))
(message "Rebuilding agenda buffer...")
- (eval org-agenda-redo-command)
+ (org-let lprops '(eval org-agenda-redo-command))
(setq org-agenda-undo-list nil
org-agenda-pending-undo-list nil)
(message "Rebuilding agenda buffer...done")
(goto-line line)
(recenter window-line)))
+(defun org-agenda-goto-date (date)
+ "Jump to DATE in agenda."
+ (interactive (list (org-read-date)))
+ (org-agenda-list nil date))
+
(defun org-agenda-goto-today ()
"Go to today."
(interactive)
@@ -16729,77 +21784,131 @@ When this is the global TODO list, a prefix argument will be interpreted."
(cond
(tdpos (goto-char tdpos))
((eq org-agenda-type 'agenda)
- (let ((org-agenda-overriding-arguments org-agenda-last-arguments))
- (setf (nth 1 org-agenda-overriding-arguments) nil)
+ (let* ((sd (time-to-days
+ (time-subtract (current-time)
+ (list 0 (* 3600 org-extend-today-until) 0))))
+ (comp (org-agenda-compute-time-span sd org-agenda-span))
+ (org-agenda-overriding-arguments org-agenda-last-arguments))
+ (setf (nth 1 org-agenda-overriding-arguments) (car comp))
+ (setf (nth 2 org-agenda-overriding-arguments) (cdr comp))
(org-agenda-redo)
- (org-agenda-find-today-or-agenda)))
+ (org-agenda-find-same-or-today-or-agenda)))
(t (error "Cannot find today")))))
-(defun org-agenda-find-today-or-agenda ()
+(defun org-agenda-find-same-or-today-or-agenda (&optional cnt)
(goto-char
- (or (text-property-any (point-min) (point-max) 'org-today t)
+ (or (and cnt (text-property-any (point-min) (point-max) 'org-day-cnt cnt))
+ (text-property-any (point-min) (point-max) 'org-today t)
(text-property-any (point-min) (point-max) 'org-agenda-type 'agenda)
(point-min))))
(defun org-agenda-later (arg)
- "Go forward in time by `org-agenda-ndays' days.
-With prefix ARG, go forward that many times `org-agenda-ndays'."
+ "Go forward in time by thee current span.
+With prefix ARG, go forward that many times the current span."
(interactive "p")
(org-agenda-check-type t 'agenda)
- (let ((org-agenda-overriding-arguments
- (list (car org-agenda-last-arguments)
- (+ org-starting-day (* arg org-agenda-ndays))
- nil t)))
- (org-agenda-redo)
- (org-agenda-find-today-or-agenda)))
+ (let* ((span org-agenda-span)
+ (sd org-starting-day)
+ (greg (calendar-gregorian-from-absolute sd))
+ (cnt (get-text-property (point) 'org-day-cnt))
+ greg2 nd)
+ (cond
+ ((eq span 'day)
+ (setq sd (+ arg sd) nd 1))
+ ((eq span 'week)
+ (setq sd (+ (* 7 arg) sd) nd 7))
+ ((eq span 'month)
+ (setq greg2 (list (+ (car greg) arg) (nth 1 greg) (nth 2 greg))
+ sd (calendar-absolute-from-gregorian greg2))
+ (setcar greg2 (1+ (car greg2)))
+ (setq nd (- (calendar-absolute-from-gregorian greg2) sd)))
+ ((eq span 'year)
+ (setq greg2 (list (car greg) (nth 1 greg) (+ arg (nth 2 greg)))
+ sd (calendar-absolute-from-gregorian greg2))
+ (setcar (nthcdr 2 greg2) (1+ (nth 2 greg2)))
+ (setq nd (- (calendar-absolute-from-gregorian greg2) sd))))
+ (let ((org-agenda-overriding-arguments
+ (list (car org-agenda-last-arguments) sd nd t)))
+ (org-agenda-redo)
+ (org-agenda-find-same-or-today-or-agenda cnt))))
(defun org-agenda-earlier (arg)
- "Go back in time by `org-agenda-ndays' days.
-With prefix ARG, go back that many times `org-agenda-ndays'."
+ "Go backward in time by the current span.
+With prefix ARG, go backward that many times the current span."
(interactive "p")
- (org-agenda-check-type t 'agenda)
- (let ((org-agenda-overriding-arguments
- (list (car org-agenda-last-arguments)
- (- org-starting-day (* arg org-agenda-ndays))
- nil t)))
- (org-agenda-redo)
- (org-agenda-find-today-or-agenda)))
+ (org-agenda-later (- arg)))
+(defun org-agenda-day-view ()
+ "Switch to daily view for agenda."
+ (interactive)
+ (setq org-agenda-ndays 1)
+ (org-agenda-change-time-span 'day))
(defun org-agenda-week-view ()
- "Switch to weekly view for agenda."
+ "Switch to daily view for agenda."
(interactive)
- (org-agenda-check-type t 'agenda)
- (if (= org-agenda-ndays 7)
- (error "This is already the week view"))
(setq org-agenda-ndays 7)
- (let ((org-agenda-overriding-arguments
- (list (car org-agenda-last-arguments)
- (or (get-text-property (point) 'day)
- org-starting-day)
- nil t)))
- (org-agenda-redo)
- (org-agenda-find-today-or-agenda))
- (org-agenda-set-mode-name)
- (message "Switched to week view"))
-
-(defun org-agenda-day-view ()
+ (org-agenda-change-time-span 'week))
+(defun org-agenda-month-view ()
"Switch to daily view for agenda."
(interactive)
+ (org-agenda-change-time-span 'month))
+(defun org-agenda-year-view ()
+ "Switch to daily view for agenda."
+ (interactive)
+ (if (y-or-n-p "Are you sure you want to compute the agenda for an entire year? ")
+ (org-agenda-change-time-span 'year)
+ (error "Abort")))
+
+(defun org-agenda-change-time-span (span)
+ "Change the agenda view to SPAN.
+SPAN may be `day', `week', `month', `year'."
(org-agenda-check-type t 'agenda)
- (if (= org-agenda-ndays 1)
- (error "This is already the day view"))
- (setq org-agenda-ndays 1)
- (let ((org-agenda-overriding-arguments
- (list (car org-agenda-last-arguments)
- (or (get-text-property (point) 'day)
- org-starting-day)
- nil t)))
+ (if (equal org-agenda-span span)
+ (error "Viewing span is already \"%s\"" span))
+ (let* ((sd (or (get-text-property (point) 'day)
+ org-starting-day))
+ (computed (org-agenda-compute-time-span sd span))
+ (org-agenda-overriding-arguments
+ (list (car org-agenda-last-arguments)
+ (car computed) (cdr computed) t)))
(org-agenda-redo)
- (org-agenda-find-today-or-agenda))
+ (org-agenda-find-same-or-today-or-agenda))
(org-agenda-set-mode-name)
- (message "Switched to day view"))
-
-;; FIXME: this no longer works if user make date format that starts with a blank
+ (message "Switched to %s view" span))
+
+(defun org-agenda-compute-time-span (sd span)
+ "Compute starting date and number of days for agenda.
+SPAN may be `day', `week', `month', `year'. The return value
+is a cons cell with the starting date and the number of days,
+so that the date SD will be in that range."
+ (let* ((greg (calendar-gregorian-from-absolute sd))
+ nd)
+ (cond
+ ((eq span 'day)
+ (setq nd 1))
+ ((eq span 'week)
+ (let* ((nt (calendar-day-of-week
+ (calendar-gregorian-from-absolute sd)))
+ (d (if org-agenda-start-on-weekday
+ (- nt org-agenda-start-on-weekday)
+ 0)))
+ (setq sd (- sd (+ (if (< d 0) 7 0) d)))
+ (setq nd 7)))
+ ((eq span 'month)
+ (setq sd (calendar-absolute-from-gregorian
+ (list (car greg) 1 (nth 2 greg)))
+ nd (- (calendar-absolute-from-gregorian
+ (list (1+ (car greg)) 1 (nth 2 greg)))
+ sd)))
+ ((eq span 'year)
+ (setq sd (calendar-absolute-from-gregorian
+ (list 1 1 (nth 2 greg)))
+ nd (- (calendar-absolute-from-gregorian
+ (list 1 1 (1+ (nth 2 greg))))
+ sd))))
+ (cons sd nd)))
+
+;; FIXME: does not work if user makes date format that starts with a blank
(defun org-agenda-next-date-line (&optional arg)
"Jump to the next line indicating a date in agenda buffer."
(interactive "p")
@@ -16837,7 +21946,6 @@ With prefix ARG, go back that many times `org-agenda-ndays'."
(defun org-highlight-until-next-command (beg end &optional buffer)
(org-highlight beg end buffer)
(add-hook 'pre-command-hook 'org-unhighlight-once))
-
(defun org-unhighlight-once ()
(remove-hook 'pre-command-hook 'org-unhighlight-once)
(org-unhighlight))
@@ -16931,8 +22039,13 @@ and by additional input from the age of a schedules or deadline entry."
(save-excursion
(and (outline-next-heading)
(org-flag-heading nil)))) ; show the next heading
+ (run-hooks 'org-agenda-after-show-hook)
(and highlight (org-highlight (point-at-bol) (point-at-eol)))))
+(defvar org-agenda-after-show-hook nil
+ "Normal hook run after an item has been shown from the agenda.
+Point is in the buffer where the item originated.")
+
(defun org-agenda-kill ()
"Kill the entry or subtree belonging to the current agenda entry."
(interactive)
@@ -16949,7 +22062,7 @@ and by additional input from the age of a schedules or deadline entry."
(goto-char pos)
(if (and (org-mode-p) (not (member type '("sexp"))))
(setq dbeg (progn (org-back-to-heading t) (point))
- dend (org-end-of-subtree t))
+ dend (org-end-of-subtree t t))
(setq dbeg (point-at-bol)
dend (min (point-max) (1+ (point-at-eol)))))
(goto-char dbeg)
@@ -17005,20 +22118,25 @@ If this information is not given, the function uses the tree at point."
(setq p (marker-position m))
(>= p beg)
(<= p end))
- (let (buffer-read-only)
+ (let ((inhibit-read-only t))
(delete-region (point-at-bol) (1+ (point-at-eol)))))
(beginning-of-line 0))))))
(defun org-agenda-open-link ()
"Follow the link in the current line, if any."
(interactive)
- (let ((eol (point-at-eol)))
- (save-excursion
- (if (or (re-search-forward org-bracket-link-regexp eol t)
- (re-search-forward org-angle-link-re eol t)
- (re-search-forward org-plain-link-re eol t))
- (call-interactively 'org-open-at-point)
- (error "No link in current line")))))
+ (org-agenda-copy-local-variable 'org-link-abbrev-alist-local)
+ (save-excursion
+ (save-restriction
+ (narrow-to-region (point-at-bol) (point-at-eol))
+ (org-open-at-point))))
+
+(defun org-agenda-copy-local-variable (var)
+ "Get a variable from a referenced buffer and install it here."
+ (let ((m (get-text-property (point) 'org-marker)))
+ (when (and m (buffer-live-p (marker-buffer m)))
+ (org-set-local var (with-current-buffer (marker-buffer m)
+ (symbol-value var))))))
(defun org-agenda-switch-to (&optional delete-other-windows)
"Go to the Org-mode file which contains the item at point."
@@ -17116,7 +22234,7 @@ the same tree node, and the headline of the tree node in the Org-mode file."
(buffer (marker-buffer marker))
(pos (marker-position marker))
(hdmarker (get-text-property (point) 'org-hd-marker))
- (buffer-read-only nil)
+ (inhibit-read-only t)
newhead)
(org-with-remote-undo buffer
(with-current-buffer buffer
@@ -17144,7 +22262,7 @@ The new content of the line will be NEWHEAD (as modified by
`equal' against all `org-hd-marker' text properties in the file.
If FIXFACE is non-nil, the face of each item is modified acording to
the new TODO state."
- (let* ((buffer-read-only nil)
+ (let* ((inhibit-read-only t)
props m pl undone-face done-face finish new dotime cat tags)
(save-excursion
(goto-char (point-max))
@@ -17182,20 +22300,25 @@ the new TODO state."
(beginning-of-line 0)))
(org-finalize-agenda)))
-;; FIXME: allow negative value for org-agenda-align-tags-to-column
-;; See the code in set-tags for the way to do this.
(defun org-agenda-align-tags (&optional line)
- "Align all tags in agenda items to `org-agenda-align-tags-to-column'."
- (let ((buffer-read-only))
+ "Align all tags in agenda items to `org-agenda-tags-column'."
+ (let ((inhibit-read-only t) l c)
(save-excursion
(goto-char (if line (point-at-bol) (point-min)))
- (while (re-search-forward "\\([ \t]+\\):[a-zA-Z0-9_@:]+:[ \t]*$"
+ (while (re-search-forward (org-re "\\([ \t]+\\)\\(:[[:alnum:]_@:]+:\\)[ \t]*$")
(if line (point-at-eol) nil) t)
+ (add-text-properties
+ (match-beginning 2) (match-end 2)
+ (list 'face (list 'org-tag (get-text-property
+ (match-beginning 2) 'face))))
+ (setq l (- (match-end 2) (match-beginning 2))
+ c (if (< org-agenda-tags-column 0)
+ (- (abs org-agenda-tags-column) l)
+ org-agenda-tags-column))
(delete-region (match-beginning 1) (match-end 1))
(goto-char (match-beginning 1))
(insert (org-add-props
- (make-string (max 1 (- org-agenda-align-tags-to-column
- (current-column))) ?\ )
+ (make-string (max 1 (- c (current-column))) ?\ )
(text-properties-at (point))))))))
(defun org-agenda-priority-up ()
@@ -17216,10 +22339,10 @@ the same tree node, and the headline of the tree node in the Org-mode file."
(org-agenda-check-no-diary)
(let* ((marker (or (get-text-property (point) 'org-marker)
(org-agenda-error)))
- (buffer (marker-buffer marker))
- (pos (marker-position marker))
(hdmarker (get-text-property (point) 'org-hd-marker))
- (buffer-read-only nil)
+ (buffer (marker-buffer hdmarker))
+ (pos (marker-position hdmarker))
+ (inhibit-read-only t)
newhead)
(org-with-remote-undo buffer
(with-current-buffer buffer
@@ -17241,7 +22364,7 @@ POS defaults to point. If tags are inherited, the list contains
the targets in the same sequence as the headlines appear, i.e.
the tags of the current headline come last."
(interactive)
- (let (tags)
+ (let (tags lastpos)
(save-excursion
(save-restriction
(widen)
@@ -17249,8 +22372,9 @@ the tags of the current headline come last."
(save-match-data
(org-back-to-heading t)
(condition-case nil
- (while t
- (if (looking-at "[^\r\n]+?:\\([a-zA-Z0-9_@:]+\\):[ \t]*\\([\n\r]\\|\\'\\)")
+ (while (not (equal lastpos (point)))
+ (setq lastpos (point))
+ (if (looking-at (org-re "[^\r\n]+?:\\([[:alnum:]_@:]+\\):[ \t]*$"))
(setq tags (append (org-split-string
(org-match-string-no-properties 1) ":")
tags)))
@@ -17264,28 +22388,30 @@ the tags of the current headline come last."
"Set tags for the current headline."
(interactive)
(org-agenda-check-no-diary)
- (org-agenda-show) ;;; FIXME This is a stupid hack and should not be needed
- (let* ((hdmarker (or (get-text-property (point) 'org-hd-marker)
- (org-agenda-error)))
- (buffer (marker-buffer hdmarker))
- (pos (marker-position hdmarker))
- (buffer-read-only nil)
- newhead)
- (org-with-remote-undo buffer
- (with-current-buffer buffer
- (widen)
- (goto-char pos)
- (save-excursion
- (org-show-context 'agenda))
- (save-excursion
- (and (outline-next-heading)
- (org-flag-heading nil))) ; show the next heading
- (goto-char pos)
- (call-interactively 'org-set-tags)
- (end-of-line 1)
- (setq newhead (org-get-heading)))
- (org-agenda-change-all-lines newhead hdmarker)
- (beginning-of-line 1))))
+ (if (and (org-region-active-p) (interactive-p))
+ (call-interactively 'org-change-tag-in-region)
+ (org-agenda-show) ;;; FIXME This is a stupid hack and should not be needed
+ (let* ((hdmarker (or (get-text-property (point) 'org-hd-marker)
+ (org-agenda-error)))
+ (buffer (marker-buffer hdmarker))
+ (pos (marker-position hdmarker))
+ (inhibit-read-only t)
+ newhead)
+ (org-with-remote-undo buffer
+ (with-current-buffer buffer
+ (widen)
+ (goto-char pos)
+ (save-excursion
+ (org-show-context 'agenda))
+ (save-excursion
+ (and (outline-next-heading)
+ (org-flag-heading nil))) ; show the next heading
+ (goto-char pos)
+ (call-interactively 'org-set-tags)
+ (end-of-line 1)
+ (setq newhead (org-get-heading)))
+ (org-agenda-change-all-lines newhead hdmarker)
+ (beginning-of-line 1)))))
(defun org-agenda-toggle-archive-tag ()
"Toggle the archive tag for the current entry."
@@ -17296,7 +22422,7 @@ the tags of the current headline come last."
(org-agenda-error)))
(buffer (marker-buffer hdmarker))
(pos (marker-position hdmarker))
- (buffer-read-only nil)
+ (inhibit-read-only t)
newhead)
(org-with-remote-undo buffer
(with-current-buffer buffer
@@ -17336,11 +22462,11 @@ the tags of the current headline come last."
(interactive "p")
(org-agenda-date-later (- arg) what))
-(defun org-agenda-show-new-time (marker stamp)
+(defun org-agenda-show-new-time (marker stamp &optional prefix)
"Show new date stamp via text properties."
;; We use text properties to make this undoable
- (let ((buffer-read-only nil))
- (setq stamp (concat " => " stamp))
+ (let ((inhibit-read-only t))
+ (setq stamp (concat " " prefix " => " stamp))
(save-excursion
(goto-char (point-max))
(while (not (bobp))
@@ -17396,8 +22522,9 @@ be used to request time specification in the time stamp."
(with-current-buffer buffer
(widen)
(goto-char pos)
- (setq ts (org-schedule))
- (message "Item scheduled for %s" ts)))))
+ (setq ts (org-schedule arg)))
+ (org-agenda-show-new-time marker ts "S"))
+ (message "Item scheduled for %s" ts)))
(defun org-agenda-deadline (arg)
"Schedule the item at point."
@@ -17414,14 +22541,19 @@ be used to request time specification in the time stamp."
(with-current-buffer buffer
(widen)
(goto-char pos)
- (setq ts (org-deadline))
- (message "Deadline for this item set to %s" ts)))))
+ (setq ts (org-deadline arg)))
+ (org-agenda-show-new-time marker ts "S"))
+ (message "Deadline for this item set to %s" ts)))
-(defun org-get-heading ()
+(defun org-get-heading (&optional no-tags)
"Return the heading of the current entry, without the stars."
(save-excursion
(org-back-to-heading t)
- (if (looking-at "\\*+[ \t]+\\([^\r\n]*\\)") (match-string 1) "")))
+ (if (looking-at
+ (if no-tags
+ (org-re "\\*+[ \t]+\\([^\n\r]*?\\)\\([ \t]+:[[:alnum:]:_@]+:[ \t]*\\)?$")
+ "\\*+[ \t]+\\([^\r\n]*\\)"))
+ (match-string 1) "")))
(defun org-agenda-clock-in (&optional arg)
"Start the clock on the currently selected item."
@@ -17580,6 +22712,7 @@ This is a command that has to be installed in `calendar-mode-map'."
"Hebrew: " (calendar-hebrew-date-string date) " (until sunset)\n"
"Islamic: " (calendar-islamic-date-string date) " (until sunset)\n"
"French: " (calendar-french-date-string date) "\n"
+ "Baha'i: " (calendar-bahai-date-string date) " (until sunset)\n"
"Mayan: " (calendar-mayan-date-string date) "\n"
"Coptic: " (calendar-coptic-date-string date) "\n"
"Ethiopic: " (calendar-ethiopic-date-string date) "\n"
@@ -17917,17 +23050,25 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
(:archived-trees . org-export-with-archived-trees)
(:emphasize . org-export-with-emphasize)
(:sub-superscript . org-export-with-sub-superscripts)
+ (:special-strings . org-export-with-special-strings)
+ (:footnotes . org-export-with-footnotes)
+ (:drawers . org-export-with-drawers)
+ (:tags . org-export-with-tags)
(:TeX-macros . org-export-with-TeX-macros)
(:LaTeX-fragments . org-export-with-LaTeX-fragments)
(:skip-before-1st-heading . org-export-skip-text-before-1st-heading)
(:fixed-width . org-export-with-fixed-width)
(:timestamps . org-export-with-timestamps)
+ (:author-info . org-export-author-info)
+ (:time-stamp-file . org-export-time-stamp-file)
(:tables . org-export-with-tables)
(:table-auto-headline . org-export-highlight-first-table-line)
(:style . org-export-html-style)
- (:agenda-style . org-agenda-export-html-style) ;; FIXME: Does this work????
+ (:agenda-style . org-agenda-export-html-style)
(:convert-org-links . org-export-html-link-org-files-as-html)
(:inline-images . org-export-html-inline-images)
+ (:html-extension . org-export-html-extension)
+ (:html-table-tag . org-export-html-table-tag)
(:expand-quoted-html . org-export-html-expand)
(:timestamp . org-export-html-with-timestamp)
(:publishing-directory . org-export-publishing-directory)
@@ -17948,44 +23089,53 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
(defun org-infile-export-plist ()
"Return the property list with file-local settings for export."
(save-excursion
- (goto-char 0)
- (let ((re (org-make-options-regexp
- '("TITLE" "AUTHOR" "EMAIL" "TEXT" "OPTIONS" "LANGUAGE")))
- p key val text options)
- (while (re-search-forward re nil t)
- (setq key (org-match-string-no-properties 1)
- val (org-match-string-no-properties 2))
- (cond
- ((string-equal key "TITLE") (setq p (plist-put p :title val)))
- ((string-equal key "AUTHOR")(setq p (plist-put p :author val)))
- ((string-equal key "EMAIL") (setq p (plist-put p :email val)))
- ((string-equal key "LANGUAGE") (setq p (plist-put p :language val)))
- ((string-equal key "TEXT")
- (setq text (if text (concat text "\n" val) val)))
- ((string-equal key "OPTIONS") (setq options val))))
- (setq p (plist-put p :text text))
- (when options
- (let ((op '(("H" . :headline-levels)
- ("num" . :section-numbers)
- ("toc" . :table-of-contents)
- ("\\n" . :preserve-breaks)
- ("@" . :expand-quoted-html)
- (":" . :fixed-width)
- ("|" . :tables)
- ("^" . :sub-superscript)
- ("*" . :emphasize)
- ("TeX" . :TeX-macros)
- ("LaTeX" . :LaTeX-fragments)
- ("skip" . :skip-before-1st-heading)))
- o)
- (while (setq o (pop op))
- (if (string-match (concat (regexp-quote (car o))
- ":\\([^ \t\n\r;,.]*\\)")
- options)
- (setq p (plist-put p (cdr o)
- (car (read-from-string
- (match-string 1 options)))))))))
- p)))
+ (save-restriction
+ (widen)
+ (goto-char 0)
+ (let ((re (org-make-options-regexp
+ '("TITLE" "AUTHOR" "DATE" "EMAIL" "TEXT" "OPTIONS" "LANGUAGE")))
+ p key val text options)
+ (while (re-search-forward re nil t)
+ (setq key (org-match-string-no-properties 1)
+ val (org-match-string-no-properties 2))
+ (cond
+ ((string-equal key "TITLE") (setq p (plist-put p :title val)))
+ ((string-equal key "AUTHOR")(setq p (plist-put p :author val)))
+ ((string-equal key "EMAIL") (setq p (plist-put p :email val)))
+ ((string-equal key "DATE") (setq p (plist-put p :date val)))
+ ((string-equal key "LANGUAGE") (setq p (plist-put p :language val)))
+ ((string-equal key "TEXT")
+ (setq text (if text (concat text "\n" val) val)))
+ ((string-equal key "OPTIONS") (setq options val))))
+ (setq p (plist-put p :text text))
+ (when options
+ (let ((op '(("H" . :headline-levels)
+ ("num" . :section-numbers)
+ ("toc" . :table-of-contents)
+ ("\\n" . :preserve-breaks)
+ ("@" . :expand-quoted-html)
+ (":" . :fixed-width)
+ ("|" . :tables)
+ ("^" . :sub-superscript)
+ ("-" . :special-strings)
+ ("f" . :footnotes)
+ ("d" . :drawers)
+ ("tags" . :tags)
+ ("*" . :emphasize)
+ ("TeX" . :TeX-macros)
+ ("LaTeX" . :LaTeX-fragments)
+ ("skip" . :skip-before-1st-heading)
+ ("author" . :author-info)
+ ("timestamp" . :time-stamp-file)))
+ o)
+ (while (setq o (pop op))
+ (if (string-match (concat (regexp-quote (car o))
+ ":\\([^ \t\n\r;,.]*\\)")
+ options)
+ (setq p (plist-put p (cdr o)
+ (car (read-from-string
+ (match-string 1 options)))))))))
+ p))))
(defun org-export-directory (type plist)
(let* ((val (plist-get plist :publishing-directory))
@@ -18028,11 +23178,16 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
\[v] limit export to visible part of outline tree
\[a] export as ASCII
+
\[h] export as HTML
\[H] export as HTML to temporary buffer
+\[R] export region as HTML
\[b] export as HTML and browse immediately
\[x] export as XOXO
+\[l] export as LaTeX
+\[L] export as LaTeX to temporary buffer
+
\[i] export current file as iCalendar file
\[I] export all agenda files as iCalendar files
\[c] export agenda files into combined iCalendar file
@@ -18050,6 +23205,8 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
(?H . org-export-as-html-to-buffer)
(?R . org-export-region-as-html)
(?x . org-export-as-xoxo)
+ (?l . org-export-as-latex)
+ (?L . org-export-as-latex-to-buffer)
(?i . org-export-icalendar-this-file)
(?I . org-export-icalendar-all-agenda-files)
(?c . org-export-icalendar-combine-agenda-files)
@@ -18261,8 +23418,8 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
("prop") ("proptp"."&prop;")
("infin") ("infty"."&infin;")
("ang") ("angle"."&ang;")
- ("and") ("vee"."&and;")
- ("or") ("wedge"."&or;")
+ ("and") ("wedge"."&and;")
+ ("or") ("vee"."&or;")
("cap")
("cup")
("int")
@@ -18294,6 +23451,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
("clubs") ("clubsuit"."&clubs;")
("hearts") ("diamondsuit"."&hearts;")
("diams") ("diamondsuit"."&diams;")
+ ("smile"."&#9786;") ("blacksmile"."&#9787;") ("sad"."&#9785;")
("quot")
("amp")
("lt")
@@ -18371,7 +23529,7 @@ translations. There is currently no way for users to extend this.")
;;; General functions for all backends
(defun org-cleaned-string-for-export (string &rest parameters)
- "Cleanup a buffer substring so that links can be created safely."
+ "Cleanup a buffer STRING so that links can be created safely."
(interactive)
(let* ((re-radio (and org-target-link-regexp
(concat "\\([^<]\\)\\(" org-target-link-regexp "\\)")))
@@ -18379,12 +23537,19 @@ translations. There is currently no way for users to extend this.")
(re-angle-link (concat "\\([^[]\\)" org-angle-link-re))
(re-archive (concat ":" org-archive-tag ":"))
(re-quote (concat "^\\*+[ \t]+" org-quote-string "\\>"))
+ (re-commented (concat "^\\*+[ \t]+" org-comment-string "\\>"))
(htmlp (plist-get parameters :for-html))
- (outline-regexp "\\*+")
- a b
+ (asciip (plist-get parameters :for-ascii))
+ (latexp (plist-get parameters :for-LaTeX))
+ (commentsp (plist-get parameters :comments))
+ (archived-trees (plist-get parameters :archived-trees))
+ (inhibit-read-only t)
+ (drawers org-drawers)
+ (exp-drawers (plist-get parameters :drawers))
+ (outline-regexp "\\*+ ")
+ a b xx
rtn p)
- (save-excursion
- (set-buffer (get-buffer-create " org-mode-tmp"))
+ (with-current-buffer (get-buffer-create " org-mode-tmp")
(erase-buffer)
(insert string)
;; Remove license-to-kill stuff
@@ -18407,36 +23572,73 @@ translations. There is currently no way for users to extend this.")
(insert (plist-get parameters :add-text) "\n"))
;; Get rid of archived trees
- (when (not (eq org-export-with-archived-trees t))
+ (when (not (eq archived-trees t))
(goto-char (point-min))
(while (re-search-forward re-archive nil t)
(if (not (org-on-heading-p t))
(org-end-of-subtree t)
(beginning-of-line 1)
- (setq a (if org-export-with-archived-trees
+ (setq a (if archived-trees
(1+ (point-at-eol)) (point))
b (org-end-of-subtree t))
(if (> b a) (delete-region a b)))))
- ;; Protect stuff from HTML processing
- (goto-char (point-min))
- (while (re-search-forward "^[ \t]*:.*\\(\n[ \t]*:.*\\)*" nil t)
- (add-text-properties (match-beginning 0) (match-end 0)
- '(org-protected t)))
- (when htmlp
+ ;; Get rid of drawers
+ (unless (eq t exp-drawers)
(goto-char (point-min))
- (while (re-search-forward "^#\\+HTML:[ \t]*\\(.*\\)" nil t)
- (replace-match "\\1" t)
- (add-text-properties
- (point-at-bol) (min (1+ (point-at-eol)) (point-max))
- '(org-protected t))))
+ (let ((re (concat "^[ \t]*:\\("
+ (mapconcat
+ 'identity
+ (org-delete-all exp-drawers
+ (copy-sequence drawers))
+ "\\|")
+ "\\):[ \t]*\n\\([^@]*?\n\\)?[ \t]*:END:[ \t]*\n")))
+ (while (re-search-forward re nil t)
+ (replace-match ""))))
+
+ ;; Find targets in comments and move them out of comments,
+ ;; but mark them as targets that should be invisible
(goto-char (point-min))
- (while (re-search-forward
- "^#\\+BEGIN_HTML\\>.*\\(\\(\n.*\\)*?\n\\)#\\+END_HTML\\>.*\n?" nil t)
- (if htmlp
- (add-text-properties (match-beginning 1) (1+ (match-end 1))
- '(org-protected t))
- (delete-region (match-beginning 0) (match-end 0))))
+ (while (re-search-forward "^#.*?\\(<<<?[^>\r\n]+>>>?\\).*" nil t)
+ (replace-match "\\1(INVISIBLE)"))
+
+ ;; Protect backend specific stuff, throw away the others.
+ (let ((formatters
+ `((,htmlp "HTML" "BEGIN_HTML" "END_HTML")
+ (,asciip "ASCII" "BEGIN_ASCII" "END_ASCII")
+ (,latexp "LaTeX" "BEGIN_LaTeX" "END_LaTeX")))
+ fmt)
+ (goto-char (point-min))
+ (while (re-search-forward "^#\\+BEGIN_EXAMPLE[ \t]*\n" nil t)
+ (goto-char (match-end 0))
+ (while (not (looking-at "#\\+END_EXAMPLE"))
+ (insert ": ")
+ (beginning-of-line 2)))
+ (goto-char (point-min))
+ (while (re-search-forward "^[ \t]*:.*\\(\n[ \t]*:.*\\)*" nil t)
+ (add-text-properties (match-beginning 0) (match-end 0)
+ '(org-protected t)))
+ (while formatters
+ (setq fmt (pop formatters))
+ (when (car fmt)
+ (goto-char (point-min))
+ (while (re-search-forward (concat "^#\\+" (cadr fmt)
+ ":[ \t]*\\(.*\\)") nil t)
+ (replace-match "\\1" t)
+ (add-text-properties
+ (point-at-bol) (min (1+ (point-at-eol)) (point-max))
+ '(org-protected t))))
+ (goto-char (point-min))
+ (while (re-search-forward
+ (concat "^#\\+"
+ (caddr fmt) "\\>.*\\(\\(\n.*\\)*?\n\\)#\\+"
+ (cadddr fmt) "\\>.*\n?") nil t)
+ (if (car fmt)
+ (add-text-properties (match-beginning 1) (1+ (match-end 1))
+ '(org-protected t))
+ (delete-region (match-beginning 0) (match-end 0))))))
+
+ ;; Protect quoted subtrees
(goto-char (point-min))
(while (re-search-forward re-quote nil t)
(goto-char (match-beginning 0))
@@ -18444,16 +23646,58 @@ translations. There is currently no way for users to extend this.")
(add-text-properties (point) (org-end-of-subtree t)
'(org-protected t)))
- ;; Find targets in comments and move them out of comments,
- ;; but mark them as targets that should be invisible
+ ;; Protect verbatim elements
(goto-char (point-min))
- (while (re-search-forward "^#.*?\\(<<<?[^>\r\n]+>>>?\\).*" nil t)
- (replace-match "\\1(INVISIBLE)"))
+ (while (re-search-forward org-verbatim-re nil t)
+ (add-text-properties (match-beginning 4) (match-end 4)
+ '(org-protected t))
+ (goto-char (1+ (match-end 4))))
- ;; Remove comments
+ ;; Remove subtrees that are commented
(goto-char (point-min))
- (while (re-search-forward "^#.*\n?" nil t)
- (replace-match ""))
+ (while (re-search-forward re-commented nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (point) (org-end-of-subtree t)))
+
+ ;; Remove special table lines
+ (when org-export-table-remove-special-lines
+ (goto-char (point-min))
+ (while (re-search-forward "^[ \t]*|" nil t)
+ (beginning-of-line 1)
+ (if (or (looking-at "[ \t]*| *[!_^] *|")
+ (and (looking-at ".*?| *<[0-9]+> *|")
+ (not (looking-at ".*?| *[^ <|]"))))
+ (delete-region (max (point-min) (1- (point-at-bol)))
+ (point-at-eol))
+ (end-of-line 1))))
+
+ ;; Specific LaTeX stuff
+ (when latexp
+ (require 'org-export-latex nil)
+ (org-export-latex-cleaned-string))
+
+ (when asciip
+ (org-export-ascii-clean-string))
+
+ ;; Specific HTML stuff
+ (when htmlp
+ ;; Convert LaTeX fragments to images
+ (when (plist-get parameters :LaTeX-fragments)
+ (org-format-latex
+ (concat "ltxpng/" (file-name-sans-extension
+ (file-name-nondirectory
+ org-current-export-file)))
+ org-current-export-dir nil "Creating LaTeX image %s"))
+ (message "Exporting..."))
+
+ ;; Remove or replace comments
+ (goto-char (point-min))
+ (while (re-search-forward "^#\\(.*\n?\\)" nil t)
+ (if commentsp
+ (progn (add-text-properties
+ (match-beginning 0) (match-end 0) '(org-protected t))
+ (replace-match (format commentsp (match-string 1)) t t))
+ (replace-match "")))
;; Find matches for radio targets and turn them into internal links
(goto-char (point-min))
@@ -18469,14 +23713,6 @@ translations. There is currently no way for users to extend this.")
(replace-match "\\1 \\3")
(goto-char (match-beginning 0))))
- ;; Convert LaTeX fragments to images
- (when (plist-get parameters :LaTeX-fragments)
- (org-format-latex
- (concat "ltxpng/" (file-name-sans-extension
- (file-name-nondirectory
- org-current-export-file)))
- org-current-export-dir nil "Creating LaTeX image %s"))
- (message "Exporting...")
;; Normalize links: Convert angle and plain links into bracket links
;; Expand link abbreviations
@@ -18484,30 +23720,31 @@ translations. There is currently no way for users to extend this.")
(while (re-search-forward re-plain-link nil t)
(goto-char (1- (match-end 0)))
(org-if-unprotected
- (replace-match
- (concat
- (match-string 1) "[[" (match-string 2) ":" (match-string 3) "]]")
- t t)))
+ (let* ((s (concat (match-string 1) "[[" (match-string 2)
+ ":" (match-string 3) "]]")))
+ ;; added 'org-link face to links
+ (put-text-property 0 (length s) 'face 'org-link s)
+ (replace-match s t t))))
(goto-char (point-min))
(while (re-search-forward re-angle-link nil t)
(goto-char (1- (match-end 0)))
(org-if-unprotected
- (replace-match
- (concat
- (match-string 1) "[[" (match-string 2) ":" (match-string 3) "]]")
- t t)))
+ (let* ((s (concat (match-string 1) "[[" (match-string 2)
+ ":" (match-string 3) "]]")))
+ (put-text-property 0 (length s) 'face 'org-link s)
+ (replace-match s t t))))
(goto-char (point-min))
(while (re-search-forward org-bracket-link-regexp nil t)
(org-if-unprotected
- (replace-match
- (concat "[[" (save-match-data
- (org-link-expand-abbrev (match-string 1)))
- "]"
- (if (match-end 3)
- (match-string 2)
- (concat "[" (match-string 1) "]"))
- "]")
- t t)))
+ (let* ((s (concat "[[" (setq xx (save-match-data
+ (org-link-expand-abbrev (match-string 1))))
+ "]"
+ (if (match-end 3)
+ (match-string 2)
+ (concat "[" xx "]"))
+ "]")))
+ (put-text-property 0 (length s) 'face 'org-link s)
+ (replace-match s t t))))
;; Find multiline emphasis and put them into single line
(when (plist-get parameters :emph-multiline)
@@ -18527,7 +23764,7 @@ translations. There is currently no way for users to extend this.")
(defun org-export-grab-title-from-buffer ()
"Get a title for the current document, from looking at the buffer."
- (let (buffer-read-only)
+ (let ((inhibit-read-only t))
(save-excursion
(goto-char (point-min))
(let ((end (save-excursion (outline-next-heading) (point))))
@@ -18539,6 +23776,22 @@ translations. There is currently no way for users to extend this.")
;; Return the title string
(org-trim (match-string 0)))))))
+(defun org-export-get-title-from-subtree ()
+ "Return subtree title and exclude it from export."
+ (let (title (m (mark)))
+ (save-excursion
+ (goto-char (region-beginning))
+ (when (and (org-at-heading-p)
+ (>= (org-end-of-subtree t t) (region-end)))
+ ;; This is a subtree, we take the title from the first heading
+ (goto-char (region-beginning))
+ (looking-at org-todo-line-regexp)
+ (setq title (match-string 3))
+ (org-unmodified
+ (add-text-properties (point) (1+ (point-at-eol))
+ (list :org-license-to-kill t)))))
+ title))
+
(defun org-solidify-link-text (s &optional alist)
"Take link text and make a safe target out of it."
(save-match-data
@@ -18549,6 +23802,15 @@ translations. There is currently no way for users to extend this.")
(a (assoc rtn alist)))
(or (cdr a) rtn))))
+(defun org-get-min-level (lines)
+ "Get the minimum level in LINES."
+ (let ((re "^\\(\\*+\\) ") l min)
+ (catch 'exit
+ (while (setq l (pop lines))
+ (if (string-match re l)
+ (throw 'exit (org-tr-level (length (match-string 1 l))))))
+ 1)))
+
;; Variable holding the vector with section numbers
(defvar org-section-numbers (make-vector org-level-max 0))
@@ -18598,6 +23860,7 @@ When LEVEL is non-nil, increase section numbers on that level."
;;; ASCII export
(defvar org-last-level nil) ; dynamically scoped variable
+(defvar org-min-level nil) ; dynamically scoped variable
(defvar org-levels-open nil) ; dynamically scoped parameter
(defvar org-ascii-current-indentation nil) ; For communication
@@ -18610,6 +23873,13 @@ underlined headlines. The default is 3."
(setq-default org-todo-line-regexp org-todo-line-regexp)
(let* ((opt-plist (org-combine-plists (org-default-export-plist)
(org-infile-export-plist)))
+ (region-p (org-region-active-p))
+ (subtree-p
+ (when region-p
+ (save-excursion
+ (goto-char (region-beginning))
+ (and (org-at-heading-p)
+ (>= (org-end-of-subtree t t) (region-end))))))
(custom-times org-display-custom-times)
(org-ascii-current-indentation '(0 . 0))
(level 0) line txt
@@ -18619,15 +23889,22 @@ underlined headlines. The default is 3."
(filename (concat (file-name-as-directory
(org-export-directory :ascii opt-plist))
(file-name-sans-extension
- (file-name-nondirectory buffer-file-name))
+ (or (and subtree-p
+ (org-entry-get (region-beginning)
+ "EXPORT_FILE_NAME" t))
+ (file-name-nondirectory buffer-file-name)))
".txt"))
+ (filename (if (equal (file-truename filename)
+ (file-truename buffer-file-name))
+ (concat filename ".txt")
+ filename))
(buffer (find-file-noselect filename))
(org-levels-open (make-vector org-level-max nil))
(odd org-odd-levels-only)
- (date (format-time-string "%Y/%m/%d" (current-time)))
- (time (format-time-string "%X" (org-current-time)))
+ (date (plist-get opt-plist :date))
(author (plist-get opt-plist :author))
- (title (or (plist-get opt-plist :title)
+ (title (or (and subtree-p (org-export-get-title-from-subtree))
+ (plist-get opt-plist :title)
(and (not
(plist-get opt-plist :skip-before-1st-heading))
(org-export-grab-title-from-buffer))
@@ -18643,23 +23920,28 @@ underlined headlines. The default is 3."
(buffer-substring
(if (org-region-active-p) (region-beginning) (point-min))
(if (org-region-active-p) (region-end) (point-max))))
- (lines (org-skip-comments
- (org-split-string
- (org-cleaned-string-for-export
- region
- :skip-before-1st-heading
- (plist-get opt-plist :skip-before-1st-heading)
- :add-text (plist-get opt-plist :text))
- "[\r\n]")))
+ (lines (org-split-string
+ (org-cleaned-string-for-export
+ region
+ :for-ascii t
+ :skip-before-1st-heading
+ (plist-get opt-plist :skip-before-1st-heading)
+ :drawers (plist-get opt-plist :drawers)
+ :verbatim-multiline t
+ :archived-trees
+ (plist-get opt-plist :archived-trees)
+ :add-text (plist-get opt-plist :text))
+ "\n"))
thetoc have-headings first-heading-pos
table-open table-buffer)
- (let (buffer-read-only)
+ (let ((inhibit-read-only t))
(org-unmodified
(remove-text-properties (point-min) (point-max)
'(:org-license-to-kill t))))
- (setq org-last-level 1)
+ (setq org-min-level (org-get-min-level lines))
+ (setq org-last-level org-min-level)
(org-init-section-numbers)
(find-file-noselect filename)
@@ -18671,10 +23953,10 @@ underlined headlines. The default is 3."
(fundamental-mode)
;; create local variables for all options, to make sure all called
;; functions get the correct information
- (mapcar (lambda (x)
- (set (make-local-variable (cdr x))
- (plist-get opt-plist (car x))))
- org-export-plist-vars)
+ (mapc (lambda (x)
+ (set (make-local-variable (cdr x))
+ (plist-get opt-plist (car x))))
+ org-export-plist-vars)
(org-set-local 'org-odd-levels-only odd)
(setq umax (if arg (prefix-numeric-value arg)
org-export-headline-levels))
@@ -18685,12 +23967,20 @@ underlined headlines. The default is 3."
;; File header
(if title (org-insert-centered title ?=))
(insert "\n")
- (if (or author email)
+ (if (and (or author email)
+ org-export-author-info)
(insert (concat (nth 1 lang-words) ": " (or author "")
(if email (concat " <" email ">") "")
"\n")))
- (if (and date time)
- (insert (concat (nth 2 lang-words) ": " date " " time "\n")))
+
+ (cond
+ ((and date (string-match "%" date))
+ (setq date (format-time-string date (current-time))))
+ (date)
+ (t (setq date (format-time-string "%Y/%m/%d %X" (current-time)))))
+
+ (if (and date org-export-time-stamp-file)
+ (insert (concat (nth 2 lang-words) ": " date"\n")))
(insert "\n\n")
@@ -18698,46 +23988,55 @@ underlined headlines. The default is 3."
(progn
(push (concat (nth 3 lang-words) "\n") thetoc)
(push (concat (make-string (length (nth 3 lang-words)) ?=) "\n") thetoc)
- (mapcar '(lambda (line)
- (if (string-match org-todo-line-regexp
- line)
- ;; This is a headline
- (progn
- (setq have-headings t)
- (setq level (- (match-end 1) (match-beginning 1))
- level (org-tr-level level)
- txt (match-string 3 line)
- todo
- (or (and org-export-mark-todo-in-toc
- (match-beginning 2)
- (not (member (match-string 2 line)
- org-done-keywords)))
+ (mapc '(lambda (line)
+ (if (string-match org-todo-line-regexp
+ line)
+ ;; This is a headline
+ (progn
+ (setq have-headings t)
+ (setq level (- (match-end 1) (match-beginning 1))
+ level (org-tr-level level)
+ txt (match-string 3 line)
+ todo
+ (or (and org-export-mark-todo-in-toc
+ (match-beginning 2)
+ (not (member (match-string 2 line)
+ org-done-keywords)))
; TODO, not DONE
- (and org-export-mark-todo-in-toc
- (= level umax-toc)
- (org-search-todo-below
- line lines level))))
- (setq txt (org-html-expand-for-ascii txt))
-
- (if (and (memq org-export-with-tags '(not-in-toc nil))
- (string-match "[ \t]+:[a-zA-Z0-9_@:]+:[ \t]*$" txt))
- (setq txt (replace-match "" t t txt)))
- (if (string-match quote-re0 txt)
- (setq txt (replace-match "" t t txt)))
-
- (if org-export-with-section-numbers
- (setq txt (concat (org-section-number level)
- " " txt)))
- (if (<= level umax-toc)
- (progn
- (push
- (concat
- (make-string (* (1- level) 4) ?\ )
- (format (if todo "%s (*)\n" "%s\n") txt))
- thetoc)
- (setq org-last-level level))
- ))))
- lines)
+ (and org-export-mark-todo-in-toc
+ (= level umax-toc)
+ (org-search-todo-below
+ line lines level))))
+ (setq txt (org-html-expand-for-ascii txt))
+
+ (while (string-match org-bracket-link-regexp txt)
+ (setq txt
+ (replace-match
+ (match-string (if (match-end 2) 3 1) txt)
+ t t txt)))
+
+ (if (and (memq org-export-with-tags '(not-in-toc nil))
+ (string-match
+ (org-re "[ \t]+:[[:alnum:]_@:]+:[ \t]*$")
+ txt))
+ (setq txt (replace-match "" t t txt)))
+ (if (string-match quote-re0 txt)
+ (setq txt (replace-match "" t t txt)))
+
+ (if org-export-with-section-numbers
+ (setq txt (concat (org-section-number level)
+ " " txt)))
+ (if (<= level umax-toc)
+ (progn
+ (push
+ (concat
+ (make-string
+ (* (max 0 (- level org-min-level)) 4) ?\ )
+ (format (if todo "%s (*)\n" "%s\n") txt))
+ thetoc)
+ (setq org-last-level level))
+ ))))
+ lines)
(setq thetoc (if have-headings (nreverse thetoc) nil))))
(org-init-section-numbers)
@@ -18755,7 +24054,7 @@ underlined headlines. The default is 3."
(when custom-times
(setq line (org-translate-time line)))
(cond
- ((string-match "^\\(\\*+\\)[ \t]*\\(.*\\)" line)
+ ((string-match "^\\(\\*+\\)[ \t]+\\(.*\\)" line)
;; a Headline
(setq first-heading-pos (or first-heading-pos (point)))
(setq level (org-tr-level (- (match-end 1) (match-beginning 1)))
@@ -18780,7 +24079,12 @@ underlined headlines. The default is 3."
(org-format-table-ascii table-buffer)
"\n") "\n")))
(t
- (insert (org-fix-indentation line org-ascii-current-indentation) "\n"))))
+ (setq line (org-fix-indentation line org-ascii-current-indentation))
+ (if (and org-export-with-fixed-width
+ (string-match "^\\([ \t]*\\)\\(:\\)" line))
+ (setq line (replace-match "\\1" nil nil line)))
+ (insert line "\n"))))
+
(normal-mode)
;; insert the table of contents
@@ -18795,6 +24099,15 @@ underlined headlines. The default is 3."
(or (looking-at "[ \t]*\n[ \t]*\n")
(insert "\n\n")))
+ ;; Convert whitespace place holders
+ (goto-char (point-min))
+ (let (beg end)
+ (while (setq beg (next-single-property-change (point) 'org-whitespace))
+ (setq end (next-single-property-change beg 'org-whitespace))
+ (goto-char beg)
+ (delete-region beg end)
+ (insert (make-string (- end beg) ?\ ))))
+
(save-buffer)
;; remove display and invisible chars
(let (beg end)
@@ -18811,6 +24124,16 @@ underlined headlines. The default is 3."
(goto-char beg)))
(goto-char (point-min))))
+(defun org-export-ascii-clean-string ()
+ "Do extra work for ASCII export"
+ (goto-char (point-min))
+ (while (re-search-forward org-verbatim-re nil t)
+ (goto-char (match-end 2))
+ (backward-delete-char 1) (insert "'")
+ (goto-char (match-beginning 2))
+ (delete-char 1) (insert "`")
+ (goto-char (match-end 2))))
+
(defun org-search-todo-below (line lines level)
"Search the subtree below LINE for any TODO entries."
(let ((rest (cdr (memq line lines)))
@@ -18857,7 +24180,7 @@ underlined headlines. The default is 3."
;; find the indentation of the next non-empty line
(catch 'stop
(while lines
- (if (string-match "^\\*" (car lines)) (throw 'stop nil))
+ (if (string-match "^\\* " (car lines)) (throw 'stop nil))
(if (string-match "^\\([ \t]*\\)\\S-" (car lines))
(throw 'stop (setq ind (org-get-indentation (car lines)))))
(pop lines)))
@@ -18867,7 +24190,7 @@ underlined headlines. The default is 3."
(insert "\n"))
(setq char (nth (- umax level) (reverse org-export-ascii-underline)))
(unless org-export-with-tags
- (if (string-match "[ \t]+\\(:[a-zA-Z0-9_@:]+:\\)[ \t]*$" title)
+ (if (string-match (org-re "[ \t]+\\(:[[:alnum:]_@:]+:\\)[ \t]*$") title)
(setq title (replace-match "" t t title))))
(if org-export-with-section-numbers
(setq title (concat (org-section-number level) " " title)))
@@ -18903,6 +24226,12 @@ command."
(file buffer-file-name)
(buffer (get-buffer-create "*Org Export Visible*"))
s e)
+ ;; Need to hack the drawers here.
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward org-drawer-regexp nil t)
+ (goto-char (match-beginning 1))
+ (or (org-invisible-p) (org-flag-drawer nil))))
(with-current-buffer buffer (erase-buffer))
(save-excursion
(setq s (goto-char (point-min)))
@@ -18910,6 +24239,7 @@ command."
(goto-char (org-find-invisible))
(append-to-buffer buffer s (point))
(setq s (goto-char (org-find-visible))))
+ (org-cycle-hide-drawers 'all)
(goto-char (point-min))
(unless keepp
;; Copy all comment lines to the end, to make sure #+ settings are
@@ -18953,11 +24283,12 @@ Does include HTML export options as well as TODO and CATEGORY stuff."
#+EMAIL: %s
#+LANGUAGE: %s
#+TEXT: Some descriptive text to be emitted. Several lines OK.
-#+OPTIONS: H:%d num:%s toc:%s \\n:%s @:%s ::%s |:%s ^:%s *:%s TeX:%s LaTeX:%s skip:%s
+#+OPTIONS: H:%d num:%s toc:%s \\n:%s @:%s ::%s |:%s ^:%s -:%s f:%s *:%s TeX:%s LaTeX:%s skip:%s d:%s tags:%s
#+CATEGORY: %s
#+SEQ_TODO: %s
#+TYP_TODO: %s
#+PRIORITIES: %c %c %c
+#+DRAWERS: %s
#+STARTUP: %s %s %s %s %s
#+TAGS: %s
#+ARCHIVE: %s
@@ -18972,14 +24303,19 @@ Does include HTML export options as well as TODO and CATEGORY stuff."
org-export-with-fixed-width
org-export-with-tables
org-export-with-sub-superscripts
+ org-export-with-special-strings
+ org-export-with-footnotes
org-export-with-emphasize
org-export-with-TeX-macros
org-export-with-LaTeX-fragments
org-export-skip-text-before-1st-heading
+ org-export-with-drawers
+ org-export-with-tags
(file-name-nondirectory buffer-file-name)
"TODO FEEDBACK VERIFY DONE"
"Me Jason Marie DONE"
org-highest-priority org-lowest-priority org-default-priority
+ (mapconcat 'identity org-drawers " ")
(cdr (assoc org-startup-folded
'((nil . "showall") (t . "overview") (content . "content"))))
(if org-odd-levels-only "odd" "oddeven")
@@ -19024,6 +24360,7 @@ this line is also exported in fixed-width font."
(beg (if regionp (region-beginning) (point)))
(end (if regionp (region-end)))
(nlines (or arg (if (and beg end) (count-lines beg end) 1)))
+ (case-fold-search nil)
(re "[ \t]*\\(:\\)")
off)
(if regionp
@@ -19047,12 +24384,12 @@ this line is also exported in fixed-width font."
(save-excursion
(org-back-to-heading)
(if (looking-at (concat outline-regexp
- "\\( +\\<" org-quote-string "\\>\\)"))
+ "\\( *\\<" org-quote-string "\\>[ \t]*\\)"))
(replace-match "" t t nil 1)
(if (looking-at outline-regexp)
(progn
(goto-char (match-end 0))
- (insert " " org-quote-string))))))))
+ (insert org-quote-string " "))))))))
(defun org-export-as-html-and-open (arg)
"Export the outline as HTML and immediately open it with a browser.
@@ -19084,20 +24421,20 @@ This can be used in any buffer. For example, you could write an
itemized list in org-mode syntax in an HTML buffer and then use this
command to convert it."
(interactive "r")
- (let (reg html buf)
- (if (org-mode-p)
- (setq html (org-export-region-as-html
- beg end t 'string))
- (setq reg (buffer-substring beg end)
- buf (get-buffer-create "*Org tmp*"))
- (save-excursion
- (set-buffer buf)
- (erase-buffer)
- (insert reg)
- (org-mode)
- (setq html (org-export-region-as-html
- (point-min) (point-max) t 'string)))
- (kill-buffer buf))
+ (let (reg html buf pop-up-frames)
+ (save-window-excursion
+ (if (org-mode-p)
+ (setq html (org-export-region-as-html
+ beg end t 'string))
+ (setq reg (buffer-substring beg end)
+ buf (get-buffer-create "*Org tmp*"))
+ (with-current-buffer buf
+ (erase-buffer)
+ (insert reg)
+ (org-mode)
+ (setq html (org-export-region-as-html
+ (point-min) (point-max) t 'string)))
+ (kill-buffer buf)))
(delete-region beg end)
(insert html)))
@@ -19117,7 +24454,7 @@ When called interactively, the output buffer is selected, and shown
in a window. A non-interactive call will only retunr the buffer."
(interactive "r\nP")
(when (interactive-p)
- (setq buffer "*Org HTML EXPORT*"))
+ (setq buffer "*Org HTML Export*"))
(let ((transient-mark-mode t) (zmacs-regions t)
rtn)
(goto-char end)
@@ -19131,6 +24468,7 @@ in a window. A non-interactive call will only retunr the buffer."
(switch-to-buffer-other-window rtn)
rtn)))
+(defvar html-table-tag nil) ; dynamically scoped into this.
(defun org-export-as-html (arg &optional hidden ext-plist
to-buffer body-only)
"Export the outline as a pretty HTML file.
@@ -19171,6 +24509,12 @@ the body tags themselves."
valid thetoc have-headings first-heading-pos
(odd org-odd-levels-only)
(region-p (org-region-active-p))
+ (subtree-p
+ (when region-p
+ (save-excursion
+ (goto-char (region-beginning))
+ (and (org-at-heading-p)
+ (>= (org-end-of-subtree t t) (region-end))))))
;; The following two are dynamically scoped into other
;; routines below.
(org-current-export-dir (org-export-directory :html opt-plist))
@@ -19179,24 +24523,29 @@ the body tags themselves."
(umax nil)
(umax-toc nil)
(filename (if to-buffer nil
- (concat (file-name-as-directory
- (org-export-directory :html opt-plist))
- (file-name-sans-extension
- (file-name-nondirectory buffer-file-name))
- ".html")))
+ (expand-file-name
+ (concat
+ (file-name-sans-extension
+ (or (and subtree-p
+ (org-entry-get (region-beginning)
+ "EXPORT_FILE_NAME" t))
+ (file-name-nondirectory buffer-file-name)))
+ "." org-export-html-extension)
+ (file-name-as-directory
+ (org-export-directory :html opt-plist)))))
(current-dir (if buffer-file-name
(file-name-directory buffer-file-name)
default-directory))
(buffer (if to-buffer
(cond
((eq to-buffer 'string) (get-buffer-create "*Org HTML Export*"))
- (t (get-buffer-create to-buffer)))
+ (t (get-buffer-create to-buffer)))
(find-file-noselect filename)))
(org-levels-open (make-vector org-level-max nil))
- (date (format-time-string "%Y/%m/%d" (current-time)))
- (time (format-time-string "%X" (org-current-time)))
+ (date (plist-get opt-plist :date))
(author (plist-get opt-plist :author))
- (title (or (plist-get opt-plist :title)
+ (title (or (and subtree-p (org-export-get-title-from-subtree))
+ (plist-get opt-plist :title)
(and (not
(plist-get opt-plist :skip-before-1st-heading))
(org-export-grab-title-from-buffer))
@@ -19204,8 +24553,9 @@ the body tags themselves."
(file-name-sans-extension
(file-name-nondirectory buffer-file-name)))
"UNTITLED"))
+ (html-table-tag (plist-get opt-plist :html-table-tag))
(quote-re0 (concat "^[ \t]*" org-quote-string "\\>"))
- (quote-re (concat "^\\(\\*+\\)\\([ \t]*" org-quote-string "\\>\\)"))
+ (quote-re (concat "^\\(\\*+\\)\\([ \t]+" org-quote-string "\\>\\)"))
(inquote nil)
(infixed nil)
(in-local-list nil)
@@ -19233,34 +24583,44 @@ the body tags themselves."
(if region-p (region-beginning) (point-min))
(if region-p (region-end) (point-max))))
(lines
- (org-skip-comments (org-split-string
- (org-cleaned-string-for-export
- region
- :emph-multiline t
- :for-html t
- :skip-before-1st-heading
- (plist-get opt-plist :skip-before-1st-heading)
- :add-text
- (plist-get opt-plist :text)
- :LaTeX-fragments
- (plist-get opt-plist :LaTeX-fragments))
- "[\r\n]")))
+ (org-split-string
+ (org-cleaned-string-for-export
+ region
+ :emph-multiline t
+ :for-html t
+ :skip-before-1st-heading
+ (plist-get opt-plist :skip-before-1st-heading)
+ :drawers (plist-get opt-plist :drawers)
+ :archived-trees
+ (plist-get opt-plist :archived-trees)
+ :add-text
+ (plist-get opt-plist :text)
+ :LaTeX-fragments
+ (plist-get opt-plist :LaTeX-fragments))
+ "[\r\n]"))
table-open type
table-buffer table-orig-buffer
ind start-is-num starter didclose
rpl path desc descp desc1 desc2 link
)
- (let (buffer-read-only)
+ (let ((inhibit-read-only t))
(org-unmodified
(remove-text-properties (point-min) (point-max)
'(:org-license-to-kill t))))
(message "Exporting...")
- (setq org-last-level 1)
+ (setq org-min-level (org-get-min-level lines))
+ (setq org-last-level org-min-level)
(org-init-section-numbers)
+ (cond
+ ((and date (string-match "%" date))
+ (setq date (format-time-string date (current-time))))
+ (date)
+ (t (setq date (format-time-string "%Y/%m/%d %X" (current-time)))))
+
;; Get the language-dependent settings
(setq lang-words (or (assoc language org-export-language-setup)
(assoc "en" org-export-language-setup)))
@@ -19269,14 +24629,18 @@ the body tags themselves."
(set-buffer buffer)
(erase-buffer)
(fundamental-mode)
+
+ (and (fboundp 'set-buffer-file-coding-system)
+ (set-buffer-file-coding-system coding-system-for-write))
+
(let ((case-fold-search nil)
(org-odd-levels-only odd))
;; create local variables for all options, to make sure all called
;; functions get the correct information
- (mapcar (lambda (x)
- (set (make-local-variable (cdr x))
- (plist-get opt-plist (car x))))
- org-export-plist-vars)
+ (mapc (lambda (x)
+ (set (make-local-variable (cdr x))
+ (plist-get opt-plist (car x))))
+ org-export-plist-vars)
(setq umax (if arg (prefix-numeric-value arg)
org-export-headline-levels))
(setq umax-toc (if (integerp org-export-with-toc)
@@ -19293,13 +24657,13 @@ lang=\"%s\" xml:lang=\"%s\">
<title>%s</title>
<meta http-equiv=\"Content-Type\" content=\"text/html;charset=%s\"/>
<meta name=\"generator\" content=\"Org-mode\"/>
-<meta name=\"generated\" content=\"%s %s\"/>
+<meta name=\"generated\" content=\"%s\"/>
<meta name=\"author\" content=\"%s\"/>
%s
</head><body>
"
language language (org-html-expand title)
- (or charset "iso-8859-1") date time author style))
+ (or charset "iso-8859-1") date author style))
(insert (or (plist-get opt-plist :preamble) ""))
@@ -19337,9 +24701,9 @@ lang=\"%s\" xml:lang=\"%s\">
(= level umax-toc)
(org-search-todo-below
line lines level))))
- (if (and (memq org-export-with-tags '(not-in-toc nil))
- (string-match "[ \t]+:[a-zA-Z0-9_@:]+:[ \t]*$" txt))
- (setq txt (replace-match "" t t txt)))
+ (if (string-match
+ (org-re "[ \t]+:\\([[:alnum:]_@:]+\\):[ \t]*$") txt)
+ (setq txt (replace-match "&nbsp;&nbsp;&nbsp;<span class=\"tag\"> \\1</span>" t nil txt)))
(if (string-match quote-re0 txt)
(setq txt (replace-match "" t t txt)))
(if org-export-with-section-numbers
@@ -19383,7 +24747,7 @@ lang=\"%s\" xml:lang=\"%s\">
)))
line)
lines))
- (while (> org-last-level 0)
+ (while (> org-last-level (1- org-min-level))
(setq org-last-level (1- org-last-level))
(push "</li>\n</ul>\n" thetoc))
(setq thetoc (if have-headings (nreverse thetoc) nil))))
@@ -19395,7 +24759,7 @@ lang=\"%s\" xml:lang=\"%s\">
(catch 'nextline
;; end of quote section?
- (when (and inquote (string-match "^\\*+" line))
+ (when (and inquote (string-match "^\\*+ " line))
(insert "</pre>\n")
(setq inquote nil))
;; inside a quote section?
@@ -19426,7 +24790,8 @@ lang=\"%s\" xml:lang=\"%s\">
(replace-match "\\2\n"))
(insert line "\n")
(while (and lines
- (get-text-property 0 'org-protected (car lines)))
+ (or (= (length (car lines)) 0)
+ (get-text-property 0 'org-protected (car lines))))
(insert (pop lines) "\n"))
(and par (insert "<p>\n")))
(throw 'nextline nil))
@@ -19462,7 +24827,8 @@ lang=\"%s\" xml:lang=\"%s\">
;; replace "&" by "&amp;", "<" and ">" by "&lt;" and "&gt;"
;; handle @<..> HTML tags (replace "@&gt;..&lt;" by "<..>")
;; Also handle sub_superscripts and checkboxes
- (setq line (org-html-expand line))
+ (or (string-match org-table-hline-regexp line)
+ (setq line (org-html-expand line)))
;; Format the links
(setq start 0)
@@ -19489,7 +24855,7 @@ lang=\"%s\" xml:lang=\"%s\">
(org-solidify-link-text
(save-match-data (org-link-unescape path)) target-alist)
"\">" desc "</a>")))
- ((member type '("http" "https")) ; FIXME: need to test this.
+ ((member type '("http" "https"))
;; standard URL, just check if we need to inline an image
(if (and (or (eq t org-export-html-inline-images)
(and org-export-html-inline-images (not descp)))
@@ -19520,7 +24886,7 @@ lang=\"%s\" xml:lang=\"%s\">
(string-match "\\.org$" thefile))
(setq thefile (concat (substring thefile 0
(match-beginning 0))
- ".html"))
+ "." org-export-html-extension))
(if (and search
;; make sure this is can be used as target search
(not (string-match "^[0-9]*$" search))
@@ -19550,27 +24916,32 @@ lang=\"%s\" xml:lang=\"%s\">
;; TODO items
(if (and (string-match org-todo-line-regexp line)
(match-beginning 2))
- (if (member (match-string 2 line) org-done-keywords)
- (setq line (replace-match
- "<span class=\"done\">\\2</span>"
- t nil line 2))
- (setq line
- (concat (substring line 0 (match-beginning 2))
- "<span class=\"todo\">" (match-string 2 line)
- "</span>" (substring line (match-end 2))))))
+
+ (setq line
+ (concat (substring line 0 (match-beginning 2))
+ "<span class=\""
+ (if (member (match-string 2 line)
+ org-done-keywords)
+ "done" "todo")
+ "\">" (match-string 2 line)
+ "</span>" (substring line (match-end 2)))))
;; Does this contain a reference to a footnote?
- (while (string-match "\\([^* \t].*?\\)\\[\\([0-9]+\\)\\]" line)
- (let ((n (match-string 2 line)))
- (setq line
- (replace-match
- (format
- "%s<sup><a class=\"footref\" name=\"fnr.%s\" href=\"#fn.%s\">%s</a></sup>"
- (match-string 1 line) n n n)
- t t line))))
+ (when org-export-with-footnotes
+ (setq start 0)
+ (while (string-match "\\([^* \t].*?\\)\\[\\([0-9]+\\)\\]" line start)
+ (if (get-text-property (match-beginning 2) 'org-protected line)
+ (setq start (match-end 2))
+ (let ((n (match-string 2 line)))
+ (setq line
+ (replace-match
+ (format
+ "%s<sup><a class=\"footref\" name=\"fnr.%s\" href=\"#fn.%s\">%s</a></sup>"
+ (match-string 1 line) n n n)
+ t t line))))))
(cond
- ((string-match "^\\(\\*+\\)[ \t]*\\(.*\\)" line)
+ ((string-match "^\\(\\*+\\)[ \t]+\\(.*\\)" line)
;; This is a headline
(setq level (org-tr-level (- (match-end 1) (match-beginning 1)))
txt (match-string 2 line))
@@ -19671,11 +25042,12 @@ lang=\"%s\" xml:lang=\"%s\">
(if (string-match "^ [-+*]-\\|^[ \t]*$" line) (org-open-par))
;; Is this the start of a footnote?
- (when (string-match "^[ \t]*\\[\\([0-9]+\\)\\]" line)
- (org-close-par-maybe)
- (let ((n (match-string 1 line)))
- (setq line (replace-match
- (format "<p class=\"footnote\"><sup><a class=\"footnum\" name=\"fn.%s\" href=\"#fnr.%s\">%s</a></sup>" n n n) t t line))))
+ (when org-export-with-footnotes
+ (when (string-match "^[ \t]*\\[\\([0-9]+\\)\\]" line)
+ (org-close-par-maybe)
+ (let ((n (match-string 1 line)))
+ (setq line (replace-match
+ (format "<p class=\"footnote\"><sup><a class=\"footnum\" name=\"fn.%s\" href=\"#fnr.%s\">%s</a></sup>" n n n) t t line)))))
;; Check if the line break needs to be conserved
(cond
@@ -19702,17 +25074,24 @@ lang=\"%s\" xml:lang=\"%s\">
(unless body-only
(when (plist-get opt-plist :auto-postamble)
- (when author
+ (insert "<div id=\"postamble\">")
+ (when (and org-export-author-info author)
(insert "<p class=\"author\"> "
(nth 1 lang-words) ": " author "\n")
(when email
- (insert "<a href=\"mailto:" email "\">&lt;"
- email "&gt;</a>\n"))
+ (if (listp (split-string email ",+ *"))
+ (mapc (lambda(e)
+ (insert "<a href=\"mailto:" e "\">&lt;"
+ e "&gt;</a>\n"))
+ (split-string email ",+ *"))
+ (insert "<a href=\"mailto:" email "\">&lt;"
+ email "&gt;</a>\n")))
(insert "</p>\n"))
- (when (and date time)
+ (when (and date org-export-time-stamp-file)
(insert "<p class=\"date\"> "
(nth 2 lang-words) ": "
- date " " time "</p>\n")))
+ date "</p>\n"))
+ (insert "</div>"))
(if org-export-html-with-timestamp
(insert org-export-html-html-helper-timestamp))
@@ -19736,7 +25115,9 @@ lang=\"%s\" xml:lang=\"%s\">
(when (looking-at "\\s-*</p>")
(goto-char (match-end 0))
(insert "\n")))
- (mapc 'insert thetoc))
+ (insert "<div id=\"table-of-contents\">\n")
+ (mapc 'insert thetoc)
+ (insert "</div>\n"))
;; remove empty paragraphs and lists
(goto-char (point-min))
(while (re-search-forward "<p>[ \r\n\t]*</p>" nil t)
@@ -19744,6 +25125,17 @@ lang=\"%s\" xml:lang=\"%s\">
(goto-char (point-min))
(while (re-search-forward "<li>[ \r\n\t]*</li>\n?" nil t)
(replace-match ""))
+ ;; Convert whitespace place holders
+ (goto-char (point-min))
+ (let (beg end n)
+ (while (setq beg (next-single-property-change (point) 'org-whitespace))
+ (setq n (get-text-property beg 'org-whitespace)
+ end (next-single-property-change beg 'org-whitespace))
+ (goto-char beg)
+ (delete-region beg end)
+ (insert (format "<span style=\"visibility:hidden;\">%s</span>"
+ (make-string n ?x)))))
+
(or to-buffer (save-buffer))
(goto-char (point-min))
(message "Exporting... done")
@@ -19752,7 +25144,7 @@ lang=\"%s\" xml:lang=\"%s\">
(kill-buffer (current-buffer)))
(current-buffer)))))
-(defvar org-table-colgroup-info nil) ;; FIXME: mode to a better place
+(defvar org-table-colgroup-info nil)
(defun org-format-table-ascii (lines)
"Format a table for ascii export."
(if (stringp lines)
@@ -19786,15 +25178,16 @@ lang=\"%s\" xml:lang=\"%s\">
(nreverse rtn))))
(defun org-colgroup-info-to-vline-list (info)
- (let (vl new last rtn line)
+ (let (vl new last)
(while info
(setq last new new (pop info))
(if (or (memq last '(:end :startend))
(memq new '(:start :startend)))
(push t vl)
(push nil vl)))
- (setq vl (cons nil (nreverse vl)))))
-
+ (setq vl (nreverse vl))
+ (and vl (setcar vl nil))
+ vl))
(defun org-format-table-html (lines olines)
"Find out which HTML converter to use and return the HTML code."
@@ -19876,25 +25269,25 @@ lang=\"%s\" xml:lang=\"%s\">
(unless splice (push "</table>\n" html))
(setq html (nreverse html))
(unless splice
- ;; Put in COL tags with the alignment (unfortuntely often ignored...)
+ ;; Put in col tags with the alignment (unfortuntely often ignored...)
(push (mapconcat
(lambda (x)
(setq gr (pop org-table-colgroup-info))
- (format "%s<COL align=\"%s\"></COL>%s"
- (if (memq gr '(:start :startend))
+ (format "%s<col align=\"%s\"></col>%s"
+ (if (memq gr '(:start :startend))
(prog1
(if colgropen "</colgroup>\n<colgroup>" "<colgroup>")
(setq colgropen t))
"")
(if (> (/ (float x) nlines) org-table-number-fraction)
"right" "left")
- (if (memq gr '(:end :startend))
+ (if (memq gr '(:end :startend))
(progn (setq colgropen nil) "</colgroup>")
"")))
fnum "")
html)
(if colgropen (setq html (cons (car html) (cons "</colgroup>" (cdr html)))))
- (push org-export-html-table-tag html))
+ (push html-table-tag html))
(concat (mapconcat 'identity html "\n") "\n")))
(defun org-table-clean-before-export (lines)
@@ -19942,8 +25335,7 @@ If yes remove the column and the special lines."
((or (string-match "^\\([ \t]*\\)|-+\\+" x)
(string-match "^\\([ \t]*\\)|[^|]*|" x))
;; remove the first column
- (replace-match "\\1|" t nil x))
- (t (error "This should not happen"))))
+ (replace-match "\\1|" t nil x))))
lines))))
(defun org-format-table-table-html (lines)
@@ -19954,7 +25346,7 @@ But it has the disadvantage, that no cell- or row-spanning is allowed."
(let (line field-buffer
(head org-export-highlight-first-table-line)
fields html empty)
- (setq html (concat org-export-html-table-tag "\n"))
+ (setq html (concat html-table-tag "\n"))
(while (setq line (pop lines))
(setq empty "&nbsp;")
(catch 'next-line
@@ -20052,8 +25444,9 @@ But it has the disadvantage, that Org-mode's HTML conversions cannot be used."
(defun org-export-cleanup-toc-line (s)
"Remove tags and time staps from lines going into the toc."
- (if (string-match " +:[a-zA-Z0-9_@:]+: *$" s)
- (setq s (replace-match "" t t s)))
+ (when (memq org-export-with-tags '(not-in-toc nil))
+ (if (string-match (org-re " +:[[:alnum:]_@:]+: *$") s)
+ (setq s (replace-match "" t t s))))
(when org-export-remove-timestamps-from-toc
(while (string-match org-maybe-keyword-time-regexp s)
(setq s (replace-match "" t t s))))
@@ -20065,8 +25458,10 @@ But it has the disadvantage, that Org-mode's HTML conversions cannot be used."
(defun org-html-expand (string)
"Prepare STRING for HTML export. Applies all active conversions.
If there are links in the string, don't modify these."
- (let* (m s l res)
- (while (setq m (string-match org-bracket-link-regexp string))
+ (let* ((re (concat org-bracket-link-regexp "\\|"
+ (org-re "[ \t]+\\(:[[:alnum:]_@:]+:\\)[ \t]*$")))
+ m s l res)
+ (while (setq m (string-match re string))
(setq s (substring string 0 m)
l (match-string 0 string)
string (substring string (match-end 0)))
@@ -20079,21 +25474,26 @@ If there are links in the string, don't modify these."
"Apply all active conversions to translate special ASCII to HTML."
(setq s (org-html-protect s))
(if org-export-html-expand
- (while (string-match "@&lt;\\([^&]*\\)&gt;" s)
- (setq s (replace-match "<\\1>" t nil s))))
+ (let ((start 0))
+ (while (string-match "@&lt;\\([^&]*\\)&gt;" s)
+ (setq s (replace-match "<\\1>" t nil s)))))
(if org-export-with-emphasize
(setq s (org-export-html-convert-emphasize s)))
+ (if org-export-with-special-strings
+ (setq s (org-export-html-convert-special-strings s)))
(if org-export-with-sub-superscripts
(setq s (org-export-html-convert-sub-super s)))
(if org-export-with-TeX-macros
(let ((start 0) wd ass)
(while (setq start (string-match "\\\\\\([a-zA-Z]+\\)" s start))
- (setq wd (match-string 1 s))
- (if (setq ass (assoc wd org-html-entities))
- (setq s (replace-match (or (cdr ass)
- (concat "&" (car ass) ";"))
- t t s))
- (setq start (+ start (length wd)))))))
+ (if (get-text-property (match-beginning 0) 'org-protected s)
+ (setq start (match-end 0))
+ (setq wd (match-string 1 s))
+ (if (setq ass (assoc wd org-html-entities))
+ (setq s (replace-match (or (cdr ass)
+ (concat "&" (car ass) ";"))
+ t t s))
+ (setq start (+ start (length wd))))))))
s)
(defun org-create-multibrace-regexp (left right n)
@@ -20124,16 +25524,41 @@ stacked delimiters is N. Escaping delimiters is not possible."
"\\(\\(?:\\*\\|[-+]?[^-+*!@#$%^_ \t\r\n,:\"?<>~;./{}=()]+\\)\\)\\)")
"The regular expression matching a sub- or superscript.")
-;(let ((s "a\\_b"))
-; (and (string-match org-match-substring-regexp s)
-; (conca t (match-string 1 s) ":::" (match-string 2 s))))
+(defvar org-match-substring-with-braces-regexp
+ (concat
+ "\\([^\\]\\)\\([_^]\\)\\("
+ "\\(" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)"
+ "\\)")
+ "The regular expression matching a sub- or superscript, forcing braces.")
+
+(defconst org-export-html-special-string-regexps
+ '(("\\\\-" . "&shy;")
+ ("---\\([^-]\\)" . "&mdash;\\1")
+ ("--\\([^-]\\)" . "&ndash;\\1")
+ ("\\.\\.\\." . "&hellip;"))
+ "Regular expressions for special string conversion.")
+
+(defun org-export-html-convert-special-strings (string)
+ "Convert special characters in STRING to HTML."
+ (let ((all org-export-html-special-string-regexps)
+ e a re rpl start)
+ (while (setq a (pop all))
+ (setq re (car a) rpl (cdr a) start 0)
+ (while (string-match re string start)
+ (if (get-text-property (match-beginning 0) 'org-protected string)
+ (setq start (match-end 0))
+ (setq string (replace-match rpl t nil string)))))
+ string))
(defun org-export-html-convert-sub-super (string)
"Convert sub- and superscripts in STRING to HTML."
(let (key c (s 0) (requireb (eq org-export-with-sub-superscripts '{})))
(while (string-match org-match-substring-regexp string s)
- (if (and requireb (match-end 8))
- (setq s (match-end 2))
+ (cond
+ ((and requireb (match-end 8)) (setq s (match-end 2)))
+ ((get-text-property (match-beginning 2) 'org-protected string)
+ (setq s (match-end 2)))
+ (t
(setq s (match-end 1)
key (if (string= (match-string 2 string) "_") "sub" "sup")
c (or (match-string 8 string)
@@ -20142,22 +25567,29 @@ stacked delimiters is N. Escaping delimiters is not possible."
string (replace-match
(concat (match-string 1 string)
"<" key ">" c "</" key ">")
- t t string))))
+ t t string)))))
(while (string-match "\\\\\\([_^]\\)" string)
(setq string (replace-match (match-string 1 string) t t string)))
string))
(defun org-export-html-convert-emphasize (string)
"Apply emphasis."
- (let ((s 0))
+ (let ((s 0) rpl)
(while (string-match org-emph-re string s)
(if (not (equal
(substring string (match-beginning 3) (1+ (match-beginning 3)))
(substring string (match-beginning 4) (1+ (match-beginning 4)))))
- (setq string (replace-match
- (concat "\\1" (nth 2 (assoc (match-string 3 string) org-emphasis-alist))
- "\\4" (nth 3 (assoc (match-string 3 string) org-emphasis-alist))
- "\\5") t nil string))
+ (setq s (match-beginning 0)
+ rpl
+ (concat
+ (match-string 1 string)
+ (nth 2 (assoc (match-string 3 string) org-emphasis-alist))
+ (match-string 4 string)
+ (nth 3 (assoc (match-string 3 string)
+ org-emphasis-alist))
+ (match-string 5 string))
+ string (replace-match rpl t t string)
+ s (+ s (- (length rpl) 2)))
(setq s (1+ s))))
string))
@@ -20182,17 +25614,17 @@ stacked delimiters is N. Escaping delimiters is not possible."
"Insert a new level in HTML export.
When TITLE is nil, just close all open levels."
(org-close-par-maybe)
- (let ((l (1+ (max level umax))))
- (while (<= l org-level-max)
+ (let ((l org-level-max))
+ (while (>= l level)
(if (aref org-levels-open (1- l))
(progn
- (org-html-level-close l)
+ (org-html-level-close l umax)
(aset org-levels-open (1- l) nil)))
- (setq l (1+ l)))
+ (setq l (1- l)))
(when title
;; If title is nil, this means this function is called to close
;; all levels, so the rest is done only if title is given
- (when (string-match "\\(:[a-zA-Z0-9_@:]+:\\)[ \t]*$" title)
+ (when (string-match (org-re "\\(:[[:alnum:]_@:]+:\\)[ \t]*$") title)
(setq title (replace-match
(if org-export-with-tags
(save-match-data
@@ -20213,19 +25645,22 @@ When TITLE is nil, just close all open levels."
(aset org-levels-open (1- level) t)
(org-close-par-maybe)
(insert "<ul>\n<li>" title "<br/>\n")))
+ (aset org-levels-open (1- level) t)
(if (and org-export-with-section-numbers (not body-only))
(setq title (concat (org-section-number level) " " title)))
(setq level (+ level org-export-html-toplevel-hlevel -1))
(if with-toc
- (insert (format "\n<h%d id=\"sec-%d\">%s</h%d>\n"
- level head-count title level))
- (insert (format "\n<h%d>%s</h%d>\n" level title level)))
+ (insert (format "\n<div class=\"outline-%d\">\n<h%d id=\"sec-%d\">%s</h%d>\n"
+ level level head-count title level))
+ (insert (format "\n<div class=\"outline-%d\">\n<h%d>%s</h%d>\n" level level title level)))
(org-open-par)))))
-(defun org-html-level-close (&rest args)
+(defun org-html-level-close (level max-outline-level)
"Terminate one level in HTML export."
- (org-close-li)
- (insert "</ul>\n"))
+ (if (<= level max-outline-level)
+ (insert "</div>\n")
+ (org-close-li)
+ (insert "</ul>\n")))
;;; iCalendar export
@@ -20310,13 +25745,13 @@ the iCalendar file.")
When COMBINE is non nil, add the category to each line."
(let ((re1 (concat org-ts-regexp "\\|<%%([^>\n]+>"))
(re2 (concat "--?-?\\(" org-ts-regexp "\\)"))
- (org-category-table (org-get-category-table))
(dts (org-ical-ts-to-string
(format-time-string (cdr org-time-stamp-formats) (current-time))
"DTSTART"))
hd ts ts2 state status (inc t) pos b sexp rrule
- scheduledp deadlinep tmp pri category
+ scheduledp deadlinep tmp pri category entry location summary desc
(sexp-buffer (get-buffer-create "*ical-tmp*")))
+ (org-refresh-category-properties)
(save-excursion
(goto-char (point-min))
(while (re-search-forward re1 nil t)
@@ -20326,15 +25761,27 @@ When COMBINE is non nil, add the category to each line."
ts (match-string 0)
inc t
hd (org-get-heading)
+ summary (org-icalendar-cleanup-string
+ (org-entry-get nil "SUMMARY"))
+ desc (org-icalendar-cleanup-string
+ (or (org-entry-get nil "DESCRIPTION")
+ (and org-icalendar-include-body (org-get-entry)))
+ t org-icalendar-include-body)
+ location (org-icalendar-cleanup-string
+ (org-entry-get nil "LOCATION"))
category (org-get-category))
(if (looking-at re2)
(progn
(goto-char (match-end 0))
(setq ts2 (match-string 1) inc nil))
- (setq ts2 ts
- tmp (buffer-substring (max (point-min)
+ (setq tmp (buffer-substring (max (point-min)
(- pos org-ds-keyword-length))
pos)
+ ts2 (if (string-match "[0-9]\\{1,2\\}:[0-9][0-9]-\\([0-9]\\{1,2\\}:[0-9][0-9]\\)" ts)
+ (progn
+ (setq inc nil)
+ (replace-match "\\1" t nil ts))
+ ts)
deadlinep (string-match org-deadline-regexp tmp)
scheduledp (string-match org-scheduled-regexp tmp)
;; donep (org-entry-is-done-p)
@@ -20351,24 +25798,32 @@ When COMBINE is non nil, add the category to each line."
("m" . "MONTHLY")("y" . "YEARLY"))))
";INTERVAL=" (match-string 1 ts)))
(setq rrule ""))
- (if (string-match org-bracket-link-regexp hd)
- (setq hd (replace-match (if (match-end 3) (match-string 3 hd)
- (match-string 1 hd))
- t t hd)))
- (if deadlinep (setq hd (concat "DL: " hd)))
- (if scheduledp (setq hd (concat "S: " hd)))
+ (setq summary (or summary hd))
+ (if (string-match org-bracket-link-regexp summary)
+ (setq summary
+ (replace-match (if (match-end 3)
+ (match-string 3 summary)
+ (match-string 1 summary))
+ t t summary)))
+ (if deadlinep (setq summary (concat "DL: " summary)))
+ (if scheduledp (setq summary (concat "S: " summary)))
(if (string-match "\\`<%%" ts)
(with-current-buffer sexp-buffer
- (insert (substring ts 1 -1) " " hd "\n"))
+ (insert (substring ts 1 -1) " " summary "\n"))
(princ (format "BEGIN:VEVENT
%s
%s%s
-SUMMARY:%s
+SUMMARY:%s%s%s
CATEGORIES:%s
END:VEVENT\n"
(org-ical-ts-to-string ts "DTSTART")
(org-ical-ts-to-string ts2 "DTEND" inc)
- rrule hd category)))))
+ rrule summary
+ (if (and desc (string-match "\\S-" desc))
+ (concat "\nDESCRIPTION: " desc) "")
+ (if (and location (string-match "\\S-" location))
+ (concat "\nLOCATION: " location) "")
+ category)))))
(when (and org-icalendar-include-sexps
(condition-case nil (require 'icalendar) (error nil))
@@ -20400,7 +25855,15 @@ END:VEVENT\n"
(eq org-icalendar-include-todo 'all))
(not (member org-archive-tag (org-get-tags-at)))
)
- (setq hd (match-string 3))
+ (setq hd (match-string 3)
+ summary (org-icalendar-cleanup-string
+ (org-entry-get nil "SUMMARY"))
+ desc (org-icalendar-cleanup-string
+ (or (org-entry-get nil "DESCRIPTION")
+ (and org-icalendar-include-body (org-get-entry)))
+ t org-icalendar-include-body)
+ location (org-icalendar-cleanup-string
+ (org-entry-get nil "LOCATION")))
(if (string-match org-bracket-link-regexp hd)
(setq hd (replace-match (if (match-end 3) (match-string 3 hd)
(match-string 1 hd))
@@ -20415,13 +25878,52 @@ END:VEVENT\n"
(princ (format "BEGIN:VTODO
%s
-SUMMARY:%s
+SUMMARY:%s%s%s
CATEGORIES:%s
SEQUENCE:1
PRIORITY:%d
STATUS:%s
END:VTODO\n"
- dts hd category pri status)))))))))
+ dts
+ (or summary hd)
+ (if (and location (string-match "\\S-" location))
+ (concat "\nLOCATION: " location) "")
+ (if (and desc (string-match "\\S-" desc))
+ (concat "\nDESCRIPTION: " desc) "")
+ category pri status)))))))))
+
+(defun org-icalendar-cleanup-string (s &optional is-body maxlength)
+ "Take out stuff and quote what needs to be quoted.
+When IS-BODY is non-nil, assume that this is the body of an item, clean up
+whitespace, newlines, drawers, and timestamps, and cut it down to MAXLENGTH
+characters."
+ (if (not s)
+ nil
+ (when is-body
+ (let ((re (concat "\\(" org-drawer-regexp "\\)[^\000]*?:END:.*\n?"))
+ (re2 (concat "^[ \t]*" org-keyword-time-regexp ".*\n?")))
+ (while (string-match re s) (setq s (replace-match "" t t s)))
+ (while (string-match re2 s) (setq s (replace-match "" t t s)))))
+ (let ((start 0))
+ (while (string-match "\\([,;\\]\\)" s start)
+ (setq start (+ (match-beginning 0) 2)
+ s (replace-match "\\\\\\1" nil nil s))))
+ (when is-body
+ (while (string-match "[ \t]*\n[ \t]*" s)
+ (setq s (replace-match "\\n" t t s))))
+ (setq s (org-trim s))
+ (if is-body
+ (if maxlength
+ (if (and (numberp maxlength)
+ (> (length s) maxlength))
+ (setq s (substring s 0 maxlength)))))
+ s))
+
+(defun org-get-entry ()
+ "Clean-up description string."
+ (save-excursion
+ (org-back-to-heading t)
+ (buffer-substring (point-at-bol 2) (org-end-of-subtree t))))
(defun org-start-icalendar-file (name)
"Start an iCalendar file by inserting the header."
@@ -20453,7 +25955,11 @@ a time), or the day by one (if it does not contain a time)."
(let ((s (car t2)) (mi (nth 1 t2)) (h (nth 2 t2))
(d (nth 3 t2)) (m (nth 4 t2)) (y (nth 5 t2)))
(when inc
- (if have-time (setq h (+ 2 h)) (setq d (1+ d))))
+ (if have-time
+ (if org-agenda-default-appointment-duration
+ (setq mi (+ org-agenda-default-appointment-duration mi))
+ (setq h (+ 2 h)))
+ (setq d (1+ d))))
(setq time (encode-time s mi h d m y)))
(setq fmt (if have-time ":%Y%m%dT%H%M%S" ";VALUE=DATE:%Y%m%d"))
(concat keyword (format-time-string fmt time))))
@@ -20473,8 +25979,8 @@ The XOXO buffer is named *xoxo-<source buffer name>*"
;; Output everything as XOXO
(with-current-buffer (get-buffer buffer)
- (goto-char (point-min)) ;; CD: beginning-of-buffer is not allowed.
- (let* ((opt-plist (org-combine-plists (org-default-export-plist)
+ (let* ((pos (point))
+ (opt-plist (org-combine-plists (org-default-export-plist)
(org-infile-export-plist)))
(filename (concat (file-name-as-directory
(org-export-directory :xoxo opt-plist))
@@ -20484,11 +25990,12 @@ The XOXO buffer is named *xoxo-<source buffer name>*"
(out (find-file-noselect filename))
(last-level 1)
(hanging-li nil))
+ (goto-char (point-min)) ;; CD: beginning-of-buffer is not allowed.
;; Check the output buffer is empty.
(with-current-buffer out (erase-buffer))
;; Kick off the output
(org-export-as-xoxo-insert-into out "<ol class='xoxo'>\n")
- (while (re-search-forward "^\\(\\*+\\) \\(.+\\)" (point-max) 't)
+ (while (re-search-forward "^\\(\\*+\\)[ \t]+\\(.+\\)" (point-max) 't)
(let* ((hd (match-string-no-properties 1))
(level (length hd))
(text (concat
@@ -20536,6 +26043,7 @@ The XOXO buffer is named *xoxo-<source buffer name>*"
(org-export-as-xoxo-insert-into out "</li>\n"))
(org-export-as-xoxo-insert-into out "</ol>\n"))
+ (goto-char pos)
;; Finish the buffer off and clean it up.
(switch-to-buffer-other-window out)
(indent-region (point-min) (point-max) nil)
@@ -20560,7 +26068,7 @@ The XOXO buffer is named *xoxo-<source buffer name>*"
(unless (featurep 'xemacs)
(org-defkey org-mode-map [S-iso-lefttab] 'org-shifttab))
(org-defkey org-mode-map [(shift tab)] 'org-shifttab)
-(define-key org-mode-map (kbd "<backtab>") 'org-shifttab)
+(define-key org-mode-map [backtab] 'org-shifttab)
(org-defkey org-mode-map [(shift return)] 'org-table-copy-down)
(org-defkey org-mode-map [(meta shift return)] 'org-insert-todo-heading)
@@ -20629,11 +26137,12 @@ The XOXO buffer is named *xoxo-<source buffer name>*"
(org-defkey org-mode-map "\C-c\C-d" 'org-deadline)
(org-defkey org-mode-map "\C-c;" 'org-toggle-comment)
(org-defkey org-mode-map "\C-c\C-v" 'org-show-todo-tree)
-(org-defkey org-mode-map "\C-c\C-w" 'org-check-deadlines)
-(org-defkey org-mode-map "\C-c/" 'org-occur) ; Minor-mode reserved
+(org-defkey org-mode-map "\C-c\C-w" 'org-refile)
+(org-defkey org-mode-map "\C-c/" 'org-sparse-tree) ; Minor-mode reserved
(org-defkey org-mode-map "\C-c\\" 'org-tags-sparse-tree) ; Minor-mode res.
(org-defkey org-mode-map "\C-c\C-m" 'org-ctrl-c-ret)
(org-defkey org-mode-map "\M-\C-m" 'org-insert-heading)
+(org-defkey org-mode-map [(control return)] 'org-insert-heading-after-current)
(org-defkey org-mode-map "\C-c\C-x\C-n" 'org-next-link)
(org-defkey org-mode-map "\C-c\C-x\C-p" 'org-previous-link)
(org-defkey org-mode-map "\C-c\C-l" 'org-insert-link)
@@ -20651,11 +26160,15 @@ The XOXO buffer is named *xoxo-<source buffer name>*"
(org-defkey org-mode-map [(control ?\')] 'org-cycle-agenda-files)
(org-defkey org-mode-map "\C-c[" 'org-agenda-file-to-front)
(org-defkey org-mode-map "\C-c]" 'org-remove-file)
-(org-defkey org-mode-map "\C-c-" 'org-table-insert-hline)
+(org-defkey org-mode-map "\C-c\C-x<" 'org-agenda-set-restriction-lock)
+(org-defkey org-mode-map "\C-c\C-x>" 'org-agenda-remove-restriction-lock)
+(org-defkey org-mode-map "\C-c-" 'org-ctrl-c-minus)
(org-defkey org-mode-map "\C-c^" 'org-sort)
(org-defkey org-mode-map "\C-c\C-c" 'org-ctrl-c-ctrl-c)
+(org-defkey org-mode-map "\C-c\C-k" 'org-kill-note-or-show-branches)
(org-defkey org-mode-map "\C-c#" 'org-update-checkbox-count)
(org-defkey org-mode-map "\C-m" 'org-return)
+(org-defkey org-mode-map "\C-j" 'org-return-indent)
(org-defkey org-mode-map "\C-c?" 'org-table-field-info)
(org-defkey org-mode-map "\C-c " 'org-table-blank-field)
(org-defkey org-mode-map "\C-c+" 'org-table-sum)
@@ -20681,12 +26194,17 @@ The XOXO buffer is named *xoxo-<source buffer name>*"
(org-defkey org-mode-map "\C-c\C-x\C-t" 'org-toggle-time-stamp-overlays)
(org-defkey org-mode-map "\C-c\C-x\C-i" 'org-clock-in)
(org-defkey org-mode-map "\C-c\C-x\C-o" 'org-clock-out)
+(org-defkey org-mode-map "\C-c\C-x\C-j" 'org-clock-goto)
(org-defkey org-mode-map "\C-c\C-x\C-x" 'org-clock-cancel)
(org-defkey org-mode-map "\C-c\C-x\C-d" 'org-clock-display)
(org-defkey org-mode-map "\C-c\C-x\C-r" 'org-clock-report)
(org-defkey org-mode-map "\C-c\C-x\C-u" 'org-dblock-update)
(org-defkey org-mode-map "\C-c\C-x\C-l" 'org-preview-latex-fragment)
(org-defkey org-mode-map "\C-c\C-x\C-b" 'org-toggle-checkbox)
+(org-defkey org-mode-map "\C-c\C-xp" 'org-set-property)
+(org-defkey org-mode-map "\C-c\C-xr" 'org-insert-columns-dblock)
+
+(define-key org-mode-map "\C-c\C-x\C-c" 'org-columns)
(when (featurep 'xemacs)
(org-defkey org-mode-map 'button3 'popup-mode-menu))
@@ -20718,7 +26236,13 @@ overwritten, and the table is not marked as requiring realignment."
(goto-char (match-beginning 0))
(self-insert-command N))
(setq org-table-may-need-update t)
- (self-insert-command N)))
+ (self-insert-command N)
+ (org-fix-tags-on-the-fly)))
+
+(defun org-fix-tags-on-the-fly ()
+ (when (and (equal (char-after (point-at-bol)) ?*)
+ (org-on-heading-p))
+ (org-align-tags-here org-tags-column)))
(defun org-delete-backward-char (N)
"Like `delete-backward-char', insert whitespace at field end in tables.
@@ -20741,7 +26265,8 @@ because, in this case the deletion might narrow the column."
;; noalign: if there were two spaces at the end, this field
;; does not determine the width of the column.
(if noalign (setq org-table-may-need-update c)))
- (backward-delete-char N)))
+ (backward-delete-char N)
+ (org-fix-tags-on-the-fly)))
(defun org-delete-char (N)
"Like `delete-char', but insert whitespace at field end in tables.
@@ -20766,7 +26291,8 @@ because, in this case the deletion might narrow the column."
;; does not determine the width of the column.
(if noalign (setq org-table-may-need-update c)))
(delete-char N))
- (delete-char N)))
+ (delete-char N)
+ (org-fix-tags-on-the-fly)))
;; Make `delete-selection-mode' work with org-mode and orgtbl-mode
(put 'org-self-insert-command 'delete-selection t)
@@ -20780,6 +26306,10 @@ because, in this case the deletion might narrow the column."
(put 'org-delete-char 'flyspell-delayed t)
(put 'org-delete-backward-char 'flyspell-delayed t)
+;; Make pabbrev-mode expand after org-mode commands
+(put 'org-self-insert-command 'pabbrev-expand-after-command t)
+(put 'orgybl-self-insert-command 'pabbrev-expand-after-command t)
+
;; How to do this: Measure non-white length of current string
;; If equal to column width, we should realign.
@@ -20902,7 +26432,7 @@ for more information."
((org-at-table-p) (org-call-with-arg 'org-table-move-row 'up))
((org-on-heading-p) (call-interactively 'org-move-subtree-up))
((org-at-item-p) (call-interactively 'org-move-item-up))
- (t (org-shiftcursor-error))))
+ (t (transpose-lines 1) (beginning-of-line -1))))
(defun org-metadown (&optional arg)
"Move subtree down or move table row down.
@@ -20914,7 +26444,7 @@ commands for more information."
((org-at-table-p) (call-interactively 'org-table-move-row))
((org-on-heading-p) (call-interactively 'org-move-subtree-down))
((org-at-item-p) (call-interactively 'org-move-item-down))
- (t (org-shiftcursor-error))))
+ (t (beginning-of-line 2) (transpose-lines 1) (beginning-of-line 0))))
(defun org-shiftup (&optional arg)
"Increase item in timestamp or increase priority of current headline.
@@ -20922,7 +26452,9 @@ Calls `org-timestamp-up' or `org-priority-up', or `org-previous-item',
depending on context. See the individual commands for more information."
(interactive "P")
(cond
- ((org-at-timestamp-p t) (call-interactively 'org-timestamp-up))
+ ((org-at-timestamp-p t)
+ (call-interactively (if org-edit-timestamp-down-means-later
+ 'org-timestamp-down 'org-timestamp-up)))
((org-on-heading-p) (call-interactively 'org-priority-up))
((org-at-item-p) (call-interactively 'org-previous-item))
(t (call-interactively 'org-beginning-of-item) (beginning-of-line 1))))
@@ -20933,7 +26465,9 @@ Calls `org-timestamp-down' or `org-priority-down', or `org-next-item'
depending on context. See the individual commands for more information."
(interactive "P")
(cond
- ((org-at-timestamp-p t) (call-interactively 'org-timestamp-down))
+ ((org-at-timestamp-p t)
+ (call-interactively (if org-edit-timestamp-down-means-later
+ 'org-timestamp-up 'org-timestamp-down)))
((org-on-heading-p) (call-interactively 'org-priority-down))
(t (call-interactively 'org-next-item))))
@@ -20943,6 +26477,8 @@ depending on context. See the individual commands for more information."
(cond
((org-at-timestamp-p t) (call-interactively 'org-timestamp-up-day))
((org-on-heading-p) (org-call-with-arg 'org-todo 'right))
+ ((org-at-item-p) (org-call-with-arg 'org-cycle-list-bullet nil))
+ ((org-at-property-p) (call-interactively 'org-property-next-allowed-value))
(t (org-shiftcursor-error))))
(defun org-shiftleft ()
@@ -20951,6 +26487,9 @@ depending on context. See the individual commands for more information."
(cond
((org-at-timestamp-p t) (call-interactively 'org-timestamp-down-day))
((org-on-heading-p) (org-call-with-arg 'org-todo 'left))
+ ((org-at-item-p) (org-call-with-arg 'org-cycle-list-bullet 'previous))
+ ((org-at-property-p)
+ (call-interactively 'org-property-previous-allowed-value))
(t (org-shiftcursor-error))))
(defun org-shiftcontrolright ()
@@ -21018,6 +26557,8 @@ This command does many different things, depending on context:
- If the cursor is on a #+TBLFM line, re-apply the formulas to
the entire table.
+- If the cursor is a the beginning of a dynamic block, update it.
+
- If the cursor is inside a table created by the table.el package,
activate that table.
@@ -21029,7 +26570,9 @@ This command does many different things, depending on context:
links in this buffer.
- If the cursor is on a numbered item in a plain list, renumber the
- ordered list."
+ ordered list.
+
+- If the cursor is on a checkbox, toggle it."
(interactive "P")
(let ((org-enable-table-editor t))
(cond
@@ -21043,6 +26586,8 @@ This command does many different things, depending on context:
((and (local-variable-p 'org-finish-function (current-buffer))
(fboundp org-finish-function))
(funcall org-finish-function))
+ ((org-at-property-p)
+ (call-interactively 'org-property-action))
((org-on-target-p) (call-interactively 'org-update-radio-target-regexp))
((org-on-heading-p) (call-interactively 'org-set-tags))
((org-at-table.el-p)
@@ -21060,6 +26605,10 @@ This command does many different things, depending on context:
(call-interactively 'org-toggle-checkbox))
((org-at-item-p)
(call-interactively 'org-maybe-renumber-ordered-list))
+ ((save-excursion (beginning-of-line 1) (looking-at "#\\+BEGIN:"))
+ ;; Dynamic block
+ (beginning-of-line 1)
+ (org-update-dblock))
((save-excursion (beginning-of-line 1) (looking-at "#\\+\\([A-Z]+\\)"))
(cond
((equal (match-string 1) "TBLFM")
@@ -21080,16 +26629,50 @@ Also updates the keyword regular expressions."
(let ((org-inhibit-startup t)) (org-mode))
(message "Org-mode restarted to refresh keyword and special line setup"))
-(defun org-return ()
+(defun org-kill-note-or-show-branches ()
+ "If this is a Note buffer, abort storing the note. Else call `show-branches'."
+ (interactive)
+ (if (not org-finish-function)
+ (call-interactively 'show-branches)
+ (let ((org-note-abort t))
+ (funcall org-finish-function))))
+
+(defun org-return (&optional indent)
"Goto next table row or insert a newline.
Calls `org-table-next-row' or `newline', depending on context.
See the individual commands for more information."
(interactive)
(cond
+ ((bobp) (if indent (newline-and-indent) (newline)))
((org-at-table-p)
(org-table-justify-field-maybe)
(call-interactively 'org-table-next-row))
- (t (newline))))
+ (t (if indent (newline-and-indent) (newline)))))
+
+(defun org-return-indent ()
+ (interactive)
+ "Goto next table row or insert a newline and indent.
+Calls `org-table-next-row' or `newline-and-indent', depending on
+context. See the individual commands for more information."
+ (org-return t))
+
+(defun org-ctrl-c-minus ()
+ "Insert separator line in table or modify bullet type in list.
+Calls `org-table-insert-hline' or `org-cycle-list-bullet',
+depending on context."
+ (interactive)
+ (cond
+ ((org-at-table-p)
+ (call-interactively 'org-table-insert-hline))
+ ((org-on-heading-p)
+ ;; Convert to item
+ (save-excursion
+ (beginning-of-line 1)
+ (if (looking-at "\\*+ ")
+ (replace-match (concat (make-string (- (match-end 0) (point)) ?\ ) "- ")))))
+ ((org-in-item-p)
+ (call-interactively 'org-cycle-list-bullet))
+ (t (error "`C-c -' does have no function here."))))
(defun org-meta-return (&optional arg)
"Insert a new heading or wrap a region in a table.
@@ -21127,7 +26710,7 @@ See the individual commands for more information."
["Insert Row" org-shiftmetadown (org-at-table-p)]
["Sort lines in region" org-table-sort-lines (org-at-table-p)]
"--"
- ["Insert Hline" org-table-insert-hline (org-at-table-p)])
+ ["Insert Hline" org-ctrl-c-minus (org-at-table-p)])
("Rectangle"
["Copy Rectangle" org-copy-special (org-at-table-p)]
["Cut Rectangle" org-cut-special (org-at-table-p)]
@@ -21182,11 +26765,7 @@ See the individual commands for more information."
["Next Same Level" outline-forward-same-level t]
["Previous Same Level" outline-backward-same-level t]
"--"
- ["Jump" org-goto t]
- "--"
- ["C-a finds headline start"
- (setq org-special-ctrl-a (not org-special-ctrl-a))
- :style toggle :selected org-special-ctrl-a])
+ ["Jump" org-goto t])
("Edit Structure"
["Move Subtree Up" org-shiftmetaup (not (org-at-table-p))]
["Move Subtree Down" org-shiftmetadown (not (org-at-table-p))]
@@ -21239,17 +26818,14 @@ See the individual commands for more information."
"--"
["Set Priority" org-priority t]
["Priority Up" org-shiftup t]
- ["Priority Down" org-shiftdown t]
+ ["Priority Down" org-shiftdown t])
+ ("TAGS and Properties"
+ ["Set Tags" 'org-ctrl-c-ctrl-c (org-at-heading-p)]
+ ["Change tag in region" 'org-change-tag-in-region (org-region-active-p)]
"--"
- ;; FIXME: why is this still here????
-; ["Insert Checkbox" org-insert-todo-heading (org-in-item-p)]
-; ["Toggle Checkbox" org-ctrl-c-ctrl-c (org-at-item-checkbox-p)]
-; ["Insert [n/m] cookie" (progn (insert "[/]") (org-update-checkbox-count))
-; (or (org-on-heading-p) (org-at-item-p))]
-; ["Insert [%] cookie" (progn (insert "[%]") (org-update-checkbox-count))
-; (or (org-on-heading-p) (org-at-item-p))]
-; ["Update Statistics" org-update-checkbox-count t]
- )
+ ["Set property" 'org-set-property t]
+ ["Column view of properties" org-columns t]
+ ["Insert Column View DBlock" org-insert-columns-dblock t])
("Dates and Scheduling"
["Timestamp" org-time-stamp t]
["Timestamp (inactive)" org-time-stamp-inactive t]
@@ -21271,6 +26847,7 @@ See the individual commands for more information."
["Clock in" org-clock-in t]
["Clock out" org-clock-out t]
["Clock cancel" org-clock-cancel t]
+ ["Goto running clock" org-clock-goto t]
["Display times" org-clock-display t]
["Create clock table" org-clock-report t]
"--"
@@ -21282,6 +26859,7 @@ See the individual commands for more information."
:style toggle :selected org-log-done])
"--"
["Agenda Command..." org-agenda t]
+ ["Set Restriction Lock" org-agenda-set-restriction-lock t]
("File List for Agenda")
("Special views current file"
["TODO Tree" org-show-todo-tree t]
@@ -21351,6 +26929,7 @@ With optional NODE, go directly to that node."
["Add/Move Current File to Front of List" org-agenda-file-to-front t]
["Remove Current File from List" org-remove-file t]
["Cycle through agenda files" org-cycle-agenda-files t]
+ ["Occur in all agenda files" org-occur-in-agenda-files t]
"--")
(mapcar 'org-file-menu-entry (org-agenda-files t))))))))
@@ -21482,7 +27061,7 @@ and :keyword."
(setq clist (nreverse (delq nil clist)))
clist))
-;; FIXME Compare with at-regexp-p
+;; FIXME: Compare with at-regexp-p Do we need both?
(defun org-in-regexp (re &optional nlines visually)
"Check if point is inside a match of regexp.
Normally only the current line is checked, but you can include NLINES extra
@@ -21512,6 +27091,21 @@ really on, so that the block visually is on the match."
(throw 'exit t)))
nil))))
+(defun org-occur-in-agenda-files (regexp &optional nlines)
+ "Call `multi-occur' with buffers for all agenda files."
+ (interactive "sOrg-files matching: \np")
+ (let* ((files (org-agenda-files))
+ (tnames (mapcar 'file-truename files))
+ (extra org-agenda-multi-occur-extra-files)
+ f)
+ (while (setq f (pop extra))
+ (unless (member (file-truename f) tnames)
+ (add-to-list 'files f 'append)
+ (add-to-list 'tnames (file-truename f) 'append)))
+ (multi-occur
+ (mapcar (lambda (x) (or (get-file-buffer x) (find-file-noselect x))) files)
+ regexp)))
+
(defun org-uniquify (list)
"Remove duplicate elements from LIST."
(let (res)
@@ -21524,6 +27118,17 @@ really on, so that the block visually is on the match."
(setq list (delete (pop elts) list)))
list)
+(defun org-back-over-empty-lines ()
+ "Move backwards over witespace, to the beginning of the first empty line.
+Returns the number o empty lines passed."
+ (let ((pos (point)))
+ (skip-chars-backward " \t\n\r")
+ (beginning-of-line 2)
+ (count-lines (point) pos)))
+
+(defun org-skip-whitespace ()
+ (skip-chars-forward " \t\n\r"))
+
(defun org-point-in-group (point group &optional context)
"Check if POINT is in match-group GROUP.
If CONTEXT is non-nil, return a list with CONTEXT and the boundaries of the
@@ -21536,6 +27141,13 @@ return nil."
(list context (match-beginning group) (match-end group))
t)))
+(defun org-switch-to-buffer-other-window (&rest args)
+ "Switch to buffer in a second window on the current frame.
+In particular, do not allow pop-up frames."
+ (let (pop-up-frames special-display-buffer-names special-display-regexps
+ special-display-function)
+ (apply 'switch-to-buffer-other-window args)))
+
(defun org-combine-plists (&rest plists)
"Create a single property list from all plists in PLISTS.
The process starts by copying the first list, and then setting properties
@@ -21578,7 +27190,7 @@ ones and overrule settings in the other lists."
(defun org-replace-escapes (string table)
"Replace %-escapes in STRING with values in TABLE.
-TABLE is an association list with keys line \"%a\" and string values.
+TABLE is an association list with keys like \"%a\" and string values.
The sequences in STRING may contain normal field width and padding information,
for example \"%-5s\". Replacements happen in the sequence given by TABLE,
so values can contain further %-escapes if they are define later in TABLE."
@@ -21607,7 +27219,9 @@ Counting starts at 1."
"Like `find-buffer-visiting' but alway return the base buffer and
not an indirect buffer"
(let ((buf (find-buffer-visiting file)))
- (or (buffer-base-buffer buf) buf)))
+ (if buf
+ (or (buffer-base-buffer buf) buf)
+ nil)))
(defun org-image-file-name-regexp ()
"Return regexp matching the file names of images."
@@ -21641,6 +27255,7 @@ not an indirect buffer"
(beginning-of-line 1)
(cond
((looking-at "#") (setq column 0))
+ ((looking-at "\\*+ ") (setq column 0))
(t
(beginning-of-line 0)
(while (and (not (bobp)) (looking-at "[ \t]*[\n:#|]"))
@@ -21651,7 +27266,8 @@ not an indirect buffer"
(setq column (current-column)))
((org-in-item-p)
(org-beginning-of-item)
- (looking-at "[ \t]*\\(\\S-+\\)[ \t]*")
+; (looking-at "[ \t]*\\(\\S-+\\)[ \t]*")
+ (looking-at "[ \t]*\\(\\S-+\\)[ \t]*\\(\\[[- X]\\][ \t]*\\)?")
(setq bpos (match-beginning 1) tpos (match-end 0)
bcol (progn (goto-char bpos) (current-column))
tcol (progn (goto-char tpos) (current-column))
@@ -21661,15 +27277,26 @@ not an indirect buffer"
(setq column tcol)
(goto-char pos)
(beginning-of-line 1)
- (looking-at "[ \t]*\\(\\S-+\\)[ \t]*")
- (setq bullet (match-string 1)
- btype (if (string-match "[0-9]" bullet) "n" bullet))
- (setq column (if (equal btype bullet-type) bcol tcol))))
+ (if (looking-at "\\S-")
+ (progn
+ (looking-at "[ \t]*\\(\\S-+\\)[ \t]*")
+ (setq bullet (match-string 1)
+ btype (if (string-match "[0-9]" bullet) "n" bullet))
+ (setq column (if (equal btype bullet-type) bcol tcol)))
+ (setq column (org-get-indentation)))))
(t (setq column (org-get-indentation))))))
(goto-char pos)
(if (<= (current-column) (current-indentation))
(indent-line-to column)
- (save-excursion (indent-line-to column)))))
+ (save-excursion (indent-line-to column)))
+ (setq column (current-column))
+ (beginning-of-line 1)
+ (if (looking-at
+ "\\([ \t]+\\)\\(:[-_0-9a-zA-Z]+:\\)[ \t]*\\(\\S-.*\\(\\S-\\|$\\)\\)")
+ (replace-match (concat "\\1" (format org-property-format
+ (match-string 2) (match-string 3)))
+ t nil))
+ (move-to-column column)))
(defun org-set-autofill-regexps ()
(interactive)
@@ -21677,16 +27304,15 @@ not an indirect buffer"
;; text in a line directly attached to a headline would otherwise
;; fill the headline as well.
(org-set-local 'comment-start-skip "^#+[ \t]*")
- (org-set-local 'paragraph-separate "\f\\|\\*\\|[ ]*$\\|[ \t]*[:|]")
-;; FIXME!!!!!!! (org-set-local 'paragraph-separate "\f\\|[ ]*$")
+ (org-set-local 'paragraph-separate "\f\\|\\*+ \\|[ ]*$\\|[ \t]*[:|]")
;; The paragraph starter includes hand-formatted lists.
(org-set-local 'paragraph-start
- "\f\\|[ ]*$\\|\\([*\f]+\\)\\|[ \t]*\\([-+*][ \t]+\\|[0-9]+[.)][ \t]+\\)\\|[ \t]*[:|]")
+ "\f\\|[ ]*$\\|\\*+ \\|\f\\|[ \t]*\\([-+*][ \t]+\\|[0-9]+[.)][ \t]+\\)\\|[ \t]*[:|]")
;; Inhibit auto-fill for headers, tables and fixed-width lines.
;; But only if the user has not turned off tables or fixed-width regions
(org-set-local
'auto-fill-inhibit-regexp
- (concat "\\*\\|#\\+"
+ (concat "\\*+ \\|#\\+"
"\\|[ \t]*" org-keyword-time-regexp
(if (or org-enable-table-editor org-enable-fixed-width-editor)
(concat
@@ -21708,10 +27334,13 @@ not an indirect buffer"
"Re-align a table, pass through to fill-paragraph if no table."
(let ((table-p (org-at-table-p))
(table.el-p (org-at-table.el-p)))
- (cond ((equal (char-after (point-at-bol)) ?*) t) ; skip headlines
- (table.el-p t) ; skip table.el tables
- (table-p (org-table-align) t) ; align org-mode tables
- (t nil)))) ; call paragraph-fill
+ (cond ((and (equal (char-after (point-at-bol)) ?*)
+ (save-excursion (goto-char (point-at-bol))
+ (looking-at outline-regexp)))
+ t) ; skip headlines
+ (table.el-p t) ; skip table.el tables
+ (table-p (org-table-align) t) ; align org-mode tables
+ (t nil)))) ; call paragraph-fill
;; For reference, this is the default value of adaptive-fill-regexp
;; "[ \t]*\\([-|#;>*]+[ \t]*\\|(?[0-9]+[.)][ \t]*\\)*"
@@ -21730,12 +27359,13 @@ work correctly."
;;;; Functions extending outline functionality
-;; C-a should go to the beginning of a *visible* line, also in the
-;; new outline.el. I guess this should be patched into Emacs?
-(defun org-beginning-of-line ()
+(defun org-beginning-of-line (&optional arg)
"Go to the beginning of the current line. If that is invisible, continue
-to a visible line beginning. This makes the function of C-a more intuitive."
- (interactive)
+to a visible line beginning. This makes the function of C-a more intuitive.
+If this is a headline, and `org-special-ctrl-a/e' is set, ignore tags on the
+first attempt, and only move to after the tags when the cursor is already
+beyond the end of the headline."
+ (interactive "P")
(let ((pos (point)))
(beginning-of-line 1)
(if (bobp)
@@ -21746,14 +27376,52 @@ to a visible line beginning. This makes the function of C-a more intuitive."
(backward-char 1)
(beginning-of-line 1))
(forward-char 1)))
- (when (and org-special-ctrl-a (looking-at org-todo-line-regexp)
- (= (char-after (match-end 1)) ?\ ))
- (goto-char
- (cond ((> pos (match-beginning 3)) (match-beginning 3))
- ((= pos (point)) (match-beginning 3))
- (t (point)))))))
+ (when org-special-ctrl-a/e
+ (cond
+ ((and (looking-at org-todo-line-regexp)
+ (= (char-after (match-end 1)) ?\ ))
+ (goto-char
+ (if (eq org-special-ctrl-a/e t)
+ (cond ((> pos (match-beginning 3)) (match-beginning 3))
+ ((= pos (point)) (match-beginning 3))
+ (t (point)))
+ (cond ((> pos (point)) (point))
+ ((not (eq last-command this-command)) (point))
+ (t (match-beginning 3))))))
+ ((org-at-item-p)
+ (goto-char
+ (if (eq org-special-ctrl-a/e t)
+ (cond ((> pos (match-end 4)) (match-end 4))
+ ((= pos (point)) (match-end 4))
+ (t (point)))
+ (cond ((> pos (point)) (point))
+ ((not (eq last-command this-command)) (point))
+ (t (match-end 4))))))))))
+
+(defun org-end-of-line (&optional arg)
+ "Go to the end of the line.
+If this is a headline, and `org-special-ctrl-a/e' is set, ignore tags on the
+first attempt, and only move to after the tags when the cursor is already
+beyond the end of the headline."
+ (interactive "P")
+ (if (or (not org-special-ctrl-a/e)
+ (not (org-on-heading-p)))
+ (end-of-line arg)
+ (let ((pos (point)))
+ (beginning-of-line 1)
+ (if (looking-at (org-re ".*?\\([ \t]*\\)\\(:[[:alnum:]_@:]+:\\)[ \t]*$"))
+ (if (eq org-special-ctrl-a/e t)
+ (if (or (< pos (match-beginning 1))
+ (= pos (match-end 0)))
+ (goto-char (match-beginning 1))
+ (goto-char (match-end 0)))
+ (if (or (< pos (match-end 0)) (not (eq this-command last-command)))
+ (goto-char (match-end 0))
+ (goto-char (match-beginning 1))))
+ (end-of-line arg)))))
(define-key org-mode-map "\C-a" 'org-beginning-of-line)
+(define-key org-mode-map "\C-e" 'org-end-of-line)
(defun org-invisible-p ()
"Check if point is at a character currently not visible."
@@ -21789,6 +27457,35 @@ With argument, move up ARG levels."
(outline-up-heading-all arg) ; emacs 21 version of outline.el
(outline-up-heading arg t))) ; emacs 22 version of outline.el
+(defun org-up-heading-safe ()
+ "Move to the heading line of which the present line is a subheading.
+This version will not throw an error. It will return the level of the
+headline found, or nil if no higher level is found."
+ (let ((pos (point)) start-level level
+ (re (concat "^" outline-regexp)))
+ (catch 'exit
+ (outline-back-to-heading t)
+ (setq start-level (funcall outline-level))
+ (if (equal start-level 1) (throw 'exit nil))
+ (while (re-search-backward re nil t)
+ (setq level (funcall outline-level))
+ (if (< level start-level) (throw 'exit level)))
+ nil)))
+
+(defun org-first-sibling-p ()
+ "Is this heading the first child of its parents?"
+ (interactive)
+ (let ((re (concat "^" outline-regexp))
+ level l)
+ (unless (org-at-heading-p t)
+ (error "Not at a heading"))
+ (setq level (funcall outline-level))
+ (save-excursion
+ (if (not (re-search-backward re nil t))
+ t
+ (setq l (funcall outline-level))
+ (< l level)))))
+
(defun org-goto-sibling (&optional previous)
"Goto the next sibling, even if it is invisible.
When PREVIOUS is set, go to the previous sibling instead. Returns t
@@ -21798,16 +27495,16 @@ move point."
(pos (point))
(re (concat "^" outline-regexp))
level l)
- (org-back-to-heading t)
- (setq level (funcall outline-level))
- (catch 'exit
- (or previous (forward-char 1))
- (while (funcall fun re nil t)
- (setq l (funcall outline-level))
- (when (< l level) (goto-char pos) (throw 'exit nil))
- (when (= l level) (goto-char (match-beginning 0)) (throw 'exit t)))
- (goto-char pos)
- nil)))
+ (when (condition-case nil (org-back-to-heading t) (error nil))
+ (setq level (funcall outline-level))
+ (catch 'exit
+ (or previous (forward-char 1))
+ (while (funcall fun re nil t)
+ (setq l (funcall outline-level))
+ (when (< l level) (goto-char pos) (throw 'exit nil))
+ (when (= l level) (goto-char (match-beginning 0)) (throw 'exit t)))
+ (goto-char pos)
+ nil))))
(defun org-show-siblings ()
"Show all siblings of the current headline."
@@ -21834,7 +27531,7 @@ When ENTRY is non-nil, show the entire entry."
(save-excursion
(and (outline-next-heading)
(org-flag-heading nil))))
- (outline-flag-region (max 1 (1- (point)))
+ (outline-flag-region (max (point-min) (1- (point)))
(save-excursion (outline-end-of-heading) (point))
flag))))
@@ -21873,13 +27570,17 @@ When ENTRY is non-nil, show the entire entry."
Show the heading too, if it is currently invisible."
(interactive)
(save-excursion
- (org-back-to-heading t)
- (outline-flag-region
- (max 1 (1- (point)))
- (save-excursion
- (re-search-forward (concat "[\r\n]\\(" outline-regexp "\\)") nil 'move)
- (or (match-beginning 1) (point-max)))
- nil)))
+ (condition-case nil
+ (progn
+ (org-back-to-heading t)
+ (outline-flag-region
+ (max (point-min) (1- (point)))
+ (save-excursion
+ (re-search-forward
+ (concat "[\r\n]\\(" outline-regexp "\\)") nil 'move)
+ (or (match-beginning 1) (point-max)))
+ nil))
+ (error nil))))
(defun org-make-options-regexp (kwds)
"Make a regular expression for keyword lines."
@@ -21913,7 +27614,104 @@ Show the heading too, if it is currently invisible."
(org-show-context 'isearch))
-;;;; Address problems with some other packages
+;;;; Integration with and fixes for other packages
+
+;;; Imenu support
+
+(defvar org-imenu-markers nil
+ "All markers currently used by Imenu.")
+(make-variable-buffer-local 'org-imenu-markers)
+
+(defun org-imenu-new-marker (&optional pos)
+ "Return a new marker for use by Imenu, and remember the marker."
+ (let ((m (make-marker)))
+ (move-marker m (or pos (point)))
+ (push m org-imenu-markers)
+ m))
+
+(defun org-imenu-get-tree ()
+ "Produce the index for Imenu."
+ (mapc (lambda (x) (move-marker x nil)) org-imenu-markers)
+ (setq org-imenu-markers nil)
+ (let* ((n org-imenu-depth)
+ (re (concat "^" outline-regexp))
+ (subs (make-vector (1+ n) nil))
+ (last-level 0)
+ m tree level head)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-max))
+ (while (re-search-backward re nil t)
+ (setq level (org-reduced-level (funcall outline-level)))
+ (when (<= level n)
+ (looking-at org-complex-heading-regexp)
+ (setq head (org-match-string-no-properties 4)
+ m (org-imenu-new-marker))
+ (org-add-props head nil 'org-imenu-marker m 'org-imenu t)
+ (if (>= level last-level)
+ (push (cons head m) (aref subs level))
+ (push (cons head (aref subs (1+ level))) (aref subs level))
+ (loop for i from (1+ level) to n do (aset subs i nil)))
+ (setq last-level level)))))
+ (aref subs 1)))
+
+(eval-after-load "imenu"
+ '(progn
+ (add-hook 'imenu-after-jump-hook
+ (lambda () (org-show-context 'org-goto)))))
+
+;; Speedbar support
+
+(defun org-speedbar-set-agenda-restriction ()
+ "Restrict future agenda commands to the location at point in speedbar.
+To get rid of the restriction, use \\[org-agenda-remove-restriction-lock]."
+ (interactive)
+ (let (p m tp np dir txt w)
+ (cond
+ ((setq p (text-property-any (point-at-bol) (point-at-eol)
+ 'org-imenu t))
+ (setq m (get-text-property p 'org-imenu-marker))
+ (save-excursion
+ (save-restriction
+ (set-buffer (marker-buffer m))
+ (goto-char m)
+ (org-agenda-set-restriction-lock 'subtree))))
+ ((setq p (text-property-any (point-at-bol) (point-at-eol)
+ 'speedbar-function 'speedbar-find-file))
+ (setq tp (previous-single-property-change
+ (1+ p) 'speedbar-function)
+ np (next-single-property-change
+ tp 'speedbar-function)
+ dir (speedbar-line-directory)
+ txt (buffer-substring-no-properties (or tp (point-min))
+ (or np (point-max))))
+ (save-excursion
+ (save-restriction
+ (set-buffer (find-file-noselect
+ (let ((default-directory dir))
+ (expand-file-name txt))))
+ (unless (org-mode-p)
+ (error "Cannot restrict to non-Org-mode file"))
+ (org-agenda-set-restriction-lock 'file))))
+ (t (error "Don't know how to restrict Org-mode's agenda")))
+ (org-move-overlay org-speedbar-restriction-lock-overlay
+ (point-at-bol) (point-at-eol))
+ (setq current-prefix-arg nil)
+ (org-agenda-maybe-redo)))
+
+(eval-after-load "speedbar"
+ '(progn
+ (speedbar-add-supported-extension ".org")
+ (define-key speedbar-file-key-map "<" 'org-speedbar-set-agenda-restriction)
+ (define-key speedbar-file-key-map "\C-c\C-x<" 'org-speedbar-set-agenda-restriction)
+ (define-key speedbar-file-key-map ">" 'org-agenda-remove-restriction-lock)
+ (define-key speedbar-file-key-map "\C-c\C-x>" 'org-agenda-remove-restriction-lock)
+ (add-hook 'speedbar-visiting-tag-hook
+ (lambda () (org-show-context 'org-goto)))))
+
+
+;;; Fixes and Hacks
;; Make flyspell not check words in links, to not mess up our keymap
(defun org-mode-flyspell-verify ()
@@ -21938,6 +27736,13 @@ Show the heading too, if it is currently invisible."
(org-invisible-p)))
(org-show-context 'bookmark-jump)))
+;; Fix a bug in htmlize where there are text properties (face nil)
+(eval-after-load "htmlize"
+ '(progn
+ (defadvice htmlize-faces-in-buffer (after org-no-nil-faces activate)
+ "Make sure there are no nil faces"
+ (setq ad-return-value (delq nil ad-return-value)))))
+
;; Make session.el ignore our circular variable
(eval-after-load "session"
'(add-to-list 'session-globals-exclude 'org-mark-ring))
@@ -21946,7 +27751,7 @@ Show the heading too, if it is currently invisible."
(defun org-closed-in-range ()
"Sparse tree of items closed in a certain time range.
-Still experimental, may disappear in the furture."
+Still experimental, may disappear in the future."
(interactive)
;; Get the time interval from the user.
(let* ((time1 (time-to-seconds
@@ -21965,11 +27770,6 @@ Still experimental, may disappear in the furture."
;; make tree, check each match with the callback
(org-occur "CLOSED: +\\[\\(.*?\\)\\]" nil callback)))
-
-(defun test ()
- (interactive)
- (message "hihi: %s" (org-item-indent-positions)))
-
;;;; Finish up
(provide 'org)
diff --git a/EXPERIMENTAL/john.el b/EXPERIMENTAL/john.el
new file mode 100644
index 0000000..82be881
--- /dev/null
+++ b/EXPERIMENTAL/john.el
@@ -0,0 +1,70 @@
+(require 'org-install)
+
+(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
+
+(define-key mode-specific-map [?a] 'org-agenda)
+
+(eval-after-load "org"
+ '(progn
+ (define-prefix-command 'org-todo-state-map)
+
+ (define-key org-mode-map "\C-cx" 'org-todo-state-map)
+
+ (define-key org-todo-state-map "x"
+ #'(lambda nil (interactive) (org-todo "CANCELLED")))
+ (define-key org-todo-state-map "d"
+ #'(lambda nil (interactive) (org-todo "DONE")))
+ (define-key org-todo-state-map "f"
+ #'(lambda nil (interactive) (org-todo "DEFERRED")))
+ (define-key org-todo-state-map "l"
+ #'(lambda nil (interactive) (org-todo "DELEGATED")))
+ (define-key org-todo-state-map "s"
+ #'(lambda nil (interactive) (org-todo "STARTED")))
+ (define-key org-todo-state-map "w"
+ #'(lambda nil (interactive) (org-todo "WAITING")))
+
+ (define-key org-agenda-mode-map "\C-n" 'next-line)
+ (define-key org-agenda-keymap "\C-n" 'next-line)
+ (define-key org-agenda-mode-map "\C-p" 'previous-line)
+ (define-key org-agenda-keymap "\C-p" 'previous-line)))
+
+(require 'remember)
+
+(add-hook 'remember-mode-hook 'org-remember-apply-template)
+
+(define-key global-map [(control meta ?r)] 'remember)
+
+(custom-set-variables
+ '(org-agenda-files (quote ("~/todo.org")))
+ '(org-default-notes-file "~/notes.org")
+ '(org-agenda-ndays 7)
+ '(org-deadline-warning-days 14)
+ '(org-agenda-show-all-dates t)
+ '(org-agenda-skip-deadline-if-done t)
+ '(org-agenda-skip-scheduled-if-done t)
+ '(org-agenda-start-on-weekday nil)
+ '(org-reverse-note-order t)
+ '(org-fast-tag-selection-single-key (quote expert))
+ '(org-agenda-custom-commands
+ (quote (("d" todo "DELEGATED" nil)
+ ("c" todo "DONE|DEFERRED|CANCELLED" nil)
+ ("w" todo "WAITING" nil)
+ ("W" agenda "" ((org-agenda-ndays 21)))
+ ("A" agenda ""
+ ((org-agenda-skip-function
+ (lambda nil
+ (org-agenda-skip-entry-if (quote notregexp) "\\=.*\\[#A\\]")))
+ (org-agenda-ndays 1)
+ (org-agenda-overriding-header "Today's Priority #A tasks: ")))
+ ("u" alltodo ""
+ ((org-agenda-skip-function
+ (lambda nil
+ (org-agenda-skip-entry-if (quote scheduled) (quote deadline)
+ (quote regexp) "<[^>\n]+>")))
+ (org-agenda-overriding-header "Unscheduled TODO entries: "))))))
+ '(org-remember-store-without-prompt t)
+ '(org-remember-templates
+ (quote ((116 "* TODO %?\n %u" "./todo.txt" "Tasks")
+ (110 "* %u %?" "./notes.txt" "Notes"))))
+ '(remember-annotation-functions (quote (org-remember-annotation)))
+ '(remember-handler-functions (quote (org-remember-handler))))
diff --git a/EXPERIMENTAL/org-bibtex.el b/EXPERIMENTAL/org-bibtex.el
new file mode 100644
index 0000000..2584d15
--- /dev/null
+++ b/EXPERIMENTAL/org-bibtex.el
@@ -0,0 +1,154 @@
+;;; org-bibtex.el --- Org links to BibTeX entries
+;;
+;; Copyright 2007 Bastien Guerry
+;;
+;; Author: bzg AT altern DOT org
+;; Version: 0.2
+;; Keywords: org, wp, remember
+;; URL: http://www.cognition.ens.fr/~guerry/u/org-bibtex.el
+;;
+;; This program 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, or (at your option)
+;; any later version.
+;;
+;; This program 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 this program; if not, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;;
+;;; Commentary:
+;;
+;; The Org mode already lets you store/insert links to BibTeX entries.
+;;
+;; But what if you want to insert the author or the title of a BibTeX
+;; item in a *remember* buffer? This library lets you deal with this
+;; by adding more properties to the BibTeX link.
+;;
+;; The available properties for each entry are listed here:
+;;
+;; :author :publisher :volume :pages
+;; :editor :url :number :journal
+;; :title :year :series :address
+;; :booktitle :month :annote :abstract
+;; :key :btype
+;;
+;; Here is an example of a remember template that use some of this
+;; information (:author :year :title :journal :pages):
+;;
+;; (setq org-remember-templates
+;; '((?b "* READ %?\n\n%a\n\n%:author (%:year): %:title\n \
+;; In %:journal, %:pages.")))
+;;
+;; Let's say you want to remember this BibTeX entry:
+;;
+;; @Article{dolev83,
+;; author = {Danny Dolev and Andrew C. Yao},
+;; title = {On the security of public-key protocols},
+;; journal = {IEEE Transaction on Information Theory},
+;; year = 1983,
+;; volume = 2,
+;; number = 29,
+;; pages = {198--208},
+;; month = {Mars}
+;; }
+;;
+;; M-x `org-remember' on this entry will produce this buffer:
+;;
+;; =====================================================================
+;; * READ <== [point here]
+;;
+;; [[file:/file.bib::dolev83][Dolev & Yao 1983: security of public key protocols]]
+;;
+;; Danny Dolev and Andrew C. Yao (1983): On the security of public-key protocols
+;; In IEEE Transaction on Information Theory, 198--208.
+;; =====================================================================
+;;
+;;; History:
+;;
+;; This piece of code was inspired by a request of Austin Frank:
+;; http://article.gmane.org/gmane.emacs.orgmode/4112
+;;
+;; Put this file into your load-path and the following into your ~/.emacs:
+;; (require 'org-bibtex)
+
+;;; Code:
+
+(provide 'org-bibtex)
+
+(require 'org)
+
+(defvar description nil) ; dynamically scoped in org.el
+
+(org-add-link-type "bibtex" 'org-bibtex-open)
+(add-hook 'org-store-link-functions 'org-bibtex-store-link)
+
+;; (defun org-bibtex-publish (path)
+;; "Build the description of the BibTeX entry for publishing."
+;; (let* ((search (when (string-match "::\\(.+\\)\\'" path)
+;; (match-string 1 path)))
+;; (path (substring path 0 (match-beginning 0)))
+;; key)
+;; (with-temp-buffer
+;; (org-open-file path t nil search)
+;; (setq key (org-create-file-search-functions)))
+;; (or description key)))
+
+(defun org-bibtex-open (path)
+ "Visit the bibliography entry on PATH."
+ (let* ((search (when (string-match "::\\(.+\\)\\'" path)
+ (match-string 1 path)))
+ (path (substring path 0 (match-beginning 0))))
+ (org-open-file path t nil search)))
+
+(defun org-bibtex-store-link ()
+ "Store a link to a BibTeX entry."
+ (when (eq major-mode 'bibtex-mode)
+ (let* ((search (run-hook-with-args-until-success
+ 'org-create-file-search-functions))
+ (link (concat "file:" (abbreviate-file-name buffer-file-name)
+ "::" search))
+ (entry (mapcar ; repair strings enclosed in "..." or {...}
+ (lambda(c)
+ (if (string-match
+ "^\\(?:{\\|\"\\)\\(.*\\)\\(?:}\\|\"\\)$" (cdr c))
+ (cons (car c) (match-string 1 (cdr c))) c))
+ (save-excursion
+ (bibtex-beginning-of-entry)
+ (bibtex-parse-entry)))))
+ (org-store-link-props
+ :key (cdr (assoc "=key=" entry))
+ :author (or (cdr (assoc "author" entry)) "[no author]")
+ :editor (or (cdr (assoc "editor" entry)) "[no editor]")
+ :title (or (cdr (assoc "title" entry)) "[no title]")
+ :booktitle (or (cdr (assoc "booktitle" entry)) "[no booktitle]")
+ :journal (or (cdr (assoc "journal" entry)) "[no journal]")
+ :publisher (or (cdr (assoc "publisher" entry)) "[no publisher]")
+ :pages (or (cdr (assoc "pages" entry)) "[no pages]")
+ :url (or (cdr (assoc "url" entry)) "[no url]")
+ :year (or (cdr (assoc "year" entry)) "[no year]")
+ :month (or (cdr (assoc "month" entry)) "[no month]")
+ :address (or (cdr (assoc "address" entry)) "[no address]")
+ :volume (or (cdr (assoc "volume" entry)) "[no volume]")
+ :number (or (cdr (assoc "number" entry)) "[no number]")
+ :annote (or (cdr (assoc "annote" entry)) "[no annotation]")
+ :series (or (cdr (assoc "series" entry)) "[no series]")
+ :abstract (or (cdr (assoc "abstract" entry)) "[no abstract]")
+ :btype (or (cdr (assoc "=type=" entry)) "[no type]")
+ :type "bibtex"
+ :link link
+ :description description))))
+
+(provide 'org-bibtex)
+
+
+;;;;##########################################################################
+;;;; User Options, Variables
+;;;;##########################################################################
+
+
+;;; org-bibtex.el ends here
diff --git a/EXPERIMENTAL/org-depend.el b/EXPERIMENTAL/org-depend.el
new file mode 100644
index 0000000..1f0fb17
--- /dev/null
+++ b/EXPERIMENTAL/org-depend.el
@@ -0,0 +1,235 @@
+;;; org-depend.el --- TODO dependencies for Org-mode
+
+;; This file is not part of GNU Emacs.
+;;
+;; This file 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, 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; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+;;
+;; WARNING: This file is just a PROOF OF CONCEPT, not a supported part
+;; of Org-mode.
+;;
+;; This is an example implementation of TODO dependencies in Org-mode.
+;; It uses the new hooks in version 5.13 of Org-mode,
+;; `org-trigger-hook' and `org-blocker-hook'.
+;;
+;; It implements the following:
+;;
+;; Triggering
+;; ----------
+;;
+;; 1) If an entry contains a TRIGGER property that contains the string
+;; "chain-siblings(KEYWORD)", then switching that entry to DONE does
+;; do the following:
+;; - The sibling following this entry switched to todo-state KEYWORD.
+;; - The sibling also gets a TRIGGER property "chain-sibling(KEYWORD)",
+;; property, to make sure that, when *it* is DONE, the chain will
+;; continue.
+;;
+;; 2) If the TRIGGER property contains any other words like
+;; XYZ(KEYWORD), these are treated as entry id's with keywords. That
+;; means, Org-mode will search for an entry with the ID property XYZ
+;; and switch that entry to KEYWORD as well.
+;;
+;; Blocking
+;; --------
+;;
+;; 1) If an entry contains a BLOCKER property that contains the word
+;; "previous-sibling", the sibling above the current entry is
+;; checked when you try to mark it DONE. If it is still in a TODO
+;; state, the current state change is blocked.
+;;
+;; 2) If the BLOCKER property contains any other words, these are
+;; treated as entry id's. That means, Org-mode will search for an
+;; entry with the ID property exactly equal to this word. If any
+;; of these entries is not yet marked DONE, the current state change
+;; will be blocked.
+;;
+;; 3) Whenever a state change is blocked, an org-mark is pushed, so that
+;; you can find the offending entry with `C-c &'.
+;;
+;;; Example:
+;;
+;; When trying this example, make sure that the settings for TODO keywords
+;; have been activated, i.e. include the following line and press C-c C-c
+;; on the line before working with the example:
+;;
+;; #+TYP_TODO: TODO NEXT | DONE
+;;
+;; * TODO Win a million in Las Vegas
+;; The "third" TODO (see above) cannot become a TODO without this money.
+;;
+;; :PROPERTIES:
+;; :ID: I-cannot-do-it-without-money
+;; :END:
+;;
+;; * Do this by doing a chain of TODO's
+;; ** NEXT This is the first in this chain
+;; :PROPERTIES:
+;; :TRIGGER: chain-siblings(NEXT)
+;; :END:
+;;
+;; ** This is the second in this chain
+;;
+;; ** This is the third in this chain
+;; :PROPERTIES:
+;; :BLOCKER: I-cannot-do-it-without-money
+;; :END:
+;;
+;; ** This is the forth in this chain
+;; When this is DONE, we will also trigger entry XYZ-is-my-id
+;; :PROPERTIES:
+;; :TRIGGER: XYZ-is-my-id(TODO)
+;; :END:
+;;
+;; ** This is the fifth in this chain
+;;
+;; * Start writing report
+;; :PROPERTIES:
+;; :ID: XYZ-is-my-id
+;; :END:
+;;
+;;
+
+(require 'org)
+
+(defun org-depend-trigger-todo (change-plist)
+ "Trigger new TODO entries after the current is switched to DONE.
+This does two different kinds of triggers:
+
+- If the current entry contains a TRIGGER property that contains
+ \"chain-siblings(KEYWORD)\", it goes to the next sibling, marks it
+ KEYWORD and also installs the \"chain-sibling\" trigger to continue
+ the chain.
+- Any other word (space-separated) like XYZ(KEYWORD) in the TRIGGER
+ property is seen as an entry id. Org-mode finds the entry with the
+ corresponding ID property and switches it to the state TODO as well."
+
+ ;; Get information from the plist
+ (let* ((type (plist-get change-plist :type))
+ (pos (plist-get change-plist :position))
+ (from (plist-get change-plist :from))
+ (to (plist-get change-plist :to))
+ (org-log-done nil) ; IMPROTANT!: no logging during automatic trigger!
+ trigger triggers tr p1 kwd)
+ (catch 'return
+ (unless (eq type 'todo-state-change)
+ ;; We are only handling todo-state-change....
+ (throw 'return t))
+ (unless (and (member from org-not-done-keywords)
+ (member to org-done-keywords))
+ ;; This is not a change from TODO to DONE, ignore it
+ (throw 'return t))
+
+ ;; OK, we just switched from a TODO state to a DONE state
+ ;; Lets see if this entry has a TRIGGER property.
+ ;; If yes, split it up on whitespace.
+ (setq trigger (org-entry-get pos "TRIGGER")
+ triggers (and trigger (org-split-string trigger "[ \t]+")))
+
+ ;; Go through all the triggers
+ (while (setq tr (pop triggers))
+ (cond
+ ((string-match "\\`chain-siblings(\\(.*?\\))\\'" tr)
+ ;; This is a TODO chain of siblings
+ (setq kwd (match-string 1 tr))
+ (catch 'exit
+ (save-excursion
+ (goto-char pos)
+ ;; find the sibling, exit if no more siblings
+ (condition-case nil
+ (outline-forward-same-level 1)
+ (error (throw 'exit t)))
+ ;; mark the sibling TODO
+ (org-todo kwd)
+ ;; make sure the sibling will continue the chain
+ (org-entry-add-to-multivalued-property
+ nil "TRIGGER" (format "chain-siblings(%s)" kwd)))))
+
+ ((string-match "\\`\\(\\S-+\\)(\\(.*?\\))\\'" tr)
+ ;; This seems to be ENTRY_ID(KEYWORD)
+ (setq id (match-string 1 tr)
+ kwd (match-string 2 tr)
+ p1 (org-find-entry-with-id id))
+ (when p1
+ ;; there is an entry with this ID, mark it TODO
+ (save-excursion
+ (goto-char p1)
+ (org-todo kwd)))))))))
+
+(defun org-depend-block-todo (change-plist)
+ "Block turning an entry into a TODO.
+This checks for a BLOCKER property in an entry and checks
+all the entries listed there. If any of them is not done,
+block changing the current entry into a TODO entry. If the property contains
+the word \"previous-sibling\", the sibling above the current entry is checked.
+Any other words are treated as entry id's. If an entry exists with the
+this ID property, that entry is also checked."
+ ;; Get information from the plist
+ (let* ((type (plist-get change-plist :type))
+ (pos (plist-get change-plist :position))
+ (from (plist-get change-plist :from))
+ (to (plist-get change-plist :to))
+ (org-log-done nil) ; IMPROTANT!: no logging during automatic trigger
+ blocker blockers bl p1)
+ (catch 'return
+ (unless (eq type 'todo-state-change)
+ ;; We are not handling this kind of change
+ (throw 'return t))
+ (unless (and (not from) (member to org-not-done-keywords))
+ ;; This is not a change from nothing to TODO, ignore it
+ (throw 'return t))
+
+ ;; OK, the plan is to switch from nothing to TODO
+ ;; Lets see if we will allow it. Find the BLOCKER property
+ ;; and split it on whitespace.
+ (setq blocker (org-entry-get pos "BLOCKER")
+ blockers (and blocker (org-split-string blocker "[ \t]+")))
+
+ ;; go through all the blockers
+ (while (setq bl (pop blockers))
+ (cond
+ ((equal bl "previous-sibling")
+ ;; the sibling is required to be DONE.
+ (catch 'ignore
+ (save-excursion
+ (goto-char pos)
+ ;; find the older sibling, exit if no more siblings
+ (condition-case nil
+ (outline-backward-same-level 1)
+ (error (throw 'ignore t)))
+ ;; Check if this entry is not yet done and block
+ (unless (org-entry-is-done-p)
+ ;; return nil, to indicate that we block the change!
+ (org-mark-ring-push)
+ (throw 'return nil)))))
+
+ ((setq p1 (org-find-entry-with-id bl))
+ ;; there is an entry with this ID, check it out
+ (save-excursion
+ (goto-char p1)
+ (unless (org-entry-is-done-p)
+ ;; return nil, to indicate that we block the change!
+ (org-mark-ring-push)
+ (throw 'return nil))))))
+ t ; return t to indicate that we are not blocking
+ )))
+
+(add-hook 'org-trigger-hook 'org-depend-trigger-todo)
+(add-hook 'org-blocker-hook 'org-depend-block-todo)
+
+;;; org-depend.el ends here
diff --git a/EXPERIMENTAL/org-elisp-symbol.el b/EXPERIMENTAL/org-elisp-symbol.el
new file mode 100644
index 0000000..05e5afc
--- /dev/null
+++ b/EXPERIMENTAL/org-elisp-symbol.el
@@ -0,0 +1,158 @@
+;;; org-elisp-symbol.el --- Org links to emacs-lisp symbols
+;;
+;; Copyright 2007 Bastien Guerry
+;;
+;; Author: bzg AT altern DOT org
+;; Version: 0.2
+;; Keywords: org, remember, lisp
+;; URL: http://www.cognition.ens.fr/~guerry/u/org-elisp-symbol.el
+;;
+;; This program 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, or (at your option)
+;; any later version.
+;;
+;; This program 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 this program; if not, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;;
+;;; Commentary:
+;;
+;; Org-mode already lets you store/insert links to emacs-lisp files,
+;; just like any other file. This package lets you precisely link to
+;; any emacs-lisp symbol and access uesful information about the symbol.
+;;
+;; Here is the list of available properties when linking from a elisp-symbol:
+;;
+;; :name The symbol's name.
+;; :stype The symbol's type (commandp, function, etc.)
+;; :def The function used to set the symbol's value (defun, etc.)
+;; :keys The keys associated with the command.
+;; :args The arguments of the function.
+;; :docstring The docstring of the symbol.
+;; :doc The first line of the dostring.
+;; :comment A comment line just above the sexp, if any.
+;; :fixme A FIXME comment line just above the sexp, if any.
+;;
+;; Let's say we have a defun like this one:
+;;
+;; ;; FIXME update docstring
+;; (defun org-export-latex-lists ()
+;; "Convert lists to LaTeX."
+;; (goto-char (point-min))
+;; (while (re-search-forward org-export-latex-list-beginning-re nil t)
+;; (beginning-of-line)
+;; (insert (org-list-to-latex (org-list-parse-list t)) "\n")))
+;;
+;; And a remember template like:
+;;
+;; (setq org-remember-templates
+;; '((?s "* DEBUG `%:name' (%:args)\n\n%?\n\nFixme: %:fixme\n \
+;; Doc: \"%:doc\"\n\n%a")))
+;;
+;; Then M-x `org-remember' on this sexp will produce this buffer:
+;;
+;; =====================================================================
+;; * DEBUG `org-export-latex-lists' ()
+;;
+;; <== point
+;;
+;; Fixme: update the docstring
+;; Doc: "Convert lists to LaTeX."
+;;
+;; [[file:~/path/file.el::defun%20org-export-latex-lists][Function: org-export-latex-lists]]
+;; =====================================================================
+;;
+;; Put this file into your load-path and the following into your ~/.emacs:
+;; (require 'org-elisp-symbol)
+
+;;; Code:
+
+(provide 'org-elisp-symbol)
+
+(require 'org)
+
+(org-add-link-type "elisp-symbol" 'org-elisp-symbol-open)
+(add-hook 'org-store-link-functions 'org-elisp-symbol-store-link)
+
+(defun org-elisp-symbol-open (path)
+ "Visit the emacs-lisp elisp-symbol at PATH."
+ (let* ((search (when (string-match "::\\(.+\\)\\'" path)
+ (match-string 1 path)))
+ (path (substring path 0 (match-beginning 0))))
+ (org-open-file path t nil search)))
+
+(defun org-elisp-symbol-store-link ()
+ "Store a link to an emacs-lisp elisp-symbol."
+ (when (eq major-mode 'emacs-lisp-mode)
+ (save-excursion
+ (or (looking-at "^(") (beginning-of-defun))
+ (looking-at "^(\\([a-z]+\\) \\([^)\n ]+\\) ?\n?[ \t]*\\(?:(\\(.*\\))\\)?")
+ (let* ((end (save-excursion
+ (save-match-data
+ (end-of-defun) (point))))
+ (def (match-string 1))
+ (name (match-string 2))
+ (sym-name (intern-soft name))
+ (stype (cond ((commandp sym-name) "Command")
+ ((functionp sym-name) "Function")
+ ((user-variable-p sym-name) "User variable")
+ ((eq def "defvar") "Variable")
+ ((eq def "defmacro") "Macro")
+ (t "Symbol")))
+ (args (if (match-string 3)
+ (mapconcat (lambda (a) (unless (string-match "^&" a) a))
+ (split-string (match-string 3)) " ")
+ "no arg"))
+ (docstring (cond ((functionp sym-name)
+ (documentation sym-name))
+ ((string-match "[Vv]ariable" stype)
+ (documentation-property sym-name
+ 'variable-documentation))
+ (t "no documentation")))
+ (doc (and (string-match "^\\([^\n]+\\)$" docstring)
+ (match-string 1 docstring)))
+ (fixme (save-excursion
+ (beginning-of-defun) (end-of-defun)
+ (if (re-search-forward "^;+ ?FIXME[ :]*\\(.*\\)$" end t)
+ (match-string 1) "nothing to fix")))
+ (comment (save-excursion
+ (beginning-of-defun) (end-of-defun)
+ (if (re-search-forward "^;;+ ?\\(.*\\)$" end t)
+ (match-string 1) "no comment")))
+ keys keys-desc link description)
+ (if (equal stype "Command")
+ (setq keys (where-is-internal sym-name)
+ keys-desc
+ (if keys (mapconcat 'key-description keys " ") "none")))
+ (setq link (concat "file:" (abbreviate-file-name buffer-file-name)
+ "::" def " " name))
+ (setq description (concat stype ": " name))
+ (org-store-link-props
+ :type "elisp-symbol"
+ :link link
+ :description description
+ :def def
+ :name name
+ :stype stype
+ :args args
+ :keys keys-desc
+ :docstring docstring
+ :doc doc
+ :fixme fixme
+ :comment comment)))))
+
+(provide 'org-elisp-symbol)
+
+
+;;;;##########################################################################
+;;;; User Options, Variables
+;;;;##########################################################################
+
+
+;;; org-elisp-symbol.el ends here
diff --git a/EXPERIMENTAL/org-fastup.el b/EXPERIMENTAL/org-fastup.el
new file mode 100644
index 0000000..a791c5f
--- /dev/null
+++ b/EXPERIMENTAL/org-fastup.el
@@ -0,0 +1,135 @@
+;; Then I don't really thing you would have to be able to customize
+;; this, as there are only very few operations for which this makes
+;; sense:
+
+;; A**** Archive
+;; T**** Mark TODO
+;; D**** Mark DONE
+;; N**** Cycle TODO to the next state
+
+;; Can't really think of anything else.
+
+
+;; I prefer configurable, because then people can use numbers. This is
+;; the idea that the editor may have limited UI. I'm using a j2me based
+;; editor called JPE at the moment:
+;; http://my-communicator.com/s80/software/applications.php?fldAuto=556&faq=2
+
+;; But other people may be using something like this:
+;; http://www.getjar.com/products/3960/TextEditor
+
+;; Or this which i'm currently playing with:
+;; http://www.bermin.net/index.html
+
+;; As for other things, it depends on what you want emacs to be able to
+;; do with an externally changed org mode file. For me this is about
+;; using org mode in an intelligent way with my mobile phone/pda. I can
+;; imagine wanting to write functions like:
+
+;; * move this huge piece of text and tables down a level
+;; <* move this huge piece of text and tables up a level
+;; M* ask to recategorise this heading when i open org mode
+;; +* remind me about this when i open org mode so i can brain dump on it
+;; in a real editor.
+;; D* ask me to schedule this as an event when i open org mode.
+;; O* open my mail client to send an email to this email address i just got
+;; C* search bbdb for the contact details of the phone no on this line.
+;; c* search ldap for the contact details of this name
+;; B* open a web browser to this link i wanted to check out when i got back to my machine
+;; R* remind me to look at TheseSearchTags headings when i get back to my machine.
+
+
+(defcustom org-fastup-action-alist
+ '((?A org-archive t)
+ (?T (org-todo 1) nil)
+ (?D (org-todo (length org-todo-keywords)) nil)
+ (?N org-todo nil)
+ (?< org-promote-subtree t)
+ (?> org-demote-subtree t)
+ (?M org-set-tags nil)
+ (?S org-schedule t))
+ "List of fastupdate actions.
+Each entry in this list is a list of 3 items:
+
+- A character representing the fastupdate action
+- A function or form to be executed, with cursor at beginning of headline
+- A flag indicating if execution of this action should normally be confirmed."
+ :group 'org-fastup
+ :type '(repeat
+ (list :value (?a nil t)
+ (character :tag "Prefix char")
+ (choice
+ (const :tag "Archive this subtree" org-archive)
+ (const :tag "Make TODO" (org-todo 1))
+ (const :tag "Mark DONE" (org-todo (length org-todo-keywords)))
+ (const :tag "Cycle TODO" org-todo)
+ (const :tag "Promote subtree" org-promote-subtree)
+ (const :tag "Demote subtree" org-demote-subtree)
+ (const :tag "Set Tags" org-set-tags)
+ (const :tag "Schedule" org-schedule)
+ (const :tag "Set Deadline" org-schedule)
+ (sexp))
+ (boolean :tag "Confirm"))))
+
+(defun org-fastup-check-buffer ()
+ "Check for and execute fastupdate actions.
+This first checks if there are any fastupdate actions in the buffer.
+If yes, the user is asked for a processing mode, with three possibilities
+with respect to confirming actions:
+
+Always confirm each action before executing it
+Never execute all actions without prior confirmation
+Maybe get only confirmation for actions that have been configured
+ as requiring confirmation in `org-fastup-action-alist'.
+
+The command will then walk through the buffer, stop at each eaction
+and do the right thing there."
+ (interactive)
+ (show-all) ; make everything visible
+ (let ((start (point-min))
+ ;; FIXME: should I limit the regexp to match existing actions?
+ ;; I think not, to catch typos
+ (re "^\\([-a-zA-Z0-9!@#$%^&+?<>]\\)\\*+")
+ s action confirm)
+ (if (not (save-excursion
+ (goto-char (point-min))
+ (re-search-forward re nil t)))
+ (if (interactive-p) (message "No fastupdate actions in this buffer"))
+ (goto-char start)
+ (message "Fastupdate: Confirm actions [A]lways [Maybe] [N]ever, or [Q]uit?")
+ (setq reaction (read-char-exclusive))
+ (cond
+ ((memq reaction '(?q ?Q)) (error "Abort"))
+ ((memq reaction '(?a ?A)) (setq cf 'always))
+ ((memq reaction '(?m ?M)) (setq cf 'maybe))
+ ((memq reaction '(?n ?N)) (setq cf 'never)))
+ (while (re-search-forward re nil t)
+ (goto-char (setq start (match-beginning 0)))
+ (setq s (match-string 1)
+ entry (assoc (string-to-char s) org-fastup-action-alist)
+ action (nth 1 entry)
+ confirm (nth 2 entry))
+ (cond
+ ((null action)
+ (if (y-or-n-p "Unknown action. Remove fastupdate character? ")
+ (delete-region start (1+ start))
+ (goto-char (1+ start))))
+ ((or (equal cf 'never)
+ (and (eq cf 'maybe) (not confirm))
+ (y-or-n-p (format "execute action [%s] " s)))
+ (delete-region start (1+ start))
+ ;; FIXME: wrap the following into condition-case and
+ ;; handle any errors in some way.
+ (if (symbolp action) (funcall action) (eval action))
+ ;; FIXME: remove the sit-for
+ (sit-for 2))
+ (t
+ (if (y-or-n-p "Action denied. Remove fastupdate character? ")
+ ;; Remove the character, without action.
+ (delete-region start (1+ start))
+ ;; Just leave the character in and skip this location
+ (goto-char (1+ start)))))))))
+
+
+
+
diff --git a/EXPERIMENTAL/org-indent.el b/EXPERIMENTAL/org-indent.el
new file mode 100644
index 0000000..b9af669
--- /dev/null
+++ b/EXPERIMENTAL/org-indent.el
@@ -0,0 +1,107 @@
+;; Need to hook into demotion, promotion functions: Redo the entire subtree
+
+;; Problem: I have this huge list of overlays, should I be able
+;; to reuse them?
+
+; should be a mode...
+(defconst org-indent-strings (make-vector 80 nil))
+(loop for i from 0 to 79 do
+ (aset org-indent-strings i (org-add-props (make-string i ?\ )
+ nil 'face '(:underline nil :background "grey95"))))
+
+(defvar org-indent-overlays nil)
+(make-variable-buffer-local 'org-indent-overlays)
+
+(defun org-indent-initialize-buffer ()
+ (interactive)
+ (when (org-mode-p)
+ (org-remove-indent-overlays)
+ (let (n)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (while (< (point) (point-max))
+ (cond
+ ((looking-at outline-regexp)
+ (setq n (1+ (funcall outline-level))))
+ (n
+ (setq ov (org-make-overlay (1- (point)) (point)))
+ (org-overlay-put ov 'after-string (aref org-indent-strings n))
+ (org-overlay-put ov 'evaporate t)
+ (org-overlay-put ov 'rear-sticky nil)
+ (org-overlay-put ov 'front-sticky nil)
+ (org-overlay-put ov 'org-indent n)
+ (push ov org-indent-overlays)))
+ (beginning-of-line 2)))))))
+
+(run-with-idle-timer 10 t 'org-indent-initialize-buffer)
+
+(defun org-indent-refresh (start end)
+ "Refresh indentation overlays in the range given."
+ (save-excursion
+ (goto-char start)
+ (when (search-forward "\n" end t)
+ (goto-char start)
+ (beginning-of-line 0)
+ (let ((n (or (get-char-property (max (point-min) (1- (point)))
+ 'org-indent) 0))
+ ov e)
+ (while (<= (point) end)
+ (mapc (lambda (x) (if (org-overlay-get x 'org-indent)
+ (if (> (setq e (org-overlay-end x)) (point))
+ (org-move-overlay x (1- e) e)
+ (org-delete-overlay x)
+ (setq org-indent-overlays
+ (delq x org-indent-overlays)))))
+ (overlays-at (max (point-min) (1- (point)))))
+ (cond
+ ((looking-at outline-regexp)
+ (setq n (1+ (funcall outline-level))))
+ (n
+ (setq ov (org-make-overlay (1- (point)) (point)))
+ (org-overlay-put ov 'after-string (aref org-indent-strings n))
+ (org-overlay-put ov 'evaporate t)
+ (org-overlay-put ov 'rear-sticky nil)
+ (org-overlay-put ov 'front-sticky nil)
+ (org-overlay-put ov 'org-indent n)
+ (push ov org-indent-overlays)))
+ (beginning-of-line 2))))))
+
+(defun org-remove-indent-overlays ()
+ (interactive)
+ (mapc 'org-delete-overlay org-indent-overlays)
+ (setq org-indent-overlays nil))
+
+(defun org-indent-after-change-function (start end length)
+ "After change function for org-indent.
+Notices when an insert has added some lines and adjusts
+the line number extents accordingly."
+ (if (= start end)
+ () ;; this is a deletion
+ (org-indent-refresh start end)))
+
+(add-hook 'after-change-functions 'org-indent-after-change-function)
+
+(defun org-fixup-indentation (diff)
+ ""
+ (save-excursion
+ (let ((end (save-excursion (outline-next-heading)
+ (point-marker)))
+ (prohibit (if (> diff 0)
+ "^\\S-"
+ (concat "^ \\{0," (int-to-string (- diff)) "\\}\\S-")))
+ col)
+ (if (eq org-adapt-indentation 'virtual)
+ (org-indent-refresh (point) end)
+ (unless (save-excursion (end-of-line 1)
+ (re-search-forward prohibit end t))
+ (while (and (< (point) end)
+ (re-search-forward "^[ \t]+" end t))
+ (goto-char (match-end 0))
+ (setq col (current-column))
+ (if (< diff 0) (replace-match ""))
+ (indent-to (+ diff col))))
+ (move-marker end nil)))))
+
+(setq org-adapt-indentation 'virtual) \ No newline at end of file
diff --git a/EXPERIMENTAL/org-panel.el b/EXPERIMENTAL/org-panel.el
new file mode 100644
index 0000000..a039942
--- /dev/null
+++ b/EXPERIMENTAL/org-panel.el
@@ -0,0 +1,642 @@
+;;; org-panel.el --- Simple routines for us with bad memory
+;;
+;; Author: Lennart Borgman (lennart O borgman A gmail O com)
+;; Created: Thu Nov 15 15:35:03 2007
+;; Version: 0.21
+;; Lxast-Updated: Wed Nov 21 03:06:03 2007 (3600 +0100)
+;; URL:
+;; Keywords:
+;; Compatibility:
+;;
+;; Fxeatures that might be required by this library:
+;;
+;; `easymenu', `font-lock', `noutline', `org', `outline', `syntax',
+;; `time-date'.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+;;
+;; This defines a kind of control panel for `org-mode'. This control
+;; panel should make it fast to move around and edit structure etc.
+;;
+;; To bring up the control panel type
+;;
+;; M-x orgpan-panel
+;;
+;; Type ? there for help.
+;;
+;; I suggest you add the following to your .emacs for quick access of
+;; the panel:
+;;
+;; (eval-after-load 'org-mode
+;; (define-key org-mode-map [(control ?c) ?p] 'orgpan-panel))
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Change log:
+;;
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; This program 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 2, or
+;; (at your option) any later version.
+;;
+;; This program 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 this program; see the file COPYING. If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
+;; Floor, Boston, MA 02110-1301, USA.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Code:
+
+(require 'org)
+(require 'outline)
+
+;; Fix-me: this is for testing. A minor mode version interferes badly
+;; with emulation minor modes. On the other hand, the other version
+;; interferes badly with (interactive ...).
+(defvar orgpan-minor-mode-version t)
+
+(defface orgpan-field
+ '((t (:inherit 'widget-field)))
+ "Face for fields."
+ :group 'winsize)
+(defvar orgpan-field-face 'orgpan-field)
+
+(defface orgpan-active-field
+ '((t (:inherit 'highlight)))
+ "Face for fields."
+ :group 'winsize)
+(defvar orgpan-active-field-face 'orgpan-active-field)
+
+(defface orgpan-spaceline
+ '((t (:height 0.2)))
+ "Face for spacing lines."
+ :group 'winsize)
+
+(defcustom orgpan-panel-buttons nil
+ "Panel style, if non-nil use buttons.
+If there are buttons in the panel they are used to change the way
+the arrow keys work. The panel looks something like this, with
+the first button chosen:
+
+ [Navigate] [Restructure] [TODO/Priority]
+ ----------
+ up/down, left: Go to, right: Visibility
+
+The line below the buttons try to give a short hint about what
+the arrow keys does. \(Personally I prefer the version without
+buttons since I then do not have to remember which button is
+active.)"
+ :type 'boolean
+ :group 'winsize)
+
+;; Fix-me: add org-mode-map
+(defconst orgpan-org-mode-commands nil)
+(defconst orgpan-org-commands
+ '(
+ orgpan-copy-subtree
+ orgpan-cut-subtree
+ orgpan-paste-subtree
+ undo
+ ;;
+ ;orgpan-occur
+ ;;
+ org-cycle
+ org-global-cycle
+ outline-up-heading
+ outline-next-visible-heading
+ outline-previous-visible-heading
+ outline-forward-same-level
+ outline-backward-same-level
+ org-todo
+ org-show-todo-tree
+ org-priority-up
+ org-priority-down
+ org-move-subtree-up
+ org-move-subtree-down
+ org-do-promote
+ org-do-demote
+ org-promote-subtree
+ org-demote-subtree))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Hook functions etc
+
+;;(defvar orgpan-this-panel-window nil)
+
+(defun orgpan-delete-panel ()
+ "Remove the panel."
+ (interactive)
+ (when (buffer-live-p orgpan-panel-buffer)
+ (delete-windows-on orgpan-panel-buffer)
+ (kill-buffer orgpan-panel-buffer))
+ (setq orgpan-panel-buffer nil)
+ (setq orgpan-panel-window nil)
+ (orgpan-panel-minor-mode 0)
+ (remove-hook 'post-command-hook 'orgpan-minor-post-command)
+ (remove-hook 'post-command-hook 'orgpan-mode-post-command)
+ ;;(remove-hook 'window-configuration-change-hook 'orgpan-window-config-change)
+ )
+
+(defvar orgpan-last-command-was-from-panel nil)
+(defun orgpan-mode-pre-command ()
+ (setq orgpan-last-command-was-from-panel nil)
+ (condition-case err
+ (if (not (and (windowp orgpan-org-window)
+ (window-live-p orgpan-org-window)))
+ (progn
+ (setq this-command 'ignore)
+ (orgpan-delete-panel)
+ (message "The window belonging to the panel had disappeared, removed panel."))
+ (let ((buf (window-buffer orgpan-org-window)))
+ (when (with-current-buffer buf
+ (derived-mode-p 'org-mode))
+ (setq orgpan-last-org-buffer buf))
+ ;; Fix me: add a list of those commands that are not
+ ;; meaningful from the panel (for example org-time-stamp)
+ (when (or (memq this-command orgpan-org-commands)
+ (memq this-command orgpan-org-mode-commands)
+ ;; For some reason not all org commands are found above:
+ (string= "org-" (substring (format "%s" this-command) 0 4)))
+ (if (not (with-current-buffer buf
+ (derived-mode-p 'org-mode)))
+ (progn
+ (if (buffer-live-p orgpan-org-buffer)
+ (set-window-buffer orgpan-org-window orgpan-org-buffer)
+ (message "Please use `l' or `b' to choose an org-mode buffer"))
+ (setq this-command 'ignore))
+ (setq orgpan-org-buffer (window-buffer orgpan-org-window))
+ (setq orgpan-last-command-was-from-panel t)
+ (select-window orgpan-org-window)
+ ;;(when (active-minibuffer-window
+ ;;(set-buffer orgpan-org-buffer)
+ ))))
+ (error (lwarn 't :warning "orgpan-pre: %S" err))))
+
+(defun orgpan-mode-post-command ()
+ (condition-case err
+ (progn
+ (unless (and (windowp orgpan-panel-window)
+ (window-live-p orgpan-panel-window)
+ (bufferp orgpan-panel-buffer)
+ (buffer-live-p orgpan-panel-buffer))
+ ;;(orgpan-delete-panel)
+ )
+ (when (and orgpan-last-command-was-from-panel
+ (windowp orgpan-panel-window)
+ (window-live-p orgpan-panel-window))
+ (select-window orgpan-panel-window)
+ (when (derived-mode-p 'orgpan-mode)
+ (setq deactivate-mark t)
+ (when orgpan-panel-buttons
+ (unless (and orgpan-point
+ (= (point) orgpan-point))
+ ;; Go backward so it is possible to click on a "button":
+ (orgpan-backward-field)))))
+ (setq orgpan-this-panel-window nil))
+ (error (lwarn 't :warning "orgpan-post: %S" err))))
+
+;; (defun orgpan-window-config-change ()
+;; "Check if any frame is displaying an orgpan panel.
+;; If not remove `orgpan-mode-post-command' and this function from
+;; the hooks."
+;; (condition-case err
+;; (unless (and (
+;; (let ((found-pan nil))
+;; (dolist (f (frame-list))
+;; (dolist (w (window-list f 'nomini))
+;; (with-current-buffer (window-buffer w)
+;; (when (derived-mode-p 'orgpan-mode)
+;; (setq found-pan t)))))
+;; (unless found-pan
+;; (remove-hook 'post-command-hook 'orgpan-mode-post-command)
+;; (remove-hook 'window-configuration-change-hook 'orgpan-window-config-change)))
+;; (error (lwarn 't :warning "Error in orgpan-config-change: %S" err))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Commands
+
+(defun orgpan-last-buffer ()
+ "Open last org-mode buffer in panels org window."
+ (interactive)
+ (let ((buf (window-buffer orgpan-org-window))
+ (last-buf orgpan-last-org-buffer))
+ (when (with-current-buffer buf
+ (derived-mode-p 'org-mode))
+ (setq orgpan-last-org-buffer buf))
+ (when (eq last-buf buf)
+ (setq last-buf nil))
+ (if (not last-buf)
+ (orgpan-switch-buffer)
+ (set-window-buffer orgpan-org-window last-buf))))
+
+(defun orgpan-switch-buffer ()
+ "Switch to next org-mode buffer in panels org window."
+ (interactive)
+ (let ((buf (window-buffer orgpan-org-window))
+ (org-buffers nil))
+ (with-current-buffer buf
+ (when (derived-mode-p 'org-mode)
+ (bury-buffer buf)
+ (setq orgpan-last-org-buffer buf)))
+ (setq org-buffers (delq nil (mapcar (lambda (buf)
+ (when (with-current-buffer buf
+ (derived-mode-p 'org-mode))
+ buf))
+ (buffer-list))))
+ (setq org-buffers (delq buf org-buffers))
+ (set-window-buffer orgpan-org-window (car org-buffers))
+ (setq orgpan-org-buffer (car org-buffers))))
+
+(defun orgpan-paste-subtree ()
+ (interactive)
+ (if (y-or-n-p "Paste subtree here? ")
+ (org-paste-subtree)
+ (message "Nothing was pasted")))
+
+(defun orgpan-cut-subtree ()
+ (interactive)
+ (let ((heading (progn
+ (org-back-to-heading)
+ (buffer-substring (point) (line-end-position))
+ )))
+ (if (y-or-n-p (format "Do you want to cut the subtree\n%s\n? " heading))
+ (org-cut-subtree)
+ (message "Nothing was cut"))))
+
+(defun orgpan-copy-subtree ()
+ (interactive)
+ (let ((heading (progn
+ (org-back-to-heading)
+ (buffer-substring (point) (line-end-position))
+ )))
+ (if (y-or-n-p (format "Do you want to copy the subtree\n%s\n? " heading))
+ (org-copy-subtree)
+ (message "Nothing was copied"))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Buttons
+
+(defvar orgpan-ovl-help nil)
+
+(defun orgpan-check-panel-mode ()
+ (unless (derived-mode-p 'orgpan-mode)
+ (error "Not orgpan-mode in buffer: " major-mode)))
+
+(defun orgpan-display-bindings-help ()
+ (orgpan-check-panel-mode)
+ (setq orgpan-point (point))
+ (let* ((ovls (overlays-at (point)))
+ (ovl (car ovls))
+ (help (when ovl (overlay-get ovl 'orgpan-explain))))
+ (dolist (o (overlays-in (point-min) (point-max)))
+ (overlay-put o 'face orgpan-field-face))
+ (overlay-put ovl 'face orgpan-active-field-face)
+ (overlay-put orgpan-ovl-help 'before-string help)))
+
+(defun orgpan-forward-field ()
+ (interactive)
+ (orgpan-check-panel-mode)
+ (let ((pos (next-overlay-change (point))))
+ (unless (overlays-at pos)
+ (setq pos (next-overlay-change pos)))
+ (when (= pos (point-max))
+ (setq pos (point-min))
+ (unless (overlays-at pos)
+ (setq pos (next-overlay-change pos))))
+ (goto-char pos))
+ (orgpan-display-bindings-help))
+
+(defun orgpan-backward-field ()
+ (interactive)
+ (orgpan-check-panel-mode)
+ (when (= (point) (point-min))
+ (goto-char (point-max)))
+ (let ((pos (previous-overlay-change (point))))
+ (unless (overlays-at pos)
+ (setq pos (previous-overlay-change pos)))
+ (goto-char pos))
+ (orgpan-display-bindings-help))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Mode
+
+(defconst orgpan-mode-map
+ ;; Fix-me: clean up here!
+ ;; Fix-me: viper support
+ (let ((map (make-sparse-keymap)))
+ (define-key map [?q] 'orgpan-delete-panel)
+ (define-key map [??] 'orgpan-help)
+ ;; Copying etc
+ (define-key map [?c] 'orgpan-copy-subtree)
+ (define-key map [?x] 'orgpan-cut-subtree)
+ (define-key map [?p] 'orgpan-paste-subtree)
+ (define-key map [?z] 'undo)
+ ;; Buffers:
+ (define-key map [?b] 'orgpan-switch-buffer)
+ (define-key map [?l] 'orgpan-last-buffer)
+ ;; Some keys for moving between headings. Emacs keys for next/prev
+ ;; line seems ok:
+ (define-key map [(control ?p)] 'outline-previous-visible-heading)
+ (define-key map [(control ?n)] 'outline-next-visible-heading)
+ (define-key map [(shift control ?p)] 'outline-backward-same-level)
+ (define-key map [(shift control ?n)] 'outline-forward-same-level)
+ ;; A mnemunic for up:
+ (define-key map [(control ?u)] 'outline-up-heading)
+ ;; Search sparse tree:
+ ;;
+ ;; Fix-me: Search does not work, some problem with
+ ;; interactive. Probably have to turn the whole thing around and
+ ;; always be in the org buffer, but with a minor mode running
+ ;; there.
+ ;;
+ ;;(define-key map [?s] 'org-sparse-tree)
+ (define-key map [?s] 'orgpan-occur)
+ ;; Same as in org-mode:
+ ;;(define-key map [(control ?c)(control ?v)] 'org-show-todo-tree)
+ ;; Fix-me: This leads to strange problems:
+ ;;(define-key map [t] 'ignore)
+ map))
+
+(defun orgpan-occur ()
+ "Replacement for `org-occur'.
+Technical reasons."
+ (interactive)
+ (let ((rgx (read-from-minibuffer "my mini Regexp: ")))
+ (setq orgpan-last-command-was-from-panel t)
+ (select-window orgpan-org-window)
+ (org-occur rgx)))
+
+(defvar orgpan-panel-window nil
+ "The window showing `orgpan-panel-buffer'.")
+
+(defvar orgpan-panel-buffer nil
+ "The panel buffer.
+There can be only one such buffer at any time.")
+
+(defvar orgpan-org-window nil)
+;;(make-variable-buffer-local 'orgpan-org-window)
+
+;; Fix-me: used?
+(defvar orgpan-org-buffer nil)
+;;(make-variable-buffer-local 'orgpan-org-buffer)
+
+(defvar orgpan-last-org-buffer nil)
+;;(make-variable-buffer-local 'orgpan-last-org-buffer)
+
+(defvar orgpan-point nil)
+;;(make-variable-buffer-local 'orgpan-point)
+
+(defun orgpan-avoid-viper-in-buffer ()
+ ;; Fix-me: This is ugly. However see `this-major-mode-requires-vi-state':
+ (set (make-local-variable 'viper-emacs-state-mode-list) '(orgpan-mode))
+ (set (make-local-variable 'viper-new-major-mode-buffer-list) nil)
+ (local-set-key [?\ ] 'ignore))
+
+(define-derived-mode orgpan-mode nil "Org-Panel"
+ "Mode for org-simple.el control panel."
+ (setq buffer-read-only t)
+ (unless orgpan-minor-mode-version
+ (add-hook 'pre-command-hook 'orgpan-mode-pre-command nil t)
+ (add-hook 'post-command-hook 'orgpan-mode-post-command t))
+ (orgpan-avoid-viper-in-buffer)
+ (setq cursor-type nil))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Panel layout
+
+(defun orgpan-insert-field (text keymap explain)
+ (insert text)
+ (let* ((end (point))
+ (len (length text))
+ (beg (- end len))
+ (ovl (make-overlay beg end)))
+ (overlay-put ovl 'face orgpan-field-face)
+ (overlay-put ovl 'keymap keymap)
+ (overlay-put ovl 'orgpan-explain explain)))
+
+(defconst orgpan-with-keymap
+ (let ((map (make-sparse-keymap)))
+ (set-keymap-parent map org-mode-map)
+ ;; Users are used to tabbing between fields:
+ (define-key map [(tab)] 'orgpan-forward-field)
+ (define-key map [(shift tab)] 'orgpan-backward-field)
+ ;; Now we must use something else for visibility (first does not work if Viper):
+ (define-key map [(meta tab)] 'org-cycle)
+ (define-key map [(control meta tab)] 'org-global-cycle)
+ map))
+
+(defconst orgpan-without-keymap
+ (let ((map (make-sparse-keymap)))
+ (set-keymap-parent map org-mode-map)
+ ;; Visibility (those are in org-mode-map):
+ ;;(define-key map [tab] 'org-cycle)
+ ;;(define-key map [(shift tab)] 'org-global-cycle)
+ ;; Navigate:
+ (define-key map [left] 'outline-up-heading)
+ (define-key map [right] 'org-cycle)
+ (define-key map [up] 'outline-previous-visible-heading)
+ (define-key map [down] 'outline-next-visible-heading)
+ (define-key map [(shift down)] 'outline-forward-same-level)
+ (define-key map [(shift up)] 'outline-backward-same-level)
+ ;; Restructure:
+ (define-key map [(control up)] 'org-move-subtree-up)
+ (define-key map [(control down)] 'org-move-subtree-down)
+ (define-key map [(control left)] 'org-do-promote)
+ (define-key map [(control right)] 'org-do-demote)
+ (define-key map [(control shift left)] 'org-promote-subtree)
+ (define-key map [(control shift right)] 'org-demote-subtree)
+ ;; Todo etc
+ (define-key map [?+] 'org-priority-up)
+ (define-key map [?-] 'org-priority-down)
+ (define-key map [?t] 'org-todo)
+ map))
+
+(defun orgpan-make-panel-without-buttons (buf)
+ (with-current-buffer buf
+ (insert (propertize "Org Panel" 'face 'orgpan-active-field))
+ (insert " ? for help, q quit\n")
+ (insert (propertize "arrows" 'face 'font-lock-keyword-face)
+ ": Go to, "
+ (propertize "C-arrows" 'face 'font-lock-keyword-face)
+ ": Edit tree\n"
+ (propertize "cxpz" 'face 'font-lock-keyword-face)
+ ": copy cut paste undo, "
+ (propertize "tT+-" 'face 'font-lock-keyword-face)
+ ": todo priority, "
+ (propertize "s" 'face 'font-lock-keyword-face)
+ " search"
+ )
+ (set-keymap-parent orgpan-mode-map orgpan-without-keymap)
+ ))
+
+(defun orgpan-make-panel-with-buttons (buf)
+ (with-current-buffer buf
+ (let* ((base-map (make-sparse-keymap))
+ (space-line (propertize "\n\n" 'face 'orgpan-spaceline))
+ (arrow-face 'font-lock-keyword-face)
+ (L (propertize "left" 'face arrow-face))
+ (R (propertize "right" 'face arrow-face))
+ (U (propertize "up" 'face arrow-face))
+ (D (propertize "down" 'face arrow-face)))
+ ;;(message D)(sit-for 2)
+ (define-key base-map [left] 'ignore)
+ (define-key base-map [right] 'ignore)
+ (define-key base-map [up] 'ignore)
+ (define-key base-map [down] 'ignore)
+ (define-key base-map [?q] 'delete-window)
+ (define-key base-map [??] 'orgpan-help)
+ ;; Navigating
+ (let ((map (copy-keymap base-map)))
+ (define-key map [left] 'outline-up-heading)
+ (define-key map [right] 'org-cycle)
+ (define-key map [up] 'outline-previous-visible-heading)
+ (define-key map [down] 'outline-next-visible-heading)
+ (define-key map [(shift down)] 'outline-forward-same-level)
+ (define-key map [(shift up)] 'outline-backward-same-level)
+ (orgpan-insert-field "Navigate" map (concat U "/" D ", " L ": Go to, " R ": Visibility")))
+ (insert " ")
+ (let ((map (copy-keymap base-map)))
+ (define-key map [up] 'org-move-subtree-up)
+ (define-key map [down] 'org-move-subtree-down)
+ (define-key map [left] 'org-do-promote)
+ (define-key map [right] 'org-do-demote)
+ (define-key map [(shift left)] 'org-promote-subtree)
+ (define-key map [(shift right)] 'org-demote-subtree)
+ (orgpan-insert-field
+ "Restructure" map
+ (concat U "/" D ": "
+ (propertize "Move" 'face 'font-lock-warning-face)
+ ", " L "/" R ": "
+ (propertize "Level (w S: Subtree Level)" 'face 'font-lock-warning-face))))
+ (insert " ")
+ (let ((map (copy-keymap base-map)))
+ (define-key map [up] 'org-priority-up)
+ (define-key map [down] 'org-priority-down)
+ (define-key map [right] 'org-todo)
+ (orgpan-insert-field "TODO/priority" map
+ (concat R ": TODO, " U "/" D ": Priority")))
+ )
+ (insert " ? for help, q quit\n")
+ (orgpan-display-bindings-help)
+ (setq orgpan-ovl-help (make-overlay (point) (point)))
+ ))
+
+(defun orgpan-make-panel-buffer ()
+ "Make the panel buffer."
+ (let* ((buf-name "*Org Panel*"))
+ (when orgpan-panel-buffer (kill-buffer orgpan-panel-buffer))
+ (setq orgpan-panel-buffer (get-buffer-create buf-name))
+ (if orgpan-panel-buttons
+ (orgpan-make-panel-with-buttons orgpan-panel-buffer)
+ (orgpan-make-panel-without-buttons orgpan-panel-buffer))
+ (with-current-buffer orgpan-panel-buffer
+ (orgpan-mode)
+ (goto-char (point-min)))
+ orgpan-panel-buffer))
+
+(defun orgpan-help ()
+ (interactive)
+ (set-keymap-parent orgpan-with-keymap nil)
+ (set-keymap-parent orgpan-without-keymap nil)
+ (describe-function 'orgpan-panel)
+ (set-keymap-parent orgpan-with-keymap org-mode-map)
+ (set-keymap-parent orgpan-without-keymap org-mode-map)
+ (message "Use 'l' to remove help window")
+ )
+
+(defun orgpan-panel ()
+ "Create a control panel for current `org-mode' buffer.
+The control panel may be used to quickly move around and change
+the headings. The idea is that when you want to to a lot of this
+kind of editing you should be able to do that with few
+keystrokes (and without having to remember the complicated
+keystrokes). A typical situation when this perhaps can be useful
+is when you are looking at your notes file \(usually ~/.notes,
+see `remember-data-file') where you have saved quick notes with
+`remember'.
+
+The keys below are defined in the panel. Note that the commands
+are carried out in the `org-mode' buffer that belongs to the
+panel.
+
+\\{orgpan-mode-map}
+
+In addition to the keys above most of the keys in `org-mode' can
+also be used from the panel.
+
+Note: There are two forms of the control panel, one with buttons
+and one without. The default is without, see
+`orgpan-panel-buttons'. If buttons are used choosing a different
+button changes the binding of the arrow keys."
+ (interactive)
+ (unless (derived-mode-p 'org-mode)
+ (error "Buffer is not in org-mode"))
+ (orgpan-delete-panel)
+ (unless orgpan-org-mode-commands
+ (map-keymap (lambda (ev def)
+ (when (and def
+ (symbolp def)
+ (fboundp def))
+ (setq orgpan-org-mode-commands
+ (cons def orgpan-org-mode-commands))))
+ org-mode-map))
+ ;;(org-back-to-heading)
+ ;;(remove-hook 'window-configuration-change-hook 'orgpan-window-config-change)
+ (split-window)
+ (set-window-buffer (selected-window) (orgpan-make-panel-buffer))
+ (setq orgpan-panel-window (selected-window))
+ ;;(set-window-dedicated-p (selected-window) t)
+ (fit-window-to-buffer nil nil 3)
+ (setq orgpan-org-window (next-window))
+ ;; The minor mode version starts here:
+ (when orgpan-minor-mode-version
+ (select-window orgpan-org-window)
+ (orgpan-panel-minor-mode 1)
+ (add-hook 'post-command-hook 'orgpan-minor-post-command t)))
+
+(defun orgpan-minor-post-command ()
+ (unless (and
+ ;; Check org window and buffer
+ (windowp orgpan-org-window)
+ (window-live-p orgpan-org-window)
+ (eq orgpan-org-window (selected-window))
+ (derived-mode-p 'org-mode)
+ ;; Check panel window and buffer
+ (windowp orgpan-panel-window)
+ (window-live-p orgpan-panel-window)
+ (bufferp orgpan-panel-buffer)
+ (buffer-live-p orgpan-panel-buffer)
+ (eq (window-buffer orgpan-panel-window) orgpan-panel-buffer)
+ ;; Check minor mode
+ orgpan-panel-minor-mode)
+ (orgpan-delete-panel)))
+
+(define-minor-mode orgpan-panel-minor-mode
+ "Minor mode used in `org-mode' buffer when showing panel."
+ :keymap orgpan-mode-map
+ :lighter " PANEL"
+ :group 'orgpan
+ )
+
+
+(provide 'org-panel)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; org-panel.el ends here
+
+
diff --git a/EXPERIMENTAL/org-pic.el b/EXPERIMENTAL/org-pic.el
new file mode 100644
index 0000000..d9ed3f4
--- /dev/null
+++ b/EXPERIMENTAL/org-pic.el
@@ -0,0 +1,191 @@
+;;; Modified picture mode with extra functions and bindings
+;; BUGS: The mouse stuff does not really work reliable
+
+;; What it really needs:
+;; Picture areas should always start with ":"
+;; Automatic recognize the region and use the right commands, also
+;; extending the region.
+
+;; Picture mode
+;; ------------
+;; Simple ASCII drawings can be made in picture-mode. You can toggle
+;; picture mode with `C-c C-c' (unless you have turned it off with the
+;; variable `org-enable-picture-mode'). See the picture-mode
+;; documentation for details. Some additional bindings are provided by
+;; org-mode:
+;;
+;; M-up M-7 M-8 M-9 \
+;; M-left M-right M-u M-o } Draw lines in keypad-like directions
+;; M-down M-j M-k M-o /
+;;
+;; M-- Draw line from mark to point, set mark at end.
+;; S-mouse1 Freehand drawing with the mouse.
+;;
+(defcustom org-enable-picture-mode t
+ "Non-nil means, C-c C-c switches to picture mode.
+When nil, this command is disabled."
+ :group 'org
+ :type 'boolean)
+(defun org-edit-picture ()
+ "Switch to picture mode and save the value of `transient-mark-mode'.
+Turn transient-mark-mode off while in picture-mode."
+ (interactive)
+ (if (not org-enable-picture-mode)
+ (error
+ "Set variable `org-enable-picture-mode' to allow picture-mode."))
+ ;; FIXME: This is not XEmacs compatible yet
+ (set (make-local-variable 'org-transient-mark-mode)
+ transient-mark-mode)
+ (set (make-local-variable 'org-cursor-color)
+ (frame-parameter nil 'cursor-color))
+ (set (make-local-variable 'transient-mark-mode) nil)
+ (set-cursor-color "red")
+ (picture-mode)
+ (message (substitute-command-keys
+ "Type \\[org-picture-mode-exit] in this buffer to return it to Org mode.")))
+
+(defun org-picture-mode-exit (&optional arg)
+ "Turn off picture mode and restore `transient-mark-mode'."
+ (interactive "P")
+ (if (local-variable-p 'org-transient-mark-mode)
+ (setq transient-mark-mode org-transient-mark-mode))
+ (if (local-variable-p 'org-cursor-color)
+ (set-cursor-color org-cursor-color))
+ (if (fboundp 'deactivate-mark) (deactivate-mark))
+ (if (fboundp 'zmacs-deactivate-region) (zmacs-deactivate-region))
+ (picture-mode-exit))
+
+
+(eval-after-load "picture"
+ ' (progn
+ (define-key picture-mode-map [(meta left)] (lambda (arg) (interactive "p") (org-picture-draw 4 arg)))
+ (define-key picture-mode-map [(meta right)] (lambda (arg) (interactive "p") (org-picture-draw 6 arg)))
+ (define-key picture-mode-map [(meta up)] (lambda (arg) (interactive "p") (org-picture-draw 8 arg)))
+ (define-key picture-mode-map [(meta down)] (lambda (arg) (interactive "p") (org-picture-draw 2 arg)))
+ (define-key picture-mode-map [(meta shift left)] (lambda (arg) (interactive "p") (org-picture-draw 7 arg)))
+ (define-key picture-mode-map [(meta shift right)] (lambda (arg) (interactive "p") (org-picture-draw 3 arg)))
+ (define-key picture-mode-map [(meta shift up)] (lambda (arg) (interactive "p") (org-picture-draw 9 arg)))
+ (define-key picture-mode-map [(meta shift down)] (lambda (arg) (interactive "p") (org-picture-draw 1 arg)))
+
+ (define-key picture-mode-map [(meta ?j)] (lambda (arg) (interactive "p") (org-picture-draw 1 arg)))
+ (define-key picture-mode-map [(meta ?k)] (lambda (arg) (interactive "p") (org-picture-draw 2 arg)))
+ (define-key picture-mode-map [(meta ?l)] (lambda (arg) (interactive "p") (org-picture-draw 3 arg)))
+ (define-key picture-mode-map [(meta ?u)] (lambda (arg) (interactive "p") (org-picture-draw 4 arg)))
+ (define-key picture-mode-map [(meta ?o)] (lambda (arg) (interactive "p") (org-picture-draw 6 arg)))
+ (define-key picture-mode-map [(meta ?7)] (lambda (arg) (interactive "p") (org-picture-draw 7 arg)))
+ (define-key picture-mode-map [(meta ?8)] (lambda (arg) (interactive "p") (org-picture-draw 8 arg)))
+ (define-key picture-mode-map [(meta ?9)] (lambda (arg) (interactive "p") (org-picture-draw 9 arg)))
+ (define-key picture-mode-map [(meta ?-)] 'org-picture-draw-line)
+ (define-key picture-mode-map [mouse-2] 'org-picture-mouse-line-to-here)
+ (define-key picture-mode-map [mouse-1] 'org-picture-mouse-set-point)
+ (define-key picture-mode-map [(shift down-mouse-1)] 'org-picture-draw-with-mouse)
+ (define-key picture-mode-map "\C-c\C-c" 'org-picture-mode-exit)))
+
+(defun org-picture-draw (dir arg)
+ "Draw ARG character into the direction given by DIR."
+ (cond
+ ((equal dir 1)
+ (picture-movement-sw)
+ (setq last-command-event ?/) (picture-self-insert arg))
+ ((equal dir 2)
+ (picture-movement-down)
+ (setq last-command-event ?|) (picture-self-insert arg))
+ ((equal dir 3)
+ (picture-movement-se)
+ (setq last-command-event ?\\) (picture-self-insert arg))
+ ((equal dir 4)
+ (picture-movement-left)
+ (setq last-command-event ?-) (picture-self-insert arg))
+ ((equal dir 5))
+ ((equal dir 6)
+ (picture-movement-right)
+ (setq last-command-event ?-) (picture-self-insert arg))
+ ((equal dir 7)
+ (picture-movement-nw)
+ (setq last-command-event ?\\) (picture-self-insert arg))
+ ((equal dir 8)
+ (picture-movement-up)
+ (setq last-command-event ?|) (picture-self-insert arg))
+ ((equal dir 9)
+ (picture-movement-ne)
+ (setq last-command-event ?/) (picture-self-insert arg)))
+ (picture-movement-right))
+
+(defun org-picture-draw-line (&optional beg end)
+ "Draw a line from mark to point."
+ (interactive)
+ (unless (and beg end)
+ (setq beg (mark 'force)
+ end (point)))
+ (let (x1 x2 y1 y2 n i Dx Dy dx dy char lp x y x1a y1a lastx lasty)
+ (goto-char beg)
+ (setq x1 (current-column) y1 (count-lines (point-min) (point)))
+ (if (bolp) (setq y1 (1+ y1)))
+ (goto-char end)
+ (setq x2 (current-column) y2 (count-lines (point-min) (point)))
+ (if (bolp) (setq y2 (1+ y2)))
+ (setq Dx (- x2 x1) Dy (- y2 y1)
+ n (+ (abs Dx) (abs Dy))
+ n (sqrt (+ (* Dx Dx) (* Dy Dy)))
+ n (max (abs Dx) (abs Dy))
+ n (max (abs Dx) (abs Dy))
+ dx (/ (float Dx) (float n)) dy (/ (float Dy) (float n)))
+ (setq x1a (floor (+ x1 (* 1. dx) .5))
+ y1a (floor (+ y1 (* 1. dy) .5)))
+ ;; Do the loop
+ (setq i -1)
+ (setq lastx x1a lasty y1a)
+ (while (< i n)
+ (setq i (1+ i)
+ x (floor (+ x1 (* (float i) dx) .5))
+ y (floor (+ y1 (* (float i) dy) .5)))
+ (setq char (cond ((= lastx x) ?|) ((= lasty y) ?-)
+ ((> (* (- x lastx) (- y lasty)) 0) ?\\)
+ (t ?/))
+ lastx x lasty y)
+ (goto-line y)
+ (move-to-column x t)
+ (setq last-command-event char)
+ (setq lp (point))
+ (picture-self-insert 1))
+ (goto-char lp)
+ (set-mark lp)))
+
+(defun org-picture-mouse-line-to-here (ev)
+ "Draw a line from point to the click position."
+ (interactive "e")
+ (let* ((beg (move-marker (make-marker) (point))))
+ (org-picture-mouse-set-point ev)
+ (org-picture-draw-line beg (point))
+ (move-marker beg nil)))
+
+;; Draw with the mouse
+(defun org-picture-mouse-set-point (ev)
+ "Mouse-set-point, but force position."
+ (interactive "e")
+ (let* ((colrow (posn-col-row (event-end ev)))
+ (col (car colrow)) (line (cdr colrow))
+ (realline (1+ (+ (count-lines (point-min) (window-start)) line))))
+ (goto-line realline)
+ (while (and (eobp)
+ (not (> (count-lines (point-min) (point-max)) realline)))
+ (newline))
+ (goto-line realline)
+ (move-to-column col t)))
+
+(defun org-picture-draw-with-mouse (ev)
+ "Use the mouse like a brush and paint stars where it goes."
+ (interactive "e")
+ (let (lastcr cr)
+ (track-mouse
+ (catch 'exit
+ (while t
+ (setq e (read-event))
+ (if (not (eq (car e) 'mouse-movement)) (throw 'exit nil))
+ (setq cr (posn-col-row (event-end e)))
+ (when (not (equal cr lastcr))
+ (setq lastcr cr)
+ (org-picture-mouse-set-point e)
+ (setq last-command-event ?*)
+ (save-excursion
+ (picture-self-insert 1))))))))
diff --git a/EXPERIMENTAL/sacha-load.el b/EXPERIMENTAL/sacha-load.el
new file mode 100644
index 0000000..9f3ac31
--- /dev/null
+++ b/EXPERIMENTAL/sacha-load.el
@@ -0,0 +1,111 @@
+(defun sacha/org-show-load ()
+ "Show my unscheduled time and free time for the day."
+ (interactive)
+ (let ((time (sacha/org-calculate-free-time
+ ;; today
+ (calendar-gregorian-from-absolute (time-to-days (current-time)))
+ ;; now
+ (let* ((now (decode-time))
+ (cur-hour (nth 2 now))
+ (cur-min (nth 1 now)))
+ (+ (* cur-hour 60) cur-min))
+ ;; until the last time in my time grid
+ (let ((last (car (last (elt org-agenda-time-grid 2)))))
+ (+ (* (/ last 100) 60) (% last 100))))))
+ (message "%.1f%% load: %d minutes to be scheduled, %d minutes free, %d minutes gap\n"
+ (/ (car time) (* .01 (cdr time)))
+ (car time)
+ (cdr time)
+ (- (cdr time) (car time)))))
+
+(defun sacha/org-agenda-load (match)
+ "Can be included in `org-agenda-custom-commands'."
+ (let ((inhibit-read-only t)
+ (time (sacha/org-calculate-free-time
+ ;; today
+ (calendar-gregorian-from-absolute org-starting-day)
+ ;; now if today, else start of day
+ (if (= org-starting-day
+ (time-to-days (current-time)))
+ (let* ((now (decode-time))
+ (cur-hour (nth 2 now))
+ (cur-min (nth 1 now)))
+ (+ (* cur-hour 60) cur-min))
+ (let ((start (car (elt org-agenda-time-grid 2))))
+ (+ (* (/ start 100) 60) (% start 100))))
+ ;; until the last time in my time grid
+ (let ((last (car (last (elt org-agenda-time-grid 2)))))
+ (+ (* (/ last 100) 60) (% last 100))))))
+ (goto-char (point-max))
+ (insert (format
+ "%.1f%% load: %d minutes to be scheduled, %d minutes free, %d minutes gap\n"
+ (/ (car time) (* .01 (cdr time)))
+ (car time)
+ (cdr time)
+ (- (cdr time) (car time))))))
+
+(defun sacha/org-calculate-free-time (date start-time end-of-day)
+ "Return a cons cell of the form (TASK-TIME . FREE-TIME) for DATE, given START-TIME and END-OF-DAY.
+DATE is a list of the form (MONTH DAY YEAR).
+START-TIME and END-OF-DAY are the number of minutes past midnight."
+ (save-window-excursion
+ (let ((files org-agenda-files)
+ (total-unscheduled 0)
+ (total-gap 0)
+ file
+ rtn
+ rtnall
+ entry
+ (last-timestamp start-time)
+ scheduled-entries)
+ (while (setq file (car files))
+ (catch 'nextfile
+ (org-check-agenda-file file)
+ (setq rtn (org-agenda-get-day-entries file date :scheduled :timestamp))
+ (setq rtnall (append rtnall rtn)))
+ (setq files (cdr files)))
+ ;; For each item on the list
+ (while (setq entry (car rtnall))
+ (let ((time (get-text-property 1 'time entry)))
+ (cond
+ ((and time (string-match "\\([^-]+\\)-\\([^-]+\\)" time))
+ (setq scheduled-entries (cons (cons
+ (save-match-data (appt-convert-time (match-string 1 time)))
+ (save-match-data (appt-convert-time (match-string 2 time))))
+ scheduled-entries)))
+ ((and time
+ (string-match "\\([^-]+\\)\\.+" time)
+ (string-match "^[A-Z]+ \\(\\[#[A-Z]\\]\\)? \\([0-9]+\\)" (get-text-property 1 'txt entry)))
+ (setq scheduled-entries
+ (let ((start (and (string-match "\\([^-]+\\)\\.+" time)
+ (appt-convert-time (match-string 1 time)))))
+ (cons (cons start
+ (and (string-match "^[A-Z]+ \\(\\[#[A-Z]\\]\\)? \\([0-9]+\\) " (get-text-property 1 'txt entry))
+ (+ start (string-to-number (match-string 2 (get-text-property 1 'txt entry))))))
+ scheduled-entries))))
+ ((string-match "^[A-Z]+ \\([0-9]+\\)" (get-text-property 1 'txt entry))
+ (setq total-unscheduled (+ (string-to-number
+ (match-string 1 (get-text-property 1 'txt entry)))
+ total-unscheduled)))))
+ (setq rtnall (cdr rtnall)))
+ ;; Sort the scheduled entries by time
+ (setq scheduled-entries (sort scheduled-entries (lambda (a b) (< (car a) (car b)))))
+
+ (while scheduled-entries
+ (let ((start (car (car scheduled-entries)))
+ (end (cdr (car scheduled-entries))))
+ (cond
+ ;; are we in the middle of this timeslot?
+ ((and (>= last-timestamp start)
+ (< = last-timestamp end))
+ ;; move timestamp later, no change to time
+ (setq last-timestamp end))
+ ;; are we completely before this timeslot?
+ ((< last-timestamp start)
+ ;; add gap to total, skip to the end
+ (setq total-gap (+ (- start last-timestamp) total-gap))
+ (setq last-timestamp end)))
+ (setq scheduled-entries (cdr scheduled-entries))))
+ (if (< last-timestamp end-of-day)
+ (setq total-gap (+ (- end-of-day last-timestamp) total-gap)))
+ (cons total-unscheduled total-gap))))
diff --git a/Makefile b/Makefile
index 950e281..bce80ae 100644
--- a/Makefile
+++ b/Makefile
@@ -68,9 +68,9 @@ DOCFILES = org.texi org.pdf org
CARDFILES = orgcard.tex orgcard.pdf orgcard_letter.pdf
TEXIFILES = org.texi
INFOFILES = org
-HTMLDIR = /home/dominik/public_html/Tools/org
HG_RELEASES = ../org-mode-all-releases-hg/
+
.SUFFIXES: .el .elc .texi
SHELL = /bin/sh
@@ -154,6 +154,10 @@ orgcard_letter.ps: orgcard_letter.dvi
webfiles:
(cd ORGWEBPAGE; emacs -batch -l ~/.emacs index.org -f org-publish-current-project)
+web:
+ make webfiles
+ (cd ORGWEBPAGE/tmp; lftp -f ../../../org-mode-proprietary/ftp_upload_website)
+
html: org.html
html_split: org.texi
@@ -168,12 +172,6 @@ pdf: org.pdf
card: orgcard.pdf orgcard.ps orgcard_letter.pdf orgcard_letter.ps
-xcompile:
- xemacs -batch -q -f batch-byte-compile $(LISPFILES)
-
-ecompile:
- emacs -batch -q -f batch-byte-compile $(LISPFILES)
-
distfile:
@if [ "X$(TAG)" = "X" ]; then echo "*** No tag ***"; exit 1; fi
touch org.texi orgcard.tex
@@ -214,15 +212,15 @@ trackrelease:
cp -r org-$(TAG)/* $(HG_RELEASES)
(cd $(HG_RELEASES); hg addremove; hg ci -m $(TAG); hg tag $(TAG))
-upload:
- (cd RELEASEDIR; lftp -f ../ftp_script)
+upload_release:
+ (cd RELEASEDIR; lftp -f ../../org-mode-proprietary/ftp_upload_release)
upload_manual:
- lftp -f ftp_script2
+ lftp -f ../org-mode-proprietary/ftp_upload_manual
relup:
make release
- make upload
+ make upload_release
make upload_manual
clean:
@@ -230,7 +228,14 @@ clean:
rm -f *~
rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.pg *.pgs
rm -f *.toc *.tp *.tps *.vr *.vrs *.log *.html *.ps
+ rm -f orgcard_letter.tex orgcard_letter.pdf
+ rm -f org-install.el
+ rm -rf manual
+ rm -rf RELEASEDIR
.el.elc:
$(ELC) $<
+
+push:
+ git+ssh://repo.or.cz/svr/git/org-mode.git master \ No newline at end of file
diff --git a/ORGWEBPAGE/.DS_Store b/ORGWEBPAGE/.DS_Store
new file mode 100644
index 0000000..942082f
--- /dev/null
+++ b/ORGWEBPAGE/.DS_Store
Binary files differ
diff --git a/ORGWEBPAGE/Changes.html b/ORGWEBPAGE/Changes.html
new file mode 100644
index 0000000..1cf21d0
--- /dev/null
+++ b/ORGWEBPAGE/Changes.html
@@ -0,0 +1,6354 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-mode list of User-visible changes</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2008/01/25 14:14:58"/>
+<meta name="author" content="Carsten Dominik"/>
+<style type="text/css">
+ html {
+ font-family: Times, serif;
+ font-size: 12pt;
+ }
+ .title { text-align: center; }
+ .todo { color: red; }
+ .done { color: green; }
+ .timestamp { color: grey }
+ .timestamp-kwd { color: CadetBlue }
+ .tag { background-color:lightblue; font-weight:normal }
+ .target { background-color: lavender; }
+ pre {
+ border: 1pt solid #AEBDCC;
+ background-color: #F3F5F7;
+ padding: 5pt;
+ font-family: courier, monospace;
+ }
+ table { border-collapse: collapse; }
+ td, th {
+ vertical-align: top;
+ <!--border: 1pt solid #ADB9CC;-->
+ }
+</style>
+</head><body>
+<h1 class="title">Org-mode list of User-visible changes</h1>
+
+<div class="outline-2">
+<h2>Version 5.20</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<p>
++&mdash;&mdash;&mdash;&mdash;+&ndash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;+
++&mdash;&mdash;&mdash;&mdash;+&ndash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;+
++&mdash;&mdash;&mdash;&mdash;+&ndash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;+
++&mdash;&mdash;&mdash;&mdash;+&ndash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;+
++&mdash;&mdash;&mdash;&mdash;+&ndash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+-&mdash;&mdash;&mdash;&mdash;+
+</p>
+<ul>
+<li>
+The variable `org-remember-use-refile-when-interactive'
+introduced only in 5.19 is obsolete. Please use
+`org-remember-interactive-interface' instead. This new
+variable does select the interface that is used to select
+the target for a remember note. Possible values are:
+FIXME:
+
+</li>
+<li>
+You can now also have a plain (as opposed to deadline or
+scheduled) repeater timestamp in a task. Switching the task
+to DONE will now also shift a plain time stamp. This was a
+request by Austin Frank.
+
+</li>
+<li>
+It is no longer necessary to update the refiling targets -
+they are always current.
+
+</li>
+<li>
+`C-u C-c C-w' allows you to jump to a refiling location.
+
+</li>
+<li>
+`C-u C-u C-c C-w' uses the refile interface to jum to any
+headline in the current file.
+
+</li>
+<li>
+In `org-goto', typing characters now automatically starts
+isearch from the beginning of the buffer. The isearch is
+special also because it only matches in headline. This goes
+some way toward saving org-goto from being removed from
+Org-mode. Thanks to Piotr Zielinski for the code, and sorry
+that it took me o long to ut it in. If you prefer to use
+single letters n,p,f,b,u,q for navigation as before,
+configure the variable `org-goto-auto-isearch'.
+
+</li>
+<li>
+The clock table accepts a new parameter <code>:step</code>. This
+parameter can be `day' or `week' and will result in separate
+tables for each day or week in the requested time interval.
+This was triggered by a proposal by Sacha Chua in her <a href="http://sachachua.com/wp/2007/12/30/clocking-time-with-emacs-org/">blog</a>.
+
+</li>
+<li>
+A time-stamp with a repeater now no longer refers to the
+date <b>closest</b> to the current day. Instead, it means either
+today or the most recent match. This change makes sure that
+overdue scheduled or deadline items never disappear from the
+agenda. With the previous convention, an overdue sheduled
+item would disappear. For example, a weekly item scheduled
+for Sunday would appear as overdue until Wednesday, and the
+suddenly disappear until next Sunday. Now the item will
+show up as "Sched 7x" on Saturday. From Sunday on it will
+be in the list as "Scheduled", i.e. old sins will be
+forgiven. This follows a request by Warong, Dennis and
+Bernt.
+
+</li>
+<li>
+Archving a subtree now creates an additional property,
+<code>ARCHIVE_OLPATH</code>. This property contains the "path" in the
+outline tree to the archived entry, as it was in the
+original file. For example, archiving <code>Fix the door</code> in the
+following hierarchy
+
+<p>
+<pre>
+ * Tasks
+ ** HOME
+ *** Garage
+ **** Fix the door
+</pre>
+</p>
+<p>
+will file is with the following property
+</p>
+<p>
+<pre>
+ :ARCHIVE_PATH: Task/HOME/Garage
+</pre>
+</p>
+<p>
+Note that you can configure (i.e. limit) the information
+that gets stored upon archiving with the variable
+`org-archive-save-context-info'.
+</p>
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.19</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Column view can list the clocked times of a subtree.
+
+</li>
+<li>
+Storing remember notes can use the `org-refile' interface.
+
+</li>
+<li>
+Storing remember notes no longer produced empty lines.
+
+</li>
+<li>
+Moving subtrees now folds all siblings of the subtree.
+
+</li>
+<li>
+New variable `org-agenda-todo-keyword-format'.
+
+</li>
+<li>
+Hack to allow brackets in link descriptions.
+
+</li>
+<li>
+Clocking into an entry can enforce a specific TODO state.
+
+</li>
+<li>
+EXPORT_FILE_NAME may be an absolute file name with "~".
+
+</li>
+<li>
+Bug fixes, lots of them.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+A new special column definition lists the sum of all CLOCK
+entries in a subtree. For example
+
+<p>
+<pre>
+ #+COLUMNS: %20ITEM %10Time_Estimate{:} %CLOCKSUM
+</pre>
+</p>
+<p>
+will allow you to compare estimated times (as given in the
+Time_Estimate property) with the clocked times. This was a
+request by Bernt Hansen.
+</p>
+</li>
+<li>
+Storing remember notes can now use the `org-refile'
+interface instead of the `org-goto' interface (see the
+variable `org-remember-use-refile-when-interactive').
+Nothing will change if the note is stored immediately after
+pressing `C-c C-c' in the <code>*Remember*</code> buffer. But if you
+have chosen (e.g. by pressing `C-u C-c C-c') to
+interactively select the filing location (file and
+headline), the refile interface will be used instead. I am
+excited about this change, because the `org-goto' interface
+is basically a failure, at least for this application. Note
+that in any case the refile interface has to be configured
+first by customizing `org-refile-targets'.
+
+</li>
+<li>
+Notes inserted with remember now remove any whitespace
+before and after the note before being pasted, so that there
+will be no empty lines inserted together with the note. We
+could invent special syntax in remember templates to allow
+creating empty lines before a note - is there anyone who'd
+want this?
+
+</li>
+<li>
+Moving subtrees now folds all siblings of the subtree. This
+is the only reasonably simple way I could find to avoid the
+reported inconsistencies in the folding state of the outline
+tree after moving entries. There are reasons to like this
+new behavior, because it easily visualizes where the tree is
+located after the move. Still, not everyone might be happy
+with this. Massive complaining would be needed to make me
+fix this.
+
+</li>
+<li>
+New variable `org-agenda-todo-keyword-format' to specify the
+width of the TODO keyword field in the agenda display. Use
+it to get things to line up better. This was a proposal by
+Rainer Stengele.
+
+</li>
+<li>
+If a link description inserted with `C-c C-l' contains
+brackets, the brackets will now be converted into curly
+braces. This looks similar enough. Supporting brackets in
+link descriptions is, for technical reasons too long to
+explain here, complex.
+
+</li>
+<li>
+The new option `org-clock-in-switch-to-state' can be set to
+a TODO state that will be enforced when the clock is started
+on an entry. This follows an idea by Sacha Chua.
+
+</li>
+<li>
+The EXPORT_FILE_NAME property may now also be an absolute
+file name, and it may contain abbreviations like "~" for the
+users home directory. This was requested by Adam Spiers.
+
+</li>
+<li>
+Bug fixes, lots of them.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.18</h2>
+
+
+<p>
+Minor fixes.
+</p>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.17</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Whitespace</h4>
+
+
+<ul>
+<li>
+When cutting, pasting, or moving subtrees and items, the
+empty lines <b>before</b> the subtree/item now belong to the
+part and will be moved with it. There is one exception to
+this rule: If the first child is moved down (or,
+equivalently, the second is moved up), the amount of empty
+lines <b>above</b> the first child to be moved along with it is
+limited by the number of empty lines <b>below</b> it. This
+sounds complicated, but it allows to have extra empty space
+before the first child and still have good behavior of the
+subtree motion commands.
+
+</li>
+<li>
+Plain lists items work the same.
+
+</li>
+</ul>
+<p>I believe we have finally nailed this one. Thanks to Daniel
+Pittman for bring this up again and to Eric Schulte for
+pointing out that it is the empty lines <b>before</b> an entry
+that really count.
+</p>
+<p>
+This change was non-trivial, please give it a good test and
+let me know about any problems.
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Remember</h4>
+
+
+<ul>
+<li>
+The new command `org-remember-goto-last-stored' will jump
+to the location of the remember note stored most recently.
+If you have `org-remember' on a key like `C-c r', then you
+can go to the location with a double prefix arg: `C-u C-u
+C-c r'. This was a proposal by Rainer Stengele.
+
+</li>
+<li>
+Template items that are being prompted for can now specify
+a default value and a completion table. Furthermore,
+previous inputs at a specific prompt are captured in a
+history variable. For example:
+
+<p>
+<pre>
+ %^{Author|Roald Dahl|Thomas Mann|Larry Niven}
+</pre>
+</p>
+<p>
+will prompt for an author name. Pressing RET without
+typing anything will select "Roald Dahl". Completion will
+give you any of the three names. And a history will be
+kept, so you can use the arrow keys to get to previous
+input. The history is tied to the prompt. By using the
+same prompt in different templates, you can build a history
+across templates. The ideas for this came from proposals
+by Bastien and Adam.
+</p>
+</li>
+<li>
+When a remember template contains the string `%!', the note
+will be stored immediately after all template parts have
+been filled in, so you don't even have to press `C-c
+C-c'. The was a proposal by Adam Spiers.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Refile</h4>
+
+
+<ul>
+<li>
+`org-refile-targets' has a new parameter to specify a
+maximum level for target selection. Thanks to Wanrong Lin
+for this proposal.
+
+</li>
+<li>
+When the new option `org-refile-use-outline-path' is set,
+refile targets will be presented like a file path to the
+completion interface: "level 1/level 2/level 3". This
+may be the fastest interface yet to get to a certain
+outline entry. Do we need to use this interface in other
+places? Thanks to Jose Ruiz for this proposal.
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.16</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Restriction lock on agenda scope</h4>
+
+
+<p>
+You can now permanently lock the agenda construction to a
+certain scope, like a file or a subtree. So instead of
+pressing "&lt;" for each command in the agenda dispatcher, you
+only once select a restriction scope. All subsequent agenda
+commands will than respect this restriction. For example,
+you can use this at work, to limit agendas to your work file
+or tree, and at home to limit to the home file or tree. Or
+you can use it during the day in order to focus in on certain
+projects.
+</p>
+<p>
+You select a scope with the command `C-c C-x &lt;', which
+restricts to the current subtree. When called with a `C-u'
+prefix, the restriction is to the current file. You can also
+make restrictions from the speedbar frame, see below.
+</p>
+<p>
+When making a new restriction and an agenda window is
+currently visible, it will immediately be updated to reflect
+the new scope. TO if you like you can display an agenda view
+and then watch it change in various scopes.
+</p>
+<p>
+To get rid of the restriction, use the command "C-c C-x &gt;".
+Or press "&gt;" in the agenda dispatcher. Also, and use of "&lt;"
+in the dispatcher will disable the restriction lock and
+select a new restriction.
+</p>
+<p>
+Thanks to Rick Moynihan for triggering this development.
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Imenu and Speedbar support</h4>
+
+
+<ul>
+<li>
+Org-mode now supports Imenu. For example, with the setting
+
+<p>
+<pre>
+ (add-hook 'org-mode-hook
+ (lambda () 'imenu-add-to-menubar "Imenu"))
+</pre>
+</p>
+<p>
+a menu will be created in each Org-mode buffer that
+provides access to all level 1 and level 2 headings. The
+depth of the menu can be set with the variable
+`org-imenu-depth'.
+</p>
+</li>
+<li>
+org-mode now supports Speedbar. This means that you can
+drill into the first and second level headlines of an
+Org-mode file right from the speedbar frame.
+
+</li>
+<li>
+You can set a restriction lock for the Org-mode agenda to a
+file or a subtree directly from the speedbar frame. Just
+press "&lt;" with the cursor on an Org-mode file or subtree to
+set the lock and immediately update the agenda if it is
+visible. Use "&gt;" to get rid of the lock again.
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.15</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+There are new special properties TIMESTAMP and TIMESTAMP_IA.
+These can be used to access the first keyword-less active
+and inactive timestamp in an entry, respectively.
+
+</li>
+<li>
+New variable `org-clock-heading-function'. It can be set to
+a function that creates the string shown in the mode line
+when a clock is running. Thanks to Tom Weissmann for this
+idea.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.14</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Remember and related stuff
+<ul>
+<li>
+New command `org-refile' to quickly move a note.
+</li>
+<li>
+Easy way to jump to the target location of remember template.
+</li>
+<li>
+New %-escapes in remember templates: %c %(&hellip;) and %[&hellip;]
+</li>
+<li>
+`org-remember-insinuate' simplifies remember setup
+
+</li>
+</ul></li>
+<li>
+Emphasis and Font-lock stuff
+<ul>
+<li>
+Stacked emphasis is no longer allowed.
+</li>
+<li>
+You may finally emphasize a single character like *a*.
+</li>
+<li>
+Font-lock now can hide the emphasis markers
+</li>
+<li>
+Text in the "=" emphasis is exported verbatim
+</li>
+<li>
+There is a new emphasis marker "~" for verbatim text
+</li>
+<li>
+Constructs treated specially by the exporters can be highlighted
+
+</li>
+</ul></li>
+<li>
+Properties and Column view
+<ul>
+<li>
+More control over which properties use inheritance
+</li>
+<li>
+CATEGORY="work" can now be used in a tags/property search
+</li>
+<li>
+the {+} summary type can specify a printf-style output format
+</li>
+<li>
+New currency summary type {$}
+
+</li>
+</ul></li>
+<li>
+The date/time prompt
+<ul>
+<li>
+While entering data, watch live the current interpretation.
+</li>
+<li>
+The date prompt now prefers to select the future
+</li>
+<li>
+Easier modification of time in an existing time stamp.
+
+</li>
+</ul></li>
+<li>
+Export
+<ul>
+<li>
+You can now export some special strings in HTML, like "&hellip;"
+</li>
+<li>
+#+EMAIL: may contain several email addresses
+
+</li>
+</ul></li>
+<li>
+Agenda
+<ul>
+<li>
+In the agenda, a few keys have changed: `g', `G', and `e'.
+
+</li>
+</ul></li>
+<li>
+Miscellaneous
+<ul>
+<li>
+Class-dependent sectioning structures in LaTeX export.
+</li>
+<li>
+Radio-lists modeled after the radio tables.
+</li>
+<li>
+The default for `org-ellipsis' is back to nil
+</li>
+<li>
+Support for pabbrev-mode
+</li>
+<li>
+New variable `org-show-entry-below'.
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+If you have customized the variable `org-emphasis-alist' or
+org-export-emphasis-alist', you need to do it again by first
+canceling your customization and then adding it again.
+
+</li>
+<li>
+I know that some people have defined their own private helper
+functions to select a specific remember template, without being
+prompted, like this:
+
+<p>
+<pre>
+ (defun my-remember-template-n ()
+ (interactive)
+ (org-remember ?n))
+</pre>
+</p>
+<p>
+You need to modify this. The character selecting the template
+must now be the <i>second</i> argument to `org-remember':
+</p>
+<p>
+<pre>
+ (defun my-remember-template-n ()
+ (interactive)
+ (org-remember nil ?n))
+</pre>
+</p>
+</li>
+<li>
+`C-c C-w' now refiles an entry. To get a sparse tree of
+deadlines, use `C-c / d' instead.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Remember and related stuff</h4>
+
+
+<ul>
+<li>
+New command `org-refile' to quickly move a note to a
+different place. It is bound to `C-c C-w'. The foremost
+application might be to put a note or task captured with
+`remember' into the proper list or project. The command
+offers a list of possible refiling targets for completion.
+These are headings under which the entry will be inserted
+as a subitem. By default, this will offer all top-level
+headings in the current buffer, but you can configure the
+variable `org-refile-targets' to get more complex
+definitions. For example:
+
+<p>
+<pre>
+ (setq org-refile-targets '((nil . (:level . 2))))
+</pre>
+</p>
+<p>
+selects all level 2 headlines in the current buffer as
+targets. And
+</p>
+<p>
+<pre>
+ (setq org-refile-targets
+ '((org-agenda-files . (:tag . "refile"))))
+</pre>
+</p>
+<p>
+searches all agenda files and selects headlines that are
+explicitly marked with the tag :refile: . Note that the
+list of targets is built upon first use only, to rebuilt
+it, call the command `C-c C-w' with a double prefix
+argument.
+</p>
+<p>
+This is based on an idea and example implementation by Max
+Mikhanosha. Many thanks Max.
+</p>
+</li>
+<li>
+You can now use a C-u prefix on `org-remember' to jump to
+the location where a specific templates stores its notes.
+For example, if you have `org-remember' bound to `C-c r',
+then `C-u C-c r n' will get you to the file and headline
+given in the template associated with the letter "n".
+
+<p>
+This was proposed by someone, but I have lost track who.
+Sorry, and thanks anyway.
+</p>
+</li>
+<li>
+New %-escapes in remember templates:
+
+<p>
+<pre>
+ %c insert the current clipboard, like C-y would do
+ %(..) evaluate Lisp expression and insert the result
+ %[..] include file
+</pre>
+</p>
+<p>
+Thanks to Adam Spiers and Tim O'Callaghan.
+</p>
+</li>
+<li>
+New function `org-remember-insinuate' that makes is easier
+to set Org-mode specific values for remember variables.
+Thanks to Michael Olson for this proposal. It is
+equivalent to:
+
+<p>
+<pre>
+ (require 'remember)
+ (setq remember-annotation-functions '(org-remember-annotation))
+ (setq remember-handler-functions '(org-remember-handler))
+ (add-hook 'remember-mode-hook 'org-remember-apply-template))
+</pre>
+</p>
+<p>
+You might still want to set `org-default-notes-file' to
+provide a default for templates without a file, and
+`org-directory' to show where to find other org files.
+</p>
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Emphasis and Font-lock stuff</h4>
+
+
+<ul>
+<li>
+Stacked emphasis like */bold italic/* is no longer allowed.
+
+</li>
+<li>
+You may finally emphasize a single character like *a*.
+
+</li>
+<li>
+Font-lock now can hide the emphasis markers, just like Muse
+does. Configure the variable `org-hide-emphasis-markers'
+if you want this. Showing the characters continues to be
+the default in Org-mode.
+
+</li>
+<li>
+Text in the "=" emphasis is now exported verbatim, i.e. no
+further parsing and interpretation of this text takes place. So
+you can write =quoted *xxx* a_x = b=. This and the following
+point implement a request by Daniel Clemente.
+
+</li>
+<li>
+There is a new emphasis marker "~" which marks text to be
+exported verbatim, without special formatting. Inside an
+org-mode file, this text is highlighted with the org-verbatim
+face. I am not happy with the face yet (currently is is like
+org-code, but underlined), please suggest a better one.
+
+</li>
+<li>
+Whether an emphasis environment is verbatim or not is now an
+extra flag in the variable `org-emphasis-alist'. If you have
+configured this variable, do it again by first canceling your
+customization to revert to the default, and then adding it
+again.
+
+</li>
+<li>
+New variable `org-highlight-latex-fragments-and-specials'.
+When turned on, Org-mode will highlight all strings that
+are treated in a special way by the exporters. This is
+great for export-oriented writing, but maybe a bit noisy
+for note taking, so this feature is off by default.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Properties and Column view</h4>
+
+
+<ul>
+<li>
+`org-use-property-inheritance' may now also be a list of
+property names that should be treated with inheritance
+during searches.
+
+</li>
+<li>
+CATEGORY="work" can now be used in a tags/property search,
+even if the category is not specified as a property in the
+entry, but rather is inherited or derived from #+CATEGORY.
+Thanks to Adam, Tim, and Bastien for an interesting
+discussion around this issue.
+
+</li>
+<li>
+Summary type improvements in column view.
+<ul>
+<li>
+The {+} summary type can specify a printf-style output
+format for computed values like this: {+;%5.2f}
+This was triggered by a report by Levin.
+</li>
+<li>
+New currency summary type {$}, which so far is just a
+shorthand for {+;%.2f}. Do we need to have a currency
+symbol in front of each value. Scott Jaderholm asked for
+this, but I am not sure if this is already what he meant.
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-4">
+<h4>The date/time prompt</h4>
+
+
+<p>
+There have been several small but <b>very</b> useful additions to
+the date prompt.
+</p>
+<ul>
+<li>
+While entering data at the date prompt, the current
+interpretation of your input is shown next to your input in
+the minibuffer. I find this great to understand how the
+input works. If you find the extra stuff in the minibuffer
+annoying, turn it off with `org-read-date-display-live'.
+
+</li>
+<li>
+The date prompt now prefers to select the future. If you
+enter a date without a month, and the day number is before
+today (for example, on the 16th of the month you enter
+"9"), Org-mode will assume next month. Similarly, if you
+enter a month and no year, next year will be assumed if the
+entered month is before the current, for example if you
+enter "May" in September. Thanks to John Rakestraw for
+this great suggestion. If you find it confusing, turn it
+off with `org-read-date-prefer-future'.
+
+</li>
+<li>
+When modifying an existing date using `C-c .' at the stamp,
+the time or time range in the stamp are now offered as
+default input at the prompt. This goes a long way to
+simplifying the modification of an existing date. Thanks
+to Adam Spiers for this proposal.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Export (all implemented by Bastien&hellip;)</h4>
+
+
+<ul>
+<li>
+You can now export special strings in HTML. Here is the
+list of newly performed conversions:
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="left"></col><col align="left"></col><col align="left"></col>
+<thead>
+<tr><th>Command</th><th></th><th>C-u</th><th>C-u C-u</th></tr>
+<tr><th>org-remember</th><th>select template and</th><th>select template and</th><th>goto location</th></tr>
+<tr><th></th><th>store a note</th><th>go to its default</th><th>last used by</th></tr>
+<tr><th></th><th></th><th>target</th><th>remember</th></tr>
+<tr><th>org-refile</th><th>select a targer and</th><th>goto a target</th><th>goto location</th></tr>
+<tr><th></th><th>refile subtree</th><th></th><th>last used by</th></tr>
+<tr><th></th><th></th><th></th><th>refile</th></tr>
+<tr><th>org-goto</th><th>go to a headline</th><th>Use outline-path-</th><th></th></tr>
+<tr><th></th><th>selected from</th><th>completion to</th><th></th></tr>
+<tr><th></th><th>outline f current</th><th>select the</th><th></th></tr>
+<tr><th></th><th>buffer.</th><th>headline</th><th></th></tr>
+<tr><th>Org</th><th>Description</th><th>HTML</th></tr>
+</thead>
+<tbody>
+<tr><td>\\-</td><td>double backslash followed by minus</td><td>&amp;shy;</td></tr>
+<tr><td>--</td><td>two dashes (minuses)</td><td>&amp;ndash;</td></tr>
+<tr><td>---</td><td>three dashes (minuses)</td><td>&amp;mdash;</td></tr>
+<tr><td>...</td><td>three dots</td><td>&amp;hellip;</td></tr>
+</tbody>
+</table>
+
+
+<p>
+You can turn this globally on or off with
+`org-export-with-special-strings' or locally with "-:t" or
+"-:nil" in the #+OPTIONS line. Thanks to Adam Spiers for
+starting the discussion, and thanks to Daniel Clemente and
+William Henney for relevant inputs.
+</p>
+</li>
+<li>
+Comma-separated emails in #+EMAIL: are correctly exported.
+Thanks to Raman for pointing out this omission.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Agenda</h4>
+
+
+<ul>
+<li>
+In the agenda, a few keys have changed
+<pre>
+ g does now the same a "r", refresh current display,
+ because "g" is the Emacs standard for "refresh"
+ G toggle the time grid, used to be "g"
+ e Execute another agenda command, pretty much the same as
+ `C-c a', but shorter and keep the same agenda window.
+</pre>
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Miscellaneous (much of it from Bastien)</h4>
+
+
+<ul>
+<li>
+You can now select the sectioning structure of your LaTeX
+export by setting it either globally
+(`org-export-latex-default-class') or locally in each Org
+file (with #+LaTeX_CLASS: myclass). You can also customize
+the list of available classes and their sectioning
+structures through the new `org-export-latex-classes'
+option. Thanks to Daniel for discussions and suggestion on
+this issue.
+
+</li>
+<li>
+You can send and receive radio lists in HTML,
+LaTeX or TeXInfo, just as you send and receive radio
+tables. Check the documentation for details and examples.
+
+</li>
+<li>
+The default for `org-ellipsis' is back to nil, some people
+seem to have had problems with the face as a default.
+
+</li>
+<li>
+Support for pabbrev-mode, needs pabbrev version 1.1. Thanks
+to Phillip Lord for adapting his package to make this
+possible.
+
+</li>
+<li>
+New variable `org-show-entry-below' to force context-showing
+commands to expose the body of a headline that is being
+shown. Thanks to Harald Weis for pointing out this omission.
+
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.13i</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+On the date/time prompt, you can now also answer with
+something like +2tue to pick the second tuesday from today.
+This was a proposal by Sacha Chua.
+
+</li>
+<li>
+When interpopating into Lisp formulas in the spreadsheet,
+the values of constants and properties are no longer
+enclosed into parenthesis. When interpolating for calc,
+this still happens in order to allow expressions in
+constants. This problem was reported by Eddward DeVilla.
+
+</li>
+<li>
+When a directory is listed in `org-agenda-files', all files
+with extension matched by the new variable
+`org-agenda-file-regexp' in that directory will be agenda
+files.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.13</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Bug fixes and improvements in column view
+<ul>
+<li>
+All known bugs fixed.
+</li>
+<li>
+A Column view can be captured into a dynamic block.
+</li>
+<li>
+The ITEM column is formatted core compactly.
+</li>
+<li>
+Also ITEM can be edited with `e'
+
+</li>
+</ul></li>
+<li>
+The agenda dispatcher
+<ul>
+<li>
+`&lt;' cycles through restriction states.
+</li>
+<li>
+Multi-character access codes to commands (= sub-keymaps).
+
+</li>
+</ul></li>
+<li>
+Sorting improvements
+<ul>
+<li>
+User-defined sorting keys.
+</li>
+<li>
+Sorting by properties.
+</li>
+<li>
+Sorting of plain lists.
+
+</li>
+</ul></li>
+<li>
+HTML &lt;div&gt; structure
+
+</li>
+<li>
+Other stuff
+<ul>
+<li>
+New variables, several of them.
+</li>
+<li>
+Drawers can be set on a per-file basis.
+</li>
+<li>
+Better control over priority fontification in agenda.
+</li>
+<li>
+M-up and M-down now move the current line up and down.
+</li>
+<li>
+Abort remember template selection with C-g.
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Bug fixes and improvements in column view</h4>
+
+
+<ul>
+<li>
+All the bugs described by Scott Jaderholm have been fixed
+(at least I hope so&hellip;).
+
+</li>
+<li>
+You can now capture a column view into a dynamic block, for
+exporting or printing it. The column view can be
+
+<ul>
+<li>
+global, i.e. for the entire file
+</li>
+<li>
+local, i.e. for the subtree where the dynamic block is
+</li>
+<li>
+from an entry with a specific :ID: property.
+
+</li>
+</ul>
+<p>You can identify the entry whose column view you want to
+capture by assigning an :ID: property, and use that property
+in the dynamic block definition. For example:
+</p>
+<p>
+<pre>
+ * Planning
+ :PROPERTIES:
+ :ID: planning-overview
+ :END:
+
+ [...]
+
+ * The column view
+ #+BEGIN: columnview :hlines 1 :id "planning-overview"
+
+ #+END:
+</pre>
+</p>
+<p>
+Use `C-c C-x r' to insert such a dynamic block, and you will
+be prompted for the ID.
+</p>
+</li>
+<li>
+When the current column format displays TODO keyword,
+priority or tags, these parts are stripped from the content
+of the ITEM column, making for more compact and readable
+entries. When any of these "properties" are not listed in
+the current column format, they are instead retained in the
+ITEM column.
+
+</li>
+<li>
+You can now also edit the ITEM column with `e'.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>The agenda dispatcher</h4>
+
+
+<ul>
+<li>
+Instead of pressing `1' to restrict an agenda command to
+the current buffer, or `0' to restrict it to the current
+subtree or region, you can now also press `&lt;' once or
+twice, respectively. This frees up `1' and `0' for user
+commands, a request by Bastien. In fact, "&lt;" cycles
+through different restriction states. "1" and "0" are
+still available for backward compatibility, until you bind
+them to custom commands.
+
+</li>
+<li>
+The access code to custom agenda commands can now contain
+several characters, effectively allowing to bundle several
+similar commands into a sub-keymap. This follows an
+excellent proposal by Adam Spiers. For example:
+
+<p>
+<pre>
+ (setq org-agenda-custom-commands
+ '(("h" . "HOME + Name tag searches") ; describe prefix "h"
+ ("hl" tags "+HOME+Lisa")
+ ("hp" tags "+HOME+Peter")
+ ("hk" tags "+HOME+Kim")))
+</pre>
+</p>
+</li>
+<li>
+The user function option in org-agenda-custom-commands may
+now also be a lambda expression, following a request by
+Adam Spiers.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Sorting improvements</h4>
+
+
+<p>
+We are using a new routine for sorting entries, courtesy of
+John Wiegley. Many thanks to John.
+</p>
+<ul>
+<li>
+You can define your own function to extract a sorting key
+and in this way sort entries by anything you like.
+
+</li>
+<li>
+Entries can now be sorted according to the value of a
+property.
+
+</li>
+<li>
+Plain lists can be sorted.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>HTML &lt;div&gt; structure</h4>
+
+
+<p>
+There is now a &lt;div&gt;-based structure in exported HTML.
+</p>
+<ul>
+<li>
+The table of context is wrapped into a div with a class
+"table-of-contents".
+
+</li>
+<li>
+The outline structure is embedded in &lt;div&gt; elements with
+classes "outline-1", "outline-2" etc.
+
+</li>
+<li>
+The postamble, containing the author information and the
+date is wrapped into a div with class "postamble".
+
+</li>
+</ul>
+<p>I am not sure if the class names are the best choice, let me
+know if there are more "canonical" choices.
+</p>
+<p>
+Thanks to Mike Newman and Cezar for input, and in particular
+to Mike for his clearly formulated specification.
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Other stuff</h4>
+
+
+<ul>
+<li>
+New variable `org-agenda-window-frame-fractions' to
+customize the size limits of the agenda window in the case
+that you display the agenda window by reorganizing the
+frame.
+
+</li>
+<li>
+Drawers can be set on a per-file basis using
+
+<p>
+<pre>
+ #+DRAWERS: HIDDEN STATE PROPERTIES
+</pre>
+</p>
+<p>
+This will define the drawers :HIDDEN: and :STATE:.
+The :PROPERTY: drawer should always be part of this list, or
+your properties will not be folded away.
+Thanks to Richard G. Riley for this proposal.
+</p>
+</li>
+<li>
+`org-agenda-fontify-priorities' may now also be an
+association list of priorities and faces, to specify the
+faces of priorities in the agenda individually.
+
+</li>
+<li>
+The variable `org-export-with-property-drawer' no longer
+exists, please use `org-export-with-drawers' instead. Also,
+the corresponding switch in the #+OPTIONS line has changed
+from "p" to "d". Thanks to Bastien for pointing out that we
+needed to handle not only the property drawer.
+
+</li>
+<li>
+M-up and M-down now move the current line up and down (if
+not at a headline, item or table). Among other things you
+can use this to re-order properties in the drawer. This was
+a proposal by Bastien.
+
+</li>
+<li>
+New variable `org-agenda-todo-ignore-with-date', based on a
+request by Wanrong Lin.
+
+</li>
+<li>
+Aborting remember template selection with C-g now kills the
+remember buffer and restores the old window configuration.
+This was a request by Nuutti Kotivuori.
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.12</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Remember templates can now have name.
+</li>
+<li>
+`C-c C-k' will abort taking a note (remember of log)
+</li>
+<li>
+`C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg.
+</li>
+<li>
+Lines in the agenda can be fontified according to priority.
+</li>
+<li>
+New variable `org-scheduled-past-days'.
+</li>
+<li>
+New variables `org-agenda-deadline-leaders' and
+`org-agenda-scheduled-leaders'.
+</li>
+<li>
+New sparse tree function `org-sparse-tree'.
+</li>
+<li>
+The variable `org-ellipsis' now defaults to `org-link'.
+</li>
+<li>
+The #+OPTIONS line has a new option "tags".
+</li>
+<li>
+New variable `org-use-property-inheritance'.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+`C-c /' now calls `org-sparse-tree'.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Remember templates can now have a template name as the first
+element. The name will be listed along with the selection
+character when prompting for a template. It is best to have
+the name start with the selection character, for example if
+you use ("Note" "n"), you will be prompted like "[n]ote".
+Thanks to Matiyam for this proposal.
+
+</li>
+<li>
+`C-c C-k' will abort taking a note. You can use this in remember
+buffers and when taking a logging note (e.g. for a state
+change). Thanks to Bastien.
+
+</li>
+<li>
+`C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg to
+cut N sequential subtrees. This was a proposal by John.
+
+</li>
+<li>
+Lines in the agenda are now bold if they have priority A and
+italic if they have priority C. You can turn this off using
+the variable `org-agenda-fontify-priorities'. Thanks to
+John Wiegley for the idea and code.
+
+</li>
+<li>
+New variable `org-scheduled-past-days' to set the number a
+scheduled item will be listed after its date has passed.
+Default is 10000, i.e. indefinitely.
+
+</li>
+<li>
+New variables `org-agenda-deadline-leaders' and
+`org-agenda-scheduled-leaders' to adjust the leading text o
+scheduled items and deadline in the agenda. Thanks to John
+Wiegley for a patch.
+
+</li>
+<li>
+New sparse tree function `org-sparse-tree'. This is now the
+default binding for `C-c /'. It requires one additional
+keypress to select a command, but in return is provides a
+single interface to all the different sparse tree commands,
+with full completion support.
+
+</li>
+<li>
+The variable `org-ellipsis' now defaults to the face
+`org-link' because the visibility of the dots is really bad
+and I have found this change very useful indeed.
+
+</li>
+<li>
+The #+OPTIONS line has a new option "tags" which can be used
+to set `org-export-with-tags'. Thanks to Wanrong Lin for
+this proposal.
+
+</li>
+<li>
+New variable `org-use-property-inheritance'. Configure it
+to `t' if you want that searching for entries with certain
+properties always should assume inheritance. This is not
+well tested yet, please check it out.
+
+</li>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.11</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+SUMMARY, DESCRIPTION, LOCATION properties for iCalendar
+</li>
+<li>
+Command to jump to the running clock
+</li>
+<li>
+Clock entries can now have their own drawer
+</li>
+<li>
+`C-c C-x C-r' only updates a clocktable at point
+</li>
+<li>
+New way to assign a remember template to a single key
+</li>
+<li>
+`C-n' and `C-p' are back to their default binding
+</li>
+<li>
+`C-x C-s' in agenda buffer saves all org-mode buffers
+</li>
+<li>
+Schedule/deadline leaves note in agenda buffer
+</li>
+<li>
+Prefix argument for `C-c C-d/s' will remove date
+</li>
+<li>
+New variable to make block aranda more compact
+</li>
+<li>
+Better tag alignment in agenda
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+If you have customized `org-drawers', you need to add
+"CLOCK" to the list of drawers.
+
+</li>
+<li>
+The variable `org-agenda-align-tags-to-column' has been
+renamed to `org-agenda-tags-column'. The old name is still
+an alias, in Emacs 22 and in XEmacs, but not in Emacs 21.
+
+</li>
+<li>
+The default value for both `org-tags-column' and
+`org-agenda-tags-column' is now -80.
+
+</li>
+<li>
+The variable
+`org-insert-labeled-timestamps-before-properties-drawer'
+is now obsolete.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+The LOGGING property allows to modify the settings for
+progress logging for a single entry. For example:
+
+<p>
+<pre>
+ :PROPERTIES:
+ :LOGGING: nologging nologrepeat
+ :END:
+</pre>
+</p>
+<p>
+turns off all progress logging for the current entry and its
+children.
+</p>
+</li>
+<li>
+The properties SUMMARY, DESCRIPTION and LOCATION have
+special meaning during iCalendar export, when they translate
+to the corresponding VEVENT and VTODO fields. If not given,
+Org-ode continues to use cleaned-up version of the headline
+and body as the summary and the description, respectively.
+
+</li>
+<li>
+New function to go to the entry with the currently running
+clock. Bound to `C-c C-x C-j', in agenda also to "J". If
+you use this often, you might even want to assign a global
+key. Thanks to Bernt and Bastien.
+
+</li>
+<li>
+Clock entries can now have their own drawer, the :CLOCK:
+drawer. Check out the variable `org-clock-into-drawer' for
+configuration of this feature. The default is to create a
+drawer when the second clocking line gets added to an entry.
+Note that "CLOCK" has been added to the default value of
+`org-drawers', but if you have configured that variable, you
+must go back and add "CLOCK" yourself to get this drawer
+folded away. Thanks to Tom Weissman for pointing out that
+too many clock entries are visually annoying.
+
+</li>
+<li>
+`C-c C-x C-r' no longer tries to find the first clocktable
+in a buffer and then updates it. Instead, it will update
+the clocktable at point if there is one (same as C-c C-c
+will do if the cursor is in the "#+BEGIN" line of the
+table). If there is none at point, a new one will be
+inserted. This change was necessary because the new :scope
+parameter allows to have several clocktables in a buffer.
+Thanks to Bastien for pointing this out.
+To update all dynamic blocks in a file, use `C-u C-c C-x C-u'.
+
+</li>
+<li>
+The function `org-remember' can now be called with a
+template selection key as argument. This helps to make key
+bindings that go directly to a specific template without
+being prompted for a template, like this:
+
+<p>
+<pre>
+ (global-set-key [f5] (lambda () (interactive) (org-remember "j")))
+</pre>
+</p>
+<p>
+Thanks to Richard G Riley for bringing this up.
+</p>
+</li>
+<li>
+`C-n' and `C-p' are back to their default binding
+(next/previous line) in the agenda buffer. Enough people,
+including recently Denis Bueno, have complained about this,
+and I agree it is not good to break habits like that.
+
+</li>
+<li>
+`C-x C-s' in an agenda buffer now saves all org-mode buffers
+(also `s' does this).
+
+</li>
+<li>
+Setting schedule or deadline dates from the agenda now
+produces a note in the agenda, similarly to what happens
+with S-left/right.
+
+</li>
+<li>
+Using a prefix argument for `C-c C-d' or `C-c C-s' will
+remove the deadline or scheduling date from an item. Thanks
+to Wanrong Lin for this proposal.
+
+</li>
+<li>
+New variable `org-agenda-compact-blocks'. When set, the
+space between blocks in a block agenda is reduced as much as
+possible, to show more items on a single screen.
+
+</li>
+<li>
+The variable `org-agenda-tags-column' (renamed from
+`org-agenda-align-tags-to-column') can now also be negative,
+to mean alignment to the left. The new default is -80, just
+like it is now for `org-tags-column'.
+
+</li>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.10</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Category and the archive location can be properties.
+</li>
+<li>
+The clocktable has a new <code>:scope</code> parameter.
+</li>
+<li>
+CSV support when importing a table.
+</li>
+<li>
+Better defaults when modifying a time stamp.
+</li>
+<li>
+New way to specify the duration of an appointment.
+</li>
+<li>
+More aggressive version of orgstruct-mode improved wrapping.
+</li>
+<li>
+Modifications to priority cycling.
+</li>
+<li>
+Modifications to computations in column view.
+</li>
+<li>
+New command `org-occur-in-agenda-files'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Both the category and the archive location in a (sub)tree of
+the buffer can now be specified using a property, for
+example:
+
+<p>
+<pre>
+ * Tree with special properties
+ :PROPERTIES:
+ :CATEGORY: Examples
+ :ARCHIVE: /some/special/file::
+ :END:
+</pre>
+</p>
+<p>
+This is a much cleaner way of dealing with multiple
+categories and archives in a single file. The preferred use
+of the <code>#+CATEGORY</code> and <code>#+ARCHIVE</code> lines is now to set a
+<b>single</b> default for the file which is then locally
+overruled by properties. This was a proposal from Bastien
+if I remember correctly. Multiple <code>#+</code> lines still work
+and I don't plan to remove this support soon, but I
+encourage you to stop using them.
+</p>
+</li>
+<li>
+The clocktable has a new <code>:scope</code> parameter that determines
+the range in the file from which clock entries should be
+taken. This can be anything from the local subtree to the
+entire buffer to even the full list of agenda files. Legal
+values are:
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="left"></col>
+<thead>
+<tr><th>value</th><th>scope</th></tr>
+</thead>
+<tbody>
+<tr><td>nil</td><td>the current buffer or narrowed region</td></tr>
+<tr><td>file</td><td>the full current buffer</td></tr>
+<tr><td>subtree</td><td>the subtree where the clocktable is located</td></tr>
+<tr><td>treeN</td><td>the surrounding level N tree, for example tree3</td></tr>
+<tr><td>tree</td><td>the surrounding level 1 tree</td></tr>
+<tr><td>agenda</td><td>all agenda files</td></tr>
+</tbody>
+</table>
+
+
+<p>
+Thanks to Jason F. McBrayer and Bernt Hansen for
+inspiration. Thanks to cranreuch (what is you full name?)
+for mentioning, at the right moment, that the clocktable is
+not so bad - that remark made it seem worthwhile to add
+features.
+</p>
+</li>
+<li>
+The commands to import a table and to convert a region to a
+table can now handle comma-separated values (CSV). The
+algorithm does not yet treat quoting correctly, but for
+basic input it works.
+
+</li>
+<li>
+When modifying an existing time stamp, or when entering the
+second stamp of a range, the date prompt will now
+consistently default to the date/time in the existing stamp.
+This was triggered by Nuutti Kotivuori's request.
+
+</li>
+<li>
+At the date/time prompt, there is a new way to specify a
+range of hours, by using "+DURATION" after the time. For
+example:
+
+<p>
+<pre>
+ 14:00+2 means 14:00-16:00
+ 2pm+2:30 means 14:00-16:30
+</pre>
+</p>
+<p>
+Again, Nuutti Kotivuori's request.
+</p>
+</li>
+<li>
+When you use the function `turn-on-orgstruct++' to turn on
+orgstruct-mode, the special org-mode settings for
+auto-filling, indentation and paragraphs are exported into
+the buffer, so that typing list items with indentation works
+better. This was Bastien's idea and request.
+
+</li>
+<li>
+New variable `org-priority-start-cycle-with-default'. When
+t (the default), priority cycling will initially set the
+default priority and then increase or decrease. When nil,
+the first priority set by cycling is already 1 different
+from the default priority. This was mostly driven by
+Bastien.
+
+</li>
+<li>
+In column view: When an entry has a property for a summary
+column defined, its value is normally overwritten by the sum
+of all the children's values each time you enter column
+view. Now there is an exception to this rule: If none of
+the children has that particular property defined, the
+parent's value stays. In this way you can still place TODO
+items under such an entry without getting the property value
+changed. Thanks to Russel Adams for pointing out that this
+is a better way of doing things.
+
+</li>
+<li>
+In column view, computed values are now bold face, and
+trying to edit them is an error. I think this works, but
+testing is appreciated.
+
+</li>
+<li>
+New command `org-occur-in-agenda-files', this is basically
+the quick command John Wiegley proposed the other day, but
+it also works when the agenda files are not yet in buffers.
+The key is `C-c C-x /', any better proposals?
+
+</li>
+<li>
+Links containing a space will now be handled correctly when
+calling the browser. Note that you need to enclose such
+links in square or angular brackets.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.09</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Taking a note upon TODO state changes can be restricted to
+selected states.
+
+</li>
+<li>
+The format in which dates are shown in the daily/weekly
+agenda can be configured.
+
+</li>
+<li>
+The default for `org-remember-store-without-prompt' is now t.
+
+</li>
+<li>
+`org-goto' has been made into a general lookup command.
+
+</li>
+<li>
+Priority cycling goes back to the nil state.
+
+</li>
+<li>
+You can store a remember note to the <b>last used</b> location.
+
+</li>
+<li>
+On Emacs 23, the headline faces for org-mode are now
+inherited from the outline faces.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+The default for `org-remember-store-without-prompt' is now
+t, in order to better match the original intent of
+remember.el (storing a note with minimum interruption of
+work flow). I expect that many people will be hit by this
+incompatible change - nevertheless I believe it is the right
+thing to do.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+You can now select specific states for recording a note when
+switching to that state. With the setting
+
+<p>
+<pre>
+ #+SEQ_TODO: TODO(t) ORDERED(o@) INVOICE(i@) PAYED(p) | RECEIVED(r)
+ #+STARTUP: lognotestate
+</pre>
+</p>
+<p>
+only the states ORDERED and INVOICE will record a timestamp
+and a note.
+</p>
+</li>
+<li>
+You can now set the format of the string for each day in the
+agenda and timeline buffers. You can use a format string
+interpreted by `format-time-string', or you can write your
+own function. Configure the new variable
+`org-agenda-format-date'. Thanks to Levin for triggering
+this development with a patch.
+
+</li>
+<li>
+The default for `org-remember-store-without-prompt' is now
+t, in order to better match the original intent of
+remember.el (storing a note with minimum interruption of
+work flow). Since we can assign files and headlines to
+templates, I guess this takes care of selecting a filing
+location in most cases. For interactive filing, you now
+need a prefix command when exiting `remember'.
+
+</li>
+<li>
+`org-goto' (bound to `C-c C-j') now uses an indirect buffer
+and has additional commands enabled: Org-occur with `C-c /'
+or even faster with `/', and the commands needed to select
+and copy a region. This make `org-goto' a more general
+lookup command instead of only a jumping command. Remember
+that you can exit with `Q' to go back to the original
+location. Thanks to William Henney for this idea.
+
+</li>
+<li>
+Setting the priority with S-up/down now cycles back to a
+state where no priority is specified. This was requested by
+Rick Moynihan.
+
+</li>
+<li>
+You can store a remember note to the <b>last used</b> location.
+So if you select a location interactively once, you can
+re-use it without having to find it again. For this, exit
+the remember buffer with `C-u C-u C-c C-c'. The leading
+comment in the remember buffer will tell exactly where the
+note goes if you exit with a particular command.
+Thanks to Maxim Loginov for this idea.
+
+</li>
+<li>
+On Emacs 23, the headline faces for org-mode are now
+inherited from the outline faces. This is just a
+convenience, so that you only have to configure one set of
+faces, and that will then be outline-1 .. outline-8. You
+will actually not see any difference in org-mode, because
+Stefan Monnier has made the outline faces in Emacs 23 to
+match the current org-mode faces.
+
+<p>
+This change does not effect XEmacs, nor Emacs 21 and 22.
+</p>
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.08</h2>
+
+
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+The default for `org-deadline-warning-days' is now 14.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+There is now a separate interface for fast and directly
+setting a TODO keyword. This interface kicks in when you
+have configured keys for TODO keywords like
+
+<p>
+<pre>
+ #+SEQ_TODO: TODO(t) WAITING(w) | DONE(d) CANCELED(c)
+</pre>
+</p>
+<p>
+C-c C-t still does the cycling thing, you need to use a
+prefix argument to get to the fast interface. Or configure
+the variable `org-use-fast-todo-selection' to t, then this
+will be the default and the prefix argument will make the
+command fall back to cycling.
+</p>
+<p>
+The tag selection no longer does include TODO keywords -
+Leo's arguments have convinced me that this is not a good
+idea. If you'd like to see the TODO keywords in the tags
+interface anyway, set the variable
+`org-fast-tag-selection-include-todo'. Thanks to Leo and
+others for input on this issue.
+</p>
+</li>
+<li>
+New variable `org-edit-timestamp-down-means-later'. When
+set, `S-down' on a timestamp will change the timestamp to
+later. Thanks to Raman for this idea.
+
+</li>
+<li>
+Property names can now contain non-ascii word characters.
+This follows a request from Daniel Clemente.
+
+</li>
+<li>
+For export, the date that should be given in the exported
+file can now be set to a specific value with a line like
+
+<p>
+<pre>
+ #+DATE: 15 November 2003
+</pre>
+</p>
+<p>
+If you want to use the date/time when the file was created,
+use a format string that will be interpreted by
+`format-time-string', for example:
+</p>
+<p>
+<pre>
+ #+DATE: %Y/%m/%d %X
+</pre>
+</p>
+</li>
+<li>
+The default of `org-deadline-warning-days' has changed to 14
+days. 30 was really too much, I suspect most people (me
+included) have changed this.
+
+</li>
+<li>
+When a deadline has an individual lead time, this lead time
+obviously overrules `org-deadline-warning-days'. However,
+if you bind `org-deadline-warning-days' to a number &lt;=0, for
+example during a custom agenda command, then the absolute
+value of this number will be enforced also when a different
+lead time has been specified. This is useful to get a list
+of all deadlines coming up in the next N days.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.07</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Different faces for different TODO keywords.
+
+</li>
+<li>
+Setting TODO states through the TAG setting interface.
+
+</li>
+<li>
+Context information is stored when moving a tree to the archive.
+
+</li>
+<li>
+Sorting can be done by priority.
+
+</li>
+<li>
+`Org-ellipsis' can now also be a face.
+
+</li>
+<li>
+Scheduling info is no longer removed entry is marked CLOSED.
+
+</li>
+<li>
+Unavailable files in `org-agenda-files' can be skipped.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+The time of archiving is now stored as a property.
+ARCHIVED is no longer a special time keyword.
+
+</li>
+<li>
+Scheduling info is no longer removed entry is marked CLOSED.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+You can now define different faces for different TODO
+keywords. This request has come up frequently, so here it
+is: Use the variable `org-todo-keyword-faces'.
+
+<p>
+A Here is a configuration example:
+</p>
+<p>
+<pre>
+ (setq org-todo-keyword-faces
+ '(("TODO" . org-warning)
+ ("DEFERRED" . shadow)
+ ("CANCELED" . (:foreground "blue" :weight bold
+ :underline t))))
+</pre>
+</p>
+<p>
+Org-mode continue still use `org-todo' and `org-done' for
+keywords that have no specific face assigned.
+</p>
+</li>
+<li>
+Some People use TODO states more like tags. For them the
+TODO keywords mark special states and they like to quickly
+switch between states in arbitrary sequence. The standard
+TODO interface is not perfect for this, because it assumes
+that the states are reached in sequence. However, the fast
+tag setting interface is in fact perfect for this. You can
+now "misuse" the TAG selection interface to also set TODO
+states. All you need to do is to assign keys to the TODO
+states, just like you also do for tags.
+
+<p>
+<pre>
+ #+SEQ_TODO: TODO(t) WAITING(w) | CANCELED(c) DONE(d)
+ #+TAGS: @HOME(h) @OFFICE(o) @SHOP(s)
+</pre>
+</p>
+<p>
+Next time you try to set tags with C-c C-c, the todo states
+will be offered as well, and the corresponding key will
+switch the entry to that state.
+</p>
+</li>
+<li>
+New variable `org-archive-save-context-info' governs if
+information that would be lost by moving a subtree to the
+archive file, should be stored as special properties. For
+example,
+
+<p>
+<pre>
+ (setq org-archive-save-context-info '(itags category))
+</pre>
+</p>
+<p>
+will store the inherited tags and the category in properties
+ARCHIVE_ITAGS and ARCHIVE_CATEGORY, respectively. The
+default setting for this variable is to save everything that
+could be lost. This was a proposal by John Wiegley.
+</p>
+</li>
+<li>
+Sorting (`C-c ^') can use the use the priority to sort. Use
+the "p" and "P" keys at the prompt. John Wiegley, again.
+
+</li>
+<li>
+`Org-ellipsis' can now also be a face to make the folding
+ellipsis more visible. This is based on a post by Tassilo
+Horn. Since `org-ellipsis' only works in Org-mode, you
+might want to use Tassilo Horn's hack directly in order to
+affect the folding ellipsis globally.
+
+</li>
+<li>
+Scheduling info is no longer removed when an entry is marked
+CLOSED. This was a request by Brian van den Broek. Let me
+know if this breaks anything for you - then it will become
+an option.
+
+</li>
+<li>
+New option `org-agenda-skip-unavailable-files'. Currently,
+if a file does not exist, it will be removed from
+`org-agenda-files' after a query. When this option is set,
+the file will simply be skipped.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.06</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+When exporting only a region and this region is a single
+(sub)tree (for example selected with `C-c @'), the title for
+the exported document is taken to be the heading of the
+subtree. The sublevels become top-level entries in the
+export. Furthermore, if the head entry of the tree has or
+inherits an EXPORT_FILE_NAME property, that file name (with
+appropriately substituted extension) will be used for the
+exported tree. Thanks to Patrick Drechsler and Jost Burkart
+for these ideas.
+
+</li>
+<li>
+org-special-ctrl-a/e has a third allowed value, `reversed'.
+When it is set to this value, the first C-a or C-e command
+behaves normally, i.e. it goes to the true beginning or end
+of the line. Only when you press C-a or C-e immediately
+again, the the "special" position will be found. Additional
+presses of the same key jump between the two positions. I
+like this a lot better than the `t' setting, because now the
+keys behave more predictable and still give easy access to
+the special locations.
+
+</li>
+<li>
+New command to set or remove a tag from all headlines in a
+region.
+
+</li>
+<li>
+When Org-mode visits a file, it will initially hide all
+drawers.
+
+</li>
+<li>
+The default of the variable `org-cycle-global-at-bob' is now
+nil, meaning that TAB no longer does global visibility
+cycling at the beginning of the buffer.
+
+</li>
+<li>
+Bug fixes, in particular the problems with scheduling and
+deadlines introduced in 5.05. Please check carefully if
+this works correctly again, and complain if not.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.05</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+LaTeX export, finally, thanks to Bastien.
+
+</li>
+<li>
+Extension mechanism for the hyperlink system.
+
+</li>
+<li>
+Global access to commands inserting and following links.
+
+</li>
+<li>
+Individual lead-times for deadlines.
+
+</li>
+<li>
+Option to show only the next instance of repeating timestamp.
+
+</li>
+<li>
+Store remember notes with only 2 keys: C-c C-c
+
+</li>
+<li>
+Appointment reminders from Org-mode.
+
+</li>
+<li>
+Global values for selected properties.
+
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Bastien's `org-export-latex.el' is now part of the org-mode
+distribution. You can export an Org-mode document to a
+LaTeX file with `C-c C-e l'. For more options, see the
+manual, and the commentary in the Lisp file. Kudos to
+Bastien for contributing this frequently requested feature.
+I am sure this has been tough because of the many different
+ways I have been allowing LaTeX snippets and environments to
+be incorporated in lazy free-format ways.
+
+</li>
+<li>
+Org-mode has now an extension mechanism for the hyperlink
+system. This should clear the road for all those mairix and
+other ideas that have been floating around. Now it is on
+<b>you</b> to write and share new link types for Org-mode. The
+interface for adding a new link type is described in the
+appendix of the manual, section A2. The unsolved problem is
+currently how to handle the new link types for
+export/publishing.
+
+</li>
+<li>
+New <b>global</b> commands `org-open-at-point-global' and
+`org-insert-link-global'. You can bind these commands to
+global keys and use them to insert and follow Org-mode-like
+links anywhere in Emacs. Thanks to Adam Spiers for this
+excellent idea.
+
+</li>
+<li>
+Each deadline timestamp may now specify its own interval of
+lead-time display, given in days, weeks, months or years.
+The syntax is like this
+
+<p>
+<pre>
+ DEADLINE: &lt;2007-08-13 Mon -5d&gt;
+</pre>
+</p>
+<p>
+When combined with a repeater, the repeater has to come
+first:
+</p>
+<p>
+<pre>
+ DEADLINE: &lt;2007-08-13 Mon +2w -5d&gt;
+</pre>
+</p>
+<p>
+You may now also customize the faces that are used in the
+agenda to indicate the distance of an approaching deadline.
+See the new option `org-agenda-deadline-faces'.
+</p>
+<p>
+Thanks to Pavel Chalmoviansky and John Wiegley proposals in
+this direction.
+</p>
+</li>
+<li>
+New option `org-agenda-repeating-timestamp-show-all'. When
+set to nil, repeating time stamps will only show up once in
+the agenda, either today or in the near future. Other
+matches will be ignored. Thanks to John Wiegley for this
+proposal.
+
+</li>
+<li>
+New variable `org-remember-store-without-prompt'. When set,
+exiting the remember buffer with C-c C-c will store the note
+without further prompts to the default location, and `C-u
+C-c C-c' will get the prompts for file and location. So
+this variable reverses the prefix-argument functionality for
+storing remember notes. This follows a request from John
+Wiegley.
+
+</li>
+<li>
+A new function `org-agenda-to-appt' activates all
+appointments for the current day so that Emacs will display
+reminders. This uses appt.el. Thanks to Bastien for this
+function.
+
+</li>
+<li>
+You can now set default values for properties that can be
+inherited by all entries in a buffer, or by all entries
+globally. Global properties are set in the variable
+`org-global-properties', like this:
+
+<p>
+(setq org-global-properties '(("NAME" "This is the value")))
+</p>
+<p>
+Buffer-local values are set like this:
+</p>
+<p>
+#+PROPERTY: NAME This is the value
+</p>
+<p>
+When using org-entry-get to get the value of a property with
+the `inherit' flag and the hierarchy above the entry does
+not contain this property, the buffer-local and global lists
+are checked as well. This is mostly useful (I think) to set
+the list of allowed values for a property. Thanks to Bernt
+Hansen and Bastien for these ideas.
+</p>
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.04</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+New variables `org-export-author-info' and
+`org-export-time-stamp-file' to turn off inclusion of author
+and time information into exported files. Thank to Patrick
+Drechsler for pointing out that this would be useful.
+
+</li>
+<li>
+New variable to avoid moving DEADLINE and SCHEDULED info
+into the property drawer. The default is now to not move
+this stuff into the drawer.
+`org-insert-labeled-timestamps-before-properties-drawer'
+
+</li>
+<li>
+`org-archive-mark-done' can be a string now, to select a
+specific keyword that should be used for archived entries.
+
+</li>
+<li>
+New command "j" in agenda to jump to an arbitrary date.
+Thanks to Bernt Hansen for the patch.
+
+</li>
+<li>
+Lots of minor fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.03</h2>
+
+
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+The variable `org-special-ctrl-a' has been renamed to
+`org-special-ctrl-a/e'. The old one is still an alias (but
+not on Emacs 21 where variable aliases cannot be defined).
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+When the variable `org-special-ctrl-a/e' is set, C-e in a
+headline first goes to the end of the headline ignoring the
+tags. A second C-e then goes to after the tags.
+
+</li>
+<li>
+Typing and removing single characters in a headline now
+keeps the tags in the headline aligned. This could have a
+little impact on performance while deleting stuff - let me
+know if we need to make this customizable.
+
+</li>
+<li>
+New option `org-n-level-faces' can be used to set the number
+of different faces that are used for headlines. Default is
+all 8 faces Org-mode defines for this purpose, level 9 uses
+again the level-1 face. However, you can use fewer, and then
+the level-1 face will be reused already for level N+1, etc.
+
+</li>
+<li>
+Column View and hidestars now work together.
+
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.02</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+The interfaces for properties and column view are finished
+now and work well.
+
+</li>
+<li>
+Properties can be summaries, i.e. the parent nodes can
+compute their value from the children's values.
+
+</li>
+<li>
+Headlines finally require a space ofter the star(s). The
+conflict with bold text at the beginning of the line is no
+longer there.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+Bad news. It looks like it is going to be really hard to
+make column view work on XEmacs and on Emacs 21. Emacs 22
+is currently the only Emacs where this works. If you are
+using Emacs 21 or XEmacs, you can still use properties, but
+not column view.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Improvements for properties:
+
+<ul>
+<li>
+There are interactive commands to insert and delete
+properties. Read the manual chapter 7 for details.
+
+</li>
+<li>
+You can define <i>allowed values</i> for a property. When
+these are defined, you can change the value of a property
+with S-left and S-right. And you may use completion when
+inserting the property. This goes a long way to prevent
+typos when entering properties.
+
+</li>
+</ul></li>
+<li>
+Improvements for column view.
+
+<ul>
+<li>
+In column view, you may use the keys S-left/right (and
+also the keys `n' and `p') to switch from one allowed
+value to the next.
+
+</li>
+<li>
+You can define summaries for columns. For example,
+parents can contain the sum of all children values of a
+property, or the parent node can have a check box property
+that is automatically checked when all children's boxes are
+checked.
+
+</li>
+<li>
+There are interactive commands to add and remove columns,
+and to change the attributes of a column like the summary
+type.
+
+</li>
+</ul>
+<p>These additions lead to the exciting fact that the example
+from <a href="http://www.omnigroup.com/images/applications/omnioutliner/features/multicolumn.jpg">omni outliner</a> posted by Scott Jaderholm can now be
+accurately <a href="omni-org.jpg">reproduced by Org-mode</a>.
+</p>
+</li>
+<li>
+The space after the stars is now required in a headline, in
+order to remove the conflict with bold words at the
+beginning of a line. So
+
+<p>
+<pre>
+ * This is a level 1 headline
+ *this is bold text*
+</pre>
+</p>
+</li>
+<li>
+S-up and S-down to navigate plain item lists are now also
+available in orgstruct-mode.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.01</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+A new minor mode, orgstruct-mode, exports the Org-mode
+structure editing commands into any other mode.
+
+</li>
+<li>
+DRAWERS are a new level off folding for special sections
+that should stay closed during visibility cycling and only
+open if explicitly asked.
+
+</li>
+<li>
+Entries can now have PROPERTIES.
+
+</li>
+<li>
+A COLUMN VIEW implementation allows to easily view and edit
+the properties of a hierarchy of entries (Emacs only, for
+now).
+
+</li>
+<li>
+Formula evaluation in the spreadsheet is more consistent
+now. Properties and per-file constants can be used during
+evaluation.
+
+</li>
+<li>
+Bug fixes and minor changes.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+When using LEVEL=N in a tags search, things have changed if
+you are also using `org-odd-levels-only'. If you are using
+only odd levels (i.e. 1 or 3 or 5&hellip; stars), LEVEL=2 will
+now refer to 3 stars, LEVEL=3 to 5 stars etc. Many thanks
+to Leo (or blame on him if you must) who has convinced me
+that this is the better convention.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Orgstruct minor mode</h4>
+
+
+<p>
+There is a new minor mode, orgstruct-mode. This modes works
+in a similar way as Orgtbl-mode. It can be used to export
+the Org-mode structure-editing commands into arbitrary major
+modes in Emacs. For example, you can use it in Mail-mode to
+easily create lists.
+</p>
+<p>
+The functionality in Orgstruct mode is only active, if the
+cursor is in a line that looks either like a headline, or
+like the first line of a plain list item. Then the commands
+`TAB', `M-cursor', `M-S-cursor', `M-RET', `M-S-RET', `C-c ^',
+`C-c C-c', and `C-c -' will do structure-related editing just
+like in Org-mode. If the cursor is not in such a line, all
+these keys will do whatever the major mode or other active
+minor modes have assigned to them.
+</p>
+<p>
+Orgstruct-mode is the result of a proposal by Raman, quite
+some time ago. It has taken a long time, but here is finally
+the promised implementation.
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Drawers</h4>
+
+
+<p>
+The new concept of <i>drawers</i> allows to create sections
+that remain folded during visibility cycling. Drawers need
+to be configured using the variable `org-drawers'. A drawer
+starts with a line containing only the name of the drawer
+bracketed by colons. It ends with :END:. For example,
+after setting
+</p>
+<p>
+<pre>
+ (setq org-drawers '("PROPERTIES" "HIDDEN"))
+</pre>
+</p>
+<p>
+you can then create drawers like this:
+</p>
+<p>
+<pre>
+ :HIDDEN:
+ here is some stuff that remains hidden
+ unless TAB is pressed directly in that line
+ :END:
+</pre>
+</p>
+<p>
+The PROPERTIES drawer has special meaning for ORG-mode, it
+contains properties of an entry (see below).
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Properties and Column View</h4>
+
+
+<ul>
+<li>
+Entries in Org-mode can now have arbitrary <i>properties</i>
+associated with them. Org-mode handles some default
+properties like the TODO state, the priority, the local
+tags, and planning information like DEADLINE and SCHEDULED.
+In addition, you can assign arbitrary properties by creating
+a property drawer and inserting a line like
+
+<p>
+<pre>
+ :PROPNAME: This is the value of the property
+</pre>
+</p>
+<p>
+Org-mode has an API for properties, if you want to write a
+program using properties, use the functions
+`org-entry-properties', `org-entry-get', `org-entry-put',
+and `org-entry-delete'.
+</p>
+</li>
+<li>
+Planning information like DEADLINE can be hidden in the
+properties drawer.
+
+<p>
+If the PROPERTIES drawer starts in the first line after a
+headline, also the DEADLINE, SCHEDULED and CLOCK information
+will be inserted inside the drawer. If no PROPERTIES drawer
+is present, or if it does not start in the line right after
+the headline, this information remains in the lines directly
+after the headline, outside the drawer.
+</p>
+</li>
+<li>
+TAGS searches can now also query properties. For example,
+the search
+
+<p>
+<pre>
+ LEVEL=3+BOSS+ASSIGNED="Hans"/WAITING
+</pre>
+</p>
+<p>
+will find entries that
+</p><ul>
+<li>
+are level 3
+</li>
+<li>
+have the tag BOSS
+</li>
+<li>
+have an ASSIGNED property with the value "Hans"
+</li>
+<li>
+are TODO status WAITING.
+
+<p>
+So here is an entry that will match:
+</p>
+<p>
+<pre>
+ *** WAITING Clean up the factory :BOSS:
+ :PROPERTIES:
+ :ASSIGNED: Hans
+ :END:
+</pre>
+</p>
+<p>
+You may also use a regular expression to match against a
+property value. For example, to find stuff assigned to Hans
+or Sarah, use
+</p>
+<p>
+<pre>
+ ASSIGNED={^\(Hans\|Sarah\)$}
+</pre>
+</p>
+</li>
+</ul></li>
+<li>
+Column View is a special way to look at property values in
+tabular form. Column View can be used in any org-mode
+file, and also in any agenda buffer. It works by placing
+an overlay over each headline (or agenda line) that shows a
+table of selected properties. You can look at and edit
+properties from this view. Which properties are shown in
+the table must be set up using the COLUMNS property. You
+can set up different property columns on different levels
+of an outline tree. For example:
+
+<p>
+<pre>
+ * People
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name
+ :END:
+ ** Family
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name %3Age
+ :END:
+ *** Sam
+ Info about Sam, including a property list with Name and Age.
+ *** Sarah
+ Info about Sarah, including a property list with Name and Age.
+ ** Office
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name %Function %Salary
+ :END:
+ *** Boss
+ Info about the Boss, including a property list with Name,
+ Function and Salary (if only we knew....).
+</pre>
+</p>
+<p>
+Now we have defined three different sets of columns. If
+you switch to column view in the <i>Family</i> section, you
+will get a different table than if you do it in the
+<i>Office</i> section. However, if you switch to column
+view with the cursor on the <i>People</i> section, the
+table will cover all entries, but contain only the
+<i>Name</i>.
+</p>
+<p>
+Column view does, for the time being, only work on Emacs.
+The XEmacs implementation needs a bit of work.
+</p>
+</li>
+<li>
+Properties can be used in table formulas. To access the
+value of the property :XYZ:, use $PROP_XYZ. The property
+needs to be defined in the hierarchy above the table, not
+necessarily in the same entry as the table. This was a
+request by Eddward. File-wide constants can be defined with
+#+CONSTANTS, see below.
+
+</li>
+<li>
+Things that still need to be sorted out about drawers,
+properties and column view - comments and suggestions
+welcome!
+
+<ul>
+<li>
+How to deal with drawers and properties in HTML and ASCII
+export?
+</li>
+<li>
+What key could be used to insert an empty property drawer
+into an entry?
+</li>
+<li>
+Right now column view is invoked through the command C-c
+C-x C-c. It is too easy to type C-x C-c by mistake, and
+that causes Emacs to quit. Suggestions for a different
+key?
+</li>
+<li>
+Fontification of drawers and properties is not good yet.
+Any suggestions for better defaults?
+</li>
+<li>
+Mouse support for editing properties in column view would
+be nice - maybe Piotr is interested to add this to
+org-mouse.el?
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Spreadsheet</h4>
+
+
+<ul>
+<li>
+In the spreadsheet, the evaluation of formulas has changed.
+Previously, first the column formulas would be evaluated
+everywhere, and then the field formulas would kick in, and
+in some cases overwrite the results of column formulas in
+the appropriate fields. This had the side effect that some
+formulas might always use the wrong, intermediate content of
+a field that is computed both by a column and a field
+formula.
+
+<p>
+From now on, column formulas will no longer temporarily
+overwrite field formulas. This gives much more consistent
+results. For example you can now finally have a column of
+increasing numbers by setting the first field to a fixed
+number, and let the rest follow from a column formula.
+</p>
+<p>
+Here is an example
+</p>
+<p>
+<pre>
+ | 1 |
+ | 2 |
+ | 3 |
+ #+TBLFM: $1=@-1+1::@1$1=1
+</pre>
+</p>
+</li>
+<li>
+Constants for formulas in spreadsheets are globally defined
+with the variable `org-table-formula-constants'. File-local
+constants can now be set with a line like:
+
+<p>
+<pre>
+ #+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6
+</pre>
+</p>
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Minor changes</h4>
+
+
+<ul>
+<li>
+When entries are archived, a timestamp for the moment of
+archiving is added to the line with planning information.
+It looks like this:
+
+<p>
+<pre>
+ ARCHIVED: [2007-07-02 Mon 11:34]
+</pre>
+</p>
+<p>
+Thanks to J. David Boyd for constructive comments.
+</p>
+</li>
+<li>
+Bug fixes
+
+<p>
+Many bugs are fixed, as usually all the ones where I replied
+"fixed" on emacs-orgmode. If you reported one of these
+bugs, please check if it really has disappeared in the new
+version, and complain if not. Thanks!
+</p>
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.79</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+We are back to a single file org.el that works both on Emacs
+and on XEmacs. Merging comes at a speed penalty for you as
+an XEmacs user, but <b>only if you do not compile</b> org.el.
+Compilation completely removes the penalty.
+
+</li>
+<li>
+New L flag for literal interpolation in Lisp formulas.
+See manual section 3.5.3.
+
+</li>
+<li>
+New options for turning off footnotes.
+This was a request from Ignotus.
+See the option `org-export-with-footnotes'.
+
+</li>
+<li>
+Default length for Agenda entries, but this is off by
+default. This was a request from Micheal.
+See the option `org-agenda-default-appointment-duration'.
+
+</li>
+<li>
+Bug fixes:
+
+<ul>
+<li>
+org-agenda-date-later (Juraj Kubelka)
+</li>
+<li>
+letters off margin in orgcard.ps (Charles Cave)
+</li>
+<li>
+TODO export problems on XEmacs (ignotus@freemail.hu)
+</li>
+<li>
+args-out-of-range with table formulas (Cecil Westerhof)
+</li>
+<li>
+problem with org-file without a heading (Tim O'Callaghan)
+
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.78</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Time stamps with a time range <b>included</b>, like
+<pre>
+ &lt;2007-06-18 Mon 17:33-18:23&gt;
+</pre>
+
+</li>
+<li>
+Clock times without clocking in/out: CLOCK: =&gt; 2:00
+
+</li>
+<li>
+Language-specific characters allowed in TAGS (Emacs only).
+
+</li>
+<li>
+Promotion and demotion of items gets the indentation right.
+
+</li>
+<li>
+Indenting lines with TAB is more intelligent.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+There is now a special version of `org.el' for XEmacs.
+Before installation, as an XEmacs user you must rename the
+file org_xemacs.el to org.el, i.e. you must overwrite org.el
+with the xemacs version. For example:
+
+<p>
+<pre>
+ mv org_xemacs.el org.el
+</pre>
+</p>
+<p>
+This is necessary so that I can make use of some features
+that would be cumbersome to support in a single file. The
+XEmacs version is derived from the Emacs version with a
+program, so no reason to fear that I might be dropping
+XEmacs support any time soon. Sorry for the trouble.
+</p>
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+A time stamp may now contain a range of times. So you no
+longer need to use two separate stamps to indicate a time
+interval on a single day. For example
+
+<p>
+<pre>
+ &lt;2007-06-18 Mon 17:30-18:20&gt;
+</pre>
+</p>
+<p>
+This is now fully supported, including changing the time
+with S-up/down while the cursor is on the end time. Also,
+da the date/time prompt, you can simply write your time like
+12:00-14:00 and the range will be inserted.
+</p>
+<p>
+This was proposed by Leo some time ago, and recently by
+Michael.
+</p>
+</li>
+<li>
+You may specify clocking times by hand (i.e. without
+clocking in and out) using this syntax.
+
+<p>
+<pre>
+ CLOCK: =&gt; 2:00
+</pre>
+</p>
+<p>
+Thanks to Scott Jaderholm for this proposal.
+</p>
+</li>
+<li>
+TAGS may now contain language-specific word characters, as
+long as they are matched by the "[:alnum:]" regexp syntax.
+This is for Emacs only, the XEmacs version continues to use
+the character class "a-zA-Z0-9_@" for tag names. Thanks to
+David Smith for a patch to this effect (a modified version
+of that patch was applied). I am considering to make the
+same change for TODO keywords, but not yet. Note that files
+using localization features may not work correctly in the
+Emacs configuration of another user, so if you are sharing
+org-mode files with other users, it might still be best to
+stick to the ASCII characters.
+
+</li>
+<li>
+Promotion and demotion of plain list items (commands M-left,
+M-right) no longer changes the indentation by just one
+space. Instead, it uses intelligence gathered from the
+surrounding list structure to do the right thing. Thanks to
+William Henney for starting the discussion about this.
+
+</li>
+<li>
+TAB does now a better job of indenting lines.
+
+<ul>
+<li>
+After tables and code segments (lines starting with ":"),
+indentation goes back to what it was before (thanks to
+William Henney for suggesting this behavior).
+
+</li>
+<li>
+When plain lists items are involved, we had a long
+discussion on emacs-orgmode where I tried to show that a
+too-sophisticated implementation will still be easily
+fooled. Here is what I have implemented now - lets see
+if we can agree on this:
+
+<p>
+Indentation will flatten lists with the same bullet type,
+but indent another bullet type further. The time when
+this fails is in a nested list, when you want to get back
+out to a previous level. For example
+</p>
+<p>
+<pre>
+ - item 1
+ - item 2
+ + item 2a
+ + item 2b
+ - item 3
+</pre>
+</p>
+<p>
+When using TAB on every line in this list, the structure
+will change to
+</p>
+<p>
+<pre>
+ - item 1
+ - item 2
+ + item 2a
+ + item 2b
+ - item 3
+</pre>
+</p>
+<p>
+So you need to change the level of the last line by hand,
+using promotion and demotion functions.
+</p>
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.77</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Vertical lines in exported tables.
+</li>
+<li>
+New default for `org-show-following-heading'.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+The default for `org-show-following-heading' is now nil.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+You can now specify column groups in tables, to the effect
+that the groups will be separated by vertical lines in HTML
+and ASCII output. Column groups are specified by the
+characters "&lt;" and "&gt;" in a special table row. "&lt;" starts a
+group, "&gt;" ends a group (in each case including the the
+column where the character is specified). You may also use
+"&lt;&gt;" to make a group a single column wide. For example:
+
+<p>
+<pre>
+ | | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N) |
+ |---+----+-----+-----+-----+---------+------------|
+ | / | &lt;&gt; | &lt; | | &gt; | &lt; | &gt; |
+ | # | 1 | 1 | 1 | 1 | 1 | 1 |
+ | # | 2 | 4 | 8 | 16 | 1.4142 | 1.1892 |
+ | # | 3 | 9 | 27 | 81 | 1.7321 | 1.3161 |
+ #+TBLFM: $3=$2^2::$4=$2^3::$5=$2^4::$6=sqrt($2)::$7=sqrt(sqrt(($2))
+</pre>
+</p>
+<p>
+A table row with with nothing but "/" in the first field is
+never exported, but can be used to place column group
+information into the table. In this table, we create a
+group for column 2, one for columns 3-5 and one for columns
+6-7. HTML export will render a vertical line between these
+groups.
+</p>
+<p>
+Because HTML does not require closing &lt;colgroup&gt; tags with
+&lt;/colgroup&gt;), you can also simply start a new column
+wherever you want a vertical line:
+</p>
+<p>
+<pre>
+ | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N0 |
+ |---+-----+-----+-----+---------+------------|
+ | / | &lt; | &lt; | | &lt; | |
+</pre>
+</p>
+</li>
+<li>
+Vertical lines are now also omitted in ASCII export, unless
+grouping explicitly requests these lines.
+
+</li>
+<li>
+The default for `org-show-following-heading' is now nil,
+meaning that sparse trees will be more compact. This has
+become possible due to in important remark by Jason Dunsmore
+who pointed out that TAB should behave differently in the
+inconsistent trees produced by the sparse tree commands.
+TAB does now make sure that the heading after a freshly
+unfolded tree is made visible at all, removing the confusing
+behavior we had before.
+
+</li>
+<li>
+Several bugs fixed. In particular:
+
+<ul>
+<li>
+Strings produced by agenda batch processing with
+`org-batch-agenda' and `org-batch-agenda-csv' are now
+properly encoded, so that you should be able to use
+special characters in other languages as along as your
+post-processing program handles them correctly. At least
+for Emacs this should work now, but have not yet figured
+out how to do this in XEmacs.
+
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.76</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Exporting Footnotes to HTML
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Footnotes like<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup> are now exported to HTML
+
+<p class="footnote"><sup><a class="footnum" name="fn.1" href="#fnr.1">1</a></sup>This is a footnote
+
+<p>
+Thanks to Scott Jaderholm for this proposal and a detailed
+HTML example on how the exported text should look like.
+</p>
+</li>
+<li>
+Special version of the reference card, for letter paper.
+
+</li>
+<li>
+Switching to OVERVIEW with S-TAB no loner moves the cursor,
+so after three `S-TAB' commands, you will be back where you
+started.
+
+</li>
+<li>
+Bug fixes, lots of them again.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.75</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Cyclic time stamps that repeat after an interval.
+</li>
+<li>
+Special timestamps for appointments like "every 2nd Thursday
+in a month".
+</li>
+<li>
+Completion of link abbreviation prefixes inside `C-c C-l'.
+</li>
+<li>
+Replacing a region of org-mode syntax with HTML.
+</li>
+<li>
+iCalendar export now honors ARCHIVE etc.
+</li>
+<li>
+New command to add/change emphasis markers.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+The REPEAT(&hellip;) cookie is no longer supported, the repeater
+interval now goes directly into the time stamp.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Time stamps can contain a repeater code, like +1w for once
+every week, +2d for every two days, etc. For example,
+
+</li>
+</ul>
+<p><span class="timestamp">2007-05-16 Wed 12:30 +1w</span><br/>
+</p>
+<p>
+will apply to every Wednesday, starting from the date given.
+I believe this syntax was actually suggested by someone on
+the mailing list, but I cannot find the email back. To
+collect your credit, let me know!
+</p>
+<ul>
+<li>
+You can use an sexp diary entry (with the syntax used by the
+Emacs calendar/diary) in a time stamp, like this:
+
+<p>
+*** The nerd club meets on 2nd Thursday of every month
+</p></li>
+</ul>
+<p><span class="timestamp">%%(diary-float t 4 2)</span><br/>
+</p>
+<ul>
+<li>
+You can put diary-style sexp entries directly into an
+org-mode file, where they will be interpreted just like they
+would in the diary. For example
+
+<ul>
+<li>
+Birthdays and similar stuff
+</li>
+</ul>
+<p>#+CATEGORY: Holiday
+%%(org-calendar-holiday) ; special function for holiday names
+#+CATEGORY: Ann
+%%(diary-anniversary 14 5 1956) Artur Dent %d is years old
+%%(diary-anniversary 2 10 1869) Mahatma Gandhi
+</p>
+<p>
+These entries must start at column 0 to be evaluated.
+</p>
+<p>
+It turns out that evaluating the entries in an org-mode file
+is actually faster than in the diary itself, because using
+the diary has some overhead (creating fancy diary display,
+then reading and re-interpreting the entries). I have moved
+all the sexp entries from my diary into an org-mode file,
+put in a few categories, and then turned off
+`org-agenda-include-diary'. This has led to a noticeably
+faster agenda display.
+</p>
+</li>
+<li>
+New command `org-replace-region-by-html' that converts the
+current region from org-mode syntax into HTML. For example,
+you might write an itemized list in plain text in an HTML
+buffer, and then invoke this command to convert it. Thanks
+to Raman for this idea.
+
+</li>
+<li>
+When inserting a link with `C-c C-l', completion will now
+fill in all valid link prefixes, like http or ftp, but also
+link abbreviation prefixes. This is based on an idea by
+Bastien.
+
+</li>
+<li>
+Highest, lowest, and default priority can be set on a
+per-file basis with #+PRIORITIES: H L D
+For example, to use priorities from 1 to 9, you could use
+
+<p>
+#+PRIORITIES: 1 9 9
+</p>
+<p>
+Thanks to Dmitri Minaev for a patch to this effect.
+</p>
+</li>
+<li>
+iCalendar export now honors (i.e. skips) subtrees marked as
+ARCHIVE, COMMENT, or QUOTE.
+
+</li>
+<li>
+There is a new command to add or change the emphasis (like
+bold or italic) of a piece of text. For lack of better
+available keys the command is at `C-c C-x C-f', but you may
+well want to choose a more convenient key like `C-c f' in
+your private setup:
+
+<p>
+(add-hook 'org-load-hook
+(lambda () (define-key org-mode-map "\C-cf" 'org-emphasize)))
+</p>
+<p>
+The command will prompt for an emphasis type, and you may
+reply either with the marker that triggers the emphasis, or
+with the first letter of the corresponding HTML tag. For
+example, to select italic, press either "/" or "i".
+</p>
+<p>
+If there is an active region, the emphasis of this region
+will be set or changed. If there is no region, only the
+emphasis markers will be inserted and the cursor positioned
+between them. Thanks to Bastien for proposing this feature.
+</p>
+</li>
+<li>
+Bug fixes, everything where I have replied "fixed" on the
+mailing list. Thanks to all of you for keeping these reports
+coming.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.74</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<p>
+This release is about exporting agenda views, to HTML, to
+postscript for printing, and to a special format (CSV) for
+further processing in scripts.
+</p>
+</div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+The variable `org-agenda-remove-tags-when-in-prefix' has
+been renamed to `org-agenda-remove-tags'.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Agenda views can be exported as plain text, as HTML, and as
+Postscript(R). This can simply be done from the agenda
+buffer with `C-x C-w' and then specifying a filename like
+`myagenda.html' or `myagenda.ps'. See section 8.6.4 of the
+manual.
+
+</li>
+<li>
+Each custom agenda view can specify a list of associated
+files names. The command `C-c a e' then creates all views
+that have associated file names and exports the views to
+these files. This is great for producing paper versions of
+your views, to take with you when you don't have your
+computer. The manual has an example on how to do this, and
+in particular on how to customize the format of the printed
+version. See section 8.6.4 of the manual.
+
+</li>
+<li>
+You can produce a CSV format of agenda information with an
+Emacs batch command. This is greate for further processing
+in scipts. Thanks to Jason F. McBrayer for this idea.
+See section 8.6.5 of the manual.
+
+</li>
+<li>
+New variable `org-agenda-skip-deadline-if-done'. When set,
+a deadline associated with a DONE item will not be shown in
+the agenda. This is based upon a report by Denis Bueno.
+
+</li>
+<li>
+Quite a few bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.73</h2>
+
+
+<p>
+Minor bug fixes.
+</p>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.72</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Control over blank lines between trees in collapsed view.
+
+</li>
+<li>
+Info about the running clock is shown in the modeline.
+
+</li>
+<li>
+C-a can behave specially in headlines.
+
+</li>
+<li>
+Better color and scaling defaults for LaTeX fragments.
+
+</li>
+<li>
+Customizable list of keys in org-mode to be replaced.
+
+</li>
+<li>
+Stuck project descriptions have been extended.
+
+</li>
+<li>
+Emphasis code has been modified to fix some issues.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+The option `org-format-latex-options' has changed. If you
+have customized it, please revert to default and then redo
+your customization.
+
+</li>
+<li>
+`org-CUA-compatible' no longer modifies S-RET by default,
+because newer versions of CUA don't use this key anymore.
+If you need this replacement, customize the variable
+`org-disputed-keys'.
+
+</li>
+<li>
+The variable `org-CUA-compatible' is obsolete, please use
+`org-replace-disputed-keys' instead. `org-CUA-compatible'
+is still an alias for this new variable, though.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Better control over blank lines between trees in collapsed
+view. This has come up several times in the past and most
+recently by Scott Jaderholm. There is now a new variable
+`org-cycle-separator-lines' with default value 2. It says
+how many empty lines there need to be after the end of a
+subtree to get an empty line in collapsed view. So with the
+default, if you leave only one empty line it will disappear
+in collapsed view. If you leave two, one empty line will
+remain so that you can use double empty lines to structure
+the collapsed views of a file. I love it, so many thanks to
+Scott fro bringing this up again.
+
+<p>
+One property of the new setup is that you will never get
+more than one blank line in collapsed view. We could do
+something special to allow <b>several</b> empty lines in
+collapsed view, but I think this is counter-productive.
+</p>
+<p>
+In Emacs 22, if you want to make full use of this, make sure
+that you have not set `outline-blank-line'.
+</p>
+</li>
+<li>
+When the clock is running, Org-mode will put info about it
+into the modeline. The info consists of the elapsed time
+and the heading of the clocked item. This was a proposal
+from Bastien who got the idea from Muse.
+
+</li>
+<li>
+C-a can behave specially in headlines when you set the
+variable `org-special-ctrl-a'. It will bring the cursor
+first back only to the beginning of the headline <b>text</b>,
+i.e. after the stars and the TODO keyword, if any. A second
+C-a will then move the cursor to the beginning of the line.
+If the cursor is already at the beginning of the line, C-a
+will spring <b>forward</b> to the headline text. This was a
+proposal from Leo, based on a request from Scott Jaderholm.
+
+<p>
+I have not turned this turned this on by default, should I?
+</p>
+</li>
+<li>
+When LaTeX fragments are processed into images, there is now
+more control and (hopefully) betters defaults for colors and
+scaling. Special values can be set for HTML export, so that
+these values can differ from what is used for display in an
+emacs buffer. The default foreground and background colors
+for images embedded in emacs are now taken from the default
+emacs face. Thanks to Xiao-Yong Jin for proposing these
+changes.
+
+</li>
+<li>
+There is now a much better mechanism to change some keys in
+org-mode if these keys clash with other modes you use. Turn
+this on by setting `org-replace-disputed-keys' (aliased to
+`org-CUA-compatible'). The list of keys to replace is now
+fully customizable, see the option `org-disputed-keys'.
+Many thanks to Meciej Katafiasz for a patch implementing
+this.
+
+</li>
+<li>
+Stuck project descriptions have been extended. You can now
+use "*" as a TODO keyword or tag to say that <b>any</b> TODO
+keyword or TAG marks a project as non-stuck. You also can
+give an arbitrary regular expression that, if it matches,
+indicates a non-stuck project.
+
+</li>
+<li>
+The code for emphasis like bold, italic etc has been
+modified - I might have broken something in the process,
+please let me know if you find problems.
+
+</li>
+<li>
+A number of bugs have been fixed - those where I have
+replied "Fixed" on the mailing list.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.71</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+New variables to customize the header and data tags in
+exported HTML. These are the variables
+`org-export-table-header-tags' and
+`org-export-table-data-tags'. This follows a request from
+Scott Otterson.
+
+</li>
+<li>
+New option `org-format-latex-header' for customizing the
+header of the LaTeX file used to convert embedded LaTeX to
+images. Thanks to `Matthieu Lemerre' for the suggestion.
+
+</li>
+<li>
+The prefix version of `org-todo-list' works again. This
+means that `C-1 C-c a t' produces the list of TODO entries
+for the first TODO keyword. If you use different TODO setups
+in different agenda files, be careful: This number now
+refers to the list of <b>all</b> todo keywords used in files
+that are scanned for the agenda.
+
+</li>
+<li>
+Many bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.70</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Dust settles after revamp of TODO keyword system.
+</li>
+<li>
+The export title can be taken from the first text line.
+</li>
+<li>
+TTY replacement keys have changed.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+Some TTY replacement keys are changed, see below.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Further development concerning TODO keywords.
+
+<ul>
+<li>
+You can now have several DONE states in a sequence, like
+
+<p>
+#+SEQ_TODO: TODO VERIFY | DONE DELEGATED
+</p>
+<p>
+The difference to the proposal discussed on the mailing
+list (and which is also works!)
+</p>
+<p>
+#+SEQ_TODO: TODO VERIFY | DONE
+#+SEQ_TODO: | CANCELED
+</p>
+<p>
+is that in the first case, the extra DONE states will be
+reached with `C-c C-t' (or with `t' from the agenda), while
+in the second case you need S-&lt;right&gt; to get to the special
+states. I guess both ideas can be useful - I am leaning
+toward using the latter.
+</p>
+</li>
+<li>
+Setting up TODO keywords in Lisp previously used two
+separate variables: `org-todo-keywords' and
+`org-todo-interpretation'. The preferred way is now to use
+only `org-todo-keywords', with a new structure:
+
+<p>
+(setq org-todo-keywords
+'((sequence "TODO" "|" "DONE")
+(sequence "BUG" "KNOWNCAUSE" "|" "FIXED" "IGNORED")
+(type "Fred" "Lisa" "Peter" "|" "DONE")
+(sequence "CANCELED") ; for things we decide to not do.
+))
+</p>
+<p>
+If your setting has this new structure,
+`org-todo-interpretation' will be ignored. This change
+does not break backward compatibility. The old way of
+using a flat list in `org-todo-keywords' and taking the
+interpretation from the other variable still works.
+</p>
+</li>
+<li>
+When listing <b>specific</b> TODO entries via a sparse tree
+(`C-u C-c C-v') or via the agenda (`C-c a T' or `C-u C-c a
+t'), you can now specify several keywords to be selected,
+like "TODO|VERIFY|WAITING". This also works for custom
+agenda commands. Thanks to Jason F. McBrayer for pointing
+out this omission.
+
+</li>
+</ul></li>
+<li>
+If you have configured Org-mode to export also the text
+before the first headline (this is done by setting the
+variable `org-export-skip-text-before-1st-heading' to nil),
+then the first normal text line in the buffer becomes the
+title of the exported document. A title set with #+TITLE
+overules this default, and the first line then belongs to the
+normal text. Thanks to David House for this proposal.
+
+</li>
+<li>
+TTY replacement keys. Some of the key bindings used by
+Org-mode do not work on a tty, so replacement key sequences
+are provided on ttys. In version 4.70, there are some
+changes in the tty replacements. Thanks to Jason F. McBrayer
+for coming up with the idea to use C-c &lt;cursor&gt; keys.
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="left"></col><col align="left"></col><col align="left"></col>
+<thead>
+<tr><th>Command</th><th></th><th>Old TTY</th><th>New TTY</th></tr>
+<tr><th>org-&hellip;..</th><th>Main Key</th><th>Replacement</th><th>Replacement</th></tr>
+</thead>
+<tbody>
+<tr><td>shiftleft</td><td>S-left</td><td>C-c C-x left</td><td>C-c left</td></tr>
+<tr><td>shiftright</td><td>S-right</td><td>C-c C-x right</td><td>C-c right</td></tr>
+<tr><td>shiftup</td><td>S-up</td><td>C-c C-x up</td><td>C-c up</td></tr>
+<tr><td>shiftdown</td><td>S-down</td><td>C-c C-x down</td><td>C-c down</td></tr>
+<tr><td>shiftcontrolleft</td><td>C-S-left</td><td></td><td>C-c C-x left</td></tr>
+<tr><td>shiftcontrolright</td><td>C-s-right</td><td></td><td>C-c C-x right</td></tr>
+</tbody>
+</table>
+
+
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.69</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<p>
+This time the changes affect the following areas:
+</p>
+<ul>
+<li>
+TODO keywords: Multiple sequences in a single file.
+</li>
+<li>
+Export: More control over text before the first heading.
+</li>
+<li>
+Export: More control over sub/superscript interpretation.
+</li>
+<li>
+Plain lists: Option to let empty lines terminate lists.
+</li>
+<li>
+Tables: New command to insert hline and move into line below.
+</li>
+<li>
+REPEATing items: Turn of note taking.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+It used to be possible to spread the list of TODO keywords
+over several lines, like
+
+<p>
+#+SEQ_TODO: TODO
+#+SEQ_TODO: PROGRESS
+#+SEQ_TODO: DONE
+</p>
+<p>
+This is no longer possible. Each such line now specifies an
+independent set of TODO keywords, with its own DONE state.
+See below for details.
+</p>
+</li>
+<li>
+The #+TEXT construct has been used to insert unchanged HTML
+into an exported file. This is no longer possible, the TEXT
+lines will be processed like any other lines. However,
+there are now much better ways of getting quoted HTML into
+the exported file.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+You can now use multiple sets of TODO keywords in the same
+buffer. For example, you may put the following three lines
+into a file:
+
+<p>
+#+SEQ_TODO: TODO DONE
+#+SEQ_TODO: REPORT BUG KNOWNCAUSE RESOLVED
+#+TYP_TODO: Fred Laura Peter Me OK
+</p>
+<p>
+Each sub-sequence has its own DONE state. It is best to use
+different keywords in all sequences, to make sure Org-mode
+does not loose track in which specific sequence it is
+working. You could use the same word for all DONE states,
+but then cycling through to a TODO state might not bring you
+where you want to be.
+</p>
+<p>
+After initially setting a keyword, `C-c C-t' cycles through
+a sublist, i.e. is cycles from TODO to DONE or from
+KNOWNCAUSE to RESOLVED and further to (nothing) and back to
+REPORT.
+</p>
+<p>
+S-right and S-left allow to select any keyword, so they move
+from DONE to REPORT and from RESOLVED to Fred.
+</p>
+<p>
+C-S-right and C-S-left jump from one sub-sequence to the
+next, for example from TODO or DONE to REPORT to Fred.
+</p>
+<p>
+Thanks to Rick Moynihan for triggering this development.
+</p>
+</li>
+<li>
+Text before the first headline can now be exported if you
+configure Org-mode accordingly. Either set the variable
+`org-export-skip-text-before-1st-heading' to nil, or use the
+new in-buffer option
+
+<p>
+#+OPTION: skip:nil
+</p>
+</li>
+<li>
+Export content specified via the #+TEXT construct is now
+fully processed, i.e. links, emphasis etc. are all
+interpreted. #+TEXT lines may include
+#+BEGIN_HTML&hellip;#+END_HTML sections to embed literal HTML.
+
+</li>
+<li>
+During HTML export, you can request to have a<sub>b</sub>
+interpreted as a subscript, but to leave a_b as it is. This
+can be done by setting the variable
+org-export-sub-superscript to the symbol `{}' with
+
+<p>
+(setq org-export-sub-superscript '{})
+</p>
+<p>
+or by using
+</p>
+<p>
+#+OPTIONS: ^:{}
+</p>
+<p>
+Thanks to Eddward DeVilla for this idea.
+</p>
+</li>
+<li>
+New variable `org-empty-line-terminates-plain-lists'.
+Default is nil, meaning that empty lines are part of the
+previous list item, and that you can have several paragraphs
+in one such item. Set this to t if you want an empty line
+terminate all levels of plain list items.
+
+<p>
+Thanks to Mike Newman for triggering this development.
+</p>
+</li>
+<li>
+C-c RET does insert a horizontal separator line and move the
+cursor into the table line below it. Thanks to Bastien for
+this proposal.
+
+</li>
+<li>
+Org-mode always offers you to record a note when a TODO item
+automatically repeats, even if you are not logging state
+changes. The new variable `org-log-repeat' allows to turn
+this off, so that notes are really only been taken if you
+are logging all state changes.
+
+</li>
+<li>
+Various Bug fixes, thanks to everyone who reported.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.68</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+<ul>
+<li>
+Priority handling in the tags view
+</li>
+<li>
+Date/time prompt follows the popup calender, and accepts AM/PM times.
+</li>
+<li>
+Standard references like B4 in the spreadsheet.
+</li>
+<li>
+Improvements to the formula editor.
+</li>
+<li>
+C-j does better indentation.
+</li>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+<ul>
+<li>
+Priority handling in the tags view
+
+<ul>
+<li>
+Agenda lists selected by tag are now sorted by priority.
+Thanks to Andrew Korty for reporting this omission.
+
+</li>
+</ul></li>
+<li>
+Improvements to the date/time prompt.
+
+<ul>
+<li>
+When you move (using S-cursor keys) the cursor in the pop-up
+calendar window while responding to a date/time prompt, the
+prompt is updated with the new default date (Emacs only).
+
+</li>
+<li>
+You can now enter AM/PM times at this prompt.
+
+</li>
+</ul></li>
+<li>
+Changes in the spreadsheet
+
+<ul>
+<li>
+You can now also write B4 instead of @4$2 as a reference in
+formulas. The column references without specified row can be
+written as C&amp; instead of $3. Such references make formulas
+easier to read and are now the default way how references are
+shown when you edit existing formulas. To get the old behavior
+back (i.e. only @row$col references), set the variable
+`org-table-use-standard-references' to nil.
+
+<p>
+Relative references like @-3$-2 or @II..III continue to use the
+internal format.
+</p>
+</li>
+</ul></li>
+<li>
+Changes in the formula editor (the one you get with "C-c '")
+
+<ul>
+<li>
+The formulas are organized in a more logical way.
+
+</li>
+<li>
+There is now a menu with commands.
+
+</li>
+<li>
+When starting the formula editor with "C-c '", the cursor
+immediately moves to the formula for the current field.
+
+</li>
+<li>
+With the cursor on a reference in the formula, you can use
+S-cursor keys to change the field being referenced.
+
+</li>
+</ul></li>
+<li>
+C-j indents the following line correctly whe used in a headline
+or in aplain list item. Thanks to Leo for this suggestion.
+
+</li>
+<li>
+Bug fixes
+
+<ul>
+<li>
+Flyspell now knows about special org-mode commands.
+Thanks to Vinod Valsalam for reporting this problem, and to
+Andrew Korty for showing how to fix it.
+
+</li>
+<li>
+Most other bugs discussed recently on emacs-orgmode@gnu.org
+should be fixed, except the problem with non-ASCII characters
+in tags&hellip;.
+
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.67</h2>
+
+
+<ul>
+<li>
+Expert mode for fast tag selection.
+When org-fast-tag-selection-single-key is `expert', not even
+the selection window is shown, only the prompt. One more C-c
+gets you the window, another one goes to multiple selection mode.
+
+</li>
+<li>
+Synchronized with Emacs once more: Emacs CVS has now org-mode
+4.67. At least until it causes a problem, then the Emacs people
+will switch back to 4.56. Lets hope there will be no problem.
+
+</li>
+<li>
+Code cleanup
+
+</li>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.66</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Sorting of top-level entries works now if the region contains
+top-level entries, or if the cursor is before the first headline.
+Thanks to "redblue" for reporting this bug.
+
+</li>
+<li>
+When entering date and time at the prompt, you can now mix
+entering text and selecting something in the calendar. For
+example, enter 22:15 at the prompt without pressing RET, and then
+click on a date in the calendar. Both pieces of information will
+be included in the resulting time stamp. You can also use
+S-curser to move the cursor in the calendar to the desired date
+and then enter 22:15 and press RET at the prompt.
+
+</li>
+<li>
+When setting a deadline or a schedule, entering a time now
+automatically selects the time stamp format that includes the
+time. Bug report (by means of a question) from Bastre.
+
+</li>
+<li>
+C-c C-l can be used to convert a plain link into a bracket link.
+
+</li>
+<li>
+Internal links now match inside (the visible part of) other
+links. Thanks to Scott Otterson for reporting this bug.
+
+</li>
+<li>
+iCalendar export of TODO items fixed, see also the variable
+`org-icalendar-include-todo'. Thanks to Philipp Raschdorf.
+
+</li>
+<li>
+The number of levels in the table of contents of an exported
+document can now be set independently of the number of headline
+levels. For example:
+
+<p>
+#+OPTIONS: H:4 toc:2
+</p>
+</li>
+<li>
+The command `C-c }' toggles the display of row and column numbers
+the the current table, to aid constructing formulas. To try it,
+move the cursor to a table and press `C-c }', or use the menu
+entry.
+
+</li>
+<li>
+Orgtbl translation functions (introduced in 4.65) have been
+simplified using a generic function `orgtbl-to-generic' that can
+be used for very general languanges. Writing your own translator
+should be very easy now. More info in the manual.
+
+</li>
+<li>
+CONTENTS visibility can be limited to a certain level. The
+command `C-3 S-TAB' will switch to CONTENTS view and show the
+first 3 levels.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.65</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Orgtbl can be used to maintain tables in LaTeX, and in any other mode
+</li>
+<li>
+Editing Lisp formulas for tables improved.
+</li>
+<li>
+Better structure for HTML exported tables.
+</li>
+<li>
+New "calculation" marker "/" to mark lines that should not be exported.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Detailed description of changes</h3>
+
+
+<ul>
+<li>
+You can use orgtbl mode to maintain a LaTeX table, or pretty much
+any table in any mode.
+
+<p>
+This does <b>not</b> work by making Orgtbl aware of LaTeX syntax. That
+would be a box of Pandora I am not willing to open. Instead, you
+use a normal Orgtbl-mode table, and a converter program to
+automatically place a LaTeX version of the table into the correct
+spot in the LaTeX file. The orgtbl-mode table can be maintained
+inside the same file, in a block comment.
+</p>
+<p>
+I am providing translators for LaTeX, HTML, and TeXInfo. For
+other applications, you need to write one yourself - but that is
+not hard if you start from the LaTeX version and just modify it.
+Thanks to Thomas Baumann for triggering this development through
+a request for a table-to-LaTeX converter.
+</p>
+</li>
+<li>
+In the special buffer to edit the formulas of a table (created
+with "C-c '"), there is now better support for editing Lisp
+formulas. TAB and M-TAB work like in an Emacs Lisp buffer,
+indenting lines and completing lisp symbols. With the cursor on
+a line defining a complex Lisp formula, a first press on TAB will
+convert the formula into a pretty-printed version with proper
+linebreaks and indentation. A second TAB folds the line back to
+the compact form.
+
+</li>
+<li>
+Tables in HTML export have now additional structure elements
+defined. The header (before the first hline) is wrapped into
+&lt;thead&gt;..&lt;/thead&gt;, and each part of the body (as separated in
+org-mode by hlines) is wrapped into &lt;tbody&gt;..&lt;/tbody&gt; tags. I
+have also changed the CSS style for &lt;td&gt; fields and the value of
+`org-export-html-table-tag' to get cleaner tables. Basically,
+tables now have horizontal lines only where needed, and no
+vertical lines at all, as generally recommended for tables in
+printed text. I like the new look, but I am not sure if this
+change will find general approval, please throw in your view if
+you like. Thanks to Scott for driving this, and to goud-H for
+pointing me to the row grouping in tables.
+
+</li>
+<li>
+In a table with calculation markers in the first column, you can
+now also put "/" into the first column. It indicates that this
+line should not be exported. The foremost application for this
+are lines containing only "&lt;N&gt;" markers for narrowing columns.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.64</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Email links get better, configurable descriptions
+</li>
+<li>
+When inserting a link, selected text becomes the description
+</li>
+<li>
+Easier access to the list of stored links.
+</li>
+<li>
+Horizontal lines in HTML export.
+</li>
+<li>
+Remember templates and storing of notes improved.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Detailed description of changes</h3>
+
+
+<ul>
+<li>
+The descriptive part of links to email messages can be configured
+using the variable `org-email-link-description-format'. The new
+default is "Email %c: %.30s" and leads to
+
+<p>
+Email from NAME: SUBJECT
+</p>
+<p>
+If you configure the variable `org-from-is-user-regexp'
+correctly, then for email you <b>sent</b> this will actually change to
+</p>
+<p>
+Email to NAME: SUBJECT
+</p>
+<p>
+The subject is limited to 30 characters. If you have become
+attached to the previous default (look twice, the new one is
+better), use "%f on: %s" as your format.
+</p>
+</li>
+<li>
+Selecting text before entering a new link with C-c C-l now really
+works, the selected text becomes the description part of the
+link. Requested by Scott, buggy 4.62 implementation is now fixed.
+
+</li>
+<li>
+Stored links are part of the history list for C-c C-l, so to
+reach them, you can use up/down rather than completion. Thanks
+to Raman for this excellent idea.
+
+</li>
+<li>
+A line consisting only of "-", and at least 5 of them, is
+exported into HTML as &lt;hr/&gt;, as proposed by Giovanni Ridolfi.
+
+</li>
+<li>
+Several changes to org &lt;-&gt; remember integration
+
+<ul>
+<li>
+You can use `org-remember' as your default command to start
+remember. It will automatically detect if there is an active
+region and use it as initial content (we will probably make
+remember.el work like this as well).
+Also, when calling `org-remember' in a remember buffer that
+was created with a template, you will again be asked to
+select a template. The buffer is then re-created with the
+new template, but the old context information. This is
+useful if you change your mind about the template to use
+(Leo's idea).
+
+</li>
+<li>
+Besides specifying a default <b>target</b> file for a note, you
+can also give a default <b>heading</b> of which the note should
+become a subitem. In many cases this avoids or speeds up
+navigating to the right location. Both file and heading can
+be different for each template. Both are non-binding, you
+can change them while storing the note. However, when you
+exit remember with C-u C-c C-c, these defaults will be used
+without interaction.
+
+</li>
+<li>
+Templates can specify interactive fields. During expansion
+of the template, you will be prompted for the information in
+that field. For example %^t will pop up a calendar and ask
+you to select a date. This new feature follows a proposal
+from Leo, who in the mean time has said he does not need it
+anymore. But I liked it, so here it is :-)
+
+</li>
+<li>
+Templates can access information specific to the link type
+created, for example the author and subject of an email.
+Syntax is %:fromname, %:fromaddress, %:subject etc, details
+in the manual. Proposed by Peder O. Klingenberg.
+
+</li>
+<li>
+I have been considering to move, at some stage, the template
+functionality into remember.el itself - which would of course
+require consent of the remember.el maintainers. I am not
+sure how well this would work though, since some things like
+the interactive time stamps are org.el specific, so treating
+them would require special hooks. Comments?
+
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.63</h2>
+
+<ul>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.62</h2>
+
+<ul>
+<li>
+Many changes to the spreadsheet functions in the table editor.
+For details, please re-read the manual section 3.4.
+<ul>
+<li>
+New Features
+<ul>
+<li>
+It is much easier to assign formulas to individual fields.
+</li>
+<li>
+References to arbitrary fields and ranges.
+</li>
+<li>
+Absolute references are modified in row-editing commands.
+</li>
+<li>
+Formula editor that highlights referenced fields.
+</li>
+</ul></li>
+<li>
+Incompatible changes
+<ul>
+<li>
+Empty fields are excluded in range references, see "E" mode flag.
+</li>
+<li>
+&amp;&hellip; ranges no longer supported, use new @&hellip; ranges.
+</li>
+<li>
+Variable insertion into Lisp formulas work differently.
+</li>
+</ul></li>
+</ul></li>
+<li>
+Selected text becomes the default description for C-c C-l links.(Scott)
+</li>
+<li>
+The date format in the agenda/timeline views is now customizable.
+See the new option `org-agenda-date-format'. (request by Victor)
+</li>
+<li>
+Link abbreviations no longer need a double colon, single colon is fine.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.61</h2>
+
+<ul>
+<li>
+Avoiding keybinding clashes with flyspell
+<ul>
+<li>
+Archiving is now also on `C-C C-x C-s' (was just `C-c $')
+</li>
+<li>
+Cycling through agenda files is now also on "C-'" (was just "C-,")
+</li>
+</ul></li>
+<li>
+Colon is considered part of number, to align times in clock tables.
+</li>
+<li>
+Fixed bug for list of stuck projects.
+</li>
+<li>
+Fixed several bugs/problems concerning linking to gnus.
+</li>
+<li>
+Block agendas can contain the list of stuck projects.
+</li>
+<li>
+#+ARCHIVE may now appear several times in the buffer.
+</li>
+<li>
+More bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.60</h2>
+
+<ul>
+<li>
+HTML export: inlining images, clickable images (manual 10.2.4).
+</li>
+<li>
+Incremental search now shows proper context when exiting.
+</li>
+<li>
+Tables calculation and Calc package.
+<ul>
+<li>
+Calc is no longer needed when using only elisp formulas.
+</li>
+<li>
+Proper error messages when calc is needed and not available.
+</li>
+</ul></li>
+<li>
+Tracking TODO state changes with time stamps and notes.
+</li>
+<li>
+Empty entries go full circle.
+</li>
+<li>
+Links in iCalendar export cleaned up.
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.59</h2>
+
+<ul>
+<li>
+Cleanup code, bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.58</h2>
+
+<ul>
+<li>
+Full undo support in the agenda buffer.
+</li>
+<li>
+Listing stuck GTD projects (projects without any NEXT ACTIONS).
+Configure `org-stuck-projects' before using it.
+</li>
+<li>
+C-c C-x b shows the current subtree in an indirect buffer, in
+another, dedicated frame.
+</li>
+<li>
+Custom agenda commands take precedence over builtin commands.
+</li>
+<li>
+auto-fill for comments works on the Emacs side, XEmacs not yet.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.57</h2>
+
+<ul>
+<li>
+Sorting of outline items on same level.
+</li>
+<li>
+Sorting tables automatically selects line range between hlines.
+</li>
+<li>
+Changes in Agenda buffer
+<ul>
+<li>
+`C-c C-o' follows a link in the current line.
+</li>
+<li>
+`C-c $' archives the subtree corresponding to the line.
+</li>
+<li>
+Changing dates with S-left and S-right show new date in agenda,
+but still do not move the entry to the new date.
+</li>
+<li>
+new option `org-agenda-skip-scheduled-if-done'.
+</li>
+</ul></li>
+<li>
+Agenda and sparse tree construction using tag matches can now
+use regular expressions.
+</li>
+<li>
+When prompted for a date/time, entering "+7" indicates a date
+7 days from now - but only this is the only thing you give.
+</li>
+<li>
+Custom time formats also apply to exported html and ascii.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.56</h2>
+
+<ul>
+<li>
+`C-k' in agenda kills current line and corresponding subtree in file.
+</li>
+<li>
+XEmacs compatibility issues fixed, in particular tag alignment.
+</li>
+<li>
+M-left/right now in/outdents plain list items, no Shift needed.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.55</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.54</h2>
+
+<ul>
+<li>
+Improvements to fast tag selection
+<ul>
+<li>
+show status also in target line.
+</li>
+<li>
+option to auto-exit after first change to tags list (see manual).
+</li>
+</ul></li>
+<li>
+Tags sparse trees now also respect the settings in
+`org-show-hierarchy-above' and `org-show-following-heading'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.53</h2>
+
+<ul>
+<li>
+Custom time formats can be overlayed over time stamps.
+</li>
+<li>
+New option `org-agenda-todo-ignore-deadlines'.
+</li>
+<li>
+Work-around for flyspell bug (CVS Emacs has this fixed in flyspell.el).
+</li>
+<li>
+Work-around for session.el problem with circular data structures.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.52</h2>
+
+<ul>
+<li>
+TAG matches can also specify conditions on TODO keywords.
+</li>
+<li>
+The fast tag interface allows setting tags that are not in the
+predefined list.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.51</h2>
+
+<ul>
+<li>
+Link abbreviations (manual section 4.5).
+</li>
+<li>
+More control over how agenda is displayed. See the new variables
+`org-agenda-window-setup', `org-agenda-restore-windows-after-quit'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.50</h2>
+
+<ul>
+<li>
+Closing a TODO item can record an additional note.
+See variables `org-log-done' and `org-log-note-headings'.
+</li>
+<li>
+Inserting headlines and bullets can leave an extra blank line.
+See variable `org-blank-before-new-entry'. (Ed Hirgelt patch)
+</li>
+<li>
+<a href="#bracket--links">bracket links</a> in the agenda are active just as in org-mode buffers.
+</li>
+<li>
+C-c C-o on a date range displays the agenda for exactly this range.
+</li>
+<li>
+The default for `org-cycle-include-plain-lists' is back to nil.
+</li>
+<li>
+Calls to `org-occur' can be stacked by using a prefix argument.
+</li>
+<li>
+The options `org-show-hierarchy-above' and `org-show-following-heading'
+now always default to `t', but can be customized differently for
+different types of sparse trees or jump commands.
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.49</h2>
+
+<ul>
+<li>
+Agenda views can be made in batch mode from the command line.
+</li>
+<li>
+`org-store-link' does the right thing in dired-mode.
+</li>
+<li>
+File links can contain environment variables.
+</li>
+<li>
+Full Emacs 21 compatibility has been restored.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.47</h2>
+
+<ul>
+<li>
+Custom commands may produce an agenda which contains several blocks,
+each block created by a different agenda command.
+</li>
+<li>
+Agenda commands can be restricted to the current file, region, subtree.
+</li>
+<li>
+The timeline command must now be called through the agenda
+dispatcher (C-c a L). `C-c C-r' no longer works.
+</li>
+<li>
+Agenda items can be sorted by tag. The <b>last</b> tag is used for this.
+</li>
+<li>
+The prefix and the sorting strategy for agenda items can depend
+upon the agenda type.
+</li>
+<li>
+The handling of `<a href="mailto:'">mailto:'</a> links can be customized, see the new
+variable `org-link-mailto-program'.
+</li>
+<li>
+`mailto' links can specify a subject after a double colon,
+like <a href="mailto:carsten@orgmode.org::Org-mode is buggy">mailto:carsten@orgmode.org::Org-mode is buggy</a>.
+</li>
+<li>
+In the #+STARTUP line, M-TAB completes valid keywords.
+</li>
+<li>
+In the #+TAGS: line, M-TAB after ":" inserts all currently used tags.
+</li>
+<li>
+Again full Emacs 21 support: Checkboxes and publishing are fixed.
+</li>
+<li>
+More minor bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.45</h2>
+
+<ul>
+<li>
+Checkbox lists can show statistics about checked items.
+</li>
+<li>
+C-TAB will cycle the visibility of archived subtrees.
+</li>
+<li>
+Documentation about checkboxes has been moved to chapter 5.
+</li>
+<li>
+Bux fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.44</h2>
+
+<ul>
+<li>
+Clock table can be done for a limited time interval.
+</li>
+<li>
+Obsolete support for the old outline mode has been removed.
+</li>
+<li>
+Bug fixes and code cleaning.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.43</h2>
+
+<ul>
+<li>
+Bug fixes
+</li>
+<li>
+`s' key in the agenda saves all org-mode buffers.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.41</h2>
+
+<ul>
+<li>
+Shift-curser keys can modify inactive time stamps (inactive time
+stamps are the ones in [&hellip;] brackets.
+</li>
+<li>
+Toggle all checkboxes in a region/below a headline.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.40</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.39</h2>
+
+<ul>
+<li>
+Special tag ARCHIVE keeps a subtree closed and away from agenda lists.
+</li>
+<li>
+LaTeX code in Org-mode files can be converted to images for HTML.
+</li>
+<li>
+Bug fixes.
+</li>
+<li>
+CDLaTeX-mode features can be used in Org-mode to help inserting
+LaTeX environment and math.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.38</h2>
+
+<ul>
+<li>
+noutline.el is now required (important for XEmacs users only).
+</li>
+<li>
+Dynamic blocks.
+</li>
+<li>
+Archiving of all level 1 trees without open TODO items.
+</li>
+<li>
+Clock reports can be inserted into the file in a special section.
+</li>
+<li>
+FAQ removed from the manual, now only on the web.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.37</h2>
+
+<ul>
+<li>
+Clock-feature for measuring time spent on specific items.
+</li>
+<li>
+Improved emphasizing allows configuration and stacking.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.36</h2>
+
+<ul>
+<li>
+Improved indentation of ASCII export, when headlines become items.
+</li>
+<li>
+Handling of 12am and 12pm fixed. Times beyond 24:00 can be used
+and will not lead to conflicts.
+</li>
+<li>
+Support for mutually exclusive TAGS with the fast tags interface.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.35</h2>
+
+<ul>
+<li>
+HTML export is now valid XHTML.
+</li>
+<li>
+Timeline can also show dates without entries. See new option
+`org-timeline-show-empty-dates'.
+</li>
+<li>
+The bullets created by the ASCII exporter can now be configured.
+See the new option `org-export-ascii-bullets'.
+</li>
+<li>
+New face `org-upcoming-deadline' (was `org-scheduled-previously').
+</li>
+<li>
+New function `org-context' to allow testing for local context.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.34</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.33</h2>
+
+<ul>
+<li>
+New commands to move through plain lists: S-up and S-down.
+</li>
+<li>
+Bug fixes and documentation update.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.32</h2>
+
+<ul>
+<li>
+Fast (single-key-per-tag) interface for setting TAGS.
+</li>
+<li>
+The list of legal tags can be configured globally and locally.
+</li>
+<li>
+Elisp and Info links (thanks to Todd Neal).
+</li>
+<li>
+`org-export-publishing-directory' can be an alist, with different
+directories for different export types.
+</li>
+<li>
+All context-sensitive commands use `call-interactively' to dispatch.
+</li>
+<li>
+`org-confirm-shell-links' renamed to `org-confirm-shell-link-function'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.31</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.30</h2>
+
+<ul>
+<li>
+Modified installation: Autoloads have been collected in org-install.el.
+</li>
+<li>
+Logging (org-log-done) is now a #+STARTUP option.
+</li>
+<li>
+Checkboxes in plain list items, following up on Frank Ruell's idea.
+</li>
+<li>
+File links inserted with C-c C-l will use relative paths if the linked
+file is in the current directory or a subdirectory of it.
+</li>
+<li>
+New variable `org-link-file-path-type' to specify preference for
+relative and absolute paths.
+</li>
+<li>
+New CSS classes for tags, timestamps, timestamp keywords.
+</li>
+<li>
+Bug and typo fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.29</h2>
+
+<ul>
+<li>
+Inlining images in HTML export now depends on wheather the link
+contains a description or not.
+</li>
+<li>
+TODO items can be scheduled from the global TODO list using C-c C-s.
+</li>
+<li>
+TODO items already scheduled can be made to disappear from the global
+todo list, see `org-agenda-todo-ignore-scheduled'.
+</li>
+<li>
+In Tables, formulas may also be Lisp forms.
+</li>
+<li>
+Exporting the visible part of an outline with `C-c C-x v' works now
+for all available exporters.
+</li>
+<li>
+Bug fixes, lots of them :-(
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.28</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.27</h2>
+
+<ul>
+<li>
+HTML exporter generalized to receive external options.
+As part of the process, author, email and date have been moved to the
+end of the HTML file.
+</li>
+<li>
+Support for customizable file search in file links.
+</li>
+<li>
+BibTeX database links as first application of the above.
+</li>
+<li>
+New option `org-agenda-todo-list-sublevels' to turn off listing TODO
+entries that are sublevels of another TODO entry.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.26</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.25</h2>
+
+<ul>
+<li>
+Revision of the font-lock faces section, with better tty support.
+</li>
+<li>
+TODO keywords in Agenda buffer are fontified.
+</li>
+<li>
+Export converts links between .org files to links between .html files.
+</li>
+<li>
+Better support for bold/italic/underline emphasis.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.24</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.23</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.22</h2>
+
+<ul>
+<li>
+Bug fixes.
+</li>
+<li>
+In agenda buffer, mouse-1 no longer follows link.
+See `org-agenda-mouse-1-follows-link' and `org-mouse-1-follows-link'.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.20</h2>
+
+<ul>
+<li>
+Links use now the <a href="#link">description</a> format by default.
+When inserting links, the user is prompted for a description.
+</li>
+<li>
+If a link has a description, only the description is displayed
+the link part is hidden. Use C-c C-l to edit the link part.
+</li>
+<li>
+TAGS are now bold, but in the same color as the headline.
+</li>
+<li>
+The width of a table column can be limited by using a field "&lt;N&gt;".
+</li>
+<li>
+New structure for the customization tree.
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.13</h2>
+
+<ul>
+<li>
+The list of agenda files can be maintainted in an external file.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.12</h2>
+
+<ul>
+<li>
+Templates for remember buffer. Note that the remember setup changes.
+To set up templates, see `org-remember-templates'.
+</li>
+<li>
+The time in new time stamps can be rounded, see new option
+`org-time-stamp-rounding-minutes'.
+</li>
+<li>
+Bug fixes (there are <b>always</b> more bugs).
+
+</li>
+</ul>
+<p>[&hellip;]
+</p>
+<p>
+Version 4.00
+</p><ul>
+<li>
+Headlines can contain TAGS, and Org-mode can produced a list
+of matching headlines based on a TAG search expression.
+</li>
+<li>
+`org-agenda' has now become a dispatcher that will produce the agenda
+and other views on org-mode data with an additional keypress.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.24</h2>
+
+<ul>
+<li>
+Switching and item to DONE records a time stamp when the variable
+`org-log-done' is turned on. Default is off.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.23</h2>
+
+<ul>
+<li>
+M-RET makes new items as well as new headings.
+</li>
+<li>
+Various small bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.22</h2>
+
+<ul>
+<li>
+CamelCase words link to other locations in the same file.
+</li>
+<li>
+File links accept search options, to link to specific locations.
+</li>
+<li>
+Plain list items can be folded with `org-cycle'. See new option
+`org-cycle-include-plain-lists'.
+</li>
+<li>
+Sparse trees for specific TODO keywords through numeric prefix
+argument to `C-c C-v'.
+</li>
+<li>
+Global TODO list, also for specific keywords.
+</li>
+<li>
+Matches in sparse trees are highlighted (highlights disappear with
+next buffer change due to editing).
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.21</h2>
+
+<ul>
+<li>
+Improved CSS support for the HTML export. Thanks to Christian Egli.
+</li>
+<li>
+Editing support for hand-formatted lists
+<ul>
+<li>
+M-S-cursor keys handle plain list items
+</li>
+<li>
+C-c C-c renumbers ordered plain lists
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.20</h2>
+
+<ul>
+<li>
+There is finally an option to make TAB jump over horizontal lines
+in tables instead of creating a new line before that line.
+The option is `org-table-tab-jumps-over-hlines', default nil.
+</li>
+<li>
+New command for sorting tables, on `C-c ^'.
+</li>
+<li>
+Changes to the HTML exporter
+<ul>
+<li>
+hand-formatted lists are exported correctly, similar to
+markdown lists. Nested lists are possible. See the docstring
+of the variable `org-export-plain-list-max-depth'.
+</li>
+<li>
+cleaned up to produce valid HTML 4.0 (transitional).
+</li>
+<li>
+support for cascading style sheets.
+</li>
+</ul></li>
+<li>
+New command to cycle through all agenda files, on C-,
+</li>
+<li>
+C-c [ can now also be used to change the sequence of agenda files.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.19</h2>
+
+<ul>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.18</h2>
+
+<ul>
+<li>
+Export of calendar information in the standard iCalendar format.
+</li>
+<li>
+Some bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.17</h2>
+
+<ul>
+<li>
+HTML export specifies character set depending on coding-system.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.16</h2>
+
+<ul>
+<li>
+In tables, directly after the field motion commands like TAB and RET,
+typing a character will blank the field. Can be turned off with
+variable `org-table-auto-blank-field'.
+</li>
+<li>
+Inactive timestamps with `C-c !'. These do not trigger the agenda
+and are not linked to the calendar.
+</li>
+<li>
+Additional key bindings to allow Org-mode to function on a tty emacs.
+</li>
+<li>
+`C-c C-h' prefix key replaced by `C-c C-x', and `C-c C-x C-h' replaced
+by `C-c C-x b' (b=Browser). This was necessary to recover the
+standard meaning of C-h after a prefix key (show prefix bindings).
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.15</h2>
+
+<ul>
+<li>
+QUOTE keyword at the beginning of an entry causes fixed-width export
+of unmodified entry text. `C-c :' toggles this keyword.
+</li>
+<li>
+New face `org-special-keyword' which is used for COMMENT, QUOTE,
+DEADLINE and SCHEDULED, and priority cookies. Default is only a weak
+color, to reduce the amount of aggressive color in the buffer.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.14</h2>
+
+<ul>
+<li>
+Formulas for individual fields in table.
+</li>
+<li>
+Automatic recalculation in calculating tables.
+</li>
+<li>
+Named fields and columns in tables.
+</li>
+<li>
+Fixed bug with calling `org-archive' several times in a row.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.13</h2>
+
+<ul>
+<li>
+Efficiency improvements: Fewer table re-alignments needed.
+</li>
+<li>
+New special lines in tables, for defining names for individual cells.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.12</h2>
+
+<ul>
+<li>
+Tables can store formulas (one per column) and compute fields.
+Not quite like a full spreadsheet, but very powerful.
+</li>
+<li>
+table.el keybinding is now `C-c ~'.
+</li>
+<li>
+Numeric argument to org-cycle does `show-subtree' above on level ARG.
+</li>
+<li>
+Small changes to keys in agenda buffer. Affected keys:
+[w] weekly view; [d] daily view; [D] toggle diary inclusion.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.11</h2>
+
+<ul>
+<li>
+Links inserted with C-c C-l are now by default enclosed in angle
+brackets. See the new variable `org-link-format'.
+</li>
+<li>
+"&gt;" terminates a link, this is a way to have several links in a line.
+Both "&lt;" and "&gt;" are no longer allowed as characters in a link.
+</li>
+<li>
+Archiving of finished tasks.
+</li>
+<li>
+C-&lt;up&gt;/&lt;down&gt; bindings removed, to allow access to paragraph commands.
+</li>
+<li>
+Compatibility with CUA-mode (see variable `org-CUA-compatible').
+</li>
+<li>
+Compatibility problems with viper-mode fixed.
+</li>
+<li>
+Improved html export of tables.
+</li>
+<li>
+Various clean-up changes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.10</h2>
+
+<ul>
+<li>
+Using `define-derived-mode' to derive `org-mode' from `outline-mode'.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.09</h2>
+
+<ul>
+<li>
+Time-of-day specifications in agenda are extracted and placed
+into the prefix. Timed entries can be placed into a time grid for
+day.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.08</h2>
+
+<ul>
+<li>
+"|" no longer allowed as part of a link, to allow links in tables.
+</li>
+<li>
+The prefix of items in the agenda buffer can be configured.
+</li>
+<li>
+Cleanup.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.07</h2>
+
+<ul>
+<li>
+Some folding inconsistencies removed.
+</li>
+<li>
+BBDB links to company-only entries.
+</li>
+<li>
+Bug fixes and global cleanup.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.06</h2>
+
+<ul>
+<li>
+M-S-RET inserts a new TODO heading.
+</li>
+<li>
+New startup option `content'.
+</li>
+<li>
+Better visual response when TODO items in agenda change status.
+</li>
+<li>
+Window positioning after visibility state changes optimized and made
+configurable. See `org-cycle-hook' and `org-occur-hook'.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.05</h2>
+
+<ul>
+<li>
+Agenda entries from the diary are linked to the diary file, so
+adding and editing diary entries can be done directly from the agenda.
+</li>
+<li>
+Many calendar/diary commands available directly from agenda.
+</li>
+<li>
+Field copying in tables with S-RET does increment.
+</li>
+<li>
+C-c C-x C-v extracts the visible part of the buffer for printing.
+</li>
+<li>
+Moving subtrees up and down preserves the whitespace at the tree end.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.04</h2>
+
+<ul>
+<li>
+Table editor optimized to need fewer realignments, and to keep
+table shape when typing in fields.
+</li>
+<li>
+A new minor mode, orgtbl-mode, introduces the Org-mode table editor
+into arbitrary major modes.
+</li>
+<li>
+Fixed bug with realignment in XEmacs.
+</li>
+<li>
+Startup options can be set with special #+STARTUP line.
+</li>
+<li>
+Heading following a match in org-occur can be suppressed.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.03</h2>
+
+<ul>
+<li>
+Copyright transfer to the FSF.
+</li>
+<li>
+Effect of C-u and C-u C-u in org-timeline swapped.
+</li>
+<li>
+Timeline now always contains today, and `.' jumps to it.
+</li>
+<li>
+Table editor:
+<ul>
+<li>
+cut and paste of rectangular regions in tables
+</li>
+<li>
+command to convert org-mode table to table.el table and back
+</li>
+<li>
+command to treat several cells like a paragraph and fill it
+</li>
+<li>
+command to convert a buffer region to a table
+</li>
+<li>
+import/export tables as tab-separated files (exchange with Excel)
+</li>
+</ul></li>
+<li>
+Agenda:
+<ul>
+<li>
+Sorting mechanism for agenda items rewritten from scratch.
+</li>
+<li>
+Sorting fully configurable.
+</li>
+<li>
+Entries specifying a time are sorted together.
+</li>
+</ul></li>
+<li>
+Completion also covers option keywords after `#-'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.01</h2>
+
+<ul>
+<li>
+New reference card, thanks to Philip Rooke for creating it.
+</li>
+<li>
+Single file agenda renamed to "Timeline". It no longer shows
+warnings about upcoming deadlines/overdue scheduled items.
+That functionality is now limited to the (multifile) agenda.
+</li>
+<li>
+When reading a date, the calendar can be manipulated with keys.
+</li>
+<li>
+Link support for RMAIL and Wanderlust (from planner.el, untested).
+</li>
+<li>
+Minor bug fixes and documentation improvements.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.00</h2>
+
+<ul>
+<li>
+Multifile Agenda shows current entries from many different files.
+</li>
+<li>
+TeXInfo documentation (thanks to Christian Egli for the conversion).
+</li>
+<li>
+Additional applications for TODO keywords, see documentation.
+Different files may have different TODO keywords etc.
+</li>
+<li>
+Priorities for TODO items.
+</li>
+<li>
+The browser mode used by `org-remember-handler' is improved.
+</li>
+<li>
+Images get inlined in HTML export (thanks to Carsten Wimmer).
+</li>
+<li>
+File links can contain line numbers, like <a href="/usr/etc/config:255">file:/usr/etc/config:255</a>
+</li>
+<li>
+Minor bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 2.10</h2>
+
+<ul>
+<li>
+TODO entries can have additional states besides TODO and DONE.
+See new variable `org-todo-keywords'.
+</li>
+<li>
+TODO keywords can be interpreted as categories. See variable
+`org-todo-interpretation'.
+</li>
+<li>
+M-TAB completion on TODO keywords, TeX symbols, and normal words.
+</li>
+<li>
+All keywords (like TODO, DEADLINE etc) are configurable.
+</li>
+<li>
+Cursor positioning optimized after pro/demotion and TODO cycling.
+</li>
+<li>
+Emphasizing in HTML works now for <b>bold</b>, <i>italic</i> and <u>underline</u>.
+</li>
+<li>
+New commands to kill, copy and yank entire subtrees. Yanking
+modifies the level of the tree before insertion.
+</li>
+<li>
+New command `org-goto' (C-c C-j) to quickly move to other locations
+in the buffer without affecting outline visibility.
+</li>
+<li>
+Hooks for John Wiegley's remember.el.
+</li>
+<li>
+`org-read-date' pops up calendar for date selection with the mouse.
+See variable `org-popup-calendar-for-date-prompt'.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 2.6</h2>
+
+<ul>
+<li>
+TODO items can be SCHEDULED to a certain date.
+</li>
+<li>
+Expired DEADLINEs are ignored if in an entry marked DONE.
+</li>
+<li>
+From the diary or time-sorted view (C-c C-r), C-c C-t can be used to
+change the TODO state of an item remotely.
+</li>
+<li>
+Horizontal computations in table editor. See `org-table-eval-formula'.
+</li>
+<li>
+Fixed bug with summing tables (command `org-table-sum', `C-c +').
+</li>
+<li>
+Calendar window follows the timestamp when a timestamp is changed.
+New variable `org-calendar-follow-timestamp-change'.
+</li>
+<li>
+Time-sorted view (`org-diary-view', C-c C-r) now uses the prefix
+argument to force inclusion of unscheduled TODO items.
+</li>
+<li>
+New variable `org-confirm-shell-links' to turn of safety query.
+</li>
+<li>
+New variable `org-open-non-existing-files'.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 2.4</h2>
+
+<ul>
+<li>
+A time-sorted view on all time stamps can be created with C-c C-r.
+</li>
+<li>
+Timestamps and Deadlines can be shown in the Emacs diary.
+</li>
+<li>
+Date ranges introduced.
+</li>
+<li>
+Time-string formats are no longer configurable.
+</li>
+<li>
+Vertical lines in tables can be made invisible with `C-c |'.
+</li>
+<li>
+New "link" type to execute shell commands, like "<i>&lt;shell:ls&gt;</i> *.org"
+</li>
+<li>
+Upon export, "myfile.org" becomes "myfile.html" or "myfile.txt",
+instead of "myfile.org.html" or "myfile.org.txt".
+</li>
+<li>
+When the cursor is in the white space at the beginning of a line,
+TAB removes the whitespace before indenting again.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 2.0</h2>
+
+<ul>
+<li>
+Windows (NT/2000) support.
+</li>
+<li>
+Works with both Emacs and XEmacs.
+</li>
+<li>
+Fully automatic table editor.
+</li>
+<li>
+New link types into Gnus, VM and BBDB.
+</li>
+<li>
+Other link system changes
+<ul>
+<li>
+Time stamps are treated as links to the calendar.
+</li>
+<li>
+Easy creation of links with global command `org-store-link'.
+</li>
+<li>
+Insertion of links with `C-c C-l' works differently now.
+</li>
+<li>
+Space characters allowed as part of a link.
+</li>
+<li>
+Options in `org-file-apps' extended. The command may now be
+symbol 'emacs', or a lisp form.
+</li>
+</ul></li>
+</ul>
+<p>Please re-read the manual section about links.
+</p><ul>
+<li>
+Timestamp changes
+<ul>
+<li>
+`org-deadline' now prompts for a date.
+</li>
+<li>
+A line can now contain several timestamps. Updating of a
+timestamp only happens if the cursor is at the timestamp.
+</li>
+<li>
+Changed the time-stamp-format to ISO, to make sure it will
+always work (non-English month names had caused problems
+with `parse-time-string'.). Changing the time stamp format
+is not recommended.
+</li>
+</ul></li>
+<li>
+Picture mode enhancements have been removed from org.el
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 1.4</h2>
+
+<ul>
+<li>
+Some option name changes, not backward compatible.
+</li>
+<li>
+ASCII exporter upgrade: Table of contents.
+</li>
+<li>
+HTML exporter upgrade: fixed-width regions, better
+sub/superscripts, many TeX symbols supported.
+</li>
+<li>
+Calendar support.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 1.3</h2>
+
+<ul>
+<li>
+HTML exporter upgrade, in particular table of contents
+
+
+
+</li>
+</ul>
+</div>
+<div id="postamble"><p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten at orgmode dot org">&lt;carsten at orgmode dot org&gt;</a>
+</p>
+<p class="date"> Date: 2008/01/25 14:14:58</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/Changes.org b/ORGWEBPAGE/Changes.org
new file mode 100644
index 0000000..6340e7a
--- /dev/null
+++ b/ORGWEBPAGE/Changes.org
@@ -0,0 +1,3353 @@
+# -*- mode: org; org-export-publishing-directory: "tmp"; fill-column: 65 -*-
+
+#+TITLE: Org-mode list of User-visible changes
+#+AUTHOR: Carsten Dominik
+#+EMAIL: carsten at orgmode dot org
+#+OPTIONS: H:3 num:nil toc:nil \n:nil @:t ::t |:t ^:{} *:t TeX:t LaTeX:nil
+
+* Version 5.20
+
+** Overview
+
+** Incompatible Changes
+
+** Details
+
+*** Remember and Refile
+
+ - The use of prefix arguments for the commands `org-remember'
+ and `org-refile' has been normalized:
+ + when called without prefix argment, the command does its
+ normal job, starting a remember note or refiling a tree.
+ + when called with a single C-u pefix, these commands can be
+ used to select a target location and to jump there. In
+ the case of `org-remember', you will be prompted for a
+ template and then Emacs jumpt to the default target
+ location or this template. In the case of `org-refile',
+ you select a location from the refile target list and jump
+ there.
+ + when called with two prefixes (`C-u C-u'), the command
+ jumps to the location last used for storing a note or a
+ moved tree.
+
+ - When the clock is running inside an remember buffer, storing
+ the remember buffer with `C-c C-c' will automatically clock
+ out. This was inspired by a request by Rainer Stengle.
+
+ - Outline-path-completion is now available as an alternative
+ interface in the command `org-goto'. Please select the
+ default interface you'd like to use with the new variable
+ `org-goto-interface'. You can then select the alternative
+ interface with a prefix argument to `C-c C-j' (org-goto). I
+ am considering to make outline-path-completion the default
+ interface. Comments?
+
+ - The variable `org-remember-use-refile-when-interactive'
+ introduced only in 5.19 is obsolete. Please use
+ `org-remember-interactive-interface' instead. This new
+ variable does select the interface that is used to select
+ the target for a remember note in an interactive way.
+ Possible values are:
+
+ + `outline': Use an outline of the document to select a
+ location.
+ + `outline-path-completion': Use completion of an outline
+ path to select a location.
+ + `refile': Offer the `org-refile-targets' as possible
+ targets.
+
+ - You can now also have a plain (as opposed to deadline or
+ scheduled) repeater timestamp in a task. Switching the task
+ to DONE will now also shift a plain time stamp. This was a
+ request by Austin Frank.
+
+ - It is no longer necessary to update the refiling targets -
+ they are always current.
+
+ *** Misc
+
+ - In `org-goto', typing characters now automatically starts
+ isearch from the beginning of the buffer. The isearch is
+ special also because it only matches in headline. This goes
+ some way toward saving org-goto from being removed from
+ Org-mode. Thanks to Piotr Zielinski for the code, and sorry
+ that it took me o long to ut it in. If you prefer to use
+ single letters n,p,f,b,u,q for navigation as before,
+ configure the variable `org-goto-auto-isearch'.
+
+ - The clock table accepts a new parameter =:step=. This
+ parameter can be `day' or `week' and will result in separate
+ tables for each day or week in the requested time interval.
+ This was triggered by a proposal by Sacha Chua in her [[http://sachachua.com/wp/2007/12/30/clocking-time-with-emacs-org/][blog]].
+
+ - A time-stamp with a repeater now no longer refers to the
+ date *closest* to the current day. Instead, it means either
+ today or the most recent match. This change makes sure that
+ overdue scheduled or deadline items never disappear from the
+ agenda. With the previous convention, an overdue sheduled
+ item would disappear. For example, a weekly item scheduled
+ for Sunday would appear as overdue until Wednesday, and the
+ suddenly disappear until next Sunday. Now the item will
+ show up as "Sched 7x" on Saturday. From Sunday on it will
+ be in the list as "Scheduled", i.e. old sins will be
+ forgiven. This follows a request by Warong, Dennis and
+ Bernt.
+
+ - Archving a subtree now creates an additional property,
+ =ARCHIVE_OLPATH=. This property contains the "path" in the
+ outline tree to the archived entry, as it was in the
+ original file. For example, archiving =Fix the door= in the
+ following hierarchy
+
+ : * Tasks
+ : ** HOME
+ : *** Garage
+ : **** Fix the door
+
+ will file is with the following property
+
+ : :ARCHIVE_PATH: Task/HOME/Garage
+
+ Note that you can configure (i.e. limit) the information
+ that gets stored upon archiving with the variable
+ `org-archive-save-context-info'.
+
+* Version 5.19
+
+** Overview
+
+ - Column view can list the clocked times of a subtree.
+
+ - Storing remember notes can use the `org-refile' interface.
+
+ - Storing remember notes no longer produced empty lines.
+
+ - Moving subtrees now folds all siblings of the subtree.
+
+ - New variable `org-agenda-todo-keyword-format'.
+
+ - Hack to allow brackets in link descriptions.
+
+ - Clocking into an entry can enforce a specific TODO state.
+
+ - EXPORT_FILE_NAME may be an absolute file name with "~".
+
+ - Bug fixes, lots of them.
+
+** Details
+
+ - A new special column definition lists the sum of all CLOCK
+ entries in a subtree. For example
+
+ : #+COLUMNS: %20ITEM %10Time_Estimate{:} %CLOCKSUM
+
+ will allow you to compare estimated times (as given in the
+ Time_Estimate property) with the clocked times. This was a
+ request by Bernt Hansen.
+
+ - Storing remember notes can now use the `org-refile'
+ interface instead of the `org-goto' interface (see the
+ variable `org-remember-use-refile-when-interactive').
+ Nothing will change if the note is stored immediately after
+ pressing `C-c C-c' in the =*Remember*= buffer. But if you
+ have chosen (e.g. by pressing `C-u C-c C-c') to
+ interactively select the filing location (file and
+ headline), the refile interface will be used instead. I am
+ excited about this change, because the `org-goto' interface
+ is basically a failure, at least for this application. Note
+ that in any case the refile interface has to be configured
+ first by customizing `org-refile-targets'.
+
+ - Notes inserted with remember now remove any whitespace
+ before and after the note before being pasted, so that there
+ will be no empty lines inserted together with the note. We
+ could invent special syntax in remember templates to allow
+ creating empty lines before a note - is there anyone who'd
+ want this?
+
+ - Moving subtrees now folds all siblings of the subtree. This
+ is the only reasonably simple way I could find to avoid the
+ reported inconsistencies in the folding state of the outline
+ tree after moving entries. There are reasons to like this
+ new behavior, because it easily visualizes where the tree is
+ located after the move. Still, not everyone might be happy
+ with this. Massive complaining would be needed to make me
+ fix this.
+
+ - New variable `org-agenda-todo-keyword-format' to specify the
+ width of the TODO keyword field in the agenda display. Use
+ it to get things to line up better. This was a proposal by
+ Rainer Stengele.
+
+ - If a link description inserted with `C-c C-l' contains
+ brackets, the brackets will now be converted into curly
+ braces. This looks similar enough. Supporting brackets in
+ link descriptions is, for technical reasons too long to
+ explain here, complex.
+
+ - The new option `org-clock-in-switch-to-state' can be set to
+ a TODO state that will be enforced when the clock is started
+ on an entry. This follows an idea by Sacha Chua.
+
+ - The EXPORT_FILE_NAME property may now also be an absolute
+ file name, and it may contain abbreviations like "~" for the
+ users home directory. This was requested by Adam Spiers.
+
+ - Bug fixes, lots of them.
+
+* Version 5.18
+
+ Minor fixes.
+
+* Version 5.17
+
+** Details
+
+*** Whitespace
+
+ - When cutting, pasting, or moving subtrees and items, the
+ empty lines *before* the subtree/item now belong to the
+ part and will be moved with it. There is one exception to
+ this rule: If the first child is moved down (or,
+ equivalently, the second is moved up), the amount of empty
+ lines *above* the first child to be moved along with it is
+ limited by the number of empty lines *below* it. This
+ sounds complicated, but it allows to have extra empty space
+ before the first child and still have good behavior of the
+ subtree motion commands.
+
+ - Plain lists items work the same.
+
+ I believe we have finally nailed this one. Thanks to Daniel
+ Pittman for bring this up again and to Eric Schulte for
+ pointing out that it is the empty lines *before* an entry
+ that really count.
+
+ This change was non-trivial, please give it a good test and
+ let me know about any problems.
+
+*** Remember
+
+ - The new command `org-remember-goto-last-stored' will jump
+ to the location of the remember note stored most recently.
+ If you have `org-remember' on a key like `C-c r', then you
+ can go to the location with a double prefix arg: `C-u C-u
+ C-c r'. This was a proposal by Rainer Stengele.
+
+ - Template items that are being prompted for can now specify
+ a default value and a completion table. Furthermore,
+ previous inputs at a specific prompt are captured in a
+ history variable. For example:
+
+ : %^{Author|Roald Dahl|Thomas Mann|Larry Niven}
+
+ will prompt for an author name. Pressing RET without
+ typing anything will select "Roald Dahl". Completion will
+ give you any of the three names. And a history will be
+ kept, so you can use the arrow keys to get to previous
+ input. The history is tied to the prompt. By using the
+ same prompt in different templates, you can build a history
+ across templates. The ideas for this came from proposals
+ by Bastien and Adam.
+
+ - When a remember template contains the string `%!', the note
+ will be stored immediately after all template parts have
+ been filled in, so you don't even have to press `C-c
+ C-c'. The was a proposal by Adam Spiers.
+
+*** Refile
+
+ - `org-refile-targets' has a new parameter to specify a
+ maximum level for target selection. Thanks to Wanrong Lin
+ for this proposal.
+
+ - When the new option `org-refile-use-outline-path' is set,
+ refile targets will be presented like a file path to the
+ completion interface: "level 1/level 2/level 3". This
+ may be the fastest interface yet to get to a certain
+ outline entry. Do we need to use this interface in other
+ places? Thanks to Jose Ruiz for this proposal.
+
+* Version 5.16
+
+** Details
+
+*** Restriction lock on agenda scope
+
+ You can now permanently lock the agenda construction to a
+ certain scope, like a file or a subtree. So instead of
+ pressing "<" for each command in the agenda dispatcher, you
+ only once select a restriction scope. All subsequent agenda
+ commands will than respect this restriction. For example,
+ you can use this at work, to limit agendas to your work file
+ or tree, and at home to limit to the home file or tree. Or
+ you can use it during the day in order to focus in on certain
+ projects.
+
+ You select a scope with the command `C-c C-x <', which
+ restricts to the current subtree. When called with a `C-u'
+ prefix, the restriction is to the current file. You can also
+ make restrictions from the speedbar frame, see below.
+
+ When making a new restriction and an agenda window is
+ currently visible, it will immediately be updated to reflect
+ the new scope. TO if you like you can display an agenda view
+ and then watch it change in various scopes.
+
+ To get rid of the restriction, use the command "C-c C-x >".
+ Or press ">" in the agenda dispatcher. Also, and use of "<"
+ in the dispatcher will disable the restriction lock and
+ select a new restriction.
+
+ Thanks to Rick Moynihan for triggering this development.
+
+*** Imenu and Speedbar support
+
+ - Org-mode now supports Imenu. For example, with the setting
+
+ : (add-hook 'org-mode-hook
+ : (lambda () 'imenu-add-to-menubar "Imenu"))
+
+ a menu will be created in each Org-mode buffer that
+ provides access to all level 1 and level 2 headings. The
+ depth of the menu can be set with the variable
+ `org-imenu-depth'.
+
+ - org-mode now supports Speedbar. This means that you can
+ drill into the first and second level headlines of an
+ Org-mode file right from the speedbar frame.
+
+ - You can set a restriction lock for the Org-mode agenda to a
+ file or a subtree directly from the speedbar frame. Just
+ press "<" with the cursor on an Org-mode file or subtree to
+ set the lock and immediately update the agenda if it is
+ visible. Use ">" to get rid of the lock again.
+
+* Version 5.15
+
+** Details
+
+ - There are new special properties TIMESTAMP and TIMESTAMP_IA.
+ These can be used to access the first keyword-less active
+ and inactive timestamp in an entry, respectively.
+
+ - New variable `org-clock-heading-function'. It can be set to
+ a function that creates the string shown in the mode line
+ when a clock is running. Thanks to Tom Weissmann for this
+ idea.
+
+ - Bug fixes.
+
+* Version 5.14
+
+** Overview
+
+ + Remember and related stuff
+ - New command `org-refile' to quickly move a note.
+ - Easy way to jump to the target location of remember template.
+ - New %-escapes in remember templates: %c %(...) and %[...]
+ - `org-remember-insinuate' simplifies remember setup
+
+ + Emphasis and Font-lock stuff
+ - Stacked emphasis is no longer allowed.
+ - You may finally emphasize a single character like ~*a*~.
+ - Font-lock now can hide the emphasis markers
+ - Text in the "=" emphasis is exported verbatim
+ - There is a new emphasis marker "~" for verbatim text
+ - Constructs treated specially by the exporters can be highlighted
+
+ + Properties and Column view
+ - More control over which properties use inheritance
+ - CATEGORY="work" can now be used in a tags/property search
+ - the {+} summary type can specify a printf-style output format
+ - New currency summary type {$}
+
+ + The date/time prompt
+ - While entering data, watch live the current interpretation.
+ - The date prompt now prefers to select the future
+ - Easier modification of time in an existing time stamp.
+
+ + Export
+ - You can now export some special strings in HTML, like "..."
+ - #+EMAIL: may contain several email addresses
+
+ + Agenda
+ - In the agenda, a few keys have changed: `g', `G', and `e'.
+
+ + Miscellaneous
+ - Class-dependent sectioning structures in LaTeX export.
+ - Radio-lists modeled after the radio tables.
+ - The default for `org-ellipsis' is back to nil
+ - Support for pabbrev-mode
+ - New variable `org-show-entry-below'.
+
+** Incompatible changes
+
+ - If you have customized the variable `org-emphasis-alist' or
+ org-export-emphasis-alist', you need to do it again by first
+ canceling your customization and then adding it again.
+
+ - I know that some people have defined their own private helper
+ functions to select a specific remember template, without being
+ prompted, like this:
+
+ : (defun my-remember-template-n ()
+ : (interactive)
+ : (org-remember ?n))
+
+ You need to modify this. The character selecting the template
+ must now be the /second/ argument to `org-remember':
+
+ : (defun my-remember-template-n ()
+ : (interactive)
+ : (org-remember nil ?n))
+
+ - `C-c C-w' now refiles an entry. To get a sparse tree of
+ deadlines, use `C-c / d' instead.
+
+** Details
+
+*** Remember and related stuff
+
+ - New command `org-refile' to quickly move a note to a
+ different place. It is bound to `C-c C-w'. The foremost
+ application might be to put a note or task captured with
+ `remember' into the proper list or project. The command
+ offers a list of possible refiling targets for completion.
+ These are headings under which the entry will be inserted
+ as a subitem. By default, this will offer all top-level
+ headings in the current buffer, but you can configure the
+ variable `org-refile-targets' to get more complex
+ definitions. For example:
+
+ : (setq org-refile-targets '((nil . (:level . 2))))
+
+ selects all level 2 headlines in the current buffer as
+ targets. And
+
+ : (setq org-refile-targets
+ : '((org-agenda-files . (:tag . "refile"))))
+
+ searches all agenda files and selects headlines that are
+ explicitly marked with the tag :refile: . Note that the
+ list of targets is built upon first use only, to rebuilt
+ it, call the command `C-c C-w' with a double prefix
+ argument.
+
+ This is based on an idea and example implementation by Max
+ Mikhanosha. Many thanks Max.
+
+ - You can now use a C-u prefix on `org-remember' to jump to
+ the location where a specific templates stores its notes.
+ For example, if you have `org-remember' bound to `C-c r',
+ then `C-u C-c r n' will get you to the file and headline
+ given in the template associated with the letter "n".
+
+ This was proposed by someone, but I have lost track who.
+ Sorry, and thanks anyway.
+
+ - New %-escapes in remember templates:
+
+ : %c insert the current clipboard, like C-y would do
+ : %(..) evaluate Lisp expression and insert the result
+ : %[..] include file
+
+ Thanks to Adam Spiers and Tim O'Callaghan.
+
+ - New function `org-remember-insinuate' that makes is easier
+ to set Org-mode specific values for remember variables.
+ Thanks to Michael Olson for this proposal. It is
+ equivalent to:
+
+ : (require 'remember)
+ : (setq remember-annotation-functions '(org-remember-annotation))
+ : (setq remember-handler-functions '(org-remember-handler))
+ : (add-hook 'remember-mode-hook 'org-remember-apply-template))
+
+ You might still want to set `org-default-notes-file' to
+ provide a default for templates without a file, and
+ `org-directory' to show where to find other org files.
+
+*** Emphasis and Font-lock stuff
+
+ - Stacked emphasis like ~*/bold italic/*~ is no longer allowed.
+
+ - You may finally emphasize a single character like ~*a*~.
+
+ - Font-lock now can hide the emphasis markers, just like Muse
+ does. Configure the variable `org-hide-emphasis-markers'
+ if you want this. Showing the characters continues to be
+ the default in Org-mode.
+
+ - Text in the "=" emphasis is now exported verbatim, i.e. no
+ further parsing and interpretation of this text takes place. So
+ you can write ~=quoted *xxx* a_x = b=~. This and the following
+ point implement a request by Daniel Clemente.
+
+ - There is a new emphasis marker "~" which marks text to be
+ exported verbatim, without special formatting. Inside an
+ org-mode file, this text is highlighted with the org-verbatim
+ face. I am not happy with the face yet (currently is is like
+ org-code, but underlined), please suggest a better one.
+
+ - Whether an emphasis environment is verbatim or not is now an
+ extra flag in the variable `org-emphasis-alist'. If you have
+ configured this variable, do it again by first canceling your
+ customization to revert to the default, and then adding it
+ again.
+
+ - New variable `org-highlight-latex-fragments-and-specials'.
+ When turned on, Org-mode will highlight all strings that
+ are treated in a special way by the exporters. This is
+ great for export-oriented writing, but maybe a bit noisy
+ for note taking, so this feature is off by default.
+
+*** Properties and Column view
+
+ - `org-use-property-inheritance' may now also be a list of
+ property names that should be treated with inheritance
+ during searches.
+
+ - CATEGORY="work" can now be used in a tags/property search,
+ even if the category is not specified as a property in the
+ entry, but rather is inherited or derived from #+CATEGORY.
+ Thanks to Adam, Tim, and Bastien for an interesting
+ discussion around this issue.
+
+ - Summary type improvements in column view.
+ * The {+} summary type can specify a printf-style output
+ format for computed values like this: {+;%5.2f}
+ This was triggered by a report by Levin.
+ * New currency summary type {$}, which so far is just a
+ shorthand for {+;%.2f}. Do we need to have a currency
+ symbol in front of each value. Scott Jaderholm asked for
+ this, but I am not sure if this is already what he meant.
+
+*** The date/time prompt
+
+ There have been several small but *very* useful additions to
+ the date prompt.
+
+ - While entering data at the date prompt, the current
+ interpretation of your input is shown next to your input in
+ the minibuffer. I find this great to understand how the
+ input works. If you find the extra stuff in the minibuffer
+ annoying, turn it off with `org-read-date-display-live'.
+
+ - The date prompt now prefers to select the future. If you
+ enter a date without a month, and the day number is before
+ today (for example, on the 16th of the month you enter
+ "9"), Org-mode will assume next month. Similarly, if you
+ enter a month and no year, next year will be assumed if the
+ entered month is before the current, for example if you
+ enter "May" in September. Thanks to John Rakestraw for
+ this great suggestion. If you find it confusing, turn it
+ off with `org-read-date-prefer-future'.
+
+ - When modifying an existing date using `C-c .' at the stamp,
+ the time or time range in the stamp are now offered as
+ default input at the prompt. This goes a long way to
+ simplifying the modification of an existing date. Thanks
+ to Adam Spiers for this proposal.
+
+*** Export (all implemented by Bastien...)
+
+ - You can now export special strings in HTML. Here is the
+ list of newly performed conversions:
+
+ | Org | Description | HTML |
+ |-----+------------------------------------+----------|
+ | ~\\-~ | double backslash followed by minus | &shy; |
+ | ~--~ | two dashes (minuses) | &ndash; |
+ | ~---~ | three dashes (minuses) | &mdash; |
+ | ~...~ | three dots | &hellip; |
+
+ You can turn this globally on or off with
+ `org-export-with-special-strings' or locally with "-:t" or
+ "-:nil" in the #+OPTIONS line. Thanks to Adam Spiers for
+ starting the discussion, and thanks to Daniel Clemente and
+ William Henney for relevant inputs.
+
+ - Comma-separated emails in #+EMAIL: are correctly exported.
+ Thanks to Raman for pointing out this omission.
+
+*** Agenda
+
+ - In the agenda, a few keys have changed
+ : g does now the same a "r", refresh current display,
+ : because "g" is the Emacs standard for "refresh"
+ : G toggle the time grid, used to be "g"
+ : e Execute another agenda command, pretty much the same as
+ : `C-c a', but shorter and keep the same agenda window.
+
+*** Miscellaneous (much of it from Bastien)
+
+ - You can now select the sectioning structure of your LaTeX
+ export by setting it either globally
+ (`org-export-latex-default-class') or locally in each Org
+ file (with #+LaTeX_CLASS: myclass). You can also customize
+ the list of available classes and their sectioning
+ structures through the new `org-export-latex-classes'
+ option. Thanks to Daniel for discussions and suggestion on
+ this issue.
+
+ - You can send and receive radio lists in HTML,
+ LaTeX or TeXInfo, just as you send and receive radio
+ tables. Check the documentation for details and examples.
+
+ - The default for `org-ellipsis' is back to nil, some people
+ seem to have had problems with the face as a default.
+
+ - Support for pabbrev-mode, needs pabbrev version 1.1. Thanks
+ to Phillip Lord for adapting his package to make this
+ possible.
+
+ - New variable `org-show-entry-below' to force context-showing
+ commands to expose the body of a headline that is being
+ shown. Thanks to Harald Weis for pointing out this omission.
+
+
+* Version 5.13i
+
+** Details
+
+ - On the date/time prompt, you can now also answer with
+ something like +2tue to pick the second tuesday from today.
+ This was a proposal by Sacha Chua.
+
+ - When interpopating into Lisp formulas in the spreadsheet,
+ the values of constants and properties are no longer
+ enclosed into parenthesis. When interpolating for calc,
+ this still happens in order to allow expressions in
+ constants. This problem was reported by Eddward DeVilla.
+
+ - When a directory is listed in `org-agenda-files', all files
+ with extension matched by the new variable
+ `org-agenda-file-regexp' in that directory will be agenda
+ files.
+
+ - Bug fixes.
+
+* Version 5.13
+
+** Overview
+
+ - Bug fixes and improvements in column view
+ + All known bugs fixed.
+ + A Column view can be captured into a dynamic block.
+ + The ITEM column is formatted core compactly.
+ + Also ITEM can be edited with `e'
+
+ - The agenda dispatcher
+ + `<' cycles through restriction states.
+ + Multi-character access codes to commands (= sub-keymaps).
+
+ - Sorting improvements
+ + User-defined sorting keys.
+ + Sorting by properties.
+ + Sorting of plain lists.
+
+ - HTML <div> structure
+
+ - Other stuff
+ + New variables, several of them.
+ + Drawers can be set on a per-file basis.
+ + Better control over priority fontification in agenda.
+ + M-up and M-down now move the current line up and down.
+ + Abort remember template selection with C-g.
+
+** Details
+
+*** Bug fixes and improvements in column view
+
+ - All the bugs described by Scott Jaderholm have been fixed
+ (at least I hope so...).
+
+ - You can now capture a column view into a dynamic block, for
+ exporting or printing it. The column view can be
+
+ + global, i.e. for the entire file
+ + local, i.e. for the subtree where the dynamic block is
+ + from an entry with a specific :ID: property.
+
+ You can identify the entry whose column view you want to
+ capture by assigning an :ID: property, and use that property
+ in the dynamic block definition. For example:
+
+ : * Planning
+ : :PROPERTIES:
+ : :ID: planning-overview
+ : :END:
+ :
+ : [...]
+ :
+ : * The column view
+ : #+BEGIN: columnview :hlines 1 :id "planning-overview"
+ :
+ : #+END:
+
+ Use `C-c C-x r' to insert such a dynamic block, and you will
+ be prompted for the ID.
+
+ - When the current column format displays TODO keyword,
+ priority or tags, these parts are stripped from the content
+ of the ITEM column, making for more compact and readable
+ entries. When any of these "properties" are not listed in
+ the current column format, they are instead retained in the
+ ITEM column.
+
+ - You can now also edit the ITEM column with `e'.
+
+*** The agenda dispatcher
+
+ - Instead of pressing `1' to restrict an agenda command to
+ the current buffer, or `0' to restrict it to the current
+ subtree or region, you can now also press `<' once or
+ twice, respectively. This frees up `1' and `0' for user
+ commands, a request by Bastien. In fact, "<" cycles
+ through different restriction states. "1" and "0" are
+ still available for backward compatibility, until you bind
+ them to custom commands.
+
+ - The access code to custom agenda commands can now contain
+ several characters, effectively allowing to bundle several
+ similar commands into a sub-keymap. This follows an
+ excellent proposal by Adam Spiers. For example:
+
+ : (setq org-agenda-custom-commands
+ : '(("h" . "HOME + Name tag searches") ; describe prefix "h"
+ : ("hl" tags "+HOME+Lisa")
+ : ("hp" tags "+HOME+Peter")
+ : ("hk" tags "+HOME+Kim")))
+
+ - The user function option in org-agenda-custom-commands may
+ now also be a lambda expression, following a request by
+ Adam Spiers.
+
+*** Sorting improvements
+
+ We are using a new routine for sorting entries, courtesy of
+ John Wiegley. Many thanks to John.
+
+ - You can define your own function to extract a sorting key
+ and in this way sort entries by anything you like.
+
+ - Entries can now be sorted according to the value of a
+ property.
+
+ - Plain lists can be sorted.
+
+*** HTML <div> structure
+
+ There is now a <div>-based structure in exported HTML.
+
+ - The table of context is wrapped into a div with a class
+ "table-of-contents".
+
+ - The outline structure is embedded in <div> elements with
+ classes "outline-1", "outline-2" etc.
+
+ - The postamble, containing the author information and the
+ date is wrapped into a div with class "postamble".
+
+ I am not sure if the class names are the best choice, let me
+ know if there are more "canonical" choices.
+
+ Thanks to Mike Newman and Cezar for input, and in particular
+ to Mike for his clearly formulated specification.
+
+*** Other stuff
+
+ - New variable `org-agenda-window-frame-fractions' to
+ customize the size limits of the agenda window in the case
+ that you display the agenda window by reorganizing the
+ frame.
+
+ - Drawers can be set on a per-file basis using
+
+ : #+DRAWERS: HIDDEN STATE PROPERTIES
+
+ This will define the drawers :HIDDEN: and :STATE:.
+ The :PROPERTY: drawer should always be part of this list, or
+ your properties will not be folded away.
+ Thanks to Richard G. Riley for this proposal.
+
+ - `org-agenda-fontify-priorities' may now also be an
+ association list of priorities and faces, to specify the
+ faces of priorities in the agenda individually.
+
+ - The variable `org-export-with-property-drawer' no longer
+ exists, please use `org-export-with-drawers' instead. Also,
+ the corresponding switch in the #+OPTIONS line has changed
+ from "p" to "d". Thanks to Bastien for pointing out that we
+ needed to handle not only the property drawer.
+
+ - M-up and M-down now move the current line up and down (if
+ not at a headline, item or table). Among other things you
+ can use this to re-order properties in the drawer. This was
+ a proposal by Bastien.
+
+ - New variable `org-agenda-todo-ignore-with-date', based on a
+ request by Wanrong Lin.
+
+ - Aborting remember template selection with C-g now kills the
+ remember buffer and restores the old window configuration.
+ This was a request by Nuutti Kotivuori.
+
+* Version 5.12
+
+** Overview
+
+ - Remember templates can now have name.
+ - `C-c C-k' will abort taking a note (remember of log)
+ - `C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg.
+ - Lines in the agenda can be fontified according to priority.
+ - New variable `org-scheduled-past-days'.
+ - New variables `org-agenda-deadline-leaders' and
+ `org-agenda-scheduled-leaders'.
+ - New sparse tree function `org-sparse-tree'.
+ - The variable `org-ellipsis' now defaults to `org-link'.
+ - The #+OPTIONS line has a new option "tags".
+ - New variable `org-use-property-inheritance'.
+
+** Incompatible Changes
+
+ - `C-c /' now calls `org-sparse-tree'.
+
+** Details
+
+ - Remember templates can now have a template name as the first
+ element. The name will be listed along with the selection
+ character when prompting for a template. It is best to have
+ the name start with the selection character, for example if
+ you use ("Note" "n"), you will be prompted like "[n]ote".
+ Thanks to Matiyam for this proposal.
+
+ - `C-c C-k' will abort taking a note. You can use this in remember
+ buffers and when taking a logging note (e.g. for a state
+ change). Thanks to Bastien.
+
+ - `C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg to
+ cut N sequential subtrees. This was a proposal by John.
+
+ - Lines in the agenda are now bold if they have priority A and
+ italic if they have priority C. You can turn this off using
+ the variable `org-agenda-fontify-priorities'. Thanks to
+ John Wiegley for the idea and code.
+
+ - New variable `org-scheduled-past-days' to set the number a
+ scheduled item will be listed after its date has passed.
+ Default is 10000, i.e. indefinitely.
+
+ - New variables `org-agenda-deadline-leaders' and
+ `org-agenda-scheduled-leaders' to adjust the leading text o
+ scheduled items and deadline in the agenda. Thanks to John
+ Wiegley for a patch.
+
+ - New sparse tree function `org-sparse-tree'. This is now the
+ default binding for `C-c /'. It requires one additional
+ keypress to select a command, but in return is provides a
+ single interface to all the different sparse tree commands,
+ with full completion support.
+
+ - The variable `org-ellipsis' now defaults to the face
+ `org-link' because the visibility of the dots is really bad
+ and I have found this change very useful indeed.
+
+ - The #+OPTIONS line has a new option "tags" which can be used
+ to set `org-export-with-tags'. Thanks to Wanrong Lin for
+ this proposal.
+
+ - New variable `org-use-property-inheritance'. Configure it
+ to `t' if you want that searching for entries with certain
+ properties always should assume inheritance. This is not
+ well tested yet, please check it out.
+
+ - Bug fixes
+
+* Version 5.11
+
+** Overview
+
+ - SUMMARY, DESCRIPTION, LOCATION properties for iCalendar
+ - Command to jump to the running clock
+ - Clock entries can now have their own drawer
+ - `C-c C-x C-r' only updates a clocktable at point
+ - New way to assign a remember template to a single key
+ - `C-n' and `C-p' are back to their default binding
+ - `C-x C-s' in agenda buffer saves all org-mode buffers
+ - Schedule/deadline leaves note in agenda buffer
+ - Prefix argument for `C-c C-d/s' will remove date
+ - New variable to make block aranda more compact
+ - Better tag alignment in agenda
+
+** Incompatible changes
+
+ - If you have customized `org-drawers', you need to add
+ "CLOCK" to the list of drawers.
+
+ - The variable `org-agenda-align-tags-to-column' has been
+ renamed to `org-agenda-tags-column'. The old name is still
+ an alias, in Emacs 22 and in XEmacs, but not in Emacs 21.
+
+ - The default value for both `org-tags-column' and
+ `org-agenda-tags-column' is now -80.
+
+ - The variable
+ `org-insert-labeled-timestamps-before-properties-drawer'
+ is now obsolete.
+
+** Details
+
+ - The LOGGING property allows to modify the settings for
+ progress logging for a single entry. For example:
+
+ : :PROPERTIES:
+ : :LOGGING: nologging nologrepeat
+ : :END:
+
+ turns off all progress logging for the current entry and its
+ children.
+
+ - The properties SUMMARY, DESCRIPTION and LOCATION have
+ special meaning during iCalendar export, when they translate
+ to the corresponding VEVENT and VTODO fields. If not given,
+ Org-ode continues to use cleaned-up version of the headline
+ and body as the summary and the description, respectively.
+
+ - New function to go to the entry with the currently running
+ clock. Bound to `C-c C-x C-j', in agenda also to "J". If
+ you use this often, you might even want to assign a global
+ key. Thanks to Bernt and Bastien.
+
+ - Clock entries can now have their own drawer, the :CLOCK:
+ drawer. Check out the variable `org-clock-into-drawer' for
+ configuration of this feature. The default is to create a
+ drawer when the second clocking line gets added to an entry.
+ Note that "CLOCK" has been added to the default value of
+ `org-drawers', but if you have configured that variable, you
+ must go back and add "CLOCK" yourself to get this drawer
+ folded away. Thanks to Tom Weissman for pointing out that
+ too many clock entries are visually annoying.
+
+ - `C-c C-x C-r' no longer tries to find the first clocktable
+ in a buffer and then updates it. Instead, it will update
+ the clocktable at point if there is one (same as C-c C-c
+ will do if the cursor is in the "#+BEGIN" line of the
+ table). If there is none at point, a new one will be
+ inserted. This change was necessary because the new :scope
+ parameter allows to have several clocktables in a buffer.
+ Thanks to Bastien for pointing this out.
+ To update all dynamic blocks in a file, use `C-u C-c C-x C-u'.
+
+ - The function `org-remember' can now be called with a
+ template selection key as argument. This helps to make key
+ bindings that go directly to a specific template without
+ being prompted for a template, like this:
+
+ : (global-set-key [f5] (lambda () (interactive) (org-remember "j")))
+
+ Thanks to Richard G Riley for bringing this up.
+
+ - `C-n' and `C-p' are back to their default binding
+ (next/previous line) in the agenda buffer. Enough people,
+ including recently Denis Bueno, have complained about this,
+ and I agree it is not good to break habits like that.
+
+ - `C-x C-s' in an agenda buffer now saves all org-mode buffers
+ (also `s' does this).
+
+ - Setting schedule or deadline dates from the agenda now
+ produces a note in the agenda, similarly to what happens
+ with S-left/right.
+
+ - Using a prefix argument for `C-c C-d' or `C-c C-s' will
+ remove the deadline or scheduling date from an item. Thanks
+ to Wanrong Lin for this proposal.
+
+ - New variable `org-agenda-compact-blocks'. When set, the
+ space between blocks in a block agenda is reduced as much as
+ possible, to show more items on a single screen.
+
+ - The variable `org-agenda-tags-column' (renamed from
+ `org-agenda-align-tags-to-column') can now also be negative,
+ to mean alignment to the left. The new default is -80, just
+ like it is now for `org-tags-column'.
+
+ - Bug fixes
+
+* Version 5.10
+
+** Overview
+
+ - Category and the archive location can be properties.
+ - The clocktable has a new =:scope= parameter.
+ - CSV support when importing a table.
+ - Better defaults when modifying a time stamp.
+ - New way to specify the duration of an appointment.
+ - More aggressive version of orgstruct-mode improved wrapping.
+ - Modifications to priority cycling.
+ - Modifications to computations in column view.
+ - New command `org-occur-in-agenda-files'.
+ - Bug fixes.
+
+** Details
+
+ - Both the category and the archive location in a (sub)tree of
+ the buffer can now be specified using a property, for
+ example:
+
+ : * Tree with special properties
+ : :PROPERTIES:
+ : :CATEGORY: Examples
+ : :ARCHIVE: /some/special/file::
+ : :END:
+
+ This is a much cleaner way of dealing with multiple
+ categories and archives in a single file. The preferred use
+ of the =#+CATEGORY= and =#+ARCHIVE= lines is now to set a
+ *single* default for the file which is then locally
+ overruled by properties. This was a proposal from Bastien
+ if I remember correctly. Multiple =#+= lines still work
+ and I don't plan to remove this support soon, but I
+ encourage you to stop using them.
+
+ - The clocktable has a new =:scope= parameter that determines
+ the range in the file from which clock entries should be
+ taken. This can be anything from the local subtree to the
+ entire buffer to even the full list of agenda files. Legal
+ values are:
+
+ | value | scope |
+ |---------+-------------------------------------------------|
+ | nil | the current buffer or narrowed region |
+ | file | the full current buffer |
+ | subtree | the subtree where the clocktable is located |
+ | treeN | the surrounding level N tree, for example tree3 |
+ | tree | the surrounding level 1 tree |
+ | agenda | all agenda files |
+
+ Thanks to Jason F. McBrayer and Bernt Hansen for
+ inspiration. Thanks to cranreuch (what is you full name?)
+ for mentioning, at the right moment, that the clocktable is
+ not so bad - that remark made it seem worthwhile to add
+ features.
+
+ - The commands to import a table and to convert a region to a
+ table can now handle comma-separated values (CSV). The
+ algorithm does not yet treat quoting correctly, but for
+ basic input it works.
+
+ - When modifying an existing time stamp, or when entering the
+ second stamp of a range, the date prompt will now
+ consistently default to the date/time in the existing stamp.
+ This was triggered by Nuutti Kotivuori's request.
+
+ - At the date/time prompt, there is a new way to specify a
+ range of hours, by using "+DURATION" after the time. For
+ example:
+
+ : 14:00+2 means 14:00-16:00
+ : 2pm+2:30 means 14:00-16:30
+
+ Again, Nuutti Kotivuori's request.
+
+ - When you use the function `turn-on-orgstruct++' to turn on
+ orgstruct-mode, the special org-mode settings for
+ auto-filling, indentation and paragraphs are exported into
+ the buffer, so that typing list items with indentation works
+ better. This was Bastien's idea and request.
+
+ - New variable `org-priority-start-cycle-with-default'. When
+ t (the default), priority cycling will initially set the
+ default priority and then increase or decrease. When nil,
+ the first priority set by cycling is already 1 different
+ from the default priority. This was mostly driven by
+ Bastien.
+
+ - In column view: When an entry has a property for a summary
+ column defined, its value is normally overwritten by the sum
+ of all the children's values each time you enter column
+ view. Now there is an exception to this rule: If none of
+ the children has that particular property defined, the
+ parent's value stays. In this way you can still place TODO
+ items under such an entry without getting the property value
+ changed. Thanks to Russel Adams for pointing out that this
+ is a better way of doing things.
+
+ - In column view, computed values are now bold face, and
+ trying to edit them is an error. I think this works, but
+ testing is appreciated.
+
+ - New command `org-occur-in-agenda-files', this is basically
+ the quick command John Wiegley proposed the other day, but
+ it also works when the agenda files are not yet in buffers.
+ The key is `C-c C-x /', any better proposals?
+
+ - Links containing a space will now be handled correctly when
+ calling the browser. Note that you need to enclose such
+ links in square or angular brackets.
+
+ - Bug fixes.
+
+* Version 5.09
+
+** Overview
+
+ - Taking a note upon TODO state changes can be restricted to
+ selected states.
+
+ - The format in which dates are shown in the daily/weekly
+ agenda can be configured.
+
+ - The default for `org-remember-store-without-prompt' is now t.
+
+ - `org-goto' has been made into a general lookup command.
+
+ - Priority cycling goes back to the nil state.
+
+ - You can store a remember note to the *last used* location.
+
+ - On Emacs 23, the headline faces for org-mode are now
+ inherited from the outline faces.
+
+** Incompatible Changes
+
+ - The default for `org-remember-store-without-prompt' is now
+ t, in order to better match the original intent of
+ remember.el (storing a note with minimum interruption of
+ work flow). I expect that many people will be hit by this
+ incompatible change - nevertheless I believe it is the right
+ thing to do.
+
+** Details
+
+ - You can now select specific states for recording a note when
+ switching to that state. With the setting
+
+ : #+SEQ_TODO: TODO(t) ORDERED(o@) INVOICE(i@) PAYED(p) | RECEIVED(r)
+ : #+STARTUP: lognotestate
+
+ only the states ORDERED and INVOICE will record a timestamp
+ and a note.
+
+ - You can now set the format of the string for each day in the
+ agenda and timeline buffers. You can use a format string
+ interpreted by `format-time-string', or you can write your
+ own function. Configure the new variable
+ `org-agenda-format-date'. Thanks to Levin for triggering
+ this development with a patch.
+
+ - The default for `org-remember-store-without-prompt' is now
+ t, in order to better match the original intent of
+ remember.el (storing a note with minimum interruption of
+ work flow). Since we can assign files and headlines to
+ templates, I guess this takes care of selecting a filing
+ location in most cases. For interactive filing, you now
+ need a prefix command when exiting `remember'.
+
+ - `org-goto' (bound to `C-c C-j') now uses an indirect buffer
+ and has additional commands enabled: Org-occur with `C-c /'
+ or even faster with `/', and the commands needed to select
+ and copy a region. This make `org-goto' a more general
+ lookup command instead of only a jumping command. Remember
+ that you can exit with `Q' to go back to the original
+ location. Thanks to William Henney for this idea.
+
+ - Setting the priority with S-up/down now cycles back to a
+ state where no priority is specified. This was requested by
+ Rick Moynihan.
+
+ - You can store a remember note to the *last used* location.
+ So if you select a location interactively once, you can
+ re-use it without having to find it again. For this, exit
+ the remember buffer with `C-u C-u C-c C-c'. The leading
+ comment in the remember buffer will tell exactly where the
+ note goes if you exit with a particular command.
+ Thanks to Maxim Loginov for this idea.
+
+ - On Emacs 23, the headline faces for org-mode are now
+ inherited from the outline faces. This is just a
+ convenience, so that you only have to configure one set of
+ faces, and that will then be outline-1 .. outline-8. You
+ will actually not see any difference in org-mode, because
+ Stefan Monnier has made the outline faces in Emacs 23 to
+ match the current org-mode faces.
+
+ This change does not effect XEmacs, nor Emacs 21 and 22.
+
+* Version 5.08
+
+** Incompatible changes
+
+ - The default for `org-deadline-warning-days' is now 14.
+
+** Details
+
+ - There is now a separate interface for fast and directly
+ setting a TODO keyword. This interface kicks in when you
+ have configured keys for TODO keywords like
+
+ : #+SEQ_TODO: TODO(t) WAITING(w) | DONE(d) CANCELED(c)
+
+ C-c C-t still does the cycling thing, you need to use a
+ prefix argument to get to the fast interface. Or configure
+ the variable `org-use-fast-todo-selection' to t, then this
+ will be the default and the prefix argument will make the
+ command fall back to cycling.
+
+ The tag selection no longer does include TODO keywords -
+ Leo's arguments have convinced me that this is not a good
+ idea. If you'd like to see the TODO keywords in the tags
+ interface anyway, set the variable
+ `org-fast-tag-selection-include-todo'. Thanks to Leo and
+ others for input on this issue.
+
+ - New variable `org-edit-timestamp-down-means-later'. When
+ set, `S-down' on a timestamp will change the timestamp to
+ later. Thanks to Raman for this idea.
+
+ - Property names can now contain non-ascii word characters.
+ This follows a request from Daniel Clemente.
+
+ - For export, the date that should be given in the exported
+ file can now be set to a specific value with a line like
+
+ : #+DATE: 15 November 2003
+
+ If you want to use the date/time when the file was created,
+ use a format string that will be interpreted by
+ `format-time-string', for example:
+
+ : #+DATE: %Y/%m/%d %X
+
+ - The default of `org-deadline-warning-days' has changed to 14
+ days. 30 was really too much, I suspect most people (me
+ included) have changed this.
+
+ - When a deadline has an individual lead time, this lead time
+ obviously overrules `org-deadline-warning-days'. However,
+ if you bind `org-deadline-warning-days' to a number <=0, for
+ example during a custom agenda command, then the absolute
+ value of this number will be enforced also when a different
+ lead time has been specified. This is useful to get a list
+ of all deadlines coming up in the next N days.
+
+* Version 5.07
+
+** Overview
+
+ - Different faces for different TODO keywords.
+
+ - Setting TODO states through the TAG setting interface.
+
+ - Context information is stored when moving a tree to the archive.
+
+ - Sorting can be done by priority.
+
+ - `Org-ellipsis' can now also be a face.
+
+ - Scheduling info is no longer removed entry is marked CLOSED.
+
+ - Unavailable files in `org-agenda-files' can be skipped.
+
+** Incompatible changes
+
+ - The time of archiving is now stored as a property.
+ ARCHIVED is no longer a special time keyword.
+
+ - Scheduling info is no longer removed entry is marked CLOSED.
+
+** Details
+
+ - You can now define different faces for different TODO
+ keywords. This request has come up frequently, so here it
+ is: Use the variable `org-todo-keyword-faces'.
+
+ A Here is a configuration example:
+
+ : (setq org-todo-keyword-faces
+ : '(("TODO" . org-warning)
+ : ("DEFERRED" . shadow)
+ : ("CANCELED" . (:foreground "blue" :weight bold
+ : :underline t))))
+
+ Org-mode continue still use `org-todo' and `org-done' for
+ keywords that have no specific face assigned.
+
+ - Some People use TODO states more like tags. For them the
+ TODO keywords mark special states and they like to quickly
+ switch between states in arbitrary sequence. The standard
+ TODO interface is not perfect for this, because it assumes
+ that the states are reached in sequence. However, the fast
+ tag setting interface is in fact perfect for this. You can
+ now "misuse" the TAG selection interface to also set TODO
+ states. All you need to do is to assign keys to the TODO
+ states, just like you also do for tags.
+
+ : #+SEQ_TODO: TODO(t) WAITING(w) | CANCELED(c) DONE(d)
+ : #+TAGS: @HOME(h) @OFFICE(o) @SHOP(s)
+
+ Next time you try to set tags with C-c C-c, the todo states
+ will be offered as well, and the corresponding key will
+ switch the entry to that state.
+
+ - New variable `org-archive-save-context-info' governs if
+ information that would be lost by moving a subtree to the
+ archive file, should be stored as special properties. For
+ example,
+
+ : (setq org-archive-save-context-info '(itags category))
+
+ will store the inherited tags and the category in properties
+ ARCHIVE_ITAGS and ARCHIVE_CATEGORY, respectively. The
+ default setting for this variable is to save everything that
+ could be lost. This was a proposal by John Wiegley.
+
+ - Sorting (`C-c ^') can use the use the priority to sort. Use
+ the "p" and "P" keys at the prompt. John Wiegley, again.
+
+ - `Org-ellipsis' can now also be a face to make the folding
+ ellipsis more visible. This is based on a post by Tassilo
+ Horn. Since `org-ellipsis' only works in Org-mode, you
+ might want to use Tassilo Horn's hack directly in order to
+ affect the folding ellipsis globally.
+
+ - Scheduling info is no longer removed when an entry is marked
+ CLOSED. This was a request by Brian van den Broek. Let me
+ know if this breaks anything for you - then it will become
+ an option.
+
+ - New option `org-agenda-skip-unavailable-files'. Currently,
+ if a file does not exist, it will be removed from
+ `org-agenda-files' after a query. When this option is set,
+ the file will simply be skipped.
+
+ - Bug fixes.
+
+* Version 5.06
+
+** Overview
+
+** Details
+
+ - When exporting only a region and this region is a single
+ (sub)tree (for example selected with `C-c @'), the title for
+ the exported document is taken to be the heading of the
+ subtree. The sublevels become top-level entries in the
+ export. Furthermore, if the head entry of the tree has or
+ inherits an EXPORT_FILE_NAME property, that file name (with
+ appropriately substituted extension) will be used for the
+ exported tree. Thanks to Patrick Drechsler and Jost Burkart
+ for these ideas.
+
+ - org-special-ctrl-a/e has a third allowed value, `reversed'.
+ When it is set to this value, the first C-a or C-e command
+ behaves normally, i.e. it goes to the true beginning or end
+ of the line. Only when you press C-a or C-e immediately
+ again, the the "special" position will be found. Additional
+ presses of the same key jump between the two positions. I
+ like this a lot better than the `t' setting, because now the
+ keys behave more predictable and still give easy access to
+ the special locations.
+
+ - New command to set or remove a tag from all headlines in a
+ region.
+
+ - When Org-mode visits a file, it will initially hide all
+ drawers.
+
+ - The default of the variable `org-cycle-global-at-bob' is now
+ nil, meaning that TAB no longer does global visibility
+ cycling at the beginning of the buffer.
+
+ - Bug fixes, in particular the problems with scheduling and
+ deadlines introduced in 5.05. Please check carefully if
+ this works correctly again, and complain if not.
+
+* Version 5.05
+
+** Overview
+
+ - LaTeX export, finally, thanks to Bastien.
+
+ - Extension mechanism for the hyperlink system.
+
+ - Global access to commands inserting and following links.
+
+ - Individual lead-times for deadlines.
+
+ - Option to show only the next instance of repeating timestamp.
+
+ - Store remember notes with only 2 keys: C-c C-c
+
+ - Appointment reminders from Org-mode.
+
+ - Global values for selected properties.
+
+ - Bug fixes.
+
+
+** Details
+
+ - Bastien's `org-export-latex.el' is now part of the org-mode
+ distribution. You can export an Org-mode document to a
+ LaTeX file with `C-c C-e l'. For more options, see the
+ manual, and the commentary in the Lisp file. Kudos to
+ Bastien for contributing this frequently requested feature.
+ I am sure this has been tough because of the many different
+ ways I have been allowing LaTeX snippets and environments to
+ be incorporated in lazy free-format ways.
+
+ - Org-mode has now an extension mechanism for the hyperlink
+ system. This should clear the road for all those mairix and
+ other ideas that have been floating around. Now it is on
+ *you* to write and share new link types for Org-mode. The
+ interface for adding a new link type is described in the
+ appendix of the manual, section A2. The unsolved problem is
+ currently how to handle the new link types for
+ export/publishing.
+
+ - New *global* commands `org-open-at-point-global' and
+ `org-insert-link-global'. You can bind these commands to
+ global keys and use them to insert and follow Org-mode-like
+ links anywhere in Emacs. Thanks to Adam Spiers for this
+ excellent idea.
+
+ - Each deadline timestamp may now specify its own interval of
+ lead-time display, given in days, weeks, months or years.
+ The syntax is like this
+
+ : DEADLINE: <2007-08-13 Mon -5d>
+
+ When combined with a repeater, the repeater has to come
+ first:
+
+ : DEADLINE: <2007-08-13 Mon +2w -5d>
+
+ You may now also customize the faces that are used in the
+ agenda to indicate the distance of an approaching deadline.
+ See the new option `org-agenda-deadline-faces'.
+
+ Thanks to Pavel Chalmoviansky and John Wiegley proposals in
+ this direction.
+
+ - New option `org-agenda-repeating-timestamp-show-all'. When
+ set to nil, repeating time stamps will only show up once in
+ the agenda, either today or in the near future. Other
+ matches will be ignored. Thanks to John Wiegley for this
+ proposal.
+
+ - New variable `org-remember-store-without-prompt'. When set,
+ exiting the remember buffer with C-c C-c will store the note
+ without further prompts to the default location, and `C-u
+ C-c C-c' will get the prompts for file and location. So
+ this variable reverses the prefix-argument functionality for
+ storing remember notes. This follows a request from John
+ Wiegley.
+
+ - A new function `org-agenda-to-appt' activates all
+ appointments for the current day so that Emacs will display
+ reminders. This uses appt.el. Thanks to Bastien for this
+ function.
+
+ - You can now set default values for properties that can be
+ inherited by all entries in a buffer, or by all entries
+ globally. Global properties are set in the variable
+ `org-global-properties', like this:
+
+ (setq org-global-properties '(("NAME" "This is the value")))
+
+ Buffer-local values are set like this:
+
+ #+PROPERTY: NAME This is the value
+
+ When using org-entry-get to get the value of a property with
+ the `inherit' flag and the hierarchy above the entry does
+ not contain this property, the buffer-local and global lists
+ are checked as well. This is mostly useful (I think) to set
+ the list of allowed values for a property. Thanks to Bernt
+ Hansen and Bastien for these ideas.
+
+ - Bug fixes.
+
+* Version 5.04
+
+** Details
+
+ - New variables `org-export-author-info' and
+ `org-export-time-stamp-file' to turn off inclusion of author
+ and time information into exported files. Thank to Patrick
+ Drechsler for pointing out that this would be useful.
+
+ - New variable to avoid moving DEADLINE and SCHEDULED info
+ into the property drawer. The default is now to not move
+ this stuff into the drawer.
+ `org-insert-labeled-timestamps-before-properties-drawer'
+
+ - `org-archive-mark-done' can be a string now, to select a
+ specific keyword that should be used for archived entries.
+
+ - New command "j" in agenda to jump to an arbitrary date.
+ Thanks to Bernt Hansen for the patch.
+
+ - Lots of minor fixes.
+
+* Version 5.03
+
+** Incompatible Changes
+
+ - The variable `org-special-ctrl-a' has been renamed to
+ `org-special-ctrl-a/e'. The old one is still an alias (but
+ not on Emacs 21 where variable aliases cannot be defined).
+
+** Details
+
+ - When the variable `org-special-ctrl-a/e' is set, C-e in a
+ headline first goes to the end of the headline ignoring the
+ tags. A second C-e then goes to after the tags.
+
+ - Typing and removing single characters in a headline now
+ keeps the tags in the headline aligned. This could have a
+ little impact on performance while deleting stuff - let me
+ know if we need to make this customizable.
+
+ - New option `org-n-level-faces' can be used to set the number
+ of different faces that are used for headlines. Default is
+ all 8 faces Org-mode defines for this purpose, level 9 uses
+ again the level-1 face. However, you can use fewer, and then
+ the level-1 face will be reused already for level N+1, etc.
+
+ - Column View and hidestars now work together.
+
+ - Bug fixes.
+
+
+* Version 5.02
+
+** Overview
+
+ - The interfaces for properties and column view are finished
+ now and work well.
+
+ - Properties can be summaries, i.e. the parent nodes can
+ compute their value from the children's values.
+
+ - Headlines finally require a space ofter the star(s). The
+ conflict with bold text at the beginning of the line is no
+ longer there.
+
+** Incompatible Changes
+
+ - Bad news. It looks like it is going to be really hard to
+ make column view work on XEmacs and on Emacs 21. Emacs 22
+ is currently the only Emacs where this works. If you are
+ using Emacs 21 or XEmacs, you can still use properties, but
+ not column view.
+
+** Details
+
+ - Improvements for properties:
+
+ + There are interactive commands to insert and delete
+ properties. Read the manual chapter 7 for details.
+
+ + You can define /allowed values/ for a property. When
+ these are defined, you can change the value of a property
+ with S-left and S-right. And you may use completion when
+ inserting the property. This goes a long way to prevent
+ typos when entering properties.
+
+ - Improvements for column view.
+
+ + In column view, you may use the keys S-left/right (and
+ also the keys `n' and `p') to switch from one allowed
+ value to the next.
+
+ + You can define summaries for columns. For example,
+ parents can contain the sum of all children values of a
+ property, or the parent node can have a check box property
+ that is automatically checked when all children's boxes are
+ checked.
+
+ + There are interactive commands to add and remove columns,
+ and to change the attributes of a column like the summary
+ type.
+
+ These additions lead to the exciting fact that the example
+ from [[http://www.omnigroup.com/images/applications/omnioutliner/features/multicolumn.jpg][omni outliner]] posted by Scott Jaderholm can now be
+ accurately [[file:omni-org.jpg][reproduced by Org-mode]].
+
+ - The space after the stars is now required in a headline, in
+ order to remove the conflict with bold words at the
+ beginning of a line. So
+
+ : * This is a level 1 headline
+ : *this is bold text*
+
+ - S-up and S-down to navigate plain item lists are now also
+ available in orgstruct-mode.
+
+* Version 5.01
+
+** Overview
+
+ - A new minor mode, orgstruct-mode, exports the Org-mode
+ structure editing commands into any other mode.
+
+ - DRAWERS are a new level off folding for special sections
+ that should stay closed during visibility cycling and only
+ open if explicitly asked.
+
+ - Entries can now have PROPERTIES.
+
+ - A COLUMN VIEW implementation allows to easily view and edit
+ the properties of a hierarchy of entries (Emacs only, for
+ now).
+
+ - Formula evaluation in the spreadsheet is more consistent
+ now. Properties and per-file constants can be used during
+ evaluation.
+
+ - Bug fixes and minor changes.
+
+** Incompatible changes
+
+ - When using LEVEL=N in a tags search, things have changed if
+ you are also using `org-odd-levels-only'. If you are using
+ only odd levels (i.e. 1 or 3 or 5... stars), LEVEL=2 will
+ now refer to 3 stars, LEVEL=3 to 5 stars etc. Many thanks
+ to Leo (or blame on him if you must) who has convinced me
+ that this is the better convention.
+
+** Details
+
+*** Orgstruct minor mode
+
+ There is a new minor mode, orgstruct-mode. This modes works
+ in a similar way as Orgtbl-mode. It can be used to export
+ the Org-mode structure-editing commands into arbitrary major
+ modes in Emacs. For example, you can use it in Mail-mode to
+ easily create lists.
+
+ The functionality in Orgstruct mode is only active, if the
+ cursor is in a line that looks either like a headline, or
+ like the first line of a plain list item. Then the commands
+ `TAB', `M-cursor', `M-S-cursor', `M-RET', `M-S-RET', `C-c ^',
+ `C-c C-c', and `C-c -' will do structure-related editing just
+ like in Org-mode. If the cursor is not in such a line, all
+ these keys will do whatever the major mode or other active
+ minor modes have assigned to them.
+
+ Orgstruct-mode is the result of a proposal by Raman, quite
+ some time ago. It has taken a long time, but here is finally
+ the promised implementation.
+
+*** Drawers
+
+ The new concept of /drawers/ allows to create sections
+ that remain folded during visibility cycling. Drawers need
+ to be configured using the variable `org-drawers'. A drawer
+ starts with a line containing only the name of the drawer
+ bracketed by colons. It ends with :END:. For example,
+ after setting
+
+ : (setq org-drawers '("PROPERTIES" "HIDDEN"))
+
+ you can then create drawers like this:
+
+ : :HIDDEN:
+ : here is some stuff that remains hidden
+ : unless TAB is pressed directly in that line
+ : :END:
+
+ The PROPERTIES drawer has special meaning for ORG-mode, it
+ contains properties of an entry (see below).
+
+*** Properties and Column View
+
+ - Entries in Org-mode can now have arbitrary /properties/
+ associated with them. Org-mode handles some default
+ properties like the TODO state, the priority, the local
+ tags, and planning information like DEADLINE and SCHEDULED.
+ In addition, you can assign arbitrary properties by creating
+ a property drawer and inserting a line like
+
+ : :PROPNAME: This is the value of the property
+
+ Org-mode has an API for properties, if you want to write a
+ program using properties, use the functions
+ `org-entry-properties', `org-entry-get', `org-entry-put',
+ and `org-entry-delete'.
+
+ - Planning information like DEADLINE can be hidden in the
+ properties drawer.
+
+ If the PROPERTIES drawer starts in the first line after a
+ headline, also the DEADLINE, SCHEDULED and CLOCK information
+ will be inserted inside the drawer. If no PROPERTIES drawer
+ is present, or if it does not start in the line right after
+ the headline, this information remains in the lines directly
+ after the headline, outside the drawer.
+
+ - TAGS searches can now also query properties. For example,
+ the search
+
+ : LEVEL=3+BOSS+ASSIGNED="Hans"/WAITING
+
+ will find entries that
+ - are level 3
+ - have the tag BOSS
+ - have an ASSIGNED property with the value "Hans"
+ - are TODO status WAITING.
+
+ So here is an entry that will match:
+
+ : *** WAITING Clean up the factory :BOSS:
+ : :PROPERTIES:
+ : :ASSIGNED: Hans
+ : :END:
+
+ You may also use a regular expression to match against a
+ property value. For example, to find stuff assigned to Hans
+ or Sarah, use
+
+ : ASSIGNED={^\(Hans\|Sarah\)$}
+
+ - Column View is a special way to look at property values in
+ tabular form. Column View can be used in any org-mode
+ file, and also in any agenda buffer. It works by placing
+ an overlay over each headline (or agenda line) that shows a
+ table of selected properties. You can look at and edit
+ properties from this view. Which properties are shown in
+ the table must be set up using the COLUMNS property. You
+ can set up different property columns on different levels
+ of an outline tree. For example:
+
+ : * People
+ : :PROPERTIES:
+ : :COLUMNS: %25ITEM %Name
+ : :END:
+ : ** Family
+ : :PROPERTIES:
+ : :COLUMNS: %25ITEM %Name %3Age
+ : :END:
+ : *** Sam
+ : Info about Sam, including a property list with Name and Age.
+ : *** Sarah
+ : Info about Sarah, including a property list with Name and Age.
+ : ** Office
+ : :PROPERTIES:
+ : :COLUMNS: %25ITEM %Name %Function %Salary
+ : :END:
+ : *** Boss
+ : Info about the Boss, including a property list with Name,
+ : Function and Salary (if only we knew....).
+
+ Now we have defined three different sets of columns. If
+ you switch to column view in the /Family/ section, you
+ will get a different table than if you do it in the
+ /Office/ section. However, if you switch to column
+ view with the cursor on the /People/ section, the
+ table will cover all entries, but contain only the
+ /Name/.
+
+ Column view does, for the time being, only work on Emacs.
+ The XEmacs implementation needs a bit of work.
+
+ - Properties can be used in table formulas. To access the
+ value of the property :XYZ:, use $PROP_XYZ. The property
+ needs to be defined in the hierarchy above the table, not
+ necessarily in the same entry as the table. This was a
+ request by Eddward. File-wide constants can be defined with
+ #+CONSTANTS, see below.
+
+ - Things that still need to be sorted out about drawers,
+ properties and column view - comments and suggestions
+ welcome!
+
+ + How to deal with drawers and properties in HTML and ASCII
+ export?
+ + What key could be used to insert an empty property drawer
+ into an entry?
+ + Right now column view is invoked through the command C-c
+ C-x C-c. It is too easy to type C-x C-c by mistake, and
+ that causes Emacs to quit. Suggestions for a different
+ key?
+ + Fontification of drawers and properties is not good yet.
+ Any suggestions for better defaults?
+ + Mouse support for editing properties in column view would
+ be nice - maybe Piotr is interested to add this to
+ org-mouse.el?
+
+*** Spreadsheet
+
+ - In the spreadsheet, the evaluation of formulas has changed.
+ Previously, first the column formulas would be evaluated
+ everywhere, and then the field formulas would kick in, and
+ in some cases overwrite the results of column formulas in
+ the appropriate fields. This had the side effect that some
+ formulas might always use the wrong, intermediate content of
+ a field that is computed both by a column and a field
+ formula.
+
+ From now on, column formulas will no longer temporarily
+ overwrite field formulas. This gives much more consistent
+ results. For example you can now finally have a column of
+ increasing numbers by setting the first field to a fixed
+ number, and let the rest follow from a column formula.
+
+ Here is an example
+
+ : | 1 |
+ : | 2 |
+ : | 3 |
+ : #+TBLFM: $1=@-1+1::@1$1=1
+
+ - Constants for formulas in spreadsheets are globally defined
+ with the variable `org-table-formula-constants'. File-local
+ constants can now be set with a line like:
+
+ : #+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6
+
+*** Minor changes
+
+ - When entries are archived, a timestamp for the moment of
+ archiving is added to the line with planning information.
+ It looks like this:
+
+ : ARCHIVED: [2007-07-02 Mon 11:34]
+
+ Thanks to J. David Boyd for constructive comments.
+
+ - Bug fixes
+
+ Many bugs are fixed, as usually all the ones where I replied
+ "fixed" on emacs-orgmode. If you reported one of these
+ bugs, please check if it really has disappeared in the new
+ version, and complain if not. Thanks!
+
+
+* Version 4.79
+
+** Details
+
+ - We are back to a single file org.el that works both on Emacs
+ and on XEmacs. Merging comes at a speed penalty for you as
+ an XEmacs user, but *only if you do not compile* org.el.
+ Compilation completely removes the penalty.
+
+ - New L flag for literal interpolation in Lisp formulas.
+ See manual section 3.5.3.
+
+ - New options for turning off footnotes.
+ This was a request from Ignotus.
+ See the option `org-export-with-footnotes'.
+
+ - Default length for Agenda entries, but this is off by
+ default. This was a request from Micheal.
+ See the option `org-agenda-default-appointment-duration'.
+
+ - Bug fixes:
+
+ + org-agenda-date-later (Juraj Kubelka)
+ + letters off margin in orgcard.ps (Charles Cave)
+ + TODO export problems on XEmacs (ignotus@freemail.hu)
+ + args-out-of-range with table formulas (Cecil Westerhof)
+ + problem with org-file without a heading (Tim O'Callaghan)
+
+* Version 4.78
+
+** Overview
+
+ - Time stamps with a time range *included*, like
+ : <2007-06-18 Mon 17:33-18:23>
+
+ - Clock times without clocking in/out: CLOCK: => 2:00
+
+ - Language-specific characters allowed in TAGS (Emacs only).
+
+ - Promotion and demotion of items gets the indentation right.
+
+ - Indenting lines with TAB is more intelligent.
+
+** Incompatible changes
+
+ - There is now a special version of `org.el' for XEmacs.
+ Before installation, as an XEmacs user you must rename the
+ file org_xemacs.el to org.el, i.e. you must overwrite org.el
+ with the xemacs version. For example:
+
+ : mv org_xemacs.el org.el
+
+ This is necessary so that I can make use of some features
+ that would be cumbersome to support in a single file. The
+ XEmacs version is derived from the Emacs version with a
+ program, so no reason to fear that I might be dropping
+ XEmacs support any time soon. Sorry for the trouble.
+
+** Details
+
+ - A time stamp may now contain a range of times. So you no
+ longer need to use two separate stamps to indicate a time
+ interval on a single day. For example
+
+ : <2007-06-18 Mon 17:30-18:20>
+
+ This is now fully supported, including changing the time
+ with S-up/down while the cursor is on the end time. Also,
+ da the date/time prompt, you can simply write your time like
+ 12:00-14:00 and the range will be inserted.
+
+ This was proposed by Leo some time ago, and recently by
+ Michael.
+
+ - You may specify clocking times by hand (i.e. without
+ clocking in and out) using this syntax.
+
+ : CLOCK: => 2:00
+
+ Thanks to Scott Jaderholm for this proposal.
+
+ - TAGS may now contain language-specific word characters, as
+ long as they are matched by the "[:alnum:]" regexp syntax.
+ This is for Emacs only, the XEmacs version continues to use
+ the character class "a-zA-Z0-9_@" for tag names. Thanks to
+ David Smith for a patch to this effect (a modified version
+ of that patch was applied). I am considering to make the
+ same change for TODO keywords, but not yet. Note that files
+ using localization features may not work correctly in the
+ Emacs configuration of another user, so if you are sharing
+ org-mode files with other users, it might still be best to
+ stick to the ASCII characters.
+
+ - Promotion and demotion of plain list items (commands M-left,
+ M-right) no longer changes the indentation by just one
+ space. Instead, it uses intelligence gathered from the
+ surrounding list structure to do the right thing. Thanks to
+ William Henney for starting the discussion about this.
+
+ - TAB does now a better job of indenting lines.
+
+ + After tables and code segments (lines starting with ":"),
+ indentation goes back to what it was before (thanks to
+ William Henney for suggesting this behavior).
+
+ + When plain lists items are involved, we had a long
+ discussion on emacs-orgmode where I tried to show that a
+ too-sophisticated implementation will still be easily
+ fooled. Here is what I have implemented now - lets see
+ if we can agree on this:
+
+ Indentation will flatten lists with the same bullet type,
+ but indent another bullet type further. The time when
+ this fails is in a nested list, when you want to get back
+ out to a previous level. For example
+
+ : - item 1
+ : - item 2
+ : + item 2a
+ : + item 2b
+ : - item 3
+
+ When using TAB on every line in this list, the structure
+ will change to
+
+ : - item 1
+ : - item 2
+ : + item 2a
+ : + item 2b
+ : - item 3
+
+ So you need to change the level of the last line by hand,
+ using promotion and demotion functions.
+
+* Version 4.77
+
+** Overview
+
+ - Vertical lines in exported tables.
+ - New default for `org-show-following-heading'.
+
+** Incompatible changes
+
+ - The default for `org-show-following-heading' is now nil.
+
+** Details
+
+ - You can now specify column groups in tables, to the effect
+ that the groups will be separated by vertical lines in HTML
+ and ASCII output. Column groups are specified by the
+ characters "<" and ">" in a special table row. "<" starts a
+ group, ">" ends a group (in each case including the the
+ column where the character is specified). You may also use
+ "<>" to make a group a single column wide. For example:
+
+: | | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N) |
+: |---+----+-----+-----+-----+---------+------------|
+: | / | <> | < | | > | < | > |
+: | # | 1 | 1 | 1 | 1 | 1 | 1 |
+: | # | 2 | 4 | 8 | 16 | 1.4142 | 1.1892 |
+: | # | 3 | 9 | 27 | 81 | 1.7321 | 1.3161 |
+: #+TBLFM: $3=$2^2::$4=$2^3::$5=$2^4::$6=sqrt($2)::$7=sqrt(sqrt(($2))
+
+ A table row with with nothing but "/" in the first field is
+ never exported, but can be used to place column group
+ information into the table. In this table, we create a
+ group for column 2, one for columns 3-5 and one for columns
+ 6-7. HTML export will render a vertical line between these
+ groups.
+
+ Because HTML does not require closing <colgroup> tags with
+ </colgroup>), you can also simply start a new column
+ wherever you want a vertical line:
+
+: | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N0 |
+: |---+-----+-----+-----+---------+------------|
+: | / | < | < | | < | |
+
+ - Vertical lines are now also omitted in ASCII export, unless
+ grouping explicitly requests these lines.
+
+ - The default for `org-show-following-heading' is now nil,
+ meaning that sparse trees will be more compact. This has
+ become possible due to in important remark by Jason Dunsmore
+ who pointed out that TAB should behave differently in the
+ inconsistent trees produced by the sparse tree commands.
+ TAB does now make sure that the heading after a freshly
+ unfolded tree is made visible at all, removing the confusing
+ behavior we had before.
+
+ - Several bugs fixed. In particular:
+
+ + Strings produced by agenda batch processing with
+ `org-batch-agenda' and `org-batch-agenda-csv' are now
+ properly encoded, so that you should be able to use
+ special characters in other languages as along as your
+ post-processing program handles them correctly. At least
+ for Emacs this should work now, but have not yet figured
+ out how to do this in XEmacs.
+
+* Version 4.76
+
+** Overview
+
+ - Exporting Footnotes to HTML
+
+** Details
+
+ - Footnotes like[1] are now exported to HTML
+
+ [1]This is a footnote
+
+ Thanks to Scott Jaderholm for this proposal and a detailed
+ HTML example on how the exported text should look like.
+
+ - Special version of the reference card, for letter paper.
+
+ - Switching to OVERVIEW with S-TAB no loner moves the cursor,
+ so after three `S-TAB' commands, you will be back where you
+ started.
+
+ - Bug fixes, lots of them again.
+
+* Version 4.75
+
+** Overview
+
+ - Cyclic time stamps that repeat after an interval.
+ - Special timestamps for appointments like "every 2nd Thursday
+ in a month".
+ - Completion of link abbreviation prefixes inside `C-c C-l'.
+ - Replacing a region of org-mode syntax with HTML.
+ - iCalendar export now honors ARCHIVE etc.
+ - New command to add/change emphasis markers.
+
+** Incompatible Changes
+
+ - The REPEAT(...) cookie is no longer supported, the repeater
+ interval now goes directly into the time stamp.
+
+** Details
+
+ - Time stamps can contain a repeater code, like +1w for once
+ every week, +2d for every two days, etc. For example,
+
+ <2007-05-16 Wed 12:30 +1w>
+
+ will apply to every Wednesday, starting from the date given.
+ I believe this syntax was actually suggested by someone on
+ the mailing list, but I cannot find the email back. To
+ collect your credit, let me know!
+
+ - You can use an sexp diary entry (with the syntax used by the
+ Emacs calendar/diary) in a time stamp, like this:
+
+ *** The nerd club meets on 2nd Thursday of every month
+ <%%(diary-float t 4 2)>
+
+ - You can put diary-style sexp entries directly into an
+ org-mode file, where they will be interpreted just like they
+ would in the diary. For example
+
+ * Birthdays and similar stuff
+ #+CATEGORY: Holiday
+ %%(org-calendar-holiday) ; special function for holiday names
+ #+CATEGORY: Ann
+ %%(diary-anniversary 14 5 1956) Artur Dent %d is years old
+ %%(diary-anniversary 2 10 1869) Mahatma Gandhi
+
+ These entries must start at column 0 to be evaluated.
+
+ It turns out that evaluating the entries in an org-mode file
+ is actually faster than in the diary itself, because using
+ the diary has some overhead (creating fancy diary display,
+ then reading and re-interpreting the entries). I have moved
+ all the sexp entries from my diary into an org-mode file,
+ put in a few categories, and then turned off
+ `org-agenda-include-diary'. This has led to a noticeably
+ faster agenda display.
+
+ - New command `org-replace-region-by-html' that converts the
+ current region from org-mode syntax into HTML. For example,
+ you might write an itemized list in plain text in an HTML
+ buffer, and then invoke this command to convert it. Thanks
+ to Raman for this idea.
+
+ - When inserting a link with `C-c C-l', completion will now
+ fill in all valid link prefixes, like http or ftp, but also
+ link abbreviation prefixes. This is based on an idea by
+ Bastien.
+
+ - Highest, lowest, and default priority can be set on a
+ per-file basis with #+PRIORITIES: H L D
+ For example, to use priorities from 1 to 9, you could use
+
+ #+PRIORITIES: 1 9 9
+
+ Thanks to Dmitri Minaev for a patch to this effect.
+
+ - iCalendar export now honors (i.e. skips) subtrees marked as
+ ARCHIVE, COMMENT, or QUOTE.
+
+ - There is a new command to add or change the emphasis (like
+ bold or italic) of a piece of text. For lack of better
+ available keys the command is at `C-c C-x C-f', but you may
+ well want to choose a more convenient key like `C-c f' in
+ your private setup:
+
+ (add-hook 'org-load-hook
+ (lambda () (define-key org-mode-map "\C-cf" 'org-emphasize)))
+
+ The command will prompt for an emphasis type, and you may
+ reply either with the marker that triggers the emphasis, or
+ with the first letter of the corresponding HTML tag. For
+ example, to select italic, press either "/" or "i".
+
+ If there is an active region, the emphasis of this region
+ will be set or changed. If there is no region, only the
+ emphasis markers will be inserted and the cursor positioned
+ between them. Thanks to Bastien for proposing this feature.
+
+ - Bug fixes, everything where I have replied "fixed" on the
+ mailing list. Thanks to all of you for keeping these reports
+ coming.
+
+* Version 4.74
+
+** Overview
+
+ This release is about exporting agenda views, to HTML, to
+ postscript for printing, and to a special format (CSV) for
+ further processing in scripts.
+
+** Incompatible Changes
+
+ - The variable `org-agenda-remove-tags-when-in-prefix' has
+ been renamed to `org-agenda-remove-tags'.
+
+** Details
+
+ - Agenda views can be exported as plain text, as HTML, and as
+ Postscript(R). This can simply be done from the agenda
+ buffer with `C-x C-w' and then specifying a filename like
+ `myagenda.html' or `myagenda.ps'. See section 8.6.4 of the
+ manual.
+
+ - Each custom agenda view can specify a list of associated
+ files names. The command `C-c a e' then creates all views
+ that have associated file names and exports the views to
+ these files. This is great for producing paper versions of
+ your views, to take with you when you don't have your
+ computer. The manual has an example on how to do this, and
+ in particular on how to customize the format of the printed
+ version. See section 8.6.4 of the manual.
+
+ - You can produce a CSV format of agenda information with an
+ Emacs batch command. This is greate for further processing
+ in scipts. Thanks to Jason F. McBrayer for this idea.
+ See section 8.6.5 of the manual.
+
+ - New variable `org-agenda-skip-deadline-if-done'. When set,
+ a deadline associated with a DONE item will not be shown in
+ the agenda. This is based upon a report by Denis Bueno.
+
+ - Quite a few bug fixes.
+
+* Version 4.73
+
+ Minor bug fixes.
+
+* Version 4.72
+
+** Overview
+
+ - Control over blank lines between trees in collapsed view.
+
+ - Info about the running clock is shown in the modeline.
+
+ - C-a can behave specially in headlines.
+
+ - Better color and scaling defaults for LaTeX fragments.
+
+ - Customizable list of keys in org-mode to be replaced.
+
+ - Stuck project descriptions have been extended.
+
+ - Emphasis code has been modified to fix some issues.
+
+ - Bug fixes.
+
+** Incompatible changes
+
+ - The option `org-format-latex-options' has changed. If you
+ have customized it, please revert to default and then redo
+ your customization.
+
+ - `org-CUA-compatible' no longer modifies S-RET by default,
+ because newer versions of CUA don't use this key anymore.
+ If you need this replacement, customize the variable
+ `org-disputed-keys'.
+
+ - The variable `org-CUA-compatible' is obsolete, please use
+ `org-replace-disputed-keys' instead. `org-CUA-compatible'
+ is still an alias for this new variable, though.
+
+** Details
+
+ - Better control over blank lines between trees in collapsed
+ view. This has come up several times in the past and most
+ recently by Scott Jaderholm. There is now a new variable
+ `org-cycle-separator-lines' with default value 2. It says
+ how many empty lines there need to be after the end of a
+ subtree to get an empty line in collapsed view. So with the
+ default, if you leave only one empty line it will disappear
+ in collapsed view. If you leave two, one empty line will
+ remain so that you can use double empty lines to structure
+ the collapsed views of a file. I love it, so many thanks to
+ Scott fro bringing this up again.
+
+ One property of the new setup is that you will never get
+ more than one blank line in collapsed view. We could do
+ something special to allow *several* empty lines in
+ collapsed view, but I think this is counter-productive.
+
+ In Emacs 22, if you want to make full use of this, make sure
+ that you have not set `outline-blank-line'.
+
+ - When the clock is running, Org-mode will put info about it
+ into the modeline. The info consists of the elapsed time
+ and the heading of the clocked item. This was a proposal
+ from Bastien who got the idea from Muse.
+
+ - C-a can behave specially in headlines when you set the
+ variable `org-special-ctrl-a'. It will bring the cursor
+ first back only to the beginning of the headline *text*,
+ i.e. after the stars and the TODO keyword, if any. A second
+ C-a will then move the cursor to the beginning of the line.
+ If the cursor is already at the beginning of the line, C-a
+ will spring *forward* to the headline text. This was a
+ proposal from Leo, based on a request from Scott Jaderholm.
+
+ I have not turned this turned this on by default, should I?
+
+ - When LaTeX fragments are processed into images, there is now
+ more control and (hopefully) betters defaults for colors and
+ scaling. Special values can be set for HTML export, so that
+ these values can differ from what is used for display in an
+ emacs buffer. The default foreground and background colors
+ for images embedded in emacs are now taken from the default
+ emacs face. Thanks to Xiao-Yong Jin for proposing these
+ changes.
+
+ - There is now a much better mechanism to change some keys in
+ org-mode if these keys clash with other modes you use. Turn
+ this on by setting `org-replace-disputed-keys' (aliased to
+ `org-CUA-compatible'). The list of keys to replace is now
+ fully customizable, see the option `org-disputed-keys'.
+ Many thanks to Meciej Katafiasz for a patch implementing
+ this.
+
+ - Stuck project descriptions have been extended. You can now
+ use "*" as a TODO keyword or tag to say that *any* TODO
+ keyword or TAG marks a project as non-stuck. You also can
+ give an arbitrary regular expression that, if it matches,
+ indicates a non-stuck project.
+
+ - The code for emphasis like bold, italic etc has been
+ modified - I might have broken something in the process,
+ please let me know if you find problems.
+
+ - A number of bugs have been fixed - those where I have
+ replied "Fixed" on the mailing list.
+
+* Version 4.71
+
+** Overview
+
+** Incompatible changes
+
+** Details
+
+ - New variables to customize the header and data tags in
+ exported HTML. These are the variables
+ `org-export-table-header-tags' and
+ `org-export-table-data-tags'. This follows a request from
+ Scott Otterson.
+
+ - New option `org-format-latex-header' for customizing the
+ header of the LaTeX file used to convert embedded LaTeX to
+ images. Thanks to `Matthieu Lemerre' for the suggestion.
+
+ - The prefix version of `org-todo-list' works again. This
+ means that `C-1 C-c a t' produces the list of TODO entries
+ for the first TODO keyword. If you use different TODO setups
+ in different agenda files, be careful: This number now
+ refers to the list of *all* todo keywords used in files
+ that are scanned for the agenda.
+
+ - Many bug fixes.
+
+* Version 4.70
+
+** Overview
+
+ - Dust settles after revamp of TODO keyword system.
+ - The export title can be taken from the first text line.
+ - TTY replacement keys have changed.
+
+** Incompatible changes
+
+ - Some TTY replacement keys are changed, see below.
+
+** Details
+
+ - Further development concerning TODO keywords.
+
+ + You can now have several DONE states in a sequence, like
+
+ #+SEQ_TODO: TODO VERIFY | DONE DELEGATED
+
+ The difference to the proposal discussed on the mailing
+ list (and which is also works!)
+
+ #+SEQ_TODO: TODO VERIFY | DONE
+ #+SEQ_TODO: | CANCELED
+
+ is that in the first case, the extra DONE states will be
+ reached with `C-c C-t' (or with `t' from the agenda), while
+ in the second case you need S-<right> to get to the special
+ states. I guess both ideas can be useful - I am leaning
+ toward using the latter.
+
+ + Setting up TODO keywords in Lisp previously used two
+ separate variables: `org-todo-keywords' and
+ `org-todo-interpretation'. The preferred way is now to use
+ only `org-todo-keywords', with a new structure:
+
+ (setq org-todo-keywords
+ '((sequence "TODO" "|" "DONE")
+ (sequence "BUG" "KNOWNCAUSE" "|" "FIXED" "IGNORED")
+ (type "Fred" "Lisa" "Peter" "|" "DONE")
+ (sequence "CANCELED") ; for things we decide to not do.
+ ))
+
+ If your setting has this new structure,
+ `org-todo-interpretation' will be ignored. This change
+ does not break backward compatibility. The old way of
+ using a flat list in `org-todo-keywords' and taking the
+ interpretation from the other variable still works.
+
+ + When listing *specific* TODO entries via a sparse tree
+ (`C-u C-c C-v') or via the agenda (`C-c a T' or `C-u C-c a
+ t'), you can now specify several keywords to be selected,
+ like "TODO|VERIFY|WAITING". This also works for custom
+ agenda commands. Thanks to Jason F. McBrayer for pointing
+ out this omission.
+
+ - If you have configured Org-mode to export also the text
+ before the first headline (this is done by setting the
+ variable `org-export-skip-text-before-1st-heading' to nil),
+ then the first normal text line in the buffer becomes the
+ title of the exported document. A title set with #+TITLE
+ overules this default, and the first line then belongs to the
+ normal text. Thanks to David House for this proposal.
+
+ - TTY replacement keys. Some of the key bindings used by
+ Org-mode do not work on a tty, so replacement key sequences
+ are provided on ttys. In version 4.70, there are some
+ changes in the tty replacements. Thanks to Jason F. McBrayer
+ for coming up with the idea to use C-c <cursor> keys.
+
+ | Command | | Old TTY | New TTY |
+ | org-..... | Main Key | Replacement | Replacement |
+ |-------------------+-----------+---------------+---------------|
+ | shiftleft | S-left | C-c C-x left | C-c left |
+ | shiftright | S-right | C-c C-x right | C-c right |
+ | shiftup | S-up | C-c C-x up | C-c up |
+ | shiftdown | S-down | C-c C-x down | C-c down |
+ | shiftcontrolleft | C-S-left | | C-c C-x left |
+ | shiftcontrolright | C-s-right | | C-c C-x right |
+
+
+* Version 4.69
+
+** Overview
+
+ This time the changes affect the following areas:
+
+ - TODO keywords: Multiple sequences in a single file.
+ - Export: More control over text before the first heading.
+ - Export: More control over sub/superscript interpretation.
+ - Plain lists: Option to let empty lines terminate lists.
+ - Tables: New command to insert hline and move into line below.
+ - REPEATing items: Turn of note taking.
+ - Bug fixes.
+
+** Incompatible changes
+
+ - It used to be possible to spread the list of TODO keywords
+ over several lines, like
+
+ #+SEQ_TODO: TODO
+ #+SEQ_TODO: PROGRESS
+ #+SEQ_TODO: DONE
+
+ This is no longer possible. Each such line now specifies an
+ independent set of TODO keywords, with its own DONE state.
+ See below for details.
+
+ - The #+TEXT construct has been used to insert unchanged HTML
+ into an exported file. This is no longer possible, the TEXT
+ lines will be processed like any other lines. However,
+ there are now much better ways of getting quoted HTML into
+ the exported file.
+
+** Details
+
+ - You can now use multiple sets of TODO keywords in the same
+ buffer. For example, you may put the following three lines
+ into a file:
+
+ #+SEQ_TODO: TODO DONE
+ #+SEQ_TODO: REPORT BUG KNOWNCAUSE RESOLVED
+ #+TYP_TODO: Fred Laura Peter Me OK
+
+ Each sub-sequence has its own DONE state. It is best to use
+ different keywords in all sequences, to make sure Org-mode
+ does not loose track in which specific sequence it is
+ working. You could use the same word for all DONE states,
+ but then cycling through to a TODO state might not bring you
+ where you want to be.
+
+ After initially setting a keyword, `C-c C-t' cycles through
+ a sublist, i.e. is cycles from TODO to DONE or from
+ KNOWNCAUSE to RESOLVED and further to (nothing) and back to
+ REPORT.
+
+ S-right and S-left allow to select any keyword, so they move
+ from DONE to REPORT and from RESOLVED to Fred.
+
+ C-S-right and C-S-left jump from one sub-sequence to the
+ next, for example from TODO or DONE to REPORT to Fred.
+
+ Thanks to Rick Moynihan for triggering this development.
+
+ - Text before the first headline can now be exported if you
+ configure Org-mode accordingly. Either set the variable
+ `org-export-skip-text-before-1st-heading' to nil, or use the
+ new in-buffer option
+
+ #+OPTION: skip:nil
+
+ - Export content specified via the #+TEXT construct is now
+ fully processed, i.e. links, emphasis etc. are all
+ interpreted. #+TEXT lines may include
+ #+BEGIN_HTML...#+END_HTML sections to embed literal HTML.
+
+ - During HTML export, you can request to have a_{b}
+ interpreted as a subscript, but to leave a_b as it is. This
+ can be done by setting the variable
+ org-export-sub-superscript to the symbol `{}' with
+
+ (setq org-export-sub-superscript '{})
+
+ or by using
+
+ #+OPTIONS: ^:{}
+
+ Thanks to Eddward DeVilla for this idea.
+
+ - New variable `org-empty-line-terminates-plain-lists'.
+ Default is nil, meaning that empty lines are part of the
+ previous list item, and that you can have several paragraphs
+ in one such item. Set this to t if you want an empty line
+ terminate all levels of plain list items.
+
+ Thanks to Mike Newman for triggering this development.
+
+ - C-c RET does insert a horizontal separator line and move the
+ cursor into the table line below it. Thanks to Bastien for
+ this proposal.
+
+ - Org-mode always offers you to record a note when a TODO item
+ automatically repeats, even if you are not logging state
+ changes. The new variable `org-log-repeat' allows to turn
+ this off, so that notes are really only been taken if you
+ are logging all state changes.
+
+ - Various Bug fixes, thanks to everyone who reported.
+
+* Version 4.68
+
+** Overview
+ - Priority handling in the tags view
+ - Date/time prompt follows the popup calender, and accepts AM/PM times.
+ - Standard references like B4 in the spreadsheet.
+ - Improvements to the formula editor.
+ - C-j does better indentation.
+ - Bug fixes
+
+** Details
+ - Priority handling in the tags view
+
+ + Agenda lists selected by tag are now sorted by priority.
+ Thanks to Andrew Korty for reporting this omission.
+
+ - Improvements to the date/time prompt.
+
+ + When you move (using S-cursor keys) the cursor in the pop-up
+ calendar window while responding to a date/time prompt, the
+ prompt is updated with the new default date (Emacs only).
+
+ + You can now enter AM/PM times at this prompt.
+
+ - Changes in the spreadsheet
+
+ + You can now also write B4 instead of @4$2 as a reference in
+ formulas. The column references without specified row can be
+ written as C& instead of $3. Such references make formulas
+ easier to read and are now the default way how references are
+ shown when you edit existing formulas. To get the old behavior
+ back (i.e. only @row$col references), set the variable
+ `org-table-use-standard-references' to nil.
+
+ Relative references like @-3$-2 or @II..III continue to use the
+ internal format.
+
+ - Changes in the formula editor (the one you get with "C-c '")
+
+ + The formulas are organized in a more logical way.
+
+ + There is now a menu with commands.
+
+ + When starting the formula editor with "C-c '", the cursor
+ immediately moves to the formula for the current field.
+
+ + With the cursor on a reference in the formula, you can use
+ S-cursor keys to change the field being referenced.
+
+ - C-j indents the following line correctly whe used in a headline
+ or in aplain list item. Thanks to Leo for this suggestion.
+
+ - Bug fixes
+
+ + Flyspell now knows about special org-mode commands.
+ Thanks to Vinod Valsalam for reporting this problem, and to
+ Andrew Korty for showing how to fix it.
+
+ + Most other bugs discussed recently on emacs-orgmode@gnu.org
+ should be fixed, except the problem with non-ASCII characters
+ in tags....
+
+* Version 4.67
+
+ - Expert mode for fast tag selection.
+ When org-fast-tag-selection-single-key is `expert', not even
+ the selection window is shown, only the prompt. One more C-c
+ gets you the window, another one goes to multiple selection mode.
+
+ - Synchronized with Emacs once more: Emacs CVS has now org-mode
+ 4.67. At least until it causes a problem, then the Emacs people
+ will switch back to 4.56. Lets hope there will be no problem.
+
+ - Code cleanup
+
+ - Bug fixes
+
+* Version 4.66
+
+** Overview
+
+ - Sorting of top-level entries works now if the region contains
+ top-level entries, or if the cursor is before the first headline.
+ Thanks to "redblue" for reporting this bug.
+
+ - When entering date and time at the prompt, you can now mix
+ entering text and selecting something in the calendar. For
+ example, enter 22:15 at the prompt without pressing RET, and then
+ click on a date in the calendar. Both pieces of information will
+ be included in the resulting time stamp. You can also use
+ S-curser to move the cursor in the calendar to the desired date
+ and then enter 22:15 and press RET at the prompt.
+
+ - When setting a deadline or a schedule, entering a time now
+ automatically selects the time stamp format that includes the
+ time. Bug report (by means of a question) from Bastre.
+
+ - C-c C-l can be used to convert a plain link into a bracket link.
+
+ - Internal links now match inside (the visible part of) other
+ links. Thanks to Scott Otterson for reporting this bug.
+
+ - iCalendar export of TODO items fixed, see also the variable
+ `org-icalendar-include-todo'. Thanks to Philipp Raschdorf.
+
+ - The number of levels in the table of contents of an exported
+ document can now be set independently of the number of headline
+ levels. For example:
+
+ #+OPTIONS: H:4 toc:2
+
+ - The command `C-c }' toggles the display of row and column numbers
+ the the current table, to aid constructing formulas. To try it,
+ move the cursor to a table and press `C-c }', or use the menu
+ entry.
+
+ - Orgtbl translation functions (introduced in 4.65) have been
+ simplified using a generic function `orgtbl-to-generic' that can
+ be used for very general languanges. Writing your own translator
+ should be very easy now. More info in the manual.
+
+ - CONTENTS visibility can be limited to a certain level. The
+ command `C-3 S-TAB' will switch to CONTENTS view and show the
+ first 3 levels.
+
+ - Bug fixes.
+
+* Version 4.65
+
+** Overview
+
+ - Orgtbl can be used to maintain tables in LaTeX, and in any other mode
+ - Editing Lisp formulas for tables improved.
+ - Better structure for HTML exported tables.
+ - New "calculation" marker "/" to mark lines that should not be exported.
+
+** Detailed description of changes
+
+ - You can use orgtbl mode to maintain a LaTeX table, or pretty much
+ any table in any mode.
+
+ This does *not* work by making Orgtbl aware of LaTeX syntax. That
+ would be a box of Pandora I am not willing to open. Instead, you
+ use a normal Orgtbl-mode table, and a converter program to
+ automatically place a LaTeX version of the table into the correct
+ spot in the LaTeX file. The orgtbl-mode table can be maintained
+ inside the same file, in a block comment.
+
+ I am providing translators for LaTeX, HTML, and TeXInfo. For
+ other applications, you need to write one yourself - but that is
+ not hard if you start from the LaTeX version and just modify it.
+ Thanks to Thomas Baumann for triggering this development through
+ a request for a table-to-LaTeX converter.
+
+ - In the special buffer to edit the formulas of a table (created
+ with "C-c '"), there is now better support for editing Lisp
+ formulas. TAB and M-TAB work like in an Emacs Lisp buffer,
+ indenting lines and completing lisp symbols. With the cursor on
+ a line defining a complex Lisp formula, a first press on TAB will
+ convert the formula into a pretty-printed version with proper
+ linebreaks and indentation. A second TAB folds the line back to
+ the compact form.
+
+ - Tables in HTML export have now additional structure elements
+ defined. The header (before the first hline) is wrapped into
+ <thead>..</thead>, and each part of the body (as separated in
+ org-mode by hlines) is wrapped into <tbody>..</tbody> tags. I
+ have also changed the CSS style for <td> fields and the value of
+ `org-export-html-table-tag' to get cleaner tables. Basically,
+ tables now have horizontal lines only where needed, and no
+ vertical lines at all, as generally recommended for tables in
+ printed text. I like the new look, but I am not sure if this
+ change will find general approval, please throw in your view if
+ you like. Thanks to Scott for driving this, and to goud-H for
+ pointing me to the row grouping in tables.
+
+ - In a table with calculation markers in the first column, you can
+ now also put "/" into the first column. It indicates that this
+ line should not be exported. The foremost application for this
+ are lines containing only "<N>" markers for narrowing columns.
+
+* Version 4.64
+
+** Overview
+
+ - Email links get better, configurable descriptions
+ - When inserting a link, selected text becomes the description
+ - Easier access to the list of stored links.
+ - Horizontal lines in HTML export.
+ - Remember templates and storing of notes improved.
+
+** Detailed description of changes
+
+ - The descriptive part of links to email messages can be configured
+ using the variable `org-email-link-description-format'. The new
+ default is "Email %c: %.30s" and leads to
+
+ Email from NAME: SUBJECT
+
+ If you configure the variable `org-from-is-user-regexp'
+ correctly, then for email you *sent* this will actually change to
+
+ Email to NAME: SUBJECT
+
+ The subject is limited to 30 characters. If you have become
+ attached to the previous default (look twice, the new one is
+ better), use "%f on: %s" as your format.
+
+ - Selecting text before entering a new link with C-c C-l now really
+ works, the selected text becomes the description part of the
+ link. Requested by Scott, buggy 4.62 implementation is now fixed.
+
+ - Stored links are part of the history list for C-c C-l, so to
+ reach them, you can use up/down rather than completion. Thanks
+ to Raman for this excellent idea.
+
+ - A line consisting only of "-", and at least 5 of them, is
+ exported into HTML as <hr/>, as proposed by Giovanni Ridolfi.
+
+ - Several changes to org <-> remember integration
+
+ - You can use `org-remember' as your default command to start
+ remember. It will automatically detect if there is an active
+ region and use it as initial content (we will probably make
+ remember.el work like this as well).
+ Also, when calling `org-remember' in a remember buffer that
+ was created with a template, you will again be asked to
+ select a template. The buffer is then re-created with the
+ new template, but the old context information. This is
+ useful if you change your mind about the template to use
+ (Leo's idea).
+
+ - Besides specifying a default *target* file for a note, you
+ can also give a default *heading* of which the note should
+ become a subitem. In many cases this avoids or speeds up
+ navigating to the right location. Both file and heading can
+ be different for each template. Both are non-binding, you
+ can change them while storing the note. However, when you
+ exit remember with C-u C-c C-c, these defaults will be used
+ without interaction.
+
+ - Templates can specify interactive fields. During expansion
+ of the template, you will be prompted for the information in
+ that field. For example %^t will pop up a calendar and ask
+ you to select a date. This new feature follows a proposal
+ from Leo, who in the mean time has said he does not need it
+ anymore. But I liked it, so here it is :-)
+
+ - Templates can access information specific to the link type
+ created, for example the author and subject of an email.
+ Syntax is %:fromname, %:fromaddress, %:subject etc, details
+ in the manual. Proposed by Peder O. Klingenberg.
+
+ - I have been considering to move, at some stage, the template
+ functionality into remember.el itself - which would of course
+ require consent of the remember.el maintainers. I am not
+ sure how well this would work though, since some things like
+ the interactive time stamps are org.el specific, so treating
+ them would require special hooks. Comments?
+
+* Version 4.63
+ - Bug fixes
+
+* Version 4.62
+ - Many changes to the spreadsheet functions in the table editor.
+ For details, please re-read the manual section 3.4.
+ + New Features
+ - It is much easier to assign formulas to individual fields.
+ - References to arbitrary fields and ranges.
+ - Absolute references are modified in row-editing commands.
+ - Formula editor that highlights referenced fields.
+ + Incompatible changes
+ - Empty fields are excluded in range references, see "E" mode flag.
+ - &... ranges no longer supported, use new @... ranges.
+ - Variable insertion into Lisp formulas work differently.
+ - Selected text becomes the default description for C-c C-l links.(Scott)
+ - The date format in the agenda/timeline views is now customizable.
+ See the new option `org-agenda-date-format'. (request by Victor)
+ - Link abbreviations no longer need a double colon, single colon is fine.
+ - Bug fixes.
+
+* Version 4.61
+ - Avoiding keybinding clashes with flyspell
+ - Archiving is now also on `C-C C-x C-s' (was just `C-c $')
+ - Cycling through agenda files is now also on "C-'" (was just "C-,")
+ - Colon is considered part of number, to align times in clock tables.
+ - Fixed bug for list of stuck projects.
+ - Fixed several bugs/problems concerning linking to gnus.
+ - Block agendas can contain the list of stuck projects.
+ - #+ARCHIVE may now appear several times in the buffer.
+ - More bug fixes.
+
+* Version 4.60
+ - HTML export: inlining images, clickable images (manual 10.2.4).
+ - Incremental search now shows proper context when exiting.
+ - Tables calculation and Calc package.
+ - Calc is no longer needed when using only elisp formulas.
+ - Proper error messages when calc is needed and not available.
+ - Tracking TODO state changes with time stamps and notes.
+ - Empty entries go full circle.
+ - Links in iCalendar export cleaned up.
+ - Bug fixes.
+
+
+* Version 4.59
+ - Cleanup code, bug fixes.
+
+* Version 4.58
+ - Full undo support in the agenda buffer.
+ - Listing stuck GTD projects (projects without any NEXT ACTIONS).
+ Configure `org-stuck-projects' before using it.
+ - C-c C-x b shows the current subtree in an indirect buffer, in
+ another, dedicated frame.
+ - Custom agenda commands take precedence over builtin commands.
+ - auto-fill for comments works on the Emacs side, XEmacs not yet.
+
+* Version 4.57
+ - Sorting of outline items on same level.
+ - Sorting tables automatically selects line range between hlines.
+ - Changes in Agenda buffer
+ - `C-c C-o' follows a link in the current line.
+ - `C-c $' archives the subtree corresponding to the line.
+ - Changing dates with S-left and S-right show new date in agenda,
+ but still do not move the entry to the new date.
+ - new option `org-agenda-skip-scheduled-if-done'.
+ - Agenda and sparse tree construction using tag matches can now
+ use regular expressions.
+ - When prompted for a date/time, entering "+7" indicates a date
+ 7 days from now - but only this is the only thing you give.
+ - Custom time formats also apply to exported html and ascii.
+ - Bug fixes.
+
+* Version 4.56
+ - `C-k' in agenda kills current line and corresponding subtree in file.
+ - XEmacs compatibility issues fixed, in particular tag alignment.
+ - M-left/right now in/outdents plain list items, no Shift needed.
+ - Bug fixes.
+
+* Version 4.55
+ - Bug fixes.
+
+* Version 4.54
+ - Improvements to fast tag selection
+ + show status also in target line.
+ + option to auto-exit after first change to tags list (see manual).
+ - Tags sparse trees now also respect the settings in
+ `org-show-hierarchy-above' and `org-show-following-heading'.
+ - Bug fixes.
+
+* Version 4.53
+ - Custom time formats can be overlayed over time stamps.
+ - New option `org-agenda-todo-ignore-deadlines'.
+ - Work-around for flyspell bug (CVS Emacs has this fixed in flyspell.el).
+ - Work-around for session.el problem with circular data structures.
+ - Bug fixes.
+
+* Version 4.52
+ - TAG matches can also specify conditions on TODO keywords.
+ - The fast tag interface allows setting tags that are not in the
+ predefined list.
+ - Bug fixes.
+
+* Version 4.51
+ - Link abbreviations (manual section 4.5).
+ - More control over how agenda is displayed. See the new variables
+ `org-agenda-window-setup', `org-agenda-restore-windows-after-quit'.
+ - Bug fixes.
+
+* Version 4.50
+ - Closing a TODO item can record an additional note.
+ See variables `org-log-done' and `org-log-note-headings'.
+ - Inserting headlines and bullets can leave an extra blank line.
+ See variable `org-blank-before-new-entry'. (Ed Hirgelt patch)
+ - [[bracket links]] in the agenda are active just as in org-mode buffers.
+ - C-c C-o on a date range displays the agenda for exactly this range.
+ - The default for `org-cycle-include-plain-lists' is back to nil.
+ - Calls to `org-occur' can be stacked by using a prefix argument.
+ - The options `org-show-hierarchy-above' and `org-show-following-heading'
+ now always default to `t', but can be customized differently for
+ different types of sparse trees or jump commands.
+ - Bug fixes.
+
+
+* Version 4.49
+ - Agenda views can be made in batch mode from the command line.
+ - `org-store-link' does the right thing in dired-mode.
+ - File links can contain environment variables.
+ - Full Emacs 21 compatibility has been restored.
+ - Bug fixes.
+
+* Version 4.47
+ - Custom commands may produce an agenda which contains several blocks,
+ each block created by a different agenda command.
+ - Agenda commands can be restricted to the current file, region, subtree.
+ - The timeline command must now be called through the agenda
+ dispatcher (C-c a L). `C-c C-r' no longer works.
+ - Agenda items can be sorted by tag. The *last* tag is used for this.
+ - The prefix and the sorting strategy for agenda items can depend
+ upon the agenda type.
+ - The handling of `mailto:' links can be customized, see the new
+ variable `org-link-mailto-program'.
+ - `mailto' links can specify a subject after a double colon,
+ like [[mailto:carsten@orgmode.org::Org-mode is buggy]].
+ - In the #+STARTUP line, M-TAB completes valid keywords.
+ - In the #+TAGS: line, M-TAB after ":" inserts all currently used tags.
+ - Again full Emacs 21 support: Checkboxes and publishing are fixed.
+ - More minor bug fixes.
+
+* Version 4.45
+ - Checkbox lists can show statistics about checked items.
+ - C-TAB will cycle the visibility of archived subtrees.
+ - Documentation about checkboxes has been moved to chapter 5.
+ - Bux fixes.
+
+* Version 4.44
+ - Clock table can be done for a limited time interval.
+ - Obsolete support for the old outline mode has been removed.
+ - Bug fixes and code cleaning.
+
+* Version 4.43
+ - Bug fixes
+ - `s' key in the agenda saves all org-mode buffers.
+
+* Version 4.41
+ - Shift-curser keys can modify inactive time stamps (inactive time
+ stamps are the ones in [...] brackets.
+ - Toggle all checkboxes in a region/below a headline.
+ - Bug fixes.
+
+* Version 4.40
+ - Bug fixes.
+
+
+* Version 4.39
+ - Special tag ARCHIVE keeps a subtree closed and away from agenda lists.
+ - LaTeX code in Org-mode files can be converted to images for HTML.
+ - Bug fixes.
+ - CDLaTeX-mode features can be used in Org-mode to help inserting
+ LaTeX environment and math.
+
+* Version 4.38
+ - noutline.el is now required (important for XEmacs users only).
+ - Dynamic blocks.
+ - Archiving of all level 1 trees without open TODO items.
+ - Clock reports can be inserted into the file in a special section.
+ - FAQ removed from the manual, now only on the web.
+ - Bug fixes.
+
+* Version 4.37
+ - Clock-feature for measuring time spent on specific items.
+ - Improved emphasizing allows configuration and stacking.
+
+* Version 4.36
+ - Improved indentation of ASCII export, when headlines become items.
+ - Handling of 12am and 12pm fixed. Times beyond 24:00 can be used
+ and will not lead to conflicts.
+ - Support for mutually exclusive TAGS with the fast tags interface.
+ - Bug fixes.
+
+* Version 4.35
+ - HTML export is now valid XHTML.
+ - Timeline can also show dates without entries. See new option
+ `org-timeline-show-empty-dates'.
+ - The bullets created by the ASCII exporter can now be configured.
+ See the new option `org-export-ascii-bullets'.
+ - New face `org-upcoming-deadline' (was `org-scheduled-previously').
+ - New function `org-context' to allow testing for local context.
+
+* Version 4.34
+ - Bug fixes.
+
+* Version 4.33
+ - New commands to move through plain lists: S-up and S-down.
+ - Bug fixes and documentation update.
+
+* Version 4.32
+ - Fast (single-key-per-tag) interface for setting TAGS.
+ - The list of legal tags can be configured globally and locally.
+ - Elisp and Info links (thanks to Todd Neal).
+ - `org-export-publishing-directory' can be an alist, with different
+ directories for different export types.
+ - All context-sensitive commands use `call-interactively' to dispatch.
+ - `org-confirm-shell-links' renamed to `org-confirm-shell-link-function'.
+ - Bug fixes.
+
+* Version 4.31
+ - Bug fixes.
+
+* Version 4.30
+ - Modified installation: Autoloads have been collected in org-install.el.
+ - Logging (org-log-done) is now a #+STARTUP option.
+ - Checkboxes in plain list items, following up on Frank Ruell's idea.
+ - File links inserted with C-c C-l will use relative paths if the linked
+ file is in the current directory or a subdirectory of it.
+ - New variable `org-link-file-path-type' to specify preference for
+ relative and absolute paths.
+ - New CSS classes for tags, timestamps, timestamp keywords.
+ - Bug and typo fixes.
+
+
+* Version 4.29
+ - Inlining images in HTML export now depends on wheather the link
+ contains a description or not.
+ - TODO items can be scheduled from the global TODO list using C-c C-s.
+ - TODO items already scheduled can be made to disappear from the global
+ todo list, see `org-agenda-todo-ignore-scheduled'.
+ - In Tables, formulas may also be Lisp forms.
+ - Exporting the visible part of an outline with `C-c C-x v' works now
+ for all available exporters.
+ - Bug fixes, lots of them :-(
+
+* Version 4.28
+ - Bug fixes.
+
+* Version 4.27
+ - HTML exporter generalized to receive external options.
+ As part of the process, author, email and date have been moved to the
+ end of the HTML file.
+ - Support for customizable file search in file links.
+ - BibTeX database links as first application of the above.
+ - New option `org-agenda-todo-list-sublevels' to turn off listing TODO
+ entries that are sublevels of another TODO entry.
+
+* Version 4.26
+ - Bug fixes.
+
+* Version 4.25
+ - Revision of the font-lock faces section, with better tty support.
+ - TODO keywords in Agenda buffer are fontified.
+ - Export converts links between .org files to links between .html files.
+ - Better support for bold/italic/underline emphasis.
+
+* Version 4.24
+ - Bug fixes.
+
+* Version 4.23
+ - Bug fixes.
+
+* Version 4.22
+ - Bug fixes.
+ - In agenda buffer, mouse-1 no longer follows link.
+ See `org-agenda-mouse-1-follows-link' and `org-mouse-1-follows-link'.
+
+* Version 4.20
+ - Links use now the [[link][description]] format by default.
+ When inserting links, the user is prompted for a description.
+ - If a link has a description, only the description is displayed
+ the link part is hidden. Use C-c C-l to edit the link part.
+ - TAGS are now bold, but in the same color as the headline.
+ - The width of a table column can be limited by using a field "<N>".
+ - New structure for the customization tree.
+ - Bug fixes.
+
+
+* Version 4.13
+ - The list of agenda files can be maintainted in an external file.
+ - Bug fixes.
+
+* Version 4.12
+ - Templates for remember buffer. Note that the remember setup changes.
+ To set up templates, see `org-remember-templates'.
+ - The time in new time stamps can be rounded, see new option
+ `org-time-stamp-rounding-minutes'.
+ - Bug fixes (there are *always* more bugs).
+
+[...]
+
+Version 4.00
+ - Headlines can contain TAGS, and Org-mode can produced a list
+ of matching headlines based on a TAG search expression.
+ - `org-agenda' has now become a dispatcher that will produce the agenda
+ and other views on org-mode data with an additional keypress.
+
+
+* Version 3.24
+ - Switching and item to DONE records a time stamp when the variable
+ `org-log-done' is turned on. Default is off.
+
+* Version 3.23
+ - M-RET makes new items as well as new headings.
+ - Various small bug fixes
+
+* Version 3.22
+ - CamelCase words link to other locations in the same file.
+ - File links accept search options, to link to specific locations.
+ - Plain list items can be folded with `org-cycle'. See new option
+ `org-cycle-include-plain-lists'.
+ - Sparse trees for specific TODO keywords through numeric prefix
+ argument to `C-c C-v'.
+ - Global TODO list, also for specific keywords.
+ - Matches in sparse trees are highlighted (highlights disappear with
+ next buffer change due to editing).
+
+* Version 3.21
+ - Improved CSS support for the HTML export. Thanks to Christian Egli.
+ - Editing support for hand-formatted lists
+ - M-S-cursor keys handle plain list items
+ - C-c C-c renumbers ordered plain lists
+
+* Version 3.20
+ - There is finally an option to make TAB jump over horizontal lines
+ in tables instead of creating a new line before that line.
+ The option is `org-table-tab-jumps-over-hlines', default nil.
+ - New command for sorting tables, on `C-c ^'.
+ - Changes to the HTML exporter
+ - hand-formatted lists are exported correctly, similar to
+ markdown lists. Nested lists are possible. See the docstring
+ of the variable `org-export-plain-list-max-depth'.
+ - cleaned up to produce valid HTML 4.0 (transitional).
+ - support for cascading style sheets.
+ - New command to cycle through all agenda files, on C-,
+ - C-c [ can now also be used to change the sequence of agenda files.
+
+
+* Version 3.19
+ - Bug fixes
+
+* Version 3.18
+ - Export of calendar information in the standard iCalendar format.
+ - Some bug fixes.
+
+* Version 3.17
+ - HTML export specifies character set depending on coding-system.
+
+* Version 3.16
+ - In tables, directly after the field motion commands like TAB and RET,
+ typing a character will blank the field. Can be turned off with
+ variable `org-table-auto-blank-field'.
+ - Inactive timestamps with `C-c !'. These do not trigger the agenda
+ and are not linked to the calendar.
+ - Additional key bindings to allow Org-mode to function on a tty emacs.
+ - `C-c C-h' prefix key replaced by `C-c C-x', and `C-c C-x C-h' replaced
+ by `C-c C-x b' (b=Browser). This was necessary to recover the
+ standard meaning of C-h after a prefix key (show prefix bindings).
+
+* Version 3.15
+ - QUOTE keyword at the beginning of an entry causes fixed-width export
+ of unmodified entry text. `C-c :' toggles this keyword.
+ - New face `org-special-keyword' which is used for COMMENT, QUOTE,
+ DEADLINE and SCHEDULED, and priority cookies. Default is only a weak
+ color, to reduce the amount of aggressive color in the buffer.
+
+* Version 3.14
+ - Formulas for individual fields in table.
+ - Automatic recalculation in calculating tables.
+ - Named fields and columns in tables.
+ - Fixed bug with calling `org-archive' several times in a row.
+
+* Version 3.13
+ - Efficiency improvements: Fewer table re-alignments needed.
+ - New special lines in tables, for defining names for individual cells.
+
+* Version 3.12
+ - Tables can store formulas (one per column) and compute fields.
+ Not quite like a full spreadsheet, but very powerful.
+ - table.el keybinding is now `C-c ~'.
+ - Numeric argument to org-cycle does `show-subtree' above on level ARG.
+ - Small changes to keys in agenda buffer. Affected keys:
+ [w] weekly view; [d] daily view; [D] toggle diary inclusion.
+ - Bug fixes.
+
+* Version 3.11
+ - Links inserted with C-c C-l are now by default enclosed in angle
+ brackets. See the new variable `org-link-format'.
+ - ">" terminates a link, this is a way to have several links in a line.
+ Both "<" and ">" are no longer allowed as characters in a link.
+ - Archiving of finished tasks.
+ - C-<up>/<down> bindings removed, to allow access to paragraph commands.
+ - Compatibility with CUA-mode (see variable `org-CUA-compatible').
+ - Compatibility problems with viper-mode fixed.
+ - Improved html export of tables.
+ - Various clean-up changes.
+
+* Version 3.10
+ - Using `define-derived-mode' to derive `org-mode' from `outline-mode'.
+
+
+* Version 3.09
+ - Time-of-day specifications in agenda are extracted and placed
+ into the prefix. Timed entries can be placed into a time grid for
+ day.
+
+* Version 3.08
+ - "|" no longer allowed as part of a link, to allow links in tables.
+ - The prefix of items in the agenda buffer can be configured.
+ - Cleanup.
+
+* Version 3.07
+ - Some folding inconsistencies removed.
+ - BBDB links to company-only entries.
+ - Bug fixes and global cleanup.
+
+* Version 3.06
+ - M-S-RET inserts a new TODO heading.
+ - New startup option `content'.
+ - Better visual response when TODO items in agenda change status.
+ - Window positioning after visibility state changes optimized and made
+ configurable. See `org-cycle-hook' and `org-occur-hook'.
+
+* Version 3.05
+ - Agenda entries from the diary are linked to the diary file, so
+ adding and editing diary entries can be done directly from the agenda.
+ - Many calendar/diary commands available directly from agenda.
+ - Field copying in tables with S-RET does increment.
+ - C-c C-x C-v extracts the visible part of the buffer for printing.
+ - Moving subtrees up and down preserves the whitespace at the tree end.
+
+* Version 3.04
+ - Table editor optimized to need fewer realignments, and to keep
+ table shape when typing in fields.
+ - A new minor mode, orgtbl-mode, introduces the Org-mode table editor
+ into arbitrary major modes.
+ - Fixed bug with realignment in XEmacs.
+ - Startup options can be set with special #+STARTUP line.
+ - Heading following a match in org-occur can be suppressed.
+
+* Version 3.03
+ - Copyright transfer to the FSF.
+ - Effect of C-u and C-u C-u in org-timeline swapped.
+ - Timeline now always contains today, and `.' jumps to it.
+ - Table editor:
+ - cut and paste of rectangular regions in tables
+ - command to convert org-mode table to table.el table and back
+ - command to treat several cells like a paragraph and fill it
+ - command to convert a buffer region to a table
+ - import/export tables as tab-separated files (exchange with Excel)
+ - Agenda:
+ - Sorting mechanism for agenda items rewritten from scratch.
+ - Sorting fully configurable.
+ - Entries specifying a time are sorted together.
+ - Completion also covers option keywords after `#-'.
+ - Bug fixes.
+
+* Version 3.01
+ - New reference card, thanks to Philip Rooke for creating it.
+ - Single file agenda renamed to "Timeline". It no longer shows
+ warnings about upcoming deadlines/overdue scheduled items.
+ That functionality is now limited to the (multifile) agenda.
+ - When reading a date, the calendar can be manipulated with keys.
+ - Link support for RMAIL and Wanderlust (from planner.el, untested).
+ - Minor bug fixes and documentation improvements.
+
+* Version 3.00
+ - Multifile Agenda shows current entries from many different files.
+ - TeXInfo documentation (thanks to Christian Egli for the conversion).
+ - Additional applications for TODO keywords, see documentation.
+ Different files may have different TODO keywords etc.
+ - Priorities for TODO items.
+ - The browser mode used by `org-remember-handler' is improved.
+ - Images get inlined in HTML export (thanks to Carsten Wimmer).
+ - File links can contain line numbers, like file:/usr/etc/config:255
+ - Minor bug fixes.
+
+
+* Version 2.10
+ - TODO entries can have additional states besides TODO and DONE.
+ See new variable `org-todo-keywords'.
+ - TODO keywords can be interpreted as categories. See variable
+ `org-todo-interpretation'.
+ - M-TAB completion on TODO keywords, TeX symbols, and normal words.
+ - All keywords (like TODO, DEADLINE etc) are configurable.
+ - Cursor positioning optimized after pro/demotion and TODO cycling.
+ - Emphasizing in HTML works now for *bold*, /italic/ and _underline_.
+ - New commands to kill, copy and yank entire subtrees. Yanking
+ modifies the level of the tree before insertion.
+ - New command `org-goto' (C-c C-j) to quickly move to other locations
+ in the buffer without affecting outline visibility.
+ - Hooks for John Wiegley's remember.el.
+ - `org-read-date' pops up calendar for date selection with the mouse.
+ See variable `org-popup-calendar-for-date-prompt'.
+
+* Version 2.6
+ - TODO items can be SCHEDULED to a certain date.
+ - Expired DEADLINEs are ignored if in an entry marked DONE.
+ - From the diary or time-sorted view (C-c C-r), C-c C-t can be used to
+ change the TODO state of an item remotely.
+ - Horizontal computations in table editor. See `org-table-eval-formula'.
+ - Fixed bug with summing tables (command `org-table-sum', `C-c +').
+ - Calendar window follows the timestamp when a timestamp is changed.
+ New variable `org-calendar-follow-timestamp-change'.
+ - Time-sorted view (`org-diary-view', C-c C-r) now uses the prefix
+ argument to force inclusion of unscheduled TODO items.
+ - New variable `org-confirm-shell-links' to turn of safety query.
+ - New variable `org-open-non-existing-files'.
+
+* Version 2.4
+ - A time-sorted view on all time stamps can be created with C-c C-r.
+ - Timestamps and Deadlines can be shown in the Emacs diary.
+ - Date ranges introduced.
+ - Time-string formats are no longer configurable.
+ - Vertical lines in tables can be made invisible with `C-c |'.
+ - New "link" type to execute shell commands, like "shell:ls *.org"
+ - Upon export, "myfile.org" becomes "myfile.html" or "myfile.txt",
+ instead of "myfile.org.html" or "myfile.org.txt".
+ - When the cursor is in the white space at the beginning of a line,
+ TAB removes the whitespace before indenting again.
+
+* Version 2.0
+ - Windows (NT/2000) support.
+ - Works with both Emacs and XEmacs.
+ - Fully automatic table editor.
+ - New link types into Gnus, VM and BBDB.
+ - Other link system changes
+ - Time stamps are treated as links to the calendar.
+ - Easy creation of links with global command `org-store-link'.
+ - Insertion of links with `C-c C-l' works differently now.
+ - Space characters allowed as part of a link.
+ - Options in `org-file-apps' extended. The command may now be
+ symbol 'emacs', or a lisp form.
+ Please re-read the manual section about links.
+ - Timestamp changes
+ - `org-deadline' now prompts for a date.
+ - A line can now contain several timestamps. Updating of a
+ timestamp only happens if the cursor is at the timestamp.
+ - Changed the time-stamp-format to ISO, to make sure it will
+ always work (non-English month names had caused problems
+ with `parse-time-string'.). Changing the time stamp format
+ is not recommended.
+ - Picture mode enhancements have been removed from org.el
+
+
+* Version 1.4
+ - Some option name changes, not backward compatible.
+ - ASCII exporter upgrade: Table of contents.
+ - HTML exporter upgrade: fixed-width regions, better
+ sub/superscripts, many TeX symbols supported.
+ - Calendar support.
+
+* Version 1.3
+ - HTML exporter upgrade, in particular table of contents
+
+
+
diff --git a/ORGWEBPAGE/Changes.txt b/ORGWEBPAGE/Changes.txt
new file mode 100644
index 0000000..067c8eb
--- /dev/null
+++ b/ORGWEBPAGE/Changes.txt
@@ -0,0 +1,3152 @@
+ Org-mode list of User-visible changes
+ =====================================
+
+Author: Carsten Dominik <carsten at orgmode dot org>
+Date: 2007/11/13 12:21:31
+
+
+Version 5.14
+~~~~~~~~~~~~
+
+Incompatible changes
+====================
+
+ - If you have customize the variable `org-emphasis-alist', you
+ need to do it again by first canceling your customization and
+ then adding it again.
+
+ - I know that some people have defined their own private helper
+ functions to select a specific remember template, without being
+ prompted, like this:
+
+ (defun my-remember-template-n ()
+ (interactive)
+ (org-remember ?n))
+
+ You need to modify this. The character selectiong the template
+ must now be the second argument to `org-remember':
+
+ (defun my-remember-template-n ()
+ (interactive)
+ (org-remember nil ?n))
+
+Details
+=======
+
+Remember and related stuff
+--------------------------
+
+ - New command `org-refile' to quickly move a note to a
+ different place. It is bound to `C-c C-w'. The foremost
+ application might be to put a note or task captured with
+ `remember' into the proper list or project. The command
+ offers a list of possible refiling targets for completion.
+ These are headings under which the entry will be inserted
+ as a subitem. By default, this will offer all top-level
+ headings in the current buffer, but you can configure the
+ variable `org-refile-targets' to get more complex
+ definitions. For example:
+
+ (setq org-refile-targets '((nil . (:level . 2))))
+
+ selects all level 2 headlines in the current buffer as
+ targets. And
+
+ (setq org-refile-targets
+ '((org-agenda-files . (:tag . "refile"))))
+
+ searches all agenda files and selects headlines that are
+ explicitly marked with the tag :refile: . Note that the
+ list of targets is built upon first use only, to rebuilt
+ it, call the command `C-c C-w' with a prefix argument.
+
+ This is based on an idea and example implementation by Max
+ Mikhanosha. Many thanks Max.
+
+ - You can now use a C-u prefix on `org-remember' to jump to
+ the location where a specific templates stores its notes.
+ For example, if you have `org-remember' bound to `C-c r',
+ then `C-u C-c r n' will get you to the file and headline
+ given in the template associated with the letter "n".
+
+ This was proposed by someone, but I have lost track who.
+ Sorry, and thanks anyway.
+
+ - New %-escapes in remember templates:
+
+ %c insert the current clipboard, like C-y would do
+ %(..) evaluate Lisp expression and insert the result
+
+ Thanks to Adam Spiers and Tim O'Callaghan.
+
+ - New function `org-remember-insinuate' that makes is easier
+ to set Org-mode specific values for remember variables.
+ Thanks to Michael Olson for this proposal. It is
+ equivalent to:
+
+ (require 'remember)
+ (setq remember-annotation-functions '(org-remember-annotation))
+ (setq remember-handler-functions '(org-remember-handler))
+ (add-hook 'remember-mode-hook 'org-remember-apply-template))
+
+ You might still want to set `org-default-notes-file' to
+ provide a default for templates without a file, and
+ `org-directory' to show where to find other org files.
+
+Emphasis
+--------
+
+ - Stacked emphasis like ~*/bold italic/*~ is no longer allowed.
+
+ - Font-lock now hides the emphasis markers - this makes for a more
+ readable text, and since we are all used to the hiding done by
+ links, I guess this is no problem? If it is for you, configure
+ the variable org-hide-emphasis-markers'.
+
+ - Text in the "=" emphasis is now exported verbatim, i.e. no
+ further parsing and interpretation of this text takes place. So
+ you can write ~=quoted *xxx* a_x = b=~. This and the following
+ point implement a request by Daniel Clemente.
+
+ - There is a new emphasis marker "~" which marks text to be
+ exported verbatim, without special formatting. Inside an
+ org-mode file, this text is highlighted with the org-verbatim
+ face. I am not happy with the face yet (currently is is like
+ org-code, but underlined), please suggest a better one.
+
+ - Whether an emphasis environment is verbatim or not is now an
+ extra flag in the variable `org-emphasis-alist'. If you have
+ configured this variable, do it again by first canceling your
+ customization to revert to the default, and then adding it
+ again.
+
+Properties and Column view
+--------------------------
+
+ - `org-use-property-inheritance' may now also be a list of
+ property names that should be treated with inheritance
+ during searches.
+
+ - CATEGORY="work" can now be used in a tags/property search,
+ even if the category is not specified as a property in the
+ entry, but rather is inherited or derived from #+CATEGORY.
+ Thanks to Adam, Tim, and Bastien for an interesting
+ discussion around this issue.
+
+ - Summary type improvements in column view.
+ * The {+} summary type can specify a printf-style output
+ format for computed values like this: {+;%5.2f}
+ This was triggered by a report by Levin.
+ * New currency summary type {$}, which so far is just a
+ shorthand for {+;%.2f}. Do we need to have a currency
+ symbol in front of each value. Scott Jaderholm asked for
+ this, but I am not sure if this is already what he meant.
+
+
+The date/time prompt
+--------------------
+
+ There have been several small but *very* useful additions to
+ the date prompt. I happen to think that it has become a very
+ compact and cool way to select or modify a date and a time,
+ better than anything I have seen in any other application -
+ at least if you like to work with the keyboard.
+
+ - While entering data at the date prompt, the current
+ interpretation of you input is shown next to your input in
+ the minibuffer. I find this great to understand how the
+ input works. If you find the extra stuff in the minibuffer
+ annoying, turn it off with `org-read-date-display-live'.
+
+ - The date prompt now prefers to select the future. If you
+ enter a date without a month, and the day number is before
+ today (for example, on the 16th of the month you enter
+ "9"), Org-mode will assume next month. Similarly, if you
+ enter a month and no year, next year will be assumed if the
+ entered month is before the current, for example if you
+ enter "May" in September. Thanks to John Rakestraw for
+ this great suggestion. If you find it confusing, turn it
+ off with `org-read-date-prefer-future'.
+
+ - When modifying an existing date using `C-c .' at the stamp,
+ the time or time range in the stamp are now offered as
+ default input at the prompt. This goes a long way to
+ simplifying the modification of an existing date. Thanks
+ to Adam Spiers for this proposal.
+
+Export
+------
+
+ - You can now export special strings in HTML. Here is the
+ list of newly performed conversions:
+
+ Org Description HTML
+ -------+------------------------------------+----------
+ \\ - double backslash followed by minus &shy;
+ - - two dashes (minuses) &ndash;
+ - - - three dashes (minuses) &mdash;
+ . . . three dots &hellip;
+
+ You can turn this globally on/off with
+ `org-export-with-special-strings' or locally with "-:t" or
+ "-:nil" in the #+OPTIONS line. Thanks to Adam Spiers for
+ starting the discussion, and thanks to Daniel Clemente and
+ William Henney for relevant inputs.
+
+ - Comma-separated emails in #+EMAIL: are correctly exported.
+ Thanks to Raman for pointing this out.
+
+Agenda
+------
+
+ - In the agenda, a few keys have changed
+ g does now the same a "r", refresh current display,
+ because "g" is the Emacs standard for "refresh"
+ G toggle the time grid, used to be "g"
+ e Execute another agenda command, pretty much the same as
+ `C-c a', but shorter and keep the same agenda window.
+
+Miscellaneous
+-------------
+
+ - The default for `org-ellipsis' is back to nil, some people
+ seem to have had problems with the face as a default.
+
+ - Support for pabbrev-mode, needs pabbrev version 1.1. Thanks
+ to Phillip Lord for adapting his package to make this
+ possible.
+
+ - New variable `org-show-entry-below' to force context-showing
+ commands to expose the body of a headline that is being
+ shown. Thanks to Harald Weis for pointing out this omission.
+
+
+Version 5.13g
+~~~~~~~~~~~~~
+
+Details
+=======
+
+ - On the date/time prompt, you can now also answer with
+ something like +2tue to pick the second tuesday from today.
+ This was a proposal by Sacha Chua.
+
+ - When interpopating into Lisp formulas in the spreadsheet,
+ the values of constants and properties are no longer
+ enclosed into parenthesis. When interpolating for calc,
+ this still happens in order to allow expressions in
+ constants. This problem was reported by Eddward DeVilla.
+
+ - When a directory is listed in `org-agenda-files', all files
+ with extension matched by the new variable
+ `org-agenda-file-regexp' in that directory will be agenda
+ files.
+
+ - Bug fixes.
+
+Version 5.13
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Bug fixes and improvements in column view
+ + All known bugs fixed.
+ + A Column view can be captured into a dynamic block.
+ + The ITEM column is formatted core compactly.
+ + Also ITEM can be edited with `e'
+
+ - The agenda dispatcher
+ + `<' cycles through restriction states.
+ + Multi-character access codes to commands (= sub-keymaps).
+
+ - Sorting improvements
+ + User-defined sorting keys.
+ + Sorting by properties.
+ + Sorting of plain lists.
+
+ - HTML <div> structure
+
+ - Other stuff
+ + New variables, several of them.
+ + Drawers can be set on a per-file basis.
+ + Better control over priority fontification in agenda.
+ + M-up and M-down now move the current line up and down.
+ + Abort remember template selection with C-g.
+
+Details
+=======
+
+Bug fixes and improvements in column view
+-----------------------------------------
+
+ - All the bugs described by Scott Jaderholm have been fixed
+ (at least I hope so...).
+
+ - You can now capture a column view into a dynamic block, for
+ exporting or printing it. The column view can be
+
+ + global, i.e. for the entire file
+ + local, i.e. for the subtree where the dynamic block is
+ + from an entry with a specific :ID: property.
+
+ You can identify the entry whose column view you want to
+ capture by assigning an :ID: property, and use that property
+ in the dynamic block definition. For example:
+
+ * Planning
+ :PROPERTIES:
+ :ID: planning-overview
+ :END:
+
+ [...]
+
+ * The column view
+ #+BEGIN: columnview :hlines 1 :id "planning-overview"
+
+ #+END:
+
+ Use `C-c C-x r' to insert such a dynamic block, and you will
+ be prompted for the ID.
+
+ - When the current column format displays TODO keyword,
+ priority or tags, these parts are stripped from the content
+ of the ITEM column, making for more compact and readable
+ entries. When any of these "properties" are not listed in
+ the current column format, they are instead retained in the
+ ITEM column.
+
+ - You can now also edit the ITEM column with `e'.
+
+The agenda dispatcher
+---------------------
+
+ - Instead of pressing `1' to restrict an agenda command to
+ the current buffer, or `0' to restrict it to the current
+ subtree or region, you can now also press `<' once or
+ twice, respectively. This frees up `1' and `0' for user
+ commands, a request by Bastien. In fact, "<" cycles
+ through different restriction states. "1" and "0" are
+ still available for backward compatibility, until you bind
+ them to custom commands.
+
+ - The access code to custom agenda commands can now contain
+ several characters, effectively allowing to bundle several
+ similar commands into a sub-keymap. This follows an
+ excellent proposal by Adam Spiers. For example:
+
+ (setq org-agenda-custom-commands
+ '(("h" . "HOME + Name tag searches") ; describe prefix "h"
+ ("hl" tags "+HOME+Lisa")
+ ("hp" tags "+HOME+Peter")
+ ("hk" tags "+HOME+Kim")))
+
+ - The user function option in org-agenda-custom-commands may
+ now also be a lambda expression, following a request by
+ Adam Spiers.
+
+Sorting improvements
+--------------------
+
+ We are using a new routine for sorting entries, courtesy of
+ John Wiegley. Many thanks to John.
+
+ - You can define your own function to extract a sorting key
+ and in this way sort entries by anything you like.
+
+ - Entries can now be sorted according to the value of a
+ property.
+
+ - Plain lists can be sorted.
+
+HTML <div> structure
+--------------------
+
+ There is now a <div>-based structure in exported HTML.
+
+ - The table of context is wrapped into a div with a class
+ "table-of-contents".
+
+ - The outline structure is embedded in <div> elements with
+ classes "outline-1", "outline-2" etc.
+
+ - The postamble, containing the author information and the
+ date is wrapped into a div with class "postamble".
+
+ I am not sure if the class names are the best choice, let me
+ know if there are more "canonical" choices.
+
+ Thanks to Mike Newman and Cezar for input, and in particular
+ to Mike for his clearly formulated specification.
+
+Other stuff
+-----------
+
+ - New variable `org-agenda-window-frame-fractions' to
+ customize the size limits of the agenda window in the case
+ that you display the agenda window by reorganizing the
+ frame.
+
+ - Drawers can be set on a per-file basis using
+
+ #+DRAWERS: HIDDEN STATE PROPERTIES
+
+ This will define the drawers :HIDDEN: and :STATE:.
+ The :PROPERTY: drawer should always be part of this list, or
+ your properties will not be folded away.
+ Thanks to Richard G. Riley for this proposal.
+
+ - `org-agenda-fontify-priorities' may now also be an
+ association list of priorities and faces, to specify the
+ faces of priorities in the agenda individually.
+
+ - The variable `org-export-with-property-drawer' no longer
+ exists, please use `org-export-with-drawers' instead. Also,
+ the corresponding switch in the #+OPTIONS line has changed
+ from "p" to "d". Thanks to Bastien for pointing out that we
+ needed to handle not only the property drawer.
+
+ - M-up and M-down now move the current line up and down (if
+ not at a headline, item or table). Among other things you
+ can use this to re-order properties in the drawer. This was
+ a proposal by Bastien.
+
+ - New variable `org-agenda-todo-ignore-with-date', based on a
+ request by Wanrong Lin.
+
+ - Aborting remember template selection with C-g now kills the
+ remember buffer and restores the old window configuration.
+ This was a request by Nuutti Kotivuori.
+
+Version 5.12
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Remember templates can now have name.
+ - `C-c C-k' will abort taking a note (remember of log)
+ - `C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg.
+ - Lines in the agenda can be fontified according to priority.
+ - New variable `org-scheduled-past-days'.
+ - New variables `org-agenda-deadline-leaders' and
+ `org-agenda-scheduled-leaders'.
+ - New sparse tree function `org-sparse-tree'.
+ - The variable `org-ellipsis' now defaults to `org-link'.
+ - The #+OPTIONS line has a new option "tags".
+ - New variable `org-use-property-inheritance'.
+
+Incompatible Changes
+====================
+
+ - `C-c /' now calls `org-sparse-tree'.
+
+Details
+=======
+
+ - Remember templates can now have a template name as the first
+ element. The name will be listed along with the selection
+ character when prompting for a template. It is best to have
+ the name start with the selection character, for example if
+ you use ("Note" "n"), you will be prompted like "[n]ote".
+ Thanks to Matiyam for this proposal.
+
+ - `C-c C-k' will abort taking a note. You can use this in remember
+ buffers and when taking a logging note (e.g. for a state
+ change). Thanks to Bastien.
+
+ - `C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg to
+ cut N sequential subtrees. This was a proposal by John.
+
+ - Lines in the agenda are now bold if they have priority A and
+ italic if they have priority C. You can turn this off using
+ the variable `org-agenda-fontify-priorities'. Thanks to
+ John Wiegley for the idea and code.
+
+ - New variable `org-scheduled-past-days' to set the number a
+ scheduled item will be listed after its date has passed.
+ Default is 10000, i.e. indefinitely.
+
+ - New variables `org-agenda-deadline-leaders' and
+ `org-agenda-scheduled-leaders' to adjust the leading text o
+ scheduled items and deadline in the agenda. Thanks to John
+ Wiegley for a patch.
+
+ - New sparse tree function `org-sparse-tree'. This is now the
+ default binding for `C-c /'. It requires one additional
+ keypress to select a command, but in return is provides a
+ single interface to all the different sparse tree commands,
+ with full completion support.
+
+ - The variable `org-ellipsis' now defaults to the face
+ `org-link' because the visibility of the dots is really bad
+ and I have found this change very useful indeed.
+
+ - The #+OPTIONS line has a new option "tags" which can be used
+ to set `org-export-with-tags'. Thanks to Wanrong Lin for
+ this proposal.
+
+ - New variable `org-use-property-inheritance'. Configure it
+ to `t' if you want that searching for entries with certain
+ properties always should assume inheritance. This is not
+ well tested yet, please check it out.
+
+ - Bug fixes
+
+Version 5.11
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - SUMMARY, DESCRIPTION, LOCATION properties for iCalendar
+ - Command to jump to the running clock
+ - Clock entries can now have their own drawer
+ - `C-c C-x C-r' only updates a clocktable at point
+ - New way to assign a remember template to a single key
+ - `C-n' and `C-p' are back to their default binding
+ - `C-x C-s' in agenda buffer saves all org-mode buffers
+ - Schedule/deadline leaves note in agenda buffer
+ - Prefix argument for `C-c C-d/s' will remove date
+ - New variable to make block aranda more compact
+ - Better tag alignment in agenda
+
+Incompatible changes
+====================
+
+ - If you have customized `org-drawers', you need to add
+ "CLOCK" to the list of drawers.
+
+ - The variable `org-agenda-align-tags-to-column' has been
+ renamed to `org-agenda-tags-column'. The old name is still
+ an alias, in Emacs 22 and in XEmacs, but not in Emacs 21.
+
+ - The default value for both `org-tags-column' and
+ `org-agenda-tags-column' is now -80.
+
+ - The variable
+ `org-insert-labeled-timestamps-before-properties-drawer'
+ is now obsolete.
+
+Details
+=======
+
+ - The LOGGING property allows to modify the settings for
+ progress logging for a single entry. For example:
+
+ :PROPERTIES:
+ :LOGGING: nologging nologrepeat
+ :END:
+
+ turns off all progress logging for the current entry and its
+ children.
+
+ - The properties SUMMARY, DESCRIPTION and LOCATION have
+ special meaning during iCalendar export, when they translate
+ to the corresponding VEVENT and VTODO fields. If not given,
+ Org-ode continues to use cleaned-up version of the headline
+ and body as the summary and the description, respectively.
+
+ - New function to go to the entry with the currently running
+ clock. Bound to `C-c C-x C-j', in agenda also to "J". If
+ you use this often, you might even want to assign a global
+ key. Thanks to Bernt and Bastien.
+
+ - Clock entries can now have their own drawer, the :CLOCK:
+ drawer. Check out the variable `org-clock-into-drawer' for
+ configuration of this feature. The default is to create a
+ drawer when the second clocking line gets added to an entry.
+ Note that "CLOCK" has been added to the default value of
+ `org-drawers', but if you have configured that variable, you
+ must go back and add "CLOCK" yourself to get this drawer
+ folded away. Thanks to Tom Weissman for pointing out that
+ too many clock entries are visually annoying.
+
+ - `C-c C-x C-r' no longer tries to find the first clocktable
+ in a buffer and then updates it. Instead, it will update
+ the clocktable at point if there is one (same as C-c C-c
+ will do if the cursor is in the "#+BEGIN" line of the
+ table). If there is none at point, a new one will be
+ inserted. This change was necessary because the new :scope
+ parameter allows to have several clocktables in a buffer.
+ Thanks to Bastien for pointing this out.
+ To update all dynamic blocks in a file, use `C-u C-c C-x C-u'.
+
+ - The function `org-remember' can now be called with a
+ template selection key as argument. This helps to make key
+ bindings that go directly to a specific template without
+ being prompted for a template, like this:
+
+ (global-set-key [f5] (lambda () (interactive) (org-remember "j")))
+
+ Thanks to Richard G Riley for bringing this up.
+
+ - `C-n' and `C-p' are back to their default binding
+ (next/previous line) in the agenda buffer. Enough people,
+ including recently Denis Bueno, have complained about this,
+ and I agree it is not good to break habits like that.
+
+ - `C-x C-s' in an agenda buffer now saves all org-mode buffers
+ (also `s' does this).
+
+ - Setting schedule or deadline dates from the agenda now
+ produces a note in the agenda, similarly to what happens
+ with S-left/right.
+
+ - Using a prefix argument for `C-c C-d' or `C-c C-s' will
+ remove the deadline or scheduling date from an item. Thanks
+ to Wanrong Lin for this proposal.
+
+ - New variable `org-agenda-compact-blocks'. When set, the
+ space between blocks in a block agenda is reduced as much as
+ possible, to show more items on a single screen.
+
+ - The variable `org-agenda-tags-column' (renamed from
+ `org-agenda-align-tags-to-column') can now also be negative,
+ to mean alignment to the left. The new default is -80, just
+ like it is now for `org-tags-column'.
+
+ - Bug fixes
+
+Version 5.10
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Category and the archive location can be properties.
+ - The clocktable has a new =:scope= parameter.
+ - CSV support when importing a table.
+ - Better defaults when modifying a time stamp.
+ - New way to specify the duration of an appointment.
+ - More aggressive version of orgstruct-mode improved wrapping.
+ - Modifications to priority cycling.
+ - Modifications to computations in column view.
+ - New command `org-occur-in-agenda-files'.
+ - Bug fixes.
+
+Details
+=======
+
+ - Both the category and the archive location in a (sub)tree of
+ the buffer can now be specified using a property, for
+ example:
+
+ * Tree with special properties
+ :PROPERTIES:
+ :CATEGORY: Examples
+ :ARCHIVE: /some/special/file::
+ :END:
+
+ This is a much cleaner way of dealing with multiple
+ categories and archives in a single file. The preferred use
+ of the =#+CATEGORY= and =#+ARCHIVE= lines is now to set a
+ *single* default for the file which is then locally
+ overruled by properties. This was a proposal from Bastien
+ if I remember correctly. Multiple =#+= lines still work
+ and I don't plan to remove this support soon, but I
+ encourage you to stop using them.
+
+ - The clocktable has a new =:scope= parameter that determines
+ the range in the file from which clock entries should be
+ taken. This can be anything from the local subtree to the
+ entire buffer to even the full list of agenda files. Legal
+ values are:
+
+ value scope
+ ---------+-------------------------------------------------
+ nil the current buffer or narrowed region
+ file the full current buffer
+ subtree the subtree where the clocktable is located
+ treeN the surrounding level N tree, for example tree3
+ tree the surrounding level 1 tree
+ agenda all agenda files
+
+ Thanks to Jason F. McBrayer and Bernt Hansen for
+ inspiration. Thanks to cranreuch (what is you full name?)
+ for mentioning, at the right moment, that the clocktable is
+ not so bad - that remark made it seem worthwhile to add
+ features.
+
+ - The commands to import a table and to convert a region to a
+ table can now handle comma-separated values (CSV). The
+ algorithm does not yet treat quoting correctly, but for
+ basic input it works.
+
+ - When modifying an existing time stamp, or when entering the
+ second stamp of a range, the date prompt will now
+ consistently default to the date/time in the existing stamp.
+ This was triggered by Nuutti Kotivuori's request.
+
+ - At the date/time prompt, there is a new way to specify a
+ range of hours, by using "+DURATION" after the time. For
+ example:
+
+ 14:00+2 means 14:00-16:00
+ 2pm+2:30 means 14:00-16:30
+
+ Again, Nuutti Kotivuori's request.
+
+ - When you use the function `turn-on-orgstruct++' to turn on
+ orgstruct-mode, the special org-mode settings for
+ auto-filling, indentation and paragraphs are exported into
+ the buffer, so that typing list items with indentation works
+ better. This was Bastien's idea and request.
+
+ - New variable `org-priority-start-cycle-with-default'. When
+ t (the default), priority cycling will initially set the
+ default priority and then increase or decrease. When nil,
+ the first priority set by cycling is already 1 different
+ from the default priority. This was mostly driven by
+ Bastien.
+
+ - In column view: When an entry has a property for a summary
+ column defined, its value is normally overwritten by the sum
+ of all the children's values each time you enter column
+ view. Now there is an exception to this rule: If none of
+ the children has that particular property defined, the
+ parent's value stays. In this way you can still place TODO
+ items under such an entry without getting the property value
+ changed. Thanks to Russel Adams for pointing out that this
+ is a better way of doing things.
+
+ - In column view, computed values are now bold face, and
+ trying to edit them is an error. I think this works, but
+ testing is appreciated.
+
+ - New command `org-occur-in-agenda-files', this is basically
+ the quick command John Wiegley proposed the other day, but
+ it also works when the agenda files are not yet in buffers.
+ The key is `C-c C-x /', any better proposals?
+
+ - Links containing a space will now be handled correctly when
+ calling the browser. Note that you need to enclose such
+ links in square or angular brackets.
+
+ - Bug fixes.
+
+Version 5.09
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Taking a note upon TODO state changes can be restricted to
+ selected states.
+
+ - The format in which dates are shown in the daily/weekly
+ agenda can be configured.
+
+ - The default for `org-remember-store-without-prompt' is now t.
+
+ - `org-goto' has been made into a general lookup command.
+
+ - Priority cycling goes back to the nil state.
+
+ - You can store a remember note to the *last used* location.
+
+ - On Emacs 23, the headline faces for org-mode are now
+ inherited from the outline faces.
+
+Incompatible Changes
+====================
+
+ - The default for `org-remember-store-without-prompt' is now
+ t, in order to better match the original intent of
+ remember.el (storing a note with minimum interruption of
+ work flow). I expect that many people will be hit by this
+ incompatible change - nevertheless I believe it is the right
+ thing to do.
+
+Details
+=======
+
+ - You can now select specific states for recording a note when
+ switching to that state. With the setting
+
+ #+SEQ_TODO: TODO(t) ORDERED(o@) INVOICE(i@) PAYED(p) | RECEIVED(r)
+ #+STARTUP: lognotestate
+
+ only the states ORDERED and INVOICE will record a timestamp
+ and a note.
+
+ - You can now set the format of the string for each day in the
+ agenda and timeline buffers. You can use a format string
+ interpreted by `format-time-string', or you can write your
+ own function. Configure the new variable
+ `org-agenda-format-date'. Thanks to Levin for triggering
+ this development with a patch.
+
+ - The default for `org-remember-store-without-prompt' is now
+ t, in order to better match the original intent of
+ remember.el (storing a note with minimum interruption of
+ work flow). Since we can assign files and headlines to
+ templates, I guess this takes care of selecting a filing
+ location in most cases. For interactive filing, you now
+ need a prefix command when exiting `remember'.
+
+ - `org-goto' (bound to `C-c C-j') now uses an indirect buffer
+ and has additional commands enabled: Org-occur with `C-c /'
+ or even faster with `/', and the commands needed to select
+ and copy a region. This make `org-goto' a more general
+ lookup command instead of only a jumping command. Remember
+ that you can exit with `Q' to go back to the original
+ location. Thanks to William Henney for this idea.
+
+ - Setting the priority with S-up/down now cycles back to a
+ state where no priority is specified. This was requested by
+ Rick Moynihan.
+
+ - You can store a remember note to the *last used* location.
+ So if you select a location interactively once, you can
+ re-use it without having to find it again. For this, exit
+ the remember buffer with `C-u C-u C-c C-c'. The leading
+ comment in the remember buffer will tell exactly where the
+ note goes if you exit with a particular command.
+ Thanks to Maxim Loginov for this idea.
+
+ - On Emacs 23, the headline faces for org-mode are now
+ inherited from the outline faces. This is just a
+ convenience, so that you only have to configure one set of
+ faces, and that will then be outline-1 .. outline-8. You
+ will actually not see any difference in org-mode, because
+ Stefan Monnier has made the outline faces in Emacs 23 to
+ match the current org-mode faces.
+
+ This change does not effect XEmacs, nor Emacs 21 and 22.
+
+Version 5.08
+~~~~~~~~~~~~
+
+Incompatible changes
+====================
+
+ - The default for `org-deadline-warning-days' is now 14.
+
+Details
+=======
+
+ - There is now a separate interface for fast and directly
+ setting a TODO keyword. This interface kicks in when you
+ have configured keys for TODO keywords like
+
+ #+SEQ_TODO: TODO(t) WAITING(w) | DONE(d) CANCELED(c)
+
+ C-c C-t still does the cycling thing, you need to use a
+ prefix argument to get to the fast interface. Or configure
+ the variable `org-use-fast-todo-selection' to t, then this
+ will be the default and the prefix argument will make the
+ command fall back to cycling.
+
+ The tag selection no longer does include TODO keywords -
+ Leo's arguments have convinced me that this is not a good
+ idea. If you'd like to see the TODO keywords in the tags
+ interface anyway, set the variable
+ `org-fast-tag-selection-include-todo'. Thanks to Leo and
+ others for input on this issue.
+
+ - New variable `org-edit-timestamp-down-means-later'. When
+ set, `S-down' on a timestamp will change the timestamp to
+ later. Thanks to Raman for this idea.
+
+ - Property names can now contain non-ascii word characters.
+ This follows a request from Daniel Clemente.
+
+ - For export, the date that should be given in the exported
+ file can now be set to a specific value with a line like
+
+ #+DATE: 15 November 2003
+
+ If you want to use the date/time when the file was created,
+ use a format string that will be interpreted by
+ `format-time-string', for example:
+
+ #+DATE: %Y/%m/%d %X
+
+ - The default of `org-deadline-warning-days' has changed to 14
+ days. 30 was really too much, I suspect most people (me
+ included) have changed this.
+
+ - When a deadline has an individual lead time, this lead time
+ obviously overrules `org-deadline-warning-days'. However,
+ if you bind `org-deadline-warning-days' to a number <=0, for
+ example during a custom agenda command, then the absolute
+ value of this number will be enforced also when a different
+ lead time has been specified. This is useful to get a list
+ of all deadlines coming up in the next N days.
+
+Version 5.07
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Different faces for different TODO keywords.
+
+ - Setting TODO states through the TAG setting interface.
+
+ - Context information is stored when moving a tree to the archive.
+
+ - Sorting can be done by priority.
+
+ - `Org-ellipsis' can now also be a face.
+
+ - Scheduling info is no longer removed entry is marked CLOSED.
+
+ - Unavailable files in `org-agenda-files' can be skipped.
+
+Incompatible changes
+====================
+
+ - The time of archiving is now stored as a property.
+ ARCHIVED is no longer a special time keyword.
+
+ - Scheduling info is no longer removed entry is marked CLOSED.
+
+Details
+=======
+
+ - You can now define different faces for different TODO
+ keywords. This request has come up frequently, so here it
+ is: Use the variable `org-todo-keyword-faces'.
+
+ A Here is a configuration example:
+
+ (setq org-todo-keyword-faces
+ '(("TODO" . org-warning)
+ ("DEFERRED" . shadow)
+ ("CANCELED" . (:foreground "blue" :weight bold
+ :underline t))))
+
+ Org-mode continue still use `org-todo' and `org-done' for
+ keywords that have no specific face assigned.
+
+ - Some People use TODO states more like tags. For them the
+ TODO keywords mark special states and they like to quickly
+ switch between states in arbitrary sequence. The standard
+ TODO interface is not perfect for this, because it assumes
+ that the states are reached in sequence. However, the fast
+ tag setting interface is in fact perfect for this. You can
+ now "misuse" the TAG selection interface to also set TODO
+ states. All you need to do is to assign keys to the TODO
+ states, just like you also do for tags.
+
+ #+SEQ_TODO: TODO(t) WAITING(w) | CANCELED(c) DONE(d)
+ #+TAGS: @HOME(h) @OFFICE(o) @SHOP(s)
+
+ Next time you try to set tags with C-c C-c, the todo states
+ will be offered as well, and the corresponding key will
+ switch the entry to that state.
+
+ - New variable `org-archive-save-context-info' governs if
+ information that would be lost by moving a subtree to the
+ archive file, should be stored as special properties. For
+ example,
+
+ (setq org-archive-save-context-info '(itags category))
+
+ will store the inherited tags and the category in properties
+ ARCHIVE_ITAGS and ARCHIVE_CATEGORY, respectively. The
+ default setting for this variable is to save everything that
+ could be lost. This was a proposal by John Wiegley.
+
+ - Sorting (`C-c ^') can use the use the priority to sort. Use
+ the "p" and "P" keys at the prompt. John Wiegley, again.
+
+ - `Org-ellipsis' can now also be a face to make the folding
+ ellipsis more visible. This is based on a post by Tassilo
+ Horn. Since `org-ellipsis' only works in Org-mode, you
+ might want to use Tassilo Horn's hack directly in order to
+ affect the folding ellipsis globally.
+
+ - Scheduling info is no longer removed when an entry is marked
+ CLOSED. This was a request by Brian van den Broek. Let me
+ know if this breaks anything for you - then it will become
+ an option.
+
+ - New option `org-agenda-skip-unavailable-files'. Currently,
+ if a file does not exist, it will be removed from
+ `org-agenda-files' after a query. When this option is set,
+ the file will simply be skipped.
+
+ - Bug fixes.
+
+Version 5.06
+~~~~~~~~~~~~
+
+Overview
+========
+
+Details
+=======
+
+ - When exporting only a region and this region is a single
+ (sub)tree (for example selected with `C-c @'), the title for
+ the exported document is taken to be the heading of the
+ subtree. The sublevels become top-level entries in the
+ export. Furthermore, if the head entry of the tree has or
+ inherits an EXPORT_FILE_NAME property, that file name (with
+ appropriately substituted extension) will be used for the
+ exported tree. Thanks to Patrick Drechsler and Jost Burkart
+ for these ideas.
+
+ - org-special-ctrl-a/e has a third allowed value, `reversed'.
+ When it is set to this value, the first C-a or C-e command
+ behaves normally, i.e. it goes to the true beginning or end
+ of the line. Only when you press C-a or C-e immediately
+ again, the the "special" position will be found. Additional
+ presses of the same key jump between the two positions. I
+ like this a lot better than the `t' setting, because now the
+ keys behave more predictable and still give easy access to
+ the special locations.
+
+ - New command to set or remove a tag from all headlines in a
+ region.
+
+ - When Org-mode visits a file, it will initially hide all
+ drawers.
+
+ - The default of the variable `org-cycle-global-at-bob' is now
+ nil, meaning that TAB no longer does global visibility
+ cycling at the beginning of the buffer.
+
+ - Bug fixes, in particular the problems with scheduling and
+ deadlines introduced in 5.05. Please check carefully if
+ this works correctly again, and complain if not.
+
+Version 5.05
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - LaTeX export, finally, thanks to Bastien.
+
+ - Extension mechanism for the hyperlink system.
+
+ - Global access to commands inserting and following links.
+
+ - Individual lead-times for deadlines.
+
+ - Option to show only the next instance of repeating timestamp.
+
+ - Store remember notes with only 2 keys: C-c C-c
+
+ - Appointment reminders from Org-mode.
+
+ - Global values for selected properties.
+
+ - Bug fixes.
+
+
+Details
+=======
+
+ - Bastien's `org-export-latex.el' is now part of the org-mode
+ distribution. You can export an Org-mode document to a
+ LaTeX file with `C-c C-e l'. For more options, see the
+ manual, and the commentary in the Lisp file. Kudos to
+ Bastien for contributing this frequently requested feature.
+ I am sure this has been tough because of the many different
+ ways I have been allowing LaTeX snippets and environments to
+ be incorporated in lazy free-format ways.
+
+ - Org-mode has now an extension mechanism for the hyperlink
+ system. This should clear the road for all those mairix and
+ other ideas that have been floating around. Now it is on
+ *you* to write and share new link types for Org-mode. The
+ interface for adding a new link type is described in the
+ appendix of the manual, section A2. The unsolved problem is
+ currently how to handle the new link types for
+ export/publishing.
+
+ - New *global* commands `org-open-at-point-global' and
+ `org-insert-link-global'. You can bind these commands to
+ global keys and use them to insert and follow Org-mode-like
+ links anywhere in Emacs. Thanks to Adam Spiers for this
+ excellent idea.
+
+ - Each deadline timestamp may now specify its own interval of
+ lead-time display, given in days, weeks, months or years.
+ The syntax is like this
+
+ DEADLINE: <2007-08-13 Mon -5d>
+
+ When combined with a repeater, the repeater has to come
+ first:
+
+ DEADLINE: <2007-08-13 Mon +2w -5d>
+
+ You may now also customize the faces that are used in the
+ agenda to indicate the distance of an approaching deadline.
+ See the new option `org-agenda-deadline-faces'.
+
+ Thanks to Pavel Chalmoviansky and John Wiegley proposals in
+ this direction.
+
+ - New option `org-agenda-repeating-timestamp-show-all'. When
+ set to nil, repeating time stamps will only show up once in
+ the agenda, either today or in the near future. Other
+ matches will be ignored. Thanks to John Wiegley for this
+ proposal.
+
+ - New variable `org-remember-store-without-prompt'. When set,
+ exiting the remember buffer with C-c C-c will store the note
+ without further prompts to the default location, and `C-u
+ C-c C-c' will get the prompts for file and location. So
+ this variable reverses the prefix-argument functionality for
+ storing remember notes. This follows a request from John
+ Wiegley.
+
+ - A new function `org-agenda-to-appt' activates all
+ appointments for the current day so that Emacs will display
+ reminders. This uses appt.el. Thanks to Bastien for this
+ function.
+
+ - You can now set default values for properties that can be
+ inherited by all entries in a buffer, or by all entries
+ globally. Global properties are set in the variable
+ `org-global-properties', like this:
+
+ (setq org-global-properties '(("NAME" "This is the value")))
+
+ Buffer-local values are set like this:
+
+ #+PROPERTY: NAME This is the value
+
+ When using org-entry-get to get the value of a property with
+ the `inherit' flag and the hierarchy above the entry does
+ not contain this property, the buffer-local and global lists
+ are checked as well. This is mostly useful (I think) to set
+ the list of allowed values for a property. Thanks to Bernt
+ Hansen and Bastien for these ideas.
+
+ - Bug fixes.
+
+Version 5.04
+~~~~~~~~~~~~
+
+Details
+=======
+
+ - New variables `org-export-author-info' and
+ `org-export-time-stamp-file' to turn off inclusion of author
+ and time information into exported files. Thank to Patrick
+ Drechsler for pointing out that this would be useful.
+
+ - New variable to avoid moving DEADLINE and SCHEDULED info
+ into the property drawer. The default is now to not move
+ this stuff into the drawer.
+ `org-insert-labeled-timestamps-before-properties-drawer'
+
+ - `org-archive-mark-done' can be a string now, to select a
+ specific keyword that should be used for archived entries.
+
+ - New command "j" in agenda to jump to an arbitrary date.
+ Thanks to Bernt Hansen for the patch.
+
+ - Lots of minor fixes.
+
+Version 5.03
+~~~~~~~~~~~~
+
+Incompatible Changes
+====================
+
+ - The variable `org-special-ctrl-a' has been renamed to
+ `org-special-ctrl-a/e'. The old one is still an alias (but
+ not on Emacs 21 where variable aliases cannot be defined).
+
+Details
+=======
+
+ - When the variable `org-special-ctrl-a/e' is set, C-e in a
+ headline first goes to the end of the headline ignoring the
+ tags. A second C-e then goes to after the tags.
+
+ - Typing and removing single characters in a headline now
+ keeps the tags in the headline aligned. This could have a
+ little impact on performance while deleting stuff - let me
+ know if we need to make this customizable.
+
+ - New option `org-n-level-faces' can be used to set the number
+ of different faces that are used for headlines. Default is
+ all 8 faces Org-mode defines for this purpose, level 9 uses
+ again the level-1 face. However, you can use fewer, and then
+ the level-1 face will be reused already for level N+1, etc.
+
+ - Column View and hidestars now work together.
+
+ - Bug fixes.
+
+
+Version 5.02
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - The interfaces for properties and column view are finished
+ now and work well.
+
+ - Properties can be summaries, i.e. the parent nodes can
+ compute their value from the children's values.
+
+ - Headlines finally require a space ofter the star(s). The
+ conflict with bold text at the beginning of the line is no
+ longer there.
+
+Incompatible Changes
+====================
+
+ - Bad news. It looks like it is going to be really hard to
+ make column view work on XEmacs and on Emacs 21. Emacs 22
+ is currently the only Emacs where this works. If you are
+ using Emacs 21 or XEmacs, you can still use properties, but
+ not column view.
+
+Details
+=======
+
+ - Improvements for properties:
+
+ + There are interactive commands to insert and delete
+ properties. Read the manual chapter 7 for details.
+
+ + You can define /allowed values/ for a property. When
+ these are defined, you can change the value of a property
+ with S-left and S-right. And you may use completion when
+ inserting the property. This goes a long way to prevent
+ typos when entering properties.
+
+ - Improvements for column view.
+
+ + In column view, you may use the keys S-left/right (and
+ also the keys `n' and `p') to switch from one allowed
+ value to the next.
+
+ + You can define summaries for columns. For example,
+ parents can contain the sum of all children values of a
+ property, or the parent node can have a check box property
+ that is automatically checked when all children's boxes are
+ checked.
+
+ + There are interactive commands to add and remove columns,
+ and to change the attributes of a column like the summary
+ type.
+
+ These additions lead to the exciting fact that the example
+ from [omni outliner] posted by Scott Jaderholm can now be
+ accurately [reproduced by Org-mode].
+
+ - The space after the stars is now required in a headline, in
+ order to remove the conflict with bold words at the
+ beginning of a line. So
+
+ * This is a level 1 headline
+ *this is bold text*
+
+ - S-up and S-down to navigate plain item lists are now also
+ available in orgstruct-mode.
+
+Version 5.01
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - A new minor mode, orgstruct-mode, exports the Org-mode
+ structure editing commands into any other mode.
+
+ - DRAWERS are a new level off folding for special sections
+ that should stay closed during visibility cycling and only
+ open if explicitly asked.
+
+ - Entries can now have PROPERTIES.
+
+ - A COLUMN VIEW implementation allows to easily view and edit
+ the properties of a hierarchy of entries (Emacs only, for
+ now).
+
+ - Formula evaluation in the spreadsheet is more consistent
+ now. Properties and per-file constants can be used during
+ evaluation.
+
+ - Bug fixes and minor changes.
+
+Incompatible changes
+====================
+
+ - When using LEVEL=N in a tags search, things have changed if
+ you are also using `org-odd-levels-only'. If you are using
+ only odd levels (i.e. 1 or 3 or 5... stars), LEVEL=2 will
+ now refer to 3 stars, LEVEL=3 to 5 stars etc. Many thanks
+ to Leo (or blame on him if you must) who has convinced me
+ that this is the better convention.
+
+Details
+=======
+
+Orgstruct minor mode
+--------------------
+
+ There is a new minor mode, orgstruct-mode. This modes works
+ in a similar way as Orgtbl-mode. It can be used to export
+ the Org-mode structure-editing commands into arbitrary major
+ modes in Emacs. For example, you can use it in Mail-mode to
+ easily create lists.
+
+ The functionality in Orgstruct mode is only active, if the
+ cursor is in a line that looks either like a headline, or
+ like the first line of a plain list item. Then the commands
+ `TAB', `M-cursor', `M-S-cursor', `M-RET', `M-S-RET', `C-c ^',
+ `C-c C-c', and `C-c -' will do structure-related editing just
+ like in Org-mode. If the cursor is not in such a line, all
+ these keys will do whatever the major mode or other active
+ minor modes have assigned to them.
+
+ Orgstruct-mode is the result of a proposal by Raman, quite
+ some time ago. It has taken a long time, but here is finally
+ the promised implementation.
+
+Drawers
+-------
+
+ The new concept of /drawers/ allows to create sections
+ that remain folded during visibility cycling. Drawers need
+ to be configured using the variable `org-drawers'. A drawer
+ starts with a line containing only the name of the drawer
+ bracketed by colons. It ends with :END:. For example,
+ after setting
+
+ (setq org-drawers '("PROPERTIES" "HIDDEN"))
+
+ you can then create drawers like this:
+
+ :HIDDEN:
+ here is some stuff that remains hidden
+ unless TAB is pressed directly in that line
+ :END:
+
+ The PROPERTIES drawer has special meaning for ORG-mode, it
+ contains properties of an entry (see below).
+
+Properties and Column View
+--------------------------
+
+ - Entries in Org-mode can now have arbitrary /properties/
+ associated with them. Org-mode handles some default
+ properties like the TODO state, the priority, the local
+ tags, and planning information like DEADLINE and SCHEDULED.
+ In addition, you can assign arbitrary properties by creating
+ a property drawer and inserting a line like
+
+ :PROPNAME: This is the value of the property
+
+ Org-mode has an API for properties, if you want to write a
+ program using properties, use the functions
+ `org-entry-properties', `org-entry-get', `org-entry-put',
+ and `org-entry-delete'.
+
+ - Planning information like DEADLINE can be hidden in the
+ properties drawer.
+
+ If the PROPERTIES drawer starts in the first line after a
+ headline, also the DEADLINE, SCHEDULED and CLOCK information
+ will be inserted inside the drawer. If no PROPERTIES drawer
+ is present, or if it does not start in the line right after
+ the headline, this information remains in the lines directly
+ after the headline, outside the drawer.
+
+ - TAGS searches can now also query properties. For example,
+ the search
+
+ LEVEL=3+BOSS+ASSIGNED="Hans"/WAITING
+
+ will find entries that
+ - are level 3
+ - have the tag BOSS
+ - have an ASSIGNED property with the value "Hans"
+ - are TODO status WAITING.
+
+ So here is an entry that will match:
+
+ *** WAITING Clean up the factory :BOSS:
+ :PROPERTIES:
+ :ASSIGNED: Hans
+ :END:
+
+ You may also use a regular expression to match against a
+ property value. For example, to find stuff assigned to Hans
+ or Sarah, use
+
+ ASSIGNED={^\(Hans\|Sarah\)$}
+
+ - Column View is a special way to look at property values in
+ tabular form. Column View can be used in any org-mode
+ file, and also in any agenda buffer. It works by placing
+ an overlay over each headline (or agenda line) that shows a
+ table of selected properties. You can look at and edit
+ properties from this view. Which properties are shown in
+ the table must be set up using the COLUMNS property. You
+ can set up different property columns on different levels
+ of an outline tree. For example:
+
+ * People
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name
+ :END:
+ ** Family
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name %3Age
+ :END:
+ *** Sam
+ Info about Sam, including a property list with Name and Age.
+ *** Sarah
+ Info about Sarah, including a property list with Name and Age.
+ ** Office
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name %Function %Salary
+ :END:
+ *** Boss
+ Info about the Boss, including a property list with Name,
+ Function and Salary (if only we knew....).
+
+ Now we have defined three different sets of columns. If
+ you switch to column view in the /Family/ section, you
+ will get a different table than if you do it in the
+ /Office/ section. However, if you switch to column
+ view with the cursor on the /People/ section, the
+ table will cover all entries, but contain only the
+ /Name/.
+
+ Column view does, for the time being, only work on Emacs.
+ The XEmacs implementation needs a bit of work.
+
+ - Properties can be used in table formulas. To access the
+ value of the property :XYZ:, use $PROP_XYZ. The property
+ needs to be defined in the hierarchy above the table, not
+ necessarily in the same entry as the table. This was a
+ request by Eddward. File-wide constants can be defined with
+ #+CONSTANTS, see below.
+
+ - Things that still need to be sorted out about drawers,
+ properties and column view - comments and suggestions
+ welcome!
+
+ + How to deal with drawers and properties in HTML and ASCII
+ export?
+ + What key could be used to insert an empty property drawer
+ into an entry?
+ + Right now column view is invoked through the command C-c
+ C-x C-c. It is too easy to type C-x C-c by mistake, and
+ that causes Emacs to quit. Suggestions for a different
+ key?
+ + Fontification of drawers and properties is not good yet.
+ Any suggestions for better defaults?
+ + Mouse support for editing properties in column view would
+ be nice - maybe Piotr is interested to add this to
+ org-mouse.el?
+
+Spreadsheet
+-----------
+
+ - In the spreadsheet, the evaluation of formulas has changed.
+ Previously, first the column formulas would be evaluated
+ everywhere, and then the field formulas would kick in, and
+ in some cases overwrite the results of column formulas in
+ the appropriate fields. This had the side effect that some
+ formulas might always use the wrong, intermediate content of
+ a field that is computed both by a column and a field
+ formula.
+
+ From now on, column formulas will no longer temporarily
+ overwrite field formulas. This gives much more consistent
+ results. For example you can now finally have a column of
+ increasing numbers by setting the first field to a fixed
+ number, and let the rest follow from a column formula.
+
+ Here is an example
+
+ | 1 |
+ | 2 |
+ | 3 |
+ #+TBLFM: $1=@-1+1::@1$1=1
+
+ - Constants for formulas in spreadsheets are globally defined
+ with the variable `org-table-formula-constants'. File-local
+ constants can now be set with a line like:
+
+ #+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6
+
+
+Minor changes
+-------------
+
+ - When entries are archived, a timestamp for the moment of
+ archiving is added to the line with planning information.
+ It looks like this:
+
+ ARCHIVED: [2007-07-02 Mon 11:34]
+
+ Thanks to J. David Boyd for constructive comments.
+
+ - Bug fixes
+
+ Many bugs are fixed, as usually all the ones where I replied
+ "fixed" on emacs-orgmode. If you reported one of these
+ bugs, please check if it really has disappeared in the new
+ version, and complain if not. Thanks!
+
+
+Version 4.79
+~~~~~~~~~~~~
+
+Details
+=======
+
+ - We are back to a single file org.el that works both on Emacs
+ and on XEmacs. Merging comes at a speed penalty for you as
+ an XEmacs user, but *only if you do not compile* org.el.
+ Compilation completely removes the penalty.
+
+ - New L flag for literal interpolation in Lisp formulas.
+ See manual section 3.5.3.
+
+ - New options for turning off footnotes.
+ This was a request from Ignotus.
+ See the option `org-export-with-footnotes'.
+
+ - Default length for Agenda entries, but this is off by
+ default. This was a request from Micheal.
+ See the option `org-agenda-default-appointment-duration'.
+
+ - Bug fixes:
+
+ + org-agenda-date-later (Juraj Kubelka)
+ + letters off margin in orgcard.ps (Charles Cave)
+ + TODO export problems on XEmacs (ignotus@freemail.hu)
+ + args-out-of-range with table formulas (Cecil Westerhof)
+ + problem with org-file without a heading (Tim O'Callaghan)
+
+Version 4.78
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Time stamps with a time range *included*, like
+ <2007-06-18 Mon 17:33-18:23>
+
+ - Clock times without clocking in/out: CLOCK: => 2:00
+
+ - Language-specific characters allowed in TAGS (Emacs only).
+
+ - Promotion and demotion of items gets the indentation right.
+
+ - Indenting lines with TAB is more intelligent.
+
+
+Incompatible changes
+====================
+
+ - There is now a special version of `org.el' for XEmacs.
+ Before installation, as an XEmacs user you must rename the
+ file org_xemacs.el to org.el, i.e. you must overwrite org.el
+ with the xemacs version. For example:
+
+ mv org_xemacs.el org.el
+
+ This is necessary so that I can make use of some features
+ that would be cumbersome to support in a single file. The
+ XEmacs version is derived from the Emacs version with a
+ program, so no reason to fear that I might be dropping
+ XEmacs support any time soon. Sorry for the trouble.
+
+Details
+=======
+
+ - A time stamp may now contain a range of times. So you no
+ longer need to use two separate stamps to indicate a time
+ interval on a single day. For example
+
+ <2007-06-18 Mon 17:30-18:20>
+
+ This is now fully supported, including changing the time
+ with S-up/down while the cursor is on the end time. Also,
+ da the date/time prompt, you can simply write your time like
+ 12:00-14:00 and the range will be inserted.
+
+ This was proposed by Leo some time ago, and recently by
+ Michael.
+
+ - You may specify clocking times by hand (i.e. without
+ clocking in and out) using this syntax.
+
+ CLOCK: => 2:00
+
+ Thanks to Scott Jaderholm for this proposal.
+
+ - TAGS may now contain language-specific word characters, as
+ long as they are matched by the "[:alnum:]" regexp syntax.
+ This is for Emacs only, the XEmacs version continues to use
+ the character class "a-zA-Z0-9_@" for tag names. Thanks to
+ David Smith for a patch to this effect (a modified version
+ of that patch was applied). I am considering to make the
+ same change for TODO keywords, but not yet. Note that files
+ using localization features may not work correctly in the
+ Emacs configuration of another user, so if you are sharing
+ org-mode files with other users, it might still be best to
+ stick to the ASCII characters.
+
+ - Promotion and demotion of plain list items (commands M-left,
+ M-right) no longer changes the indentation by just one
+ space. Instead, it uses intelligence gathered from the
+ surrounding list structure to do the right thing. Thanks to
+ William Henney for starting the discussion about this.
+
+ - TAB does now a better job of indenting lines.
+
+ + After tables and code segments (lines starting with ":"),
+ indentation goes back to what it was before (thanks to
+ William Henney for suggesting this behavior).
+
+ + When plain lists items are involved, we had a long
+ discussion on emacs-orgmode where I tried to show that a
+ too-sophisticated implementation will still be easily
+ fooled. Here is what I have implemented now - lets see
+ if we can agree on this:
+
+ Indentation will flatten lists with the same bullet type,
+ but indent another bullet type further. The time when
+ this fails is in a nested list, when you want to get back
+ out to a previous level. For example
+
+ - item 1
+ - item 2
+ + item 2a
+ + item 2b
+ - item 3
+
+ When using TAB on every line in this list, the structure
+ will change to
+
+ - item 1
+ - item 2
+ + item 2a
+ + item 2b
+ - item 3
+
+ So you need to change the level of the last line by hand,
+ using promotion and demotion functions.
+
+
+Version 4.77
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Vertical lines in exported tables.
+ - New default for `org-show-following-heading'.
+
+Incompatible changes
+====================
+
+ - The default for `org-show-following-heading' is now nil.
+
+Details
+=======
+
+ - You can now specify column groups in tables, to the effect
+ that the groups will be separated by vertical lines in HTML
+ and ASCII output. Column groups are specified by the
+ characters "<" and ">" in a special table row. "<" starts a
+ group, ">" ends a group (in each case including the the
+ column where the character is specified). You may also use
+ "<>" to make a group a single column wide. For example:
+
+ | | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N) |
+ |---+----+-----+-----+-----+---------+------------|
+ | / | <> | < | | > | < | > |
+ | # | 1 | 1 | 1 | 1 | 1 | 1 |
+ | # | 2 | 4 | 8 | 16 | 1.4142 | 1.1892 |
+ | # | 3 | 9 | 27 | 81 | 1.7321 | 1.3161 |
+ #+TBLFM: $3=$2^2::$4=$2^3::$5=$2^4::$6=sqrt($2)::$7=sqrt(sqrt(($2))
+
+ A table row with with nothing but "/" in the first field is
+ never exported, but can be used to place column group
+ information into the table. In this table, we create a
+ group for column 2, one for columns 3-5 and one for columns
+ 6-7. HTML export will render a vertical line between these
+ groups.
+
+ Because HTML does not require closing <colgroup> tags with
+ </colgroup>), you can also simply start a new column
+ wherever you want a vertical line:
+
+ | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N0 |
+ |---+-----+-----+-----+---------+------------|
+ | / | < | < | | < | |
+
+ - Vertical lines are now also omitted in ASCII export, unless
+ grouping explicitly requests these lines.
+
+ - The default for `org-show-following-heading' is now nil,
+ meaning that sparse trees will be more compact. This has
+ become possible due to in important remark by Jason Dunsmore
+ who pointed out that TAB should behave differently in the
+ inconsistent trees produced by the sparse tree commands.
+ TAB does now make sure that the heading after a freshly
+ unfolded tree is made visible at all, removing the confusing
+ behavior we had before.
+
+ - Several bugs fixed. In particular:
+
+ + Strings produced by agenda batch processing with
+ `org-batch-agenda' and `org-batch-agenda-csv' are now
+ properly encoded, so that you should be able to use
+ special characters in other languages as along as your
+ post-processing program handles them correctly. At least
+ for Emacs this should work now, but have not yet figured
+ out how to do this in XEmacs.
+
+Version 4.76
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Exporting Footnotes to HTML
+
+Details
+=======
+
+ - Footnotes like[1] are now exported to HTML
+
+ [1]This is a footnote
+
+ Thanks to Scott Jaderholm for this proposal and a detailed
+ HTML example on how the exported text should look like.
+
+ - Special version of the reference card, for letter paper.
+
+ - Switching to OVERVIEW with S-TAB no loner moves the cursor,
+ so after three `S-TAB' commands, you will be back where you
+ started.
+
+ - Bug fixes, lots of them again.
+
+Version 4.75
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Cyclic time stamps that repeat after an interval.
+ - Special timestamps for appointments like "every 2nd Thursday
+ in a month".
+ - Completion of link abbreviation prefixes inside `C-c C-l'.
+ - Replacing a region of org-mode syntax with HTML.
+ - iCalendar export now honors ARCHIVE etc.
+ - New command to add/change emphasis markers.
+
+Incompatible Changes
+====================
+
+ - The REPEAT(...) cookie is no longer supported, the repeater
+ interval now goes directly into the time stamp.
+
+Details
+=======
+
+ - Time stamps can contain a repeater code, like +1w for once
+ every week, +2d for every two days, etc. For example,
+
+ <2007-05-16 Wed 12:30 +1w>
+
+ will apply to every Wednesday, starting from the date given.
+ I believe this syntax was actually suggested by someone on
+ the mailing list, but I cannot find the email back. To
+ collect your credit, let me know!
+
+ - You can use an sexp diary entry (with the syntax used by the
+ Emacs calendar/diary) in a time stamp, like this:
+
+ *** The nerd club meets on 2nd Thursday of every month
+ <%%(diary-float t 4 2)>
+
+ - You can put diary-style sexp entries directly into an
+ org-mode file, where they will be interpreted just like they
+ would in the diary. For example
+
+ * Birthdays and similar stuff
+ #+CATEGORY: Holiday
+ %%(org-calendar-holiday) ; special function for holiday names
+ #+CATEGORY: Ann
+ %%(diary-anniversary 14 5 1956) Artur Dent %d is years old
+ %%(diary-anniversary 2 10 1869) Mahatma Gandhi
+
+ These entries must start at column 0 to be evaluated.
+
+ It turns out that evaluating the entries in an org-mode file
+ is actually faster than in the diary itself, because using
+ the diary has some overhead (creating fancy diary display,
+ then reading and re-interpreting the entries). I have moved
+ all the sexp entries from my diary into an org-mode file,
+ put in a few categories, and then turned off
+ `org-agenda-include-diary'. This has led to a noticeably
+ faster agenda display.
+
+ - New command `org-replace-region-by-html' that converts the
+ current region from org-mode syntax into HTML. For example,
+ you might write an itemized list in plain text in an HTML
+ buffer, and then invoke this command to convert it. Thanks
+ to Raman for this idea.
+
+ - When inserting a link with `C-c C-l', completion will now
+ fill in all valid link prefixes, like http or ftp, but also
+ link abbreviation prefixes. This is based on an idea by
+ Bastien.
+
+ - Highest, lowest, and default priority can be set on a
+ per-file basis with #+PRIORITIES: H L D
+ For example, to use priorities from 1 to 9, you could use
+
+ #+PRIORITIES: 1 9 9
+
+ Thanks to Dmitri Minaev for a patch to this effect.
+
+ - iCalendar export now honors (i.e. skips) subtrees marked as
+ ARCHIVE, COMMENT, or QUOTE.
+
+ - There is a new command to add or change the emphasis (like
+ bold or italic) of a piece of text. For lack of better
+ available keys the command is at `C-c C-x C-f', but you may
+ well want to choose a more convenient key like `C-c f' in
+ your private setup:
+
+ (add-hook 'org-load-hook
+ (lambda () (define-key org-mode-map "\C-cf" 'org-emphasize)))
+
+ The command will prompt for an emphasis type, and you may
+ reply either with the marker that triggers the emphasis, or
+ with the first letter of the corresponding HTML tag. For
+ example, to select italic, press either "/" or "i".
+
+ If there is an active region, the emphasis of this region
+ will be set or changed. If there is no region, only the
+ emphasis markers will be inserted and the cursor positioned
+ between them. Thanks to Bastien for proposing this feature.
+
+ - Bug fixes, everything where I have replied "fixed" on the
+ mailing list. Thanks to all of you for keeping these reports
+ coming.
+
+Version 4.74
+~~~~~~~~~~~~
+
+Overview
+========
+
+ This release is about exporting agenda views, to HTML, to
+ postscript for printing, and to a special format (CSV) for
+ further processing in scripts.
+
+Incompatible Changes
+====================
+
+ - The variable `org-agenda-remove-tags-when-in-prefix' has
+ been renamed to `org-agenda-remove-tags'.
+
+Details
+=======
+
+ - Agenda views can be exported as plain text, as HTML, and as
+ Postscript(R). This can simply be done from the agenda
+ buffer with `C-x C-w' and then specifying a filename like
+ `myagenda.html' or `myagenda.ps'. See section 8.6.4 of the
+ manual.
+
+ - Each custom agenda view can specify a list of associated
+ files names. The command `C-c a e' then creates all views
+ that have associated file names and exports the views to
+ these files. This is great for producing paper versions of
+ your views, to take with you when you don't have your
+ computer. The manual has an example on how to do this, and
+ in particular on how to customize the format of the printed
+ version. See section 8.6.4 of the manual.
+
+ - You can produce a CSV format of agenda information with an
+ Emacs batch command. This is greate for further processing
+ in scipts. Thanks to Jason F. McBrayer for this idea.
+ See section 8.6.5 of the manual.
+
+ - New variable `org-agenda-skip-deadline-if-done'. When set,
+ a deadline associated with a DONE item will not be shown in
+ the agenda. This is based upon a report by Denis Bueno.
+
+ - Quite a few bug fixes.
+
+Version 4.73
+~~~~~~~~~~~~
+
+ Minor bug fixes.
+
+Version 4.72
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Control over blank lines between trees in collapsed view.
+
+ - Info about the running clock is shown in the modeline.
+
+ - C-a can behave specially in headlines.
+
+ - Better color and scaling defaults for LaTeX fragments.
+
+ - Customizable list of keys in org-mode to be replaced.
+
+ - Stuck project descriptions have been extended.
+
+ - Emphasis code has been modified to fix some issues.
+
+ - Bug fixes.
+
+Incompatible changes
+====================
+
+ - The option `org-format-latex-options' has changed. If you
+ have customized it, please revert to default and then redo
+ your customization.
+
+ - `org-CUA-compatible' no longer modifies S-RET by default,
+ because newer versions of CUA don't use this key anymore.
+ If you need this replacement, customize the variable
+ `org-disputed-keys'.
+
+ - The variable `org-CUA-compatible' is obsolete, please use
+ `org-replace-disputed-keys' instead. `org-CUA-compatible'
+ is still an alias for this new variable, though.
+
+Details
+=======
+
+ - Better control over blank lines between trees in collapsed
+ view. This has come up several times in the past and most
+ recently by Scott Jaderholm. There is now a new variable
+ `org-cycle-separator-lines' with default value 2. It says
+ how many empty lines there need to be after the end of a
+ subtree to get an empty line in collapsed view. So with the
+ default, if you leave only one empty line it will disappear
+ in collapsed view. If you leave two, one empty line will
+ remain so that you can use double empty lines to structure
+ the collapsed views of a file. I love it, so many thanks to
+ Scott fro bringing this up again.
+
+ One property of the new setup is that you will never get
+ more than one blank line in collapsed view. We could do
+ something special to allow *several* empty lines in
+ collapsed view, but I think this is counter-productive.
+
+ In Emacs 22, if you want to make full use of this, make sure
+ that you have not set `outline-blank-line'.
+
+ - When the clock is running, Org-mode will put info about it
+ into the modeline. The info consists of the elapsed time
+ and the heading of the clocked item. This was a proposal
+ from Bastien who got the idea from Muse.
+
+ - C-a can behave specially in headlines when you set the
+ variable `org-special-ctrl-a'. It will bring the cursor
+ first back only to the beginning of the headline *text*,
+ i.e. after the stars and the TODO keyword, if any. A second
+ C-a will then move the cursor to the beginning of the line.
+ If the cursor is already at the beginning of the line, C-a
+ will spring *forward* to the headline text. This was a
+ proposal from Leo, based on a request from Scott Jaderholm.
+
+ I have not turned this turned this on by default, should I?
+
+ - When LaTeX fragments are processed into images, there is now
+ more control and (hopefully) betters defaults for colors and
+ scaling. Special values can be set for HTML export, so that
+ these values can differ from what is used for display in an
+ emacs buffer. The default foreground and background colors
+ for images embedded in emacs are now taken from the default
+ emacs face. Thanks to Xiao-Yong Jin for proposing these
+ changes.
+
+ - There is now a much better mechanism to change some keys in
+ org-mode if these keys clash with other modes you use. Turn
+ this on by setting `org-replace-disputed-keys' (aliased to
+ `org-CUA-compatible'). The list of keys to replace is now
+ fully customizable, see the option `org-disputed-keys'.
+ Many thanks to Meciej Katafiasz for a patch implementing
+ this.
+
+ - Stuck project descriptions have been extended. You can now
+ use "*" as a TODO keyword or tag to say that *any* TODO
+ keyword or TAG marks a project as non-stuck. You also can
+ give an arbitrary regular expression that, if it matches,
+ indicates a non-stuck project.
+
+ - The code for emphasis like bold, italic etc has been
+ modified - I might have broken something in the process,
+ please let me know if you find problems.
+
+ - A number of bugs have been fixed - those where I have
+ replied "Fixed" on the mailing list.
+
+Version 4.71
+~~~~~~~~~~~~
+
+Overview
+========
+
+
+Incompatible changes
+====================
+
+
+Details
+=======
+
+ - New variables to customize the header and data tags in
+ exported HTML. These are the variables
+ `org-export-table-header-tags' and
+ `org-export-table-data-tags'. This follows a request from
+ Scott Otterson.
+
+ - New option `org-format-latex-header' for customizing the
+ header of the LaTeX file used to convert embedded LaTeX to
+ images. Thanks to `Matthieu Lemerre' for the suggestion.
+
+ - The prefix version of `org-todo-list' works again. This
+ means that `C-1 C-c a t' produces the list of TODO entries
+ for the first TODO keyword. If you use different TODO setups
+ in different agenda files, be careful: This number now
+ refers to the list of *all* todo keywords used in files
+ that are scanned for the agenda.
+
+ - Many bug fixes.
+
+Version 4.70
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Dust settles after revamp of TODO keyword system.
+ - The export title can be taken from the first text line.
+ - TTY replacement keys have changed.
+
+Incompatible changes
+====================
+
+ - Some TTY replacement keys are changed, see below.
+
+Details
+=======
+
+ - Further development concerning TODO keywords.
+
+ + You can now have several DONE states in a sequence, like
+
+ #+SEQ_TODO: TODO VERIFY | DONE DELEGATED
+
+ The difference to the proposal discussed on the mailing
+ list (and which is also works!)
+
+ #+SEQ_TODO: TODO VERIFY | DONE
+ #+SEQ_TODO: | CANCELED
+
+ is that in the first case, the extra DONE states will be
+ reached with `C-c C-t' (or with `t' from the agenda), while
+ in the second case you need S-<right> to get to the special
+ states. I guess both ideas can be useful - I am leaning
+ toward using the latter.
+
+ + Setting up TODO keywords in Lisp previously used two
+ separate variables: `org-todo-keywords' and
+ `org-todo-interpretation'. The preferred way is now to use
+ only `org-todo-keywords', with a new structure:
+
+ (setq org-todo-keywords
+ '((sequence "TODO" "|" "DONE")
+ (sequence "BUG" "KNOWNCAUSE" "|" "FIXED" "IGNORED")
+ (type "Fred" "Lisa" "Peter" "|" "DONE")
+ (sequence "CANCELED") ; for things we decide to not do.
+ ))
+
+ If your setting has this new structure,
+ `org-todo-interpretation' will be ignored. This change
+ does not break backward compatibility. The old way of
+ using a flat list in `org-todo-keywords' and taking the
+ interpretation from the other variable still works.
+
+ + When listing *specific* TODO entries via a sparse tree
+ (`C-u C-c C-v') or via the agenda (`C-c a T' or `C-u C-c a
+ t'), you can now specify several keywords to be selected,
+ like "TODO|VERIFY|WAITING". This also works for custom
+ agenda commands. Thanks to Jason F. McBrayer for pointing
+ out this omission.
+
+ - If you have configured Org-mode to export also the text
+ before the first headline (this is done by setting the
+ variable `org-export-skip-text-before-1st-heading' to nil),
+ then the first normal text line in the buffer becomes the
+ title of the exported document. A title set with #+TITLE
+ overules this default, and the first line then belongs to the
+ normal text. Thanks to David House for this proposal.
+
+ - TTY replacement keys. Some of the key bindings used by
+ Org-mode do not work on a tty, so replacement key sequences
+ are provided on ttys. In version 4.70, there are some
+ changes in the tty replacements. Thanks to Jason F. McBrayer
+ for coming up with the idea to use C-c <cursor> keys.
+
+ Command Old TTY New TTY
+ org-..... Main Key Replacement Replacement
+ -------------------+-----------+---------------+---------------
+ shiftleft S-left C-c C-x left C-c left
+ shiftright S-right C-c C-x right C-c right
+ shiftup S-up C-c C-x up C-c up
+ shiftdown S-down C-c C-x down C-c down
+ shiftcontrolleft C-S-left C-c C-x left
+ shiftcontrolright C-s-right C-c C-x right
+
+
+Version 4.69
+~~~~~~~~~~~~
+
+Overview
+========
+
+ This time the changes affect the following areas:
+
+ - TODO keywords: Multiple sequences in a single file.
+ - Export: More control over text before the first heading.
+ - Export: More control over sub/superscript interpretation.
+ - Plain lists: Option to let empty lines terminate lists.
+ - Tables: New command to insert hline and move into line below.
+ - REPEATing items: Turn of note taking.
+ - Bug fixes.
+
+Incompatible changes
+====================
+
+ - It used to be possible to spread the list of TODO keywords
+ over several lines, like
+
+ #+SEQ_TODO: TODO
+ #+SEQ_TODO: PROGRESS
+ #+SEQ_TODO: DONE
+
+ This is no longer possible. Each such line now specifies an
+ independent set of TODO keywords, with its own DONE state.
+ See below for details.
+
+ - The #+TEXT construct has been used to insert unchanged HTML
+ into an exported file. This is no longer possible, the TEXT
+ lines will be processed like any other lines. However,
+ there are now much better ways of getting quoted HTML into
+ the exported file.
+
+Details
+=======
+
+ - You can now use multiple sets of TODO keywords in the same
+ buffer. For example, you may put the following three lines
+ into a file:
+
+ #+SEQ_TODO: TODO DONE
+ #+SEQ_TODO: REPORT BUG KNOWNCAUSE RESOLVED
+ #+TYP_TODO: Fred Laura Peter Me OK
+
+ Each sub-sequence has its own DONE state. It is best to use
+ different keywords in all sequences, to make sure Org-mode
+ does not loose track in which specific sequence it is
+ working. You could use the same word for all DONE states,
+ but then cycling through to a TODO state might not bring you
+ where you want to be.
+
+ After initially setting a keyword, `C-c C-t' cycles through
+ a sublist, i.e. is cycles from TODO to DONE or from
+ KNOWNCAUSE to RESOLVED and further to (nothing) and back to
+ REPORT.
+
+ S-right and S-left allow to select any keyword, so they move
+ from DONE to REPORT and from RESOLVED to Fred.
+
+ C-S-right and C-S-left jump from one sub-sequence to the
+ next, for example from TODO or DONE to REPORT to Fred.
+
+ Thanks to Rick Moynihan for triggering this development.
+
+ - Text before the first headline can now be exported if you
+ configure Org-mode accordingly. Either set the variable
+ `org-export-skip-text-before-1st-heading' to nil, or use the
+ new in-buffer option
+
+ #+OPTION: skip:nil
+
+ - Export content specified via the #+TEXT construct is now
+ fully processed, i.e. links, emphasis etc. are all
+ interpreted. #+TEXT lines may include
+ #+BEGIN_HTML...#+END_HTML sections to embed literal HTML.
+
+ - During HTML export, you can request to have a_{b}
+ interpreted as a subscript, but to leave a_b as it is. This
+ can be done by setting the variable
+ org-export-sub-superscript to the symbol `{}' with
+
+ (setq org-export-sub-superscript '{})
+
+ or by using
+
+ #+OPTIONS: ^:{}
+
+ Thanks to Eddward DeVilla for this idea.
+
+ - New variable `org-empty-line-terminates-plain-lists'.
+ Default is nil, meaning that empty lines are part of the
+ previous list item, and that you can have several paragraphs
+ in one such item. Set this to t if you want an empty line
+ terminate all levels of plain list items.
+
+ Thanks to Mike Newman for triggering this development.
+
+ - C-c RET does insert a horizontal separator line and move the
+ cursor into the table line below it. Thanks to Bastien for
+ this proposal.
+
+ - Org-mode always offers you to record a note when a TODO item
+ automatically repeats, even if you are not logging state
+ changes. The new variable `org-log-repeat' allows to turn
+ this off, so that notes are really only been taken if you
+ are logging all state changes.
+
+ - Various Bug fixes, thanks to everyone who reported.
+
+Version 4.68
+~~~~~~~~~~~~
+
+Overview
+========
+ - Priority handling in the tags view
+ - Date/time prompt follows the popup calender, and accepts AM/PM times.
+ - Standard references like B4 in the spreadsheet.
+ - Improvements to the formula editor.
+ - C-j does better indentation.
+ - Bug fixes
+
+Details
+=======
+ - Priority handling in the tags view
+
+ + Agenda lists selected by tag are now sorted by priority.
+ Thanks to Andrew Korty for reporting this omission.
+
+ - Improvements to the date/time prompt.
+
+ + When you move (using S-cursor keys) the cursor in the pop-up
+ calendar window while responding to a date/time prompt, the
+ prompt is updated with the new default date (Emacs only).
+
+ + You can now enter AM/PM times at this prompt.
+
+ - Changes in the spreadsheet
+
+ + You can now also write B4 instead of @4$2 as a reference in
+ formulas. The column references without specified row can be
+ written as C& instead of $3. Such references make formulas
+ easier to read and are now the default way how references are
+ shown when you edit existing formulas. To get the old behavior
+ back (i.e. only @row$col references), set the variable
+ `org-table-use-standard-references' to nil.
+
+ Relative references like @-3$-2 or @II..III continue to use the
+ internal format.
+
+ - Changes in the formula editor (the one you get with "C-c '")
+
+ + The formulas are organized in a more logical way.
+
+ + There is now a menu with commands.
+
+ + When starting the formula editor with "C-c '", the cursor
+ immediately moves to the formula for the current field.
+
+ + With the cursor on a reference in the formula, you can use
+ S-cursor keys to change the field being referenced.
+
+ - C-j indents the following line correctly whe used in a headline
+ or in aplain list item. Thanks to Leo for this suggestion.
+
+ - Bug fixes
+
+ + Flyspell now knows about special org-mode commands.
+ Thanks to Vinod Valsalam for reporting this problem, and to
+ Andrew Korty for showing how to fix it.
+
+ + Most other bugs discussed recently on emacs-orgmode@gnu.org
+ should be fixed, except the problem with non-ASCII characters
+ in tags....
+
+Version 4.67
+~~~~~~~~~~~~
+
+ - Expert mode for fast tag selection.
+ When org-fast-tag-selection-single-key is `expert', not even
+ the selection window is shown, only the prompt. One more C-c
+ gets you the window, another one goes to multiple selection mode.
+
+ - Synchronized with Emacs once more: Emacs CVS has now org-mode
+ 4.67. At least until it causes a problem, then the Emacs people
+ will switch back to 4.56. Lets hope there will be no problem.
+
+ - Code cleanup
+
+ - Bug fixes
+
+Version 4.66
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Sorting of top-level entries works now if the region contains
+ top-level entries, or if the cursor is before the first headline.
+ Thanks to "redblue" for reporting this bug.
+
+ - When entering date and time at the prompt, you can now mix
+ entering text and selecting something in the calendar. For
+ example, enter 22:15 at the prompt without pressing RET, and then
+ click on a date in the calendar. Both pieces of information will
+ be included in the resulting time stamp. You can also use
+ S-curser to move the cursor in the calendar to the desired date
+ and then enter 22:15 and press RET at the prompt.
+
+ - When setting a deadline or a schedule, entering a time now
+ automatically selects the time stamp format that includes the
+ time. Bug report (by means of a question) from Bastre.
+
+ - C-c C-l can be used to convert a plain link into a bracket link.
+
+ - Internal links now match inside (the visible part of) other
+ links. Thanks to Scott Otterson for reporting this bug.
+
+ - iCalendar export of TODO items fixed, see also the variable
+ `org-icalendar-include-todo'. Thanks to Philipp Raschdorf.
+
+ - The number of levels in the table of contents of an exported
+ document can now be set independently of the number of headline
+ levels. For example:
+
+ #+OPTIONS: H:4 toc:2
+
+ - The command `C-c }' toggles the display of row and column numbers
+ the the current table, to aid constructing formulas. To try it,
+ move the cursor to a table and press `C-c }', or use the menu
+ entry.
+
+ - Orgtbl translation functions (introduced in 4.65) have been
+ simplified using a generic function `orgtbl-to-generic' that can
+ be used for very general languanges. Writing your own translator
+ should be very easy now. More info in the manual.
+
+ - CONTENTS visibility can be limited to a certain level. The
+ command `C-3 S-TAB' will switch to CONTENTS view and show the
+ first 3 levels.
+
+ - Bug fixes.
+
+Version 4.65
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Orgtbl can be used to maintain tables in LaTeX, and in any other mode
+ - Editing Lisp formulas for tables improved.
+ - Better structure for HTML exported tables.
+ - New "calculation" marker "/" to mark lines that should not be exported.
+
+Detailed description of changes
+===============================
+
+ - You can use orgtbl mode to maintain a LaTeX table, or pretty much
+ any table in any mode.
+
+ This does *not* work by making Orgtbl aware of LaTeX syntax. That
+ would be a box of Pandora I am not willing to open. Instead, you
+ use a normal Orgtbl-mode table, and a converter program to
+ automatically place a LaTeX version of the table into the correct
+ spot in the LaTeX file. The orgtbl-mode table can be maintained
+ inside the same file, in a block comment.
+
+ I am providing translators for LaTeX, HTML, and TeXInfo. For
+ other applications, you need to write one yourself - but that is
+ not hard if you start from the LaTeX version and just modify it.
+ Thanks to Thomas Baumann for triggering this development through
+ a request for a table-to-LaTeX converter.
+
+ - In the special buffer to edit the formulas of a table (created
+ with "C-c '"), there is now better support for editing Lisp
+ formulas. TAB and M-TAB work like in an Emacs Lisp buffer,
+ indenting lines and completing lisp symbols. With the cursor on
+ a line defining a complex Lisp formula, a first press on TAB will
+ convert the formula into a pretty-printed version with proper
+ linebreaks and indentation. A second TAB folds the line back to
+ the compact form.
+
+ - Tables in HTML export have now additional structure elements
+ defined. The header (before the first hline) is wrapped into
+ <thead>..</thead>, and each part of the body (as separated in
+ org-mode by hlines) is wrapped into <tbody>..</tbody> tags. I
+ have also changed the CSS style for <td> fields and the value of
+ `org-export-html-table-tag' to get cleaner tables. Basically,
+ tables now have horizontal lines only where needed, and no
+ vertical lines at all, as generally recommended for tables in
+ printed text. I like the new look, but I am not sure if this
+ change will find general approval, please throw in your view if
+ you like. Thanks to Scott for driving this, and to goud-H for
+ pointing me to the row grouping in tables.
+
+ - In a table with calculation markers in the first column, you can
+ now also put "/" into the first column. It indicates that this
+ line should not be exported. The foremost application for this
+ are lines containing only "<N>" markers for narrowing columns.
+
+Version 4.64
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Email links get better, configurable descriptions
+ - When inserting a link, selected text becomes the description
+ - Easier access to the list of stored links.
+ - Horizontal lines in HTML export.
+ - Remember templates and storing of notes improved.
+
+
+Detailed description of changes
+================================
+
+ - The descriptive part of links to email messages can be configured
+ using the variable `org-email-link-description-format'. The new
+ default is "Email %c: %.30s" and leads to
+
+ Email from NAME: SUBJECT
+
+ If you configure the variable `org-from-is-user-regexp'
+ correctly, then for email you *sent* this will actually change to
+
+ Email to NAME: SUBJECT
+
+ The subject is limited to 30 characters. If you have become
+ attached to the previous default (look twice, the new one is
+ better), use "%f on: %s" as your format.
+
+ - Selecting text before entering a new link with C-c C-l now really
+ works, the selected text becomes the description part of the
+ link. Requested by Scott, buggy 4.62 implementation is now fixed.
+
+ - Stored links are part of the history list for C-c C-l, so to
+ reach them, you can use up/down rather than completion. Thanks
+ to Raman for this excellent idea.
+
+ - A line consisting only of "-", and at least 5 of them, is
+ exported into HTML as <hr/>, as proposed by Giovanni Ridolfi.
+
+ - Several changes to org <-> remember integration
+
+ - You can use `org-remember' as your default command to start
+ remember. It will automatically detect if there is an active
+ region and use it as initial content (we will probably make
+ remember.el work like this as well).
+ Also, when calling `org-remember' in a remember buffer that
+ was created with a template, you will again be asked to
+ select a template. The buffer is then re-created with the
+ new template, but the old context information. This is
+ useful if you change your mind about the template to use
+ (Leo's idea).
+
+ - Besides specifying a default *target* file for a note, you
+ can also give a default *heading* of which the note should
+ become a subitem. In many cases this avoids or speeds up
+ navigating to the right location. Both file and heading can
+ be different for each template. Both are non-binding, you
+ can change them while storing the note. However, when you
+ exit remember with C-u C-c C-c, these defaults will be used
+ without interaction.
+
+ - Templates can specify interactive fields. During expansion
+ of the template, you will be prompted for the information in
+ that field. For example %^t will pop up a calendar and ask
+ you to select a date. This new feature follows a proposal
+ from Leo, who in the mean time has said he does not need it
+ anymore. But I liked it, so here it is :-)
+
+ - Templates can access information specific to the link type
+ created, for example the author and subject of an email.
+ Syntax is %:fromname, %:fromaddress, %:subject etc, details
+ in the manual. Proposed by Peder O. Klingenberg.
+
+ - I have been considering to move, at some stage, the template
+ functionality into remember.el itself - which would of course
+ require consent of the remember.el maintainers. I am not
+ sure how well this would work though, since some things like
+ the interactive time stamps are org.el specific, so treating
+ them would require special hooks. Comments?
+
+
+Version 4.63
+~~~~~~~~~~~~
+ - Bug fixes
+
+Version 4.62
+~~~~~~~~~~~~
+ - Many changes to the spreadsheet functions in the table editor.
+ For details, please re-read the manual section 3.4.
+ + New Features
+ - It is much easier to assign formulas to individual fields.
+ - References to arbitrary fields and ranges.
+ - Absolute references are modified in row-editing commands.
+ - Formula editor that highlights referenced fields.
+ + Incompatible changes
+ - Empty fields are excluded in range references, see "E" mode flag.
+ - &... ranges no longer supported, use new @... ranges.
+ - Variable insertion into Lisp formulas work differently.
+ - Selected text becomes the default description for C-c C-l links.(Scott)
+ - The date format in the agenda/timeline views is now customizable.
+ See the new option `org-agenda-date-format'. (request by Victor)
+ - Link abbreviations no longer need a double colon, single colon is fine.
+ - Bug fixes.
+
+Version 4.61
+~~~~~~~~~~~~
+ - Avoiding keybinding clashes with flyspell
+ - Archiving is now also on `C-C C-x C-s' (was just `C-c $')
+ - Cycling through agenda files is now also on "C-'" (was just "C-,")
+ - Colon is considered part of number, to align times in clock tables.
+ - Fixed bug for list of stuck projects.
+ - Fixed several bugs/problems concerning linking to gnus.
+ - Block agendas can contain the list of stuck projects.
+ - #+ARCHIVE may now appear several times in the buffer.
+ - More bug fixes.
+
+Version 4.60
+~~~~~~~~~~~~
+ - HTML export: inlining images, clickable images (manual 10.2.4).
+ - Incremental search now shows proper context when exiting.
+ - Tables calculation and Calc package.
+ - Calc is no longer needed when using only elisp formulas.
+ - Proper error messages when calc is needed and not available.
+ - Tracking TODO state changes with time stamps and notes.
+ - Empty entries go full circle.
+ - Links in iCalendar export cleaned up.
+ - Bug fixes.
+
+
+Version 4.59
+~~~~~~~~~~~~
+ - Cleanup code, bug fixes.
+
+Version 4.58
+~~~~~~~~~~~~
+ - Full undo support in the agenda buffer.
+ - Listing stuck GTD projects (projects without any NEXT ACTIONS).
+ Configure `org-stuck-projects' before using it.
+ - C-c C-x b shows the current subtree in an indirect buffer, in
+ another, dedicated frame.
+ - Custom agenda commands take precedence over builtin commands.
+ - auto-fill for comments works on the Emacs side, XEmacs not yet.
+
+Version 4.57
+~~~~~~~~~~~~
+ - Sorting of outline items on same level.
+ - Sorting tables automatically selects line range between hlines.
+ - Changes in Agenda buffer
+ - `C-c C-o' follows a link in the current line.
+ - `C-c $' archives the subtree corresponding to the line.
+ - Changing dates with S-left and S-right show new date in agenda,
+ but still do not move the entry to the new date.
+ - new option `org-agenda-skip-scheduled-if-done'.
+ - Agenda and sparse tree construction using tag matches can now
+ use regular expressions.
+ - When prompted for a date/time, entering "+7" indicates a date
+ 7 days from now - but only this is the only thing you give.
+ - Custom time formats also apply to exported html and ascii.
+ - Bug fixes.
+
+Version 4.56
+~~~~~~~~~~~~
+ - `C-k' in agenda kills current line and corresponding subtree in file.
+ - XEmacs compatibility issues fixed, in particular tag alignment.
+ - M-left/right now in/outdents plain list items, no Shift needed.
+ - Bug fixes.
+
+Version 4.55
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.54
+~~~~~~~~~~~~
+ - Improvements to fast tag selection
+ + show status also in target line.
+ + option to auto-exit after first change to tags list (see manual).
+ - Tags sparse trees now also respect the settings in
+ `org-show-hierarchy-above' and `org-show-following-heading'.
+ - Bug fixes.
+
+Version 4.53
+~~~~~~~~~~~~
+ - Custom time formats can be overlayed over time stamps.
+ - New option `org-agenda-todo-ignore-deadlines'.
+ - Work-around for flyspell bug (CVS Emacs has this fixed in flyspell.el).
+ - Work-around for session.el problem with circular data structures.
+ - Bug fixes.
+
+Version 4.52
+~~~~~~~~~~~~
+ - TAG matches can also specify conditions on TODO keywords.
+ - The fast tag interface allows setting tags that are not in the
+ predefined list.
+ - Bug fixes.
+
+Version 4.51
+~~~~~~~~~~~~
+ - Link abbreviations (manual section 4.5).
+ - More control over how agenda is displayed. See the new variables
+ `org-agenda-window-setup', `org-agenda-restore-windows-after-quit'.
+ - Bug fixes.
+
+Version 4.50
+~~~~~~~~~~~~
+ - Closing a TODO item can record an additional note.
+ See variables `org-log-done' and `org-log-note-headings'.
+ - Inserting headlines and bullets can leave an extra blank line.
+ See variable `org-blank-before-new-entry'. (Ed Hirgelt patch)
+ - [bracket links] in the agenda are active just as in org-mode buffers.
+ - C-c C-o on a date range displays the agenda for exactly this range.
+ - The default for `org-cycle-include-plain-lists' is back to nil.
+ - Calls to `org-occur' can be stacked by using a prefix argument.
+ - The options `org-show-hierarchy-above' and `org-show-following-heading'
+ now always default to `t', but can be customized differently for
+ different types of sparse trees or jump commands.
+ - Bug fixes.
+
+
+Version 4.49
+~~~~~~~~~~~~
+ - Agenda views can be made in batch mode from the command line.
+ - `org-store-link' does the right thing in dired-mode.
+ - File links can contain environment variables.
+ - Full Emacs 21 compatibility has been restored.
+ - Bug fixes.
+
+Version 4.47
+~~~~~~~~~~~~
+ - Custom commands may produce an agenda which contains several blocks,
+ each block created by a different agenda command.
+ - Agenda commands can be restricted to the current file, region, subtree.
+ - The timeline command must now be called through the agenda
+ dispatcher (C-c a L). `C-c C-r' no longer works.
+ - Agenda items can be sorted by tag. The *last* tag is used for this.
+ - The prefix and the sorting strategy for agenda items can depend
+ upon the agenda type.
+ - The handling of `[mailto:'] links can be customized, see the new
+ variable `org-link-mailto-program'.
+ - `mailto' links can specify a subject after a double colon,
+ like [mailto:carsten@orgmode.org::Org-mode is buggy].
+ - In the #+STARTUP line, M-TAB completes valid keywords.
+ - In the #+TAGS: line, M-TAB after ":" inserts all currently used tags.
+ - Again full Emacs 21 support: Checkboxes and publishing are fixed.
+ - More minor bug fixes.
+
+Version 4.45
+~~~~~~~~~~~~
+ - Checkbox lists can show statistics about checked items.
+ - C-TAB will cycle the visibility of archived subtrees.
+ - Documentation about checkboxes has been moved to chapter 5.
+ - Bux fixes.
+
+Version 4.44
+~~~~~~~~~~~~
+ - Clock table can be done for a limited time interval.
+ - Obsolete support for the old outline mode has been removed.
+ - Bug fixes and code cleaning.
+
+Version 4.43
+~~~~~~~~~~~~
+ - Bug fixes
+ - `s' key in the agenda saves all org-mode buffers.
+
+Version 4.41
+~~~~~~~~~~~~
+ - Shift-curser keys can modify inactive time stamps (inactive time
+ stamps are the ones in [...] brackets.
+ - Toggle all checkboxes in a region/below a headline.
+ - Bug fixes.
+
+Version 4.40
+~~~~~~~~~~~~
+ - Bug fixes.
+
+
+Version 4.39
+~~~~~~~~~~~~
+ - Special tag ARCHIVE keeps a subtree closed and away from agenda lists.
+ - LaTeX code in Org-mode files can be converted to images for HTML.
+ - Bug fixes.
+ - CDLaTeX-mode features can be used in Org-mode to help inserting
+ LaTeX environment and math.
+
+Version 4.38
+~~~~~~~~~~~~
+ - noutline.el is now required (important for XEmacs users only).
+ - Dynamic blocks.
+ - Archiving of all level 1 trees without open TODO items.
+ - Clock reports can be inserted into the file in a special section.
+ - FAQ removed from the manual, now only on the web.
+ - Bug fixes.
+
+Version 4.37
+~~~~~~~~~~~~
+ - Clock-feature for measuring time spent on specific items.
+ - Improved emphasizing allows configuration and stacking.
+
+Version 4.36
+~~~~~~~~~~~~
+ - Improved indentation of ASCII export, when headlines become items.
+ - Handling of 12am and 12pm fixed. Times beyond 24:00 can be used
+ and will not lead to conflicts.
+ - Support for mutually exclusive TAGS with the fast tags interface.
+ - Bug fixes.
+
+Version 4.35
+~~~~~~~~~~~~
+ - HTML export is now valid XHTML.
+ - Timeline can also show dates without entries. See new option
+ `org-timeline-show-empty-dates'.
+ - The bullets created by the ASCII exporter can now be configured.
+ See the new option `org-export-ascii-bullets'.
+ - New face `org-upcoming-deadline' (was `org-scheduled-previously').
+ - New function `org-context' to allow testing for local context.
+
+Version 4.34
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.33
+~~~~~~~~~~~~
+ - New commands to move through plain lists: S-up and S-down.
+ - Bug fixes and documentation update.
+
+Version 4.32
+~~~~~~~~~~~~
+ - Fast (single-key-per-tag) interface for setting TAGS.
+ - The list of legal tags can be configured globally and locally.
+ - Elisp and Info links (thanks to Todd Neal).
+ - `org-export-publishing-directory' can be an alist, with different
+ directories for different export types.
+ - All context-sensitive commands use `call-interactively' to dispatch.
+ - `org-confirm-shell-links' renamed to `org-confirm-shell-link-function'.
+ - Bug fixes.
+
+Version 4.31
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.30
+~~~~~~~~~~~~
+ - Modified installation: Autoloads have been collected in org-install.el.
+ - Logging (org-log-done) is now a #+STARTUP option.
+ - Checkboxes in plain list items, following up on Frank Ruell's idea.
+ - File links inserted with C-c C-l will use relative paths if the linked
+ file is in the current directory or a subdirectory of it.
+ - New variable `org-link-file-path-type' to specify preference for
+ relative and absolute paths.
+ - New CSS classes for tags, timestamps, timestamp keywords.
+ - Bug and typo fixes.
+
+
+Version 4.29
+~~~~~~~~~~~~
+ - Inlining images in HTML export now depends on wheather the link
+ contains a description or not.
+ - TODO items can be scheduled from the global TODO list using C-c C-s.
+ - TODO items already scheduled can be made to disappear from the global
+ todo list, see `org-agenda-todo-ignore-scheduled'.
+ - In Tables, formulas may also be Lisp forms.
+ - Exporting the visible part of an outline with `C-c C-x v' works now
+ for all available exporters.
+ - Bug fixes, lots of them :-(
+
+Version 4.28
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.27
+~~~~~~~~~~~~
+ - HTML exporter generalized to receive external options.
+ As part of the process, author, email and date have been moved to the
+ end of the HTML file.
+ - Support for customizable file search in file links.
+ - BibTeX database links as first application of the above.
+ - New option `org-agenda-todo-list-sublevels' to turn off listing TODO
+ entries that are sublevels of another TODO entry.
+
+Version 4.26
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.25
+~~~~~~~~~~~~
+ - Revision of the font-lock faces section, with better tty support.
+ - TODO keywords in Agenda buffer are fontified.
+ - Export converts links between .org files to links between .html files.
+ - Better support for bold/italic/underline emphasis.
+
+Version 4.24
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.23
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.22
+~~~~~~~~~~~~
+ - Bug fixes.
+ - In agenda buffer, mouse-1 no longer follows link.
+ See `org-agenda-mouse-1-follows-link' and `org-mouse-1-follows-link'.
+
+Version 4.20
+~~~~~~~~~~~~
+ - Links use now the [description] format by default.
+ When inserting links, the user is prompted for a description.
+ - If a link has a description, only the description is displayed
+ the link part is hidden. Use C-c C-l to edit the link part.
+ - TAGS are now bold, but in the same color as the headline.
+ - The width of a table column can be limited by using a field "<N>".
+ - New structure for the customization tree.
+ - Bug fixes.
+
+
+Version 4.13
+~~~~~~~~~~~~
+ - The list of agenda files can be maintainted in an external file.
+ - Bug fixes.
+
+Version 4.12
+~~~~~~~~~~~~
+ - Templates for remember buffer. Note that the remember setup changes.
+ To set up templates, see `org-remember-templates'.
+ - The time in new time stamps can be rounded, see new option
+ `org-time-stamp-rounding-minutes'.
+ - Bug fixes (there are *always* more bugs).
+
+[...]
+
+Version 4.00
+ - Headlines can contain TAGS, and Org-mode can produced a list
+ of matching headlines based on a TAG search expression.
+ - `org-agenda' has now become a dispatcher that will produce the agenda
+ and other views on org-mode data with an additional keypress.
+
+
+Version 3.24
+~~~~~~~~~~~~
+ - Switching and item to DONE records a time stamp when the variable
+ `org-log-done' is turned on. Default is off.
+
+Version 3.23
+~~~~~~~~~~~~
+ - M-RET makes new items as well as new headings.
+ - Various small bug fixes
+
+Version 3.22
+~~~~~~~~~~~~
+ - CamelCase words link to other locations in the same file.
+ - File links accept search options, to link to specific locations.
+ - Plain list items can be folded with `org-cycle'. See new option
+ `org-cycle-include-plain-lists'.
+ - Sparse trees for specific TODO keywords through numeric prefix
+ argument to `C-c C-v'.
+ - Global TODO list, also for specific keywords.
+ - Matches in sparse trees are highlighted (highlights disappear with
+ next buffer change due to editing).
+
+Version 3.21
+~~~~~~~~~~~~
+ - Improved CSS support for the HTML export. Thanks to Christian Egli.
+ - Editing support for hand-formatted lists
+ - M-S-cursor keys handle plain list items
+ - C-c C-c renumbers ordered plain lists
+
+Version 3.20
+~~~~~~~~~~~~
+ - There is finally an option to make TAB jump over horizontal lines
+ in tables instead of creating a new line before that line.
+ The option is `org-table-tab-jumps-over-hlines', default nil.
+ - New command for sorting tables, on `C-c ^'.
+ - Changes to the HTML exporter
+ - hand-formatted lists are exported correctly, similar to
+ markdown lists. Nested lists are possible. See the docstring
+ of the variable `org-export-plain-list-max-depth'.
+ - cleaned up to produce valid HTML 4.0 (transitional).
+ - support for cascading style sheets.
+ - New command to cycle through all agenda files, on C-,
+ - C-c [ can now also be used to change the sequence of agenda files.
+
+
+Version 3.19
+~~~~~~~~~~~~
+ - Bug fixes
+
+Version 3.18
+~~~~~~~~~~~~
+ - Export of calendar information in the standard iCalendar format.
+ - Some bug fixes.
+
+Version 3.17
+~~~~~~~~~~~~
+ - HTML export specifies character set depending on coding-system.
+
+Version 3.16
+~~~~~~~~~~~~
+ - In tables, directly after the field motion commands like TAB and RET,
+ typing a character will blank the field. Can be turned off with
+ variable `org-table-auto-blank-field'.
+ - Inactive timestamps with `C-c !'. These do not trigger the agenda
+ and are not linked to the calendar.
+ - Additional key bindings to allow Org-mode to function on a tty emacs.
+ - `C-c C-h' prefix key replaced by `C-c C-x', and `C-c C-x C-h' replaced
+ by `C-c C-x b' (b=Browser). This was necessary to recover the
+ standard meaning of C-h after a prefix key (show prefix bindings).
+
+Version 3.15
+~~~~~~~~~~~~
+ - QUOTE keyword at the beginning of an entry causes fixed-width export
+ of unmodified entry text. `C-c :' toggles this keyword.
+ - New face `org-special-keyword' which is used for COMMENT, QUOTE,
+ DEADLINE and SCHEDULED, and priority cookies. Default is only a weak
+ color, to reduce the amount of aggressive color in the buffer.
+
+Version 3.14
+~~~~~~~~~~~~
+ - Formulas for individual fields in table.
+ - Automatic recalculation in calculating tables.
+ - Named fields and columns in tables.
+ - Fixed bug with calling `org-archive' several times in a row.
+
+Version 3.13
+~~~~~~~~~~~~
+ - Efficiency improvements: Fewer table re-alignments needed.
+ - New special lines in tables, for defining names for individual cells.
+
+Version 3.12
+~~~~~~~~~~~~
+ - Tables can store formulas (one per column) and compute fields.
+ Not quite like a full spreadsheet, but very powerful.
+ - table.el keybinding is now `C-c ~'.
+ - Numeric argument to org-cycle does `show-subtree' above on level ARG.
+ - Small changes to keys in agenda buffer. Affected keys:
+ [w] weekly view; [d] daily view; [D] toggle diary inclusion.
+ - Bug fixes.
+
+Version 3.11
+~~~~~~~~~~~~
+ - Links inserted with C-c C-l are now by default enclosed in angle
+ brackets. See the new variable `org-link-format'.
+ - ">" terminates a link, this is a way to have several links in a line.
+ Both "<" and ">" are no longer allowed as characters in a link.
+ - Archiving of finished tasks.
+ - C-<up>/<down> bindings removed, to allow access to paragraph commands.
+ - Compatibility with CUA-mode (see variable `org-CUA-compatible').
+ - Compatibility problems with viper-mode fixed.
+ - Improved html export of tables.
+ - Various clean-up changes.
+
+Version 3.10
+~~~~~~~~~~~~
+ - Using `define-derived-mode' to derive `org-mode' from `outline-mode'.
+
+
+Version 3.09
+~~~~~~~~~~~~
+ - Time-of-day specifications in agenda are extracted and placed
+ into the prefix. Timed entries can be placed into a time grid for
+ day.
+
+Version 3.08
+~~~~~~~~~~~~
+ - "|" no longer allowed as part of a link, to allow links in tables.
+ - The prefix of items in the agenda buffer can be configured.
+ - Cleanup.
+
+Version 3.07
+~~~~~~~~~~~~
+ - Some folding inconsistencies removed.
+ - BBDB links to company-only entries.
+ - Bug fixes and global cleanup.
+
+Version 3.06
+~~~~~~~~~~~~
+ - M-S-RET inserts a new TODO heading.
+ - New startup option `content'.
+ - Better visual response when TODO items in agenda change status.
+ - Window positioning after visibility state changes optimized and made
+ configurable. See `org-cycle-hook' and `org-occur-hook'.
+
+Version 3.05
+~~~~~~~~~~~~
+ - Agenda entries from the diary are linked to the diary file, so
+ adding and editing diary entries can be done directly from the agenda.
+ - Many calendar/diary commands available directly from agenda.
+ - Field copying in tables with S-RET does increment.
+ - C-c C-x C-v extracts the visible part of the buffer for printing.
+ - Moving subtrees up and down preserves the whitespace at the tree end.
+
+Version 3.04
+~~~~~~~~~~~~
+ - Table editor optimized to need fewer realignments, and to keep
+ table shape when typing in fields.
+ - A new minor mode, orgtbl-mode, introduces the Org-mode table editor
+ into arbitrary major modes.
+ - Fixed bug with realignment in XEmacs.
+ - Startup options can be set with special #+STARTUP line.
+ - Heading following a match in org-occur can be suppressed.
+
+Version 3.03
+~~~~~~~~~~~~
+ - Copyright transfer to the FSF.
+ - Effect of C-u and C-u C-u in org-timeline swapped.
+ - Timeline now always contains today, and `.' jumps to it.
+ - Table editor:
+ - cut and paste of rectangular regions in tables
+ - command to convert org-mode table to table.el table and back
+ - command to treat several cells like a paragraph and fill it
+ - command to convert a buffer region to a table
+ - import/export tables as tab-separated files (exchange with Excel)
+ - Agenda:
+ - Sorting mechanism for agenda items rewritten from scratch.
+ - Sorting fully configurable.
+ - Entries specifying a time are sorted together.
+ - Completion also covers option keywords after `#-'.
+ - Bug fixes.
+
+Version 3.01
+~~~~~~~~~~~~
+ - New reference card, thanks to Philip Rooke for creating it.
+ - Single file agenda renamed to "Timeline". It no longer shows
+ warnings about upcoming deadlines/overdue scheduled items.
+ That functionality is now limited to the (multifile) agenda.
+ - When reading a date, the calendar can be manipulated with keys.
+ - Link support for RMAIL and Wanderlust (from planner.el, untested).
+ - Minor bug fixes and documentation improvements.
+
+Version 3.00
+~~~~~~~~~~~~
+ - Multifile Agenda shows current entries from many different files.
+ - TeXInfo documentation (thanks to Christian Egli for the conversion).
+ - Additional applications for TODO keywords, see documentation.
+ Different files may have different TODO keywords etc.
+ - Priorities for TODO items.
+ - The browser mode used by `org-remember-handler' is improved.
+ - Images get inlined in HTML export (thanks to Carsten Wimmer).
+ - File links can contain line numbers, like [file:/usr/etc/config:255]
+ - Minor bug fixes.
+
+
+Version 2.10
+~~~~~~~~~~~~
+ - TODO entries can have additional states besides TODO and DONE.
+ See new variable `org-todo-keywords'.
+ - TODO keywords can be interpreted as categories. See variable
+ `org-todo-interpretation'.
+ - M-TAB completion on TODO keywords, TeX symbols, and normal words.
+ - All keywords (like TODO, DEADLINE etc) are configurable.
+ - Cursor positioning optimized after pro/demotion and TODO cycling.
+ - Emphasizing in HTML works now for *bold*, /italic/ and _underline_.
+ - New commands to kill, copy and yank entire subtrees. Yanking
+ modifies the level of the tree before insertion.
+ - New command `org-goto' (C-c C-j) to quickly move to other locations
+ in the buffer without affecting outline visibility.
+ - Hooks for John Wiegley's remember.el.
+ - `org-read-date' pops up calendar for date selection with the mouse.
+ See variable `org-popup-calendar-for-date-prompt'.
+
+Version 2.6
+~~~~~~~~~~~
+ - TODO items can be SCHEDULED to a certain date.
+ - Expired DEADLINEs are ignored if in an entry marked DONE.
+ - From the diary or time-sorted view (C-c C-r), C-c C-t can be used to
+ change the TODO state of an item remotely.
+ - Horizontal computations in table editor. See `org-table-eval-formula'.
+ - Fixed bug with summing tables (command `org-table-sum', `C-c +').
+ - Calendar window follows the timestamp when a timestamp is changed.
+ New variable `org-calendar-follow-timestamp-change'.
+ - Time-sorted view (`org-diary-view', C-c C-r) now uses the prefix
+ argument to force inclusion of unscheduled TODO items.
+ - New variable `org-confirm-shell-links' to turn of safety query.
+ - New variable `org-open-non-existing-files'.
+
+Version 2.4
+~~~~~~~~~~~
+ - A time-sorted view on all time stamps can be created with C-c C-r.
+ - Timestamps and Deadlines can be shown in the Emacs diary.
+ - Date ranges introduced.
+ - Time-string formats are no longer configurable.
+ - Vertical lines in tables can be made invisible with `C-c |'.
+ - New "link" type to execute shell commands, like "[shell:ls] *.org"
+ - Upon export, "myfile.org" becomes "myfile.html" or "myfile.txt",
+ instead of "myfile.org.html" or "myfile.org.txt".
+ - When the cursor is in the white space at the beginning of a line,
+ TAB removes the whitespace before indenting again.
+
+Version 2.0
+~~~~~~~~~~~
+ - Windows (NT/2000) support.
+ - Works with both Emacs and XEmacs.
+ - Fully automatic table editor.
+ - New link types into Gnus, VM and BBDB.
+ - Other link system changes
+ - Time stamps are treated as links to the calendar.
+ - Easy creation of links with global command `org-store-link'.
+ - Insertion of links with `C-c C-l' works differently now.
+ - Space characters allowed as part of a link.
+ - Options in `org-file-apps' extended. The command may now be
+ symbol 'emacs', or a lisp form.
+ Please re-read the manual section about links.
+ - Timestamp changes
+ - `org-deadline' now prompts for a date.
+ - A line can now contain several timestamps. Updating of a
+ timestamp only happens if the cursor is at the timestamp.
+ - Changed the time-stamp-format to ISO, to make sure it will
+ always work (non-English month names had caused problems
+ with `parse-time-string'.). Changing the time stamp format
+ is not recommended.
+ - Picture mode enhancements have been removed from org.el
+
+
+Version 1.4
+~~~~~~~~~~~
+ - Some option name changes, not backward compatible.
+ - ASCII exporter upgrade: Table of contents.
+ - HTML exporter upgrade: fixed-width regions, better
+ sub/superscripts, many TeX symbols supported.
+ - Calendar support.
+
+Version 1.3
+~~~~~~~~~~~
+ - HTML exporter upgrade, in particular table of contents
+
+
+
diff --git a/ORGWEBPAGE/faq.html b/ORGWEBPAGE/faq.html
new file mode 100644
index 0000000..eb293c8
--- /dev/null
+++ b/ORGWEBPAGE/faq.html
@@ -0,0 +1,555 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-mode Frequently Asked Questions</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2007/09/10 07:06:01"/>
+<meta name="author" content="Carsten Dominik"/>
+<link rel=stylesheet href="freeshell2.css" type="text/css"> <style type="text/css"> .tag { color: red; font-weight:bold}</style>
+</head><body>
+<h1 class="title">Org-mode Frequently Asked Questions</h1>
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">1 General</a>
+<ul>
+<li><a href="#sec-2">1.1 Use features in other modes</a></li>
+<li><a href="#sec-3">1.2 Visibility cycling in Outline-mode and Outline-minor-mode</a></li>
+</ul>
+</li>
+<li><a href="#sec-4">2 Errors</a>
+<ul>
+<li><a href="#sec-5">2.1 <code>(wrong-type-argument keymapp nil)</code></a></li>
+<li><a href="#sec-6">2.2 CUA mode does not work with Org-mode</a></li>
+<li><a href="#sec-7">2.3 <code>winddmove.el</code> does not work with Org-mode.</a></li>
+</ul>
+</li>
+<li><a href="#sec-8">3 Setup and Structure</a>
+<ul>
+<li><a href="#sec-9">3.1 Org-mode as default mode</a></li>
+<li><a href="#sec-10">3.2 Get rid of extra stars in outline</a></li>
+<li><a href="#sec-11">3.3 Two windows on same Org-mode file</a></li>
+<li><a href="#sec-12">3.4 Insert empty lines before new headings and plain list items</a></li>
+<li><a href="#sec-13">3.5 Amount of context in sparse trees</a></li>
+<li><a href="#sec-14">3.6 Stacking calls to org-occur</a></li>
+</ul>
+</li>
+<li><a href="#sec-15">4 Hyperlinks</a>
+<ul>
+<li><a href="#sec-16">4.1 Confirmation for shell and elisp links</a></li>
+<li><a href="#sec-17">4.2 Use RET or TAB to follow a link</a></li>
+<li><a href="#sec-18">4.3 Clicking on a link without activating it</a></li>
+</ul>
+</li>
+<li><a href="#sec-19">5 Export</a>
+<ul>
+<li><a href="#sec-20">5.1 Make TODO entries items, not headlines in HTML export</a></li>
+<li><a href="#sec-21">5.2 Export only a subtree</a></li>
+<li><a href="#sec-22">5.3 How to import org-mode calendar data into Mac OSX ical</a></li>
+</ul>
+</li>
+<li><a href="#sec-23">6 Tables</a>
+<ul>
+<li><a href="#sec-24">6.1 #ERROR fields in tables</a></li>
+<li><a href="#sec-25">6.2 Unwanted new lines in table</a></li>
+<li><a href="#sec-26">6.3 Automatic detection of formulas</a></li>
+<li><a href="#sec-27">6.4 Change indentation of a table</a></li>
+<li><a href="#sec-28">6.5 Performance issues with table alignment</a></li>
+<li><a href="#sec-29">6.6 Performance issues with table calculation</a></li>
+<li><a href="#sec-30">6.7 Incrementing numbers</a></li>
+</ul>
+</li>
+<li><a href="#sec-31">7 Agenda</a>
+<ul>
+<li><a href="#sec-32">7.1 Include Org-mode agenda into Emacs diary</a></li>
+</ul>
+</li>
+</ul>
+
+<h2 id="sec-1">1 General</h2>
+
+
+<h3 id="sec-2">1.1 Use features in other modes</h3>
+
+<p><b>I would like to use editing features of org-mode in other modes, is this possible?</b>
+</p>
+<p>
+Not really. For tables there is <code>orgtbl-mode</code> which implements the
+table editor as a minor mode. For other features you need to switch to
+Org-mode temporarily, or prepare text in a different buffer.
+</p>
+
+
+<h3 id="sec-3">1.2 Visibility cycling in Outline-mode and Outline-minor-mode</h3>
+
+
+<p>
+<b>Can I get the visibility-cycling features in outline-mode and outline-minor-mode?</b>
+</p>
+<p>
+Yes, these functions are written in a way that they are independent of
+the outline setup. The following setup provides standard Org-mode
+functionality in outline-mode on <code>TAB</code> and <code>S-TAB</code>. For
+outline-minor-mode, we use <code>C-TAB</code> instead of <code>TAB</code>,
+because <code>TAB</code> usually has mode-specific tasks.
+</p>
+<p>
+<pre>
+(add-hook 'outline-minor-mode-hook
+ (lambda ()
+ (define-key outline-minor-mode-map [(control tab)] 'org-cycle)
+ (define-key outline-minor-mode-map [(shift tab)] 'org-global-cycle)))
+(add-hook 'outline-mode-hook
+ (lambda ()
+ (define-key outline-mode-map [(tab)] 'org-cycle)
+ (define-key outline-mode-map [(shift tab)] 'org-global-cycle)))
+</pre>
+</p>
+<p>
+Or check out <i>outline-magic.el</i>, which does this and also provides
+promotion and demotion functionality. <i>outline-magic.el</i> is
+available at <a href="http://www.astro.uva.nl/~dominik/Tools/OutlineMagic">Outline Magic</a>.
+</p>
+
+<h2 id="sec-4">2 Errors</h2>
+
+
+<h3 id="sec-5">2.1 <code>(wrong-type-argument keymapp nil)</code></h3>
+
+<p><b>When I try to use Org-mode, I always get the error message @code{(wrong-type-argument keymapp nil)}</b>
+</p>
+<p>
+This is a conflict with an outdated version of the <i>allout.el</i>, see
+the <a href="http://staff.science.uva.nl/~dominik/Tools/org/org.html#Conflicts">Conflicts</a> section in the manual
+</p>
+
+<h3 id="sec-6">2.2 CUA mode does not work with Org-mode</h3>
+
+
+<p>
+<b>Org-mode takes over the S-cursor keys. I also want to use CUA-mode, is there a way to fix this conflict?</b>
+</p>
+<p>
+Yes, see the <a href="http://staff.science.uva.nl/~dominik/Tools/org/org.html#Conflicts">Conflicts</a> section of the manual.
+</p>
+
+<h3 id="sec-7">2.3 <code>winddmove.el</code> does not work with Org-mode.</h3>
+
+
+<p>
+<b>Org-mode takes over the S-cursor keys. I also want to use windmove.el, is there a way to fix this conflict?</b>
+</p>
+<p>
+Yes, see the <a href="http://staff.science.uva.nl/~dominik/Tools/org/org.html#Conflicts">Conflicts</a> section of the manual.
+</p>
+
+<h2 id="sec-8">3 Setup and Structure</h2>
+
+
+<h3 id="sec-9">3.1 Org-mode as default mode</h3>
+
+
+<p>
+<b>Org-mode seems to be a useful default mode for the various README files I have scattered through my directories</b>. <b>How do I turn it on for all README files?</b>
+</p>
+<p>
+Add the following to your .emacs file:
+</p>
+<p>
+<pre>
+ (add-to-list 'auto-mode-alist '("README$" . org-mode))
+</pre>
+</p>
+<p>
+You can even make it the default mode for any files with unspecified
+mode using
+</p>
+<p>
+<pre>
+ (setq default-major-mode 'org-mode)
+</pre>
+</p>
+
+<h3 id="sec-10">3.2 Get rid of extra stars in outline</h3>
+
+
+<p>
+<b>All these stars are driving me mad, I just find the Emacs outlines unreadable. Can't you just put white space and a single star as a starter for headlines?</b>
+</p>
+<p>
+See the section <a href="http://staff.science.uva.nl/~dominik/Tools/org/org.html#Clean%20outline%20view">Clean outline view</a> in the manual.
+</p>
+
+<h3 id="sec-11">3.3 Two windows on same Org-mode file</h3>
+
+<p><b>I would like to have two windows on the same Org-mode file, but with different outline visibility. Is that possible?</b>
+</p>
+<p>
+You may use <i>indirect buffers</i> which do exactly this. See the
+documentation on the command <code>make-indirect-buffer</code>.
+</p>
+
+<h3 id="sec-12">3.4 Insert empty lines before new headings and plain list items</h3>
+
+
+<p>
+<b>I would like to have an empty line before each newly inserted headline, but not before each newly inserted plain-list item</b>.
+</p>
+<p>
+<pre>
+ (setq org-blank-before-new-entry
+ '((heading . t) (plain-list-item . nil))
+</pre>
+</p>
+
+
+<h3 id="sec-13">3.5 Amount of context in sparse trees</h3>
+
+
+<p>
+*Sparse tree show the headline hierarchy above each match, and also
+the headline following a match. I'd like to construct more compact
+trees, with less context.*
+</p>
+<p>
+Take a look at the variables <code>org-show-hierarchy-above</code> and
+<code>org-show-following-headline</code>.
+</p>
+
+<h3 id="sec-14">3.6 Stacking calls to org-occur</h3>
+
+
+<p>
+<b>Each call to org-occur starts again from OVERVIEW and exposes only the matches of the current call. I'd like to combine the effect of several calls</b>.
+</p>
+<p>
+You can construct a regular expression that matches all targets you
+want. Alternatively, use a <code>C-u</code> prefix with the second and any
+further calls to <code>org-occur</code> to keep the current visibility and
+highlighting in addition to the new ones.
+</p>
+
+<h2 id="sec-15">4 Hyperlinks</h2>
+
+
+
+<h3 id="sec-16">4.1 Confirmation for shell and elisp links</h3>
+
+
+<p>
+<b>When I am executing shell/elisp links I always get a confirmation prompt and need to type "yes RET", that's 4 key presses! Can I get rid of this?</b>
+</p>
+<p>
+The confirmation is there to protect you from unwantingly execute
+potentially dangerous commands. For example, imagine a link
+<pre>
+[[shell:rm -rf ~/*][ Google Search]]
+</pre>
+</p>
+<p>
+In an Org-mode buffer, this command would look like <i>Google Search</i>,
+but really it would remove your home directory. If you wish, you can
+make it easier to respond to the query by setting
+</p>
+<p>
+<pre>
+ (setq org-confirm-shell-link-function 'y-or-n-p
+ org-confirm-elisp-link-function 'y-or-n-p).
+</pre>
+</p>
+<p>
+Then a single keypress will be enough to confirm those links. It is
+also possible to turn off this check entirely, but I strongly recommend
+against this. Be warned.
+</p>
+
+<h3 id="sec-17">4.2 Use RET or TAB to follow a link</h3>
+
+
+<p>
+<b>From other packages like Emacs-wiki, I am used to follow links with <code>RET</code> when the cursor is on the link. Is this also possible in org-mode?</b>
+</p>
+<p>
+Yes, and you may also use TAB.
+</p>
+<p>
+<pre>
+ (setq org-return-follows-link t)
+ (setq org-tab-follows-link t)
+</pre>
+</p>
+
+<h3 id="sec-18">4.3 Clicking on a link without activating it</h3>
+
+
+<p>
+<b>Each time I click inside a link in order to set point to this location, Org-mode actually follows the link</b>
+</p>
+<p>
+Activating links with <code>mouse-1</code> is a new feature in Emacs 22, to make
+link behavior similar to other applications like web browsers. If you
+hold the mouse button down a bit longer, the cursor will be set
+without following the link. If you cannot get used to this behavior,
+you can (as in Emacs 21) use <code>mouse-2</code> to follow links and turn off
+link activation for <code>mouse-1</code> with
+</p>
+<p>
+<pre>
+ (setq org-mouse-1-follows-link nil)
+</pre>
+</p>
+
+
+<h2 id="sec-19">5 Export</h2>
+
+
+<h3 id="sec-20">5.1 Make TODO entries items, not headlines in HTML export</h3>
+
+
+<p>
+<b>When I export my TODO list, every TODO item becomes a separate section. How do I enforce these items to be exported as an itemized list?</b>
+</p>
+<p>
+If you plan to use ASCII or HTML export, make sure things you want to
+be exported as item lists are level 4 at least, even if that does mean
+there is a level jump. For example:
+</p>
+<p>
+<pre>
+ * Todays top priorities
+ **** TODO write a letter to xyz
+ **** TODO Finish the paper
+ **** Pick up kids at the school
+</pre>
+</p>
+<p>
+Alternatively, if you need a specific value for the heading/item
+transition in a particular file, use the <code>#+OPTIONS</code> line to
+configure the H switch.
+</p>
+<p>
+<pre>
+ #+OPTIONS: H:2; ...
+</pre>
+</p>
+
+<h3 id="sec-21">5.2 Export only a subtree</h3>
+
+
+<p>
+<b>I would like to export only a subtree of my file to HTML. How?</b>
+</p>
+<p>
+If you want to export a subtree, mark the subtree as region and then
+export. Marking can be done with <code>C-c @ C-x C-x</code>, for example.
+</p>
+
+<h3 id="sec-22">5.3 How to import org-mode calendar data into Mac OSX ical</h3>
+
+
+<p>
+<b>I would like my iCal program on Mac OSX to import the iCalendar file produced by Org-mode. How?</b>
+</p>
+<p>
+<i>This is for OSX 10.3, see below for 10.4:</i> When using iCal under
+Apple MacOS X, you can create a new calendar <i>OrgMode</i> (the default
+name for the calendar created by <code>C-c C-e c</code>, see the variables
+<code>org-icalendar-combined-name</code> and
+<code>org-combined-agenda-icalendar-file</code>). Then set Org-mode to overwrite
+the corresponding file <i>~/Library/Calendars/OrgMode.ics</i>. You may
+even use AppleScript to make iCal re-read the calendar files each time
+a new version of <i>OrgMode.ics</i> is produced. Here is the setup needed
+for this:
+</p>
+<p>
+<pre>
+ (setq org-combined-agenda-icalendar-file
+ "~/Library/Calendars/OrgMode.ics")
+ (add-hook 'org-after-save-iCalendar-file-hook
+ (lambda ()
+ (shell-command
+ "osascript -e 'tell application \"iCal\" to reload calendars'")))
+</pre>
+</p>
+
+<p>
+For Mac OS X 10.4, you need to write the ics file to
+<code>/Library/WebServer/Documents/</code> and then subscribe iCalendar to
+<code>http: //localhost/orgmode.ics</code>
+</p>
+
+<h2 id="sec-23">6 Tables</h2>
+
+
+<h3 id="sec-24">6.1 #ERROR fields in tables</h3>
+
+
+<p>
+<b>One of my table columns has started to fill up with <code>#ERROR</code>. What is going on?</b>
+</p>
+<p>
+Org-mode tried to compute the column from other fields using a
+formula stored in the <code>#+TBLFM:</code> line just below the table, and
+the evaluation of the formula fails. Fix the fields used in the
+formula, or fix the formula, or remove it!
+</p>
+
+<h3 id="sec-25">6.2 Unwanted new lines in table</h3>
+
+
+<p>
+<b>When I am in the last column of a table and just above a horizontal line in the table, pressing TAB creates a new table line before the horizontal line</b>. <b>How can I quickly move to the line below the horizontal line instead?</b>
+</p>
+<p>
+Press <code>down</code> (to get on the separator line) and then <code>TAB</code>.
+Or configure the variable
+</p>
+<p>
+<pre>
+ (setq org-table-tab-jumps-over-hlines t)
+</pre>
+</p>
+
+<h3 id="sec-26">6.3 Automatic detection of formulas</h3>
+
+<p><b>I need to use fields in my table that start with "=", and each time I enter such a field, Org-mode thinks this is a formula</b>.
+</p>
+<p>
+With the setting
+</p>
+<p>
+<pre>
+ (setq org-table-formula-evaluate-inline nil)
+</pre>
+</p>
+<p>
+this will no longer happen. You can still use formulas using the
+commands <tt>C-c =</tt> and <tt>C-u C-c =</tt>
+</p>
+
+
+<h3 id="sec-27">6.4 Change indentation of a table</h3>
+
+<p><b>How can I change the indentation of an entire table without fixing every line by hand?</b>
+</p>
+<p>
+The indentation of a table is set by the first line. So just fix the
+indentation of the first line and realign with <code>TAB</code>.
+</p>
+
+<h3 id="sec-28">6.5 Performance issues with table alignment</h3>
+
+<p><b>I have a huge table in a file, and the automatic realign of tables is just taking too long. What can I do?</b>
+</p>
+<p>
+Either split the table into several by inserting an empty line every
+100 lines or so. Or turn off the automatic re-align with
+</p>
+<p>
+<pre>
+ (setq org-table-automatic-realign nil)
+</pre>
+</p>
+<p>
+After this the only way to realign a table is to press <code>C-c C-c</code>. It
+will no longer happen automatically, removing the corresponding delays
+during editing.
+</p>
+
+<h3 id="sec-29">6.6 Performance issues with table calculation</h3>
+
+<p><b>I have a complex table with lots of formulas, and recomputing the table takes rather long. What can I do?</b>
+</p>
+<p>
+Nothing, really. The spreadsheet in org is mostly done to make
+calculations possible, not so much to make them fast. Since Org-mode
+is firmly committed to the ASCII format, nothing is stopping you from
+editing the table by hand. Therefore, there is no internal
+representation of the data. Each time Org-mode starts a computation,
+it must scan the table for special lines, find the fields etc. This
+is slow. Furthermore, Calc is slow compared to hardware computations.
+To make this work with normal editing, recalculation is not happening
+automatically, or only for the current line, so that the long wait for
+a full table iteration only happens when you ask for it.
+</p>
+<p>
+So for really complex tables, moving to a "real" spreadsheet may still
+be the best option.
+</p>
+<p>
+That said, there are some ways to optimize things in Org-mode, and I
+have been thinking about moving a bit further down this line.
+However, for my applications this has so far not been an issue at all.
+If you have a good case,you could try to convince me.
+</p>
+
+<h3 id="sec-30">6.7 Incrementing numbers</h3>
+
+<p><b>When I press <code>S-RET</code> in a table field to copy its value down, the content is not copied as is, but it is increased by one. Is that a bug or a feature</b>
+</p>
+<p>
+Well, it is <i>supposed</i> to be a feature, to make it easy to create a
+column with increasing numbers. If this gets into your way, turn it
+off with
+</p>
+<p>
+<pre>
+ (setq org-org-table-copy-increment nil)
+</pre>
+</p>
+
+<h2 id="sec-31">7 Agenda</h2>
+
+
+<h3 id="sec-32">7.1 Include Org-mode agenda into Emacs diary</h3>
+
+<p><b>Is it possible to include entries from org-mode files into my emacs diary?</b>
+</p>
+<p>
+Since the org-mode agenda is much more powerful and can contain the
+diary, you should think twice before deciding to do this. If you
+insist, however, integrating Org-mode information into the diary is
+possible. You need to turn on <i>fancy diary display</i> by setting in
+.emacs:
+</p>
+<p>
+<pre>
+ (add-hook 'diary-display-hook 'fancy-diary-display)
+</pre>
+</p>
+<p>
+Then include the following line into your ~/diary file, in
+order to get the entries from all files listed in the variable
+<code>org-agenda-files</code>
+</p>
+<p>
+<pre>
+ &amp;%%(org-diary)
+</pre>
+You may also select specific files with
+</p>
+<p>
+<pre>
+ &amp;%%(org-diary) ~/path/to/some/org-file.org
+ &amp;%%(org-diary) ~/path/to/another/org-file.org
+</pre>
+</p>
+<p>
+If you now launch the calendar and press <tt>d</tt> to display a diary, the
+headlines of entries containing a timestamp, date range, schedule, or
+deadline referring to the selected date will be listed. Just like
+Org-mode's agenda view, the diary for <i>today</i> contains additional
+entries for overdue deadlines and scheduled items. See also the
+documentation of the <code>org-diary</code> function. Under XEmacs, it is
+not possible to jump back from the diary to the org, this works only in
+the agenda buffer.
+</p>
+
+<p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten.dominik@gmail.com">&lt;carsten.dominik@gmail.com&gt;</a>
+</p>
+<p class="date"> Date: 2007/09/10 07:06:01</p>
+</body>
+</html>
diff --git a/ORGWEBPAGE/faq.org b/ORGWEBPAGE/faq.org
new file mode 100644
index 0000000..b2fbe67
--- /dev/null
+++ b/ORGWEBPAGE/faq.org
@@ -0,0 +1,372 @@
+
+#+STARTUP: overview align
+#+TYP_TODO: TODO IDEA WISH QUESTION DECLINED INCONSISTENCY BUG DONE
+#+OPTIONS: H:2 num:t toc:t \n:nil @:t ::t |:t ^:t *:t TeX:t
+#+EMAIL: carsten.dominik@gmail.com
+#+TITLE: Org-mode Frequently Asked Questions
+
+* General
+** Use features in other modes
+ *I would like to use editing features of org-mode in other modes, is
+ this possible?*
+
+Not really. For tables there is =orgtbl-mode= which implements the
+table editor as a minor mode. For other features you need to switch to
+Org-mode temporarily, or prepare text in a different buffer.
+
+
+** Visibility cycling in Outline-mode and Outline-minor-mode
+
+ *Can I get the visibility-cycling features in outline-mode and
+outline-minor-mode?*
+
+ Yes, these functions are written in a way that they are independent of
+ the outline setup. The following setup provides standard Org-mode
+ functionality in outline-mode on =TAB= and =S-TAB=. For
+ outline-minor-mode, we use =C-TAB= instead of =TAB=,
+ because =TAB= usually has mode-specific tasks.
+
+:(add-hook 'outline-minor-mode-hook
+: (lambda ()
+: (define-key outline-minor-mode-map [(control tab)] 'org-cycle)
+: (define-key outline-minor-mode-map [(shift tab)] 'org-global-cycle)))
+:(add-hook 'outline-mode-hook
+: (lambda ()
+: (define-key outline-mode-map [(tab)] 'org-cycle)
+: (define-key outline-mode-map [(shift tab)] 'org-global-cycle)))
+
+Or check out /outline-magic.el/, which does this and also provides
+promotion and demotion functionality. /outline-magic.el/ is
+available at [[http://www.astro.uva.nl/~dominik/Tools/OutlineMagic][Outline Magic]].
+
+* Errors
+** =(wrong-type-argument keymapp nil)=
+ *When I try to use Org-mode, I always get the error message
+@code{(wrong-type-argument keymapp nil)}*
+
+This is a conflict with an outdated version of the /allout.el/, see
+the [[http://staff.science.uva.nl/~dominik/Tools/org/org.html#Conflicts][Conflicts]] section in the manual
+
+** CUA mode does not work with Org-mode
+
+ *Org-mode takes over the S-cursor keys. I also want to use CUA-mode,
+is there a way to fix this conflict?*
+
+Yes, see the [[http://staff.science.uva.nl/~dominik/Tools/org/org.html#Conflicts][Conflicts]] section of the manual.
+
+** =winddmove.el= does not work with Org-mode.
+
+ *Org-mode takes over the S-cursor keys. I also want to use windmove.el,
+is there a way to fix this conflict?*
+
+Yes, see the [[http://staff.science.uva.nl/~dominik/Tools/org/org.html#Conflicts][Conflicts]] section of the manual.
+
+* Setup and Structure
+** Org-mode as default mode
+
+ *Org-mode seems to be a useful default mode for the various README
+files I have scattered through my directories*. *How do I turn it on
+for all README files?*
+
+Add the following to your .emacs file:
+
+: (add-to-list 'auto-mode-alist '("README$" . org-mode))
+
+You can even make it the default mode for any files with unspecified
+mode using
+
+: (setq default-major-mode 'org-mode)
+
+** Get rid of extra stars in outline
+
+ *All these stars are driving me mad, I just find the Emacs outlines
+unreadable. Can't you just put white space and a single star as a
+starter for headlines?*
+
+See the section [[http://staff.science.uva.nl/~dominik/Tools/org/org.html#Clean%20outline%20view][Clean outline view]] in the manual.
+
+** Two windows on same Org-mode file
+ *I would like to have two windows on the same Org-mode file, but with
+different outline visibility. Is that possible?*
+
+You may use /indirect buffers/ which do exactly this. See the
+documentation on the command =make-indirect-buffer=.
+
+** Insert empty lines before new headings and plain list items
+
+ *I would like to have an empty line before each newly inserted
+headline, but not before each newly inserted plain-list item*.
+
+: (setq org-blank-before-new-entry
+: '((heading . t) (plain-list-item . nil))
+
+
+** Amount of context in sparse trees
+
+ *Sparse tree show the headline hierarchy above each match, and also
+ the headline following a match. I'd like to construct more compact
+ trees, with less context.*
+
+Take a look at the variables =org-show-hierarchy-above= and
+=org-show-following-headline=.
+
+** Stacking calls to org-occur
+
+ *Each call to org-occur starts again from OVERVIEW and exposes only
+ the matches of the current call. I'd like to combine the effect of
+ several calls*.
+
+You can construct a regular expression that matches all targets you
+want. Alternatively, use a =C-u= prefix with the second and any
+further calls to =org-occur= to keep the current visibility and
+highlighting in addition to the new ones.
+
+* Hyperlinks
+
+** Confirmation for shell and elisp links
+
+ *When I am executing shell/elisp links I always get a confirmation
+prompt and need to type "yes RET", that's 4 key presses! Can I get
+rid of this?*
+
+The confirmation is there to protect you from unwantingly execute
+potentially dangerous commands. For example, imagine a link
+:[[shell:rm -rf ~/*][ Google Search]]
+
+In an Org-mode buffer, this command would look like /Google Search/,
+but really it would remove your home directory. If you wish, you can
+make it easier to respond to the query by setting
+
+: (setq org-confirm-shell-link-function 'y-or-n-p
+: org-confirm-elisp-link-function 'y-or-n-p).
+
+Then a single keypress will be enough to confirm those links. It is
+also possible to turn off this check entirely, but I strongly recommend
+against this. Be warned.
+
+** Use RET or TAB to follow a link
+
+ *From other packages like Emacs-wiki, I am used to follow links with
+ =RET= when the cursor is on the link. Is this also possible in org-mode?*
+
+Yes, and you may also use TAB.
+
+: (setq org-return-follows-link t)
+: (setq org-tab-follows-link t)
+
+** Clicking on a link without activating it
+
+ *Each time I click inside a link in order to set point to this
+ location, Org-mode actually follows the link*
+
+Activating links with =mouse-1= is a new feature in Emacs 22, to make
+link behavior similar to other applications like web browsers. If you
+hold the mouse button down a bit longer, the cursor will be set
+without following the link. If you cannot get used to this behavior,
+you can (as in Emacs 21) use =mouse-2= to follow links and turn off
+link activation for =mouse-1= with
+
+: (setq org-mouse-1-follows-link nil)
+
+* Remember
+
+ *Can I automatically start the clock when opening a remember template?*
+
+Yes, this is possible. Use the following code and make sure that
+after executing it, `my-start-clock-if-needed' is in
+`remember-mode-hook' /after/ `org-remember-apply-template'.
+
+: (add-hook 'remember-mode-hook 'my-start-clock-if-needed 'append)
+: (defun my-start-clock-if-needed ()
+: (save-excursion
+: (goto-char (point-min))
+: (when (re-search-forward " *CLOCK-IN *" nil t)
+: (replace-match "")
+: (org-clock-in))))
+
+Then, when a template contains the key string CLOCK-IN, the clock will
+be started. Starting with Org-mode version 5.20, the clock will
+automatically be stopped when storing the remember buffer.
+
+* Export
+** Make TODO entries items, not headlines in HTML export
+
+ *When I export my TODO list, every TODO item becomes a separate
+section. How do I enforce these items to be exported as an itemized
+list?*
+
+If you plan to use ASCII or HTML export, make sure things you want to
+be exported as item lists are level 4 at least, even if that does mean
+there is a level jump. For example:
+
+: * Todays top priorities
+: **** TODO write a letter to xyz
+: **** TODO Finish the paper
+: **** Pick up kids at the school
+
+Alternatively, if you need a specific value for the heading/item
+transition in a particular file, use the =#+OPTIONS= line to
+configure the H switch.
+
+: #+OPTIONS: H:2; ...
+
+** Export only a subtree
+
+ *I would like to export only a subtree of my file to HTML. How?*
+
+If you want to export a subtree, mark the subtree as region and then
+export. Marking can be done with =C-c @ C-x C-x=, for example.
+
+** How to import org-mode calendar data into Mac OSX ical
+
+ *I would like my iCal program on Mac OSX to import the iCalendar file
+ produced by Org-mode. How?*
+
+ /This is for OSX 10.3, see below for 10.4:/ When using iCal under
+Apple MacOS X, you can create a new calendar /OrgMode/ (the default
+name for the calendar created by =C-c C-e c=, see the variables
+=org-icalendar-combined-name= and
+=org-combined-agenda-icalendar-file=). Then set Org-mode to overwrite
+the corresponding file /~/Library/Calendars/OrgMode.ics/. You may
+even use AppleScript to make iCal re-read the calendar files each time
+a new version of /OrgMode.ics/ is produced. Here is the setup needed
+for this:
+
+: (setq org-combined-agenda-icalendar-file
+: "~/Library/Calendars/OrgMode.ics")
+: (add-hook 'org-after-save-iCalendar-file-hook
+: (lambda ()
+: (shell-command
+: "osascript -e 'tell application \"iCal\" to reload calendars'")))
+
+
+For Mac OS X 10.4, you need to write the ics file to
+=/Library/WebServer/Documents/= and then subscribe iCalendar to
+=http: //localhost/orgmode.ics=
+
+* Tables
+** #ERROR fields in tables
+
+ *One of my table columns has started to fill up with =#ERROR=. What
+is going on?*
+
+Org-mode tried to compute the column from other fields using a
+formula stored in the =#+TBLFM:= line just below the table, and
+the evaluation of the formula fails. Fix the fields used in the
+formula, or fix the formula, or remove it!
+
+** Unwanted new lines in table
+
+ *When I am in the last column of a table and just above a horizontal
+line in the table, pressing TAB creates a new table line before the
+horizontal line*. *How can I quickly move to the line below the
+horizontal line instead?*
+
+Press =down= (to get on the separator line) and then =TAB=.
+Or configure the variable
+
+: (setq org-table-tab-jumps-over-hlines t)
+
+** Automatic detection of formulas
+ *I need to use fields in my table that start with "=", and each time
+ I enter such a field, Org-mode thinks this is a formula*.
+
+With the setting
+
+: (setq org-table-formula-evaluate-inline nil)
+
+this will no longer happen. You can still use formulas using the
+commands @<tt>C-c =@</tt> and @<tt>C-u C-c =@</tt>
+
+
+** Change indentation of a table
+ *How can I change the indentation of an entire table without fixing
+every line by hand?*
+
+The indentation of a table is set by the first line. So just fix the
+indentation of the first line and realign with =TAB=.
+
+** Performance issues with table alignment
+ *I have a huge table in a file, and the automatic realign of tables
+ is just taking too long. What can I do?*
+
+Either split the table into several by inserting an empty line every
+100 lines or so. Or turn off the automatic re-align with
+
+: (setq org-table-automatic-realign nil)
+
+After this the only way to realign a table is to press =C-c C-c=. It
+will no longer happen automatically, removing the corresponding delays
+during editing.
+
+** Performance issues with table calculation
+ *I have a complex table with lots of formulas, and recomputing the
+ table takes rather long. What can I do?*
+
+Nothing, really. The spreadsheet in org is mostly done to make
+calculations possible, not so much to make them fast. Since Org-mode
+is firmly committed to the ASCII format, nothing is stopping you from
+editing the table by hand. Therefore, there is no internal
+representation of the data. Each time Org-mode starts a computation,
+it must scan the table for special lines, find the fields etc. This
+is slow. Furthermore, Calc is slow compared to hardware computations.
+To make this work with normal editing, recalculation is not happening
+automatically, or only for the current line, so that the long wait for
+a full table iteration only happens when you ask for it.
+
+So for really complex tables, moving to a "real" spreadsheet may still
+be the best option.
+
+That said, there are some ways to optimize things in Org-mode, and I
+have been thinking about moving a bit further down this line.
+However, for my applications this has so far not been an issue at all.
+If you have a good case,you could try to convince me.
+
+** Incrementing numbers
+ *When I press =S-RET= in a table field to copy its value down, the
+ content is not copied as is, but it is increased by one.
+ Is that a bug or a feature*
+
+Well, it is /supposed/ to be a feature, to make it easy to create a
+column with increasing numbers. If this gets into your way, turn it
+off with
+
+: (setq org-org-table-copy-increment nil)
+
+* Agenda
+** Include Org-mode agenda into Emacs diary
+ *Is it possible to include entries from org-mode files into my emacs
+diary?*
+
+Since the org-mode agenda is much more powerful and can contain the
+diary, you should think twice before deciding to do this. If you
+insist, however, integrating Org-mode information into the diary is
+possible. You need to turn on /fancy diary display/ by setting in
+.emacs:
+
+: (add-hook 'diary-display-hook 'fancy-diary-display)
+
+Then include the following line into your ~/diary file, in
+order to get the entries from all files listed in the variable
+=org-agenda-files=
+
+: &%%(org-diary)
+You may also select specific files with
+
+: &%%(org-diary) ~/path/to/some/org-file.org
+: &%%(org-diary) ~/path/to/another/org-file.org
+
+If you now launch the calendar and press @<tt>d@</tt> to display a diary, the
+headlines of entries containing a timestamp, date range, schedule, or
+deadline referring to the selected date will be listed. Just like
+Org-mode's agenda view, the diary for /today/ contains additional
+entries for overdue deadlines and scheduled items. See also the
+documentation of the =org-diary= function. Under XEmacs, it is
+not possible to jump back from the diary to the org, this works only in
+the agenda buffer.
+
+* COMMENT HTML style specifications
+
+# Local Variables:
+# org-export-html-style: "<link rel=stylesheet href=\"freeshell2.css\" type=\"text/css\"> <style type=\"text/css\"> .tag { color: red; font-weight:bold}</style>"
+# End:
diff --git a/ORGWEBPAGE/freeshell2.css b/ORGWEBPAGE/freeshell2.css
new file mode 100644
index 0000000..d88a0d9
--- /dev/null
+++ b/ORGWEBPAGE/freeshell2.css
@@ -0,0 +1,66 @@
+body {
+ font-family: helvetica, verdana, sans-serif;
+ font-size: 12pt;
+ margin-top: 5%;
+ margin-bottom: 8%;
+ background: white; color: black;
+ margin-left: 15%; margin-right: 15%;
+}
+
+h1 {
+ font-size: 18pt;
+ color: #ff8c00;
+ padding-top: 1em;
+ border-bottom: 2px solid #aaa;
+}
+
+h2 {
+ font-size: 16pt;
+ padding-top: 1em;
+ border-bottom: 1px solid #ccc;
+}
+
+h3 {
+ font-size: 14pt;
+ padding-top: 0.5em;
+ border-bottom: 1px solid #eee;
+}
+
+.todo, .deadline { color: red; }
+.done { color: green; }
+.timestamp { color: grey }
+.timestamp-kwd { color: CadetBlue; }
+.tag { background-color:lightblue; font-weight:normal; }
+
+.target { background-color: lavender; }
+
+.menu {
+ color: #666;
+}
+
+.menu a:link {
+ color: #888;
+}
+.menu a:active {
+ color: #888;
+}
+.menu a:visited {
+ color: #888;
+}
+
+img { align: center; }
+
+pre {
+ border: 1pt solid #AEBDCC;
+ background-color: #F3F5F7;
+ padding: 5pt;
+ font-family: courier, monospace;
+ font-size: 9pt;
+}
+
+table { border-collapse: collapse; }
+
+td, th {
+ vertical-align: top;
+ border: 1pt solid #ADB9CC;
+}
diff --git a/ORGWEBPAGE/index.html b/ORGWEBPAGE/index.html
new file mode 100644
index 0000000..ea618eb
--- /dev/null
+++ b/ORGWEBPAGE/index.html
@@ -0,0 +1,403 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-Mode Homepage</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2008/01/18 12:46:32"/>
+<meta name="author" content="Carsten Dominik"/>
+<style type="text/css">
+ html {
+ font-family: Times, serif;
+ font-size: 12pt;
+ }
+ .title { text-align: center; }
+ .todo { color: red; }
+ .done { color: green; }
+ .timestamp { color: grey }
+ .timestamp-kwd { color: CadetBlue }
+ .tag { background-color:lightblue; font-weight:normal }
+ .target { background-color: lavender; }
+ pre {
+ border: 1pt solid #AEBDCC;
+ background-color: #F3F5F7;
+ padding: 5pt;
+ font-family: courier, monospace;
+ }
+ table { border-collapse: collapse; }
+ td, th {
+ vertical-align: top;
+ <!--border: 1pt solid #ADB9CC;-->
+ }
+</style>
+</head><body>
+<h1 class="title">Org-Mode Homepage</h1>
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">Org - an Emacs Mode for Notes and Project Planning</a></li>
+<li><a href="#sec-2">Current Version (5.19) and Compatibility</a></li>
+<li><a href="#sec-3">Downloads</a></li>
+<li><a href="#sec-4">Documentation</a>
+<ul>
+<li><a href="#sec-5">Manual and Reference card</a></li>
+</ul>
+</li>
+<li><a href="#sec-6">Links</a>
+<ul>
+<li><a href="#sec-7">Mailing list</a></li>
+<li><a href="#sec-8">Tutorials</a></li>
+<li><a href="#sec-9">Org-mode, GTD and other task management systems </a></li>
+<li><a href="#sec-10">Add-Ons</a></li>
+<li><a href="#sec-11">Translators</a></li>
+<li><a href="#sec-15">Alternative distributions</a></li>
+<li><a href="#sec-16">Contributing to Org-mode</a></li>
+<li><a href="#sec-17">Future Development</a></li>
+</ul>
+</li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-1">Org - an Emacs Mode for Notes and Project Planning</h2>
+
+
+
+
+<BASE href="http://orgmode.org/index.html">
+
+<p>
+Org-mode is a mode for keeping notes, maintaining ToDo lists, and doing
+project planning with a fast and effective plain-text system.
+</p>
+<p>
+Org-mode develops organizational tasks around NOTES files that contain
+information about projects as plain text. Org-mode is implemented on
+top of outline-mode, which makes it possible to keep the content of
+large files well structured. Visibility cycling and structure editing
+help to work with the tree. Tables are easily created with a built-in
+table editor. Org-mode supports ToDo items, deadlines, time stamps,
+and scheduling. It dynamically compiles entries into an agenda.
+Plain text URL-like links connect to websites, emails, Usenet
+messages, BBDB entries, and any files related to the projects. For
+printing and sharing of notes, an Org-mode file can be exported as a
+structured ASCII file, HTML, and LaTeX.
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-2">Current Version (5.19) and Compatibility</h2>
+
+
+<p>
+The current version is 5.19. To see what has changed in recent
+releases, check this <a href="Changes.html">list of user-visible changes</a>. These descriptions
+are extensive, to avoid that people will be printing the manual after
+each incremental release. If you have an older version of the manual,
+just check the release notes and you will be up-to-date.
+</p>
+<p>
+This package works on Emacs 22, and (with minor restrictions) on Emacs
+21 and XEmacs 21 (where you must also use <i>noutline.el</i> shipped with
+Org-mode). The Emacs 22.1 release ships with Org-mode version 4.67c.
+The latest CVS emacs trunk usually contains a fairly recent version,
+but may lag a bit behind the website release.
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-3">Downloads</h2>
+
+
+<ul>
+<li>Distribution<br/>
+Download as <a href="org-5.19.zip">zip file</a> or <a href="org-5.19.tar.gz">gzipped tar archive</a>. These archives contain
+both the Lisp file org.el and the documentation in PDF and (TeX)Info
+formats. A shell script to simplify upgrading to the newest release
+has been posted <a href="http://www.philfam.co.uk/pete/GTD/org-mode/update-org.sh">here</a>.
+
+</li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-4">Documentation</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-5">Manual and Reference card</h3>
+
+<ul>
+<li>
+Read the documentation <a href="manual/index.html">online</a>. This is a version consisting of many
+small files, to save bandwidth. If you really need it, you can also
+have the entire manual in a <a href="org.html">single monolithic file</a>.
+</li>
+<li>
+Download the documentation in other formats: <a href="org.pdf">PDF</a>, <a href="org">Info</a>, or <a href="org.texi">TeXInfo</a>.
+</li>
+<li>
+Download the <a href="orgcard.pdf">Refcard</a> for org-mode, and Kyle Sherman hast created a
+<a href="orgcard.txt">text version</a> of the reference card
+</li>
+<li>
+There is also a <a href="http://hpcgi1.nifty.com/spen/index.cgi?OrgMode%2fManual">Japanese translation</a> of the manual (version 4.60),
+produced by Takeshi Okano.
+</li>
+<li>
+The <a href="faq.html">FAQ</a> is not very up-to-date, but may still answer some of your
+questions. Please have a look before posting to emacs-orgmode@gnu.org.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-6">Links</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-7">Mailing list</h3>
+
+
+<p>
+There is a mailing list for discussion about org-mode.
+</p>
+<ul>
+<li>
+Subscribe to it at <a href="http://lists.gnu.org/mailman/listinfo/emacs-orgmode">this webpage</a>.
+</li>
+<li>
+Directly <a href="mailto:emacs-orgmode@gnu.org">send mail to it</a>. If you are not subscribed, a moderator
+will look at the message before passing it through to the
+list. If that has happened once, future messages from your email
+address will get through immediately, even if you remain
+unsubscribed.
+</li>
+<li>
+Read the list on <a href="http://www.gmane.org">Gmane</a> through a <a href="http://news.gmane.org/gmane.emacs.orgmode">web interface</a> or with a
+<a href="news://news.gmane.org/gmane.emacs.orgmode">newsreader</a>.
+<li><form method="get" action="http://search.gmane.org/">
+<input type="text" name="query">
+<input type="hidden" name="group" value="gmane.emacs.orgmode">
+<input type="submit" value="Search gmane.emacs.orgmode">
+</form>
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-8">Tutorials</h3>
+
+
+<p>
+<a href="tutorials.html">Tutorials and screencasts</a> are listed on a separate page.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-9">Org-mode, GTD and other task management systems </h3>
+
+<p>Org-mode is flexible enough to implement many different ways of
+organizing your projects. A frequently discusses scheme is <a href="http://www.davidco.com/">David Allen's</a> strategy for <a href="http://en.wikipedia.org/wiki/GTD">Getting Things Done</a>. But it is clearly not
+the only way to us Org-mode for planning. Here are a couple of
+links related to this topic.
+</p>
+<ul>
+<li>
+<a href="http://johnwiegley.com">John Wiegley</a> has written an excellent document describing his
+way of using Org-mode as a <a href="http://johnwiegley.com/org.mode.day.planner.html">day planner</a>. See also some later
+messages for enhancements of his setup:
+<a href="http://article.gmane.org/gmane.emacs.orgmode/2963">emacs-orgmode-2962</a>, <a href="http://article.gmane.org/gmane.emacs.orgmode/3629">emacs-orgmode-3629</a>
+
+</li>
+<li>
+<a href="http://members.optusnet.com.au/charles57/Creative/">Charles Cave</a> has written an <a href="http://members.optusnet.com.au/~charles57/GTD/orgmode.html">article/tutorial</a> about the basic
+elements of GTD and how he implements them in Org-mode.
+
+</li>
+<li>
+There have been several threads on emacs-orgmode@gnu.org related
+to GTD, the most important ones are:
+<ul>
+<li>
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/683">Another GTD question</a>, which contains a discussion about basic
+GTD aspects. It also contains this
+</li>
+<li>
+<a href="http://article.gmane.org/gmane.emacs.orgmode/715">Post by Carsten</a> summarizing several options for implementing
+GTD in org-mode.
+</li>
+<li>
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/523">GTD, Projects and Next Actions in org-mode</a> is a thread where
+several people describe their personal setup is
+</li>
+<li>
+The <a href="http://thread.gmane.org/gmane.emacs.orgmode/4915">SOMEDAY/MAYBE vs. low priorities</a> thread contains a
+discussion about priorities that is quite instructive.
+</li>
+<li>
+Here is a <a href="http://thread.gmane.org/gmane.emacs.orgmode/4832/focus%3D4854">very instructive post</a> by Pete Phillips explaining
+why David Allens book is where you should start to learn GTD,
+and that the Internet and Org-mode only come into the game
+later, when thinking about the implementation. And since
+doing GTD the right way will give you lots of free time, don't
+forget to listen to <a href="http://www.detox-jazz.co.uk/">Pete's music</a>!
+</li>
+</ul></li>
+<li>
+Also on the web you can find information about how people are
+setting up Org-mode to fit their habits. A few examples:
+
+<ul>
+<li>
+This <a href="http://www.brool.com/?p=82">blog post</a> shows a very simple and clear GTD setup.
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-10">Add-Ons</h3>
+
+
+<ul>
+<li>
+<a href="http://www.cl.cam.ac.uk/~pz215/">Piotr Zielinski</a> wrote <a href="http://www.cl.cam.ac.uk/~pz215/files/org-mouse.el">org-mouse.el</a> which is now distributed with
+Org-mode. It implements great mouse support for many functions in
+org-mode.
+
+</li>
+<li>
+<a href="http://dto.freeshell.org/notebook/">David O'Toole</a> is the author of <a href="http://dto.freeshell.org/e/org-publish.el">org-publish.el</a>. While this is
+now part of the Org-mode distribution, you might find the newest
+bug fixes and developments at his <a href="http://dto.freeshell.org/notebook/OrgMode.html">Org-mode page</a>, along with
+several other projects like <i>org-blog.el</i> and
+<i>org-publish-escript.el</i>.
+
+</li>
+<li>
+<a href="http://www.cognition.ens.fr/~guerry/">Bastien Guerry</a> has been really prolific in writing interesting
+add-ons, all available at his <a href="http://www.cognition.ens.fr/~guerry/bastien-org-mode.html">org-mode page</a>:
+<ul>
+<li>
+a package for using Org-mode as the basis for blogging
+</li>
+<li>
+a LaTeX exporter that is now distributed together with
+org-mode
+</li>
+<li>
+a special table-of-contents buffer that simplifies navigation
+</li>
+<li>
+a registry to find locations that link a specific document.
+
+</li>
+</ul></li>
+<li>
+George C.F. Greve wrote <a href="http://www.emacswiki.org/emacs/org-mairix.el">org-mairix.el</a> to add links that trigger a
+mairix search.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-11">Translators</h3>
+
+
+<p>
+I know about the following attempts to translate from and to
+Org-mode files:
+</p>
+
+<div class="outline-4">
+<h4 id="sec-12">Org-mode to XXX</h4>
+
+
+<ul>
+<li>
+<a href="http://www.cognition.ens.fr/~guerry/u/org2rem.el">From Org-mode to remind</a> by <a href="http://www.cognition.ens.fr/~guerry/">Bastien Guerry</a>.
+
+</li>
+<li>
+<a href="org-export-freemind-0.1.0.tar.gz">From Org-mode to Freemind</a> by Marco Vezzoli.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4 id="sec-13">XXX to Org-mode</h4>
+
+
+<ul>
+<li>
+<a href="http://www.olafdietsche.de/palm/palm2orgmode.pl">From Palm TODO database to Orgmode</a>. This Translator was
+written by <a href="http://www.olafdietsche.de/">Olaf Dietsche</a>.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4 id="sec-14">Bi-directional</h4>
+
+
+<p>
+Unfortunately nothing so far.
+</p>
+</div>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-15">Alternative distributions</h3>
+
+
+<ul>
+<li>
+Mark A. Hershberger has made some <a href="https://launchpad.net/~hexmode/+archive">Ubuntu packages</a> for org-mode.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-16">Contributing to Org-mode</h3>
+
+
+<p>
+You can always contribute with ideas and bug reports on the mailing
+list. If you want to contribute a patch, code snippets, or a full
+add-on, this is very welcome too! However, I can only make it an
+official part of Org-mode if you have signed the papers with the
+Free Software Foundation. Org-mode is distributed as part of Emacs
+and must therefore adhere to strict rules about the copyright of
+all included material. If this is what you want to do, <a href="request-assign-future.txt">here</a> is the
+form that you have to fill in and send to the FSF. After you
+received the final copy with signatures, please scan it and send
+the scan to the maintainer.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-17">Future Development</h3>
+
+
+<p>
+Org-mode is still developing fast. The best way to stay up-to-date
+is to join the mailing list where the changes are developed and
+discusssed.
+</p>
+<p>
+Here is a loose <a href="todo.html">list of ideas</a> that are still to be processed
+somehow, when I get to it&hellip;
+</p>
+</div>
+</div>
+<div id="postamble"><p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten at orgmode dot org">&lt;carsten at orgmode dot org&gt;</a>
+</p>
+<p class="date"> Date: 2008/01/18 12:46:32</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/index.org b/ORGWEBPAGE/index.org
new file mode 100644
index 0000000..142c3c2
--- /dev/null
+++ b/ORGWEBPAGE/index.org
@@ -0,0 +1,211 @@
+#+TITLE: Org-Mode Homepage
+#+LANGUAGE: en
+#+EMAIL: carsten at orgmode dot org
+#+OPTIONS: H:3 num:nil toc:2 \n:nil @:t ::t |:t ^:t *:t TeX:t
+
+* Org - an Emacs Mode for Notes and Project Planning
+
+#+HTML: <BASE href="http://orgmode.org/index.html">
+
+Org-mode is a mode for keeping notes, maintaining ToDo lists, and doing
+project planning with a fast and effective plain-text system.
+
+Org-mode develops organizational tasks around NOTES files that contain
+information about projects as plain text. Org-mode is implemented on
+top of outline-mode, which makes it possible to keep the content of
+large files well structured. Visibility cycling and structure editing
+help to work with the tree. Tables are easily created with a built-in
+table editor. Org-mode supports ToDo items, deadlines, time stamps,
+and scheduling. It dynamically compiles entries into an agenda.
+Plain text URL-like links connect to websites, emails, Usenet
+messages, BBDB entries, and any files related to the projects. For
+printing and sharing of notes, an Org-mode file can be exported as a
+structured ASCII file, HTML, and LaTeX.
+
+* Current Version (5.19a) and Compatibility
+
+The current version is 5.19a. To see what has changed in recent
+releases, check this [[file:Changes.html][list of user-visible changes]]. These descriptions
+are extensive, to avoid that people will be printing the manual after
+each incremental release. If you have an older version of the manual,
+just check the release notes and you will be up-to-date.
+
+This package works on Emacs 22, and (with minor restrictions) on Emacs
+21 and XEmacs 21 (where you must also use /noutline.el/ shipped with
+Org-mode). The Emacs 22.1 release ships with Org-mode version 4.67c.
+The latest CVS emacs trunk usually contains a fairly recent version,
+but may lag a bit behind the website release.
+
+* Downloads
+
+**** Distribution
+Download as [[file:org-5.19a.zip][zip file]] or [[file:org-5.19a.tar.gz][gzipped tar archive]]. These archives contain
+both the Lisp file org.el and the documentation in PDF and (TeX)Info
+formats. A shell script to simplify upgrading to the newest release
+has been posted [[http://www.philfam.co.uk/pete/GTD/org-mode/update-org.sh][here]].
+
+* Documentation
+** Manual and Reference card
+ - Read the documentation [[file:manual/index.html][online]]. This is a version consisting of many
+ small files, to save bandwidth. If you really need it, you can also
+ have the entire manual in a [[file:org.html][single monolithic file]].
+ - Download the documentation in other formats: [[file:org.pdf][PDF]], [[file:org][Info]], or [[file:org.texi][TeXInfo]].
+ - Download the [[file:orgcard.pdf][Refcard]] for org-mode, and Kyle Sherman hast created a
+ [[file:orgcard.txt][text version]] of the reference card
+ - There is also a [[http://hpcgi1.nifty.com/spen/index.cgi?OrgMode%2fManual][Japanese translation]] of the manual (version 4.60),
+ produced by Takeshi Okano.
+ - The [[file:faq.org][FAQ]] is not very up-to-date, but may still answer some of your
+ questions. Please have a look before posting to emacs-orgmode@gnu.org.
+
+* Links
+
+** Mailing list
+
+ There is a mailing list for discussion about org-mode.
+
+ - Subscribe to it at [[http://lists.gnu.org/mailman/listinfo/emacs-orgmode][this webpage]].
+ - Directly [[mailto:emacs-orgmode@gnu.org][send mail to it]]. If you are not subscribed, a moderator
+ will look at the message before passing it through to the
+ list. If that has happened once, future messages from your email
+ address will get through immediately, even if you remain
+ unsubscribed.
+ - Read the list on [[http://www.gmane.org][Gmane]] through a [[http://news.gmane.org/gmane.emacs.orgmode][web interface]] or with a
+ [[news://news.gmane.org/gmane.emacs.orgmode][newsreader]].
+#+BEGIN_HTML
+<li><form method="get" action="http://search.gmane.org/">
+<input type="text" name="query">
+<input type="hidden" name="group" value="gmane.emacs.orgmode">
+<input type="submit" value="Search gmane.emacs.orgmode">
+</form>
+#+END_HTML
+
+** Worg - user-driven knowledge-base about org-mode
+
+[[http://129.199.80.1/~guerry/worg/][Worg]], created by [[http://www.cognition.ens.fr/~guerry/][Bastien Guerry]], is a setup to allow users to jointly
+edit a number of Org-mode files containing documentation about
+Org-mode. This is something like a wiki. If you'd like to contribute
+your own setup, screenshots, tutorials etc, please go to [[http://129.199.80.1/~guerry/worg/][the Worg
+page]], and start from there.
+
+** Tutorials
+
+ [[file:tutorials.org][Tutorials and screencasts]] are listed on a separate page.
+
+** Survey
+
+ In November 2007, Charles Cave organized a survey among Org-mode
+ users. The answers given in this survey can be found [[file:survey.html][here]].
+
+** Org-mode, GTD and other task management systems
+ Org-mode is flexible enough to implement many different ways of
+ organizing your projects. A frequently discusses scheme is [[http://www.davidco.com/][David
+ Allen's]] strategy for [[http://en.wikipedia.org/wiki/GTD][Getting Things Done]]. But it is clearly not
+ the only way to us Org-mode for planning. Here are a couple of
+ links related to this topic.
+
+ - [[http://johnwiegley.com][John Wiegley]] has written an excellent document describing his
+ way of using Org-mode as a [[http://johnwiegley.com/org.mode.day.planner.html][day planner]]. See also some later
+ messages for enhancements of his setup:
+ [[http://article.gmane.org/gmane.emacs.orgmode/2963][emacs-orgmode-2962]], [[http://article.gmane.org/gmane.emacs.orgmode/3629][emacs-orgmode-3629]]
+
+ - [[http://members.optusnet.com.au/charles57/Creative/][Charles Cave]] has written an [[http://members.optusnet.com.au/~charles57/GTD/orgmode.html][article/tutorial]] about the basic
+ elements of GTD and how he implements them in Org-mode. There
+ is also a [[http://129.199.80.1/~guerry/org-gtd.html][french translation]] of this document.
+
+ - There have been several threads on emacs-orgmode@gnu.org related
+ to GTD, the most important ones are:
+
+ + [[http://thread.gmane.org/gmane.emacs.orgmode/683][Another GTD question]], which contains a discussion about basic
+ GTD aspects. It also contains this
+ + [[http://article.gmane.org/gmane.emacs.orgmode/715][Post by Carsten]] summarizing several options for implementing
+ GTD in org-mode.
+ + [[http://thread.gmane.org/gmane.emacs.orgmode/523][GTD, Projects and Next Actions in org-mode]] is a thread where
+ several people describe their personal setup is
+ + The [[http://thread.gmane.org/gmane.emacs.orgmode/4915][SOMEDAY/MAYBE vs. low priorities]] thread contains a
+ discussion about priorities that is quite instructive.
+ + Here is a [[http://thread.gmane.org/gmane.emacs.orgmode/4832/focus%3D4854][very instructive post]] by Pete Phillips explaining
+ why David Allens book is where you should start to learn GTD,
+ and that the Internet and Org-mode only come into the game
+ later, when thinking about the implementation. And since
+ doing GTD the right way will give you lots of free time, don't
+ forget to listen to [[http://www.detox-jazz.co.uk/][Pete's music]]!
+
+ - Also on the web you can find information about how people are
+ setting up Org-mode to fit their habits. A few examples:
+
+ + This [[http://www.brool.com/?p=82][blog post]] shows a very simple and clear GTD setup.
+
+** Add-Ons
+
+ - [[http://www.cl.cam.ac.uk/~pz215/][Piotr Zielinski]] wrote [[http://www.cl.cam.ac.uk/~pz215/files/org-mouse.el][org-mouse.el]] which is now distributed with
+ Org-mode. It implements great mouse support for many functions in
+ org-mode.
+
+ - [[http://dto.freeshell.org/notebook/][David O'Toole]] is the author of [[http://dto.freeshell.org/e/org-publish.el][org-publish.el]]. While this is
+ now part of the Org-mode distribution, you might find the newest
+ bug fixes and developments at his [[http://dto.freeshell.org/notebook/OrgMode.html][Org-mode page]], along with
+ several other projects like /org-blog.el/ and
+ /org-publish-escript.el/.
+
+ - [[http://www.cognition.ens.fr/~guerry/][Bastien Guerry]] has been really prolific in writing interesting
+ add-ons, all available at his [[http://www.cognition.ens.fr/~guerry/bastien-org-mode.html][org-mode page]]:
+ + a package for using Org-mode as the basis for blogging
+ + a LaTeX exporter that is now distributed together with
+ org-mode
+ + a special table-of-contents buffer that simplifies navigation
+ + a registry to find locations that link a specific document.
+
+ - George C.F. Greve wrote [[http://www.emacswiki.org/emacs/org-mairix.el][org-mairix.el]] to add links that trigger a
+ mairix search.
+
+** Translators
+
+ I know about the following attempts to translate from and to
+ Org-mode files:
+
+*** Org-mode to XXX
+
+ - [[http://www.cognition.ens.fr/~guerry/u/org2rem.el][From Org-mode to remind]] by [[http://www.cognition.ens.fr/~guerry/][Bastien Guerry]].
+
+ - [[file:org-export-freemind-0.1.0.tar.gz][From Org-mode to Freemind]] by Marco Vezzoli.
+
+*** XXX to Org-mode
+
+ - [[http://www.olafdietsche.de/palm/palm2orgmode.pl][From Palm TODO database to Orgmode]]. This Translator was
+ written by [[http://www.olafdietsche.de/][Olaf Dietsche]].
+
+ - From [[http://thread.gmane.org/gmane.emacs.orgmode/5073][Remind to Org]] by Detlef Steuer.
+
+*** Bi-directional
+
+ Unfortunately nothing so far.
+
+** Alternative distributions
+
+ - Mark A. Hershberger has made some [[https://launchpad.net/~hexmode/+archive][Ubuntu packages]] for org-mode.
+
+** Contributing to Org-mode
+
+ You can always contribute with ideas and bug reports on the mailing
+ list. If you want to contribute a patch, code snippets, or a full
+ add-on, this is very welcome too! However, I can only make it an
+ official part of Org-mode if you have signed the papers with the
+ Free Software Foundation. Org-mode is distributed as part of Emacs
+ and must therefore adhere to strict rules about the copyright of
+ all included material. If this is what you want to do, [[file:request-assign-future.txt][here]] is the
+ form that you have to fill in and send to the FSF. After you
+ received the final copy with signatures, please scan it and send
+ the scan to the maintainer.
+
+** Future Development
+
+ Org-mode is still developing fast. The best way to stay up-to-date
+ is to join the mailing list where the changes are developed and
+ discusssed.
+
+ Here is a loose [[file:todo.org][list of ideas]] that are still to be processed
+ somehow, when I get to it...
+
+* Related Software
+ [[http://sachachua.com/wp/][Sacha Chua]] about [[http://sachachua.com/wp/2007/12/26/emacs-choosing-between-org-and-planner/][Choosing between Planner and Org]].
+
diff --git a/ORGWEBPAGE/index.txt b/ORGWEBPAGE/index.txt
new file mode 100644
index 0000000..f9366d3
--- /dev/null
+++ b/ORGWEBPAGE/index.txt
@@ -0,0 +1,151 @@
+ Org-Mode Homepage
+ =================
+
+Author: Carsten Dominik <dominik at science dot uva dot nl>
+Date: 2007/05/13 09:31:34
+
+
+Table of Contents
+=================
+Org - an Emacs Mode for Notes and Project Planning
+ Current Version
+ Compatibility
+ Downloads
+ Frequently Asked Questions
+ Mailing list
+ Links
+ Tutorials
+ Org-mode and GTD
+ Add-Ons
+ Future Development
+
+
+Org - an Emacs Mode for Notes and Project Planning
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Org-mode is a mode for keeping notes, maintaining ToDo lists, and doing
+project planning with a fast and effective plain-text system.
+
+Org-mode develops organizational tasks around NOTES files that contain
+information about projects as plain text. Org-mode is implemented on
+top of outline-mode, which makes it possible to keep the content of
+large files well structured. Visibility cycling and structure editing
+help to work with the tree. Tables are easily created with a built-in
+table editor. Org-mode supports ToDo items, deadlines, time stamps,
+and scheduling. It dynamically compiles entries into an agenda.
+Plain text URL-like links connect to websites, emails, Usenet
+messages, BBDB entries, and any files related to the projects. For
+printing and sharing of notes, an Org-mode file can be exported as a
+structured ASCII file, or as HTML.
+
+Current Version
+===============
+
+The current version is 4.74. To see what has changed in recent
+releases, check this [list of user-visible changes].
+
+Compatibility
+=============
+
+This package works on Emacs 21 and (with minor restrictions) on
+XEmacs 21. Version 4.67c will be part of the Emacs 22.1 release.
+
+ *Attention XEmacs users*: Starting with Org-mode 4.38, Org-mode will
+only work correctly with XEmacs if you use [noutline.el], a new
+implementation of outline-mode. Until this package becomes part of
+XEmacs, you can find it in the xemacs subdirectory of the Org-mode
+distribution. Just compile it and place it onto you load path,
+Org-mode will load it automatically.
+
+Downloads
+=========
+
+* Distribution
+ Download as [zip file] or [gzipped tar archive]. These archives
+ contain both the Lisp file org.el and the documentation in PDF
+ and (TeX)Info formats.
+
+* Documentation
+ - Read the documentation [online].
+ - Download the documentation in [PDF], [Info], or [TeXInfo] format.
+ - Download the [Refcard] for org-mode.
+ - There is also a [Japanese translation] of the manual (version 4.60), produced by Takeshi Okano.
+
+
+Frequently Asked Questions
+==========================
+
+The [FAQ] used to be part of the manual but this is no longer the case.
+
+Mailing list
+============
+
+There is a mailing list for discussion about org-mode. You can
+subscribe to it at [this webpage] or directly [send mail to it] (which
+will make it to the list after the moderator has accepted it.
+Furthermore you can access the mailing list on [Gmane] through a
+[web interface] or with a
+[newsreader].
+
+Links
+=====
+
+Tutorials
+---------
+ - There is a very nice introductory [OrgMode tutorial] by [David O'Toole] covering the basics of TODO lists and the agenda. It
+ has been translated into [French], [Japanese], [Chinese], and [Korean].
+
+Org-mode and GTD
+----------------
+ Org-mode is flexible enough to implement many different ways of
+ organizing your projects. A frequently discusses scheme is [David Allen's] strategy for [Getting Things Done]. Here are a couple of
+ links related to this topic.
+
+ - [Charles Cave] has written an [article/tutorial] about the basic
+ elements of GTD and how he implements them in Org-mode.
+
+ - There have been several threads on emacs-orgmode@gnu.org related
+ to GTD, the most important ones are:
+ - [Another GTD question], which contains a discussion about basic
+ GTD aspects. It also contains this
+ - [Post by Carsten] summarising several options for implementing
+ GTD in org-mode.
+ - [GTD, Projects and Next Actions in org-mode] is a thread where
+ several people describe their personal setup is
+
+ - Also on the web you can find information about how people are
+ setting up Org-mode to fit their habits. A few examples:
+
+ - This [blog post] shows a very simple and clear GTD setup.
+
+Add-Ons
+-------
+
+ - [Piotr Zielinski] wrote [org-mouse.el] which is now distributed with
+ Org-mode. It implements very interesting mouse support for many
+ functions in org-mode.
+
+ - [David O'Toole] is the author of [org-publish.el]. While this is
+ now part of the Org-mode distribution, you might find the newest
+ bug fixes and developments at his [Org-mode page], along with
+ several other projects like /org-blog.el/ and
+ /org-publish-escript.el/.
+
+ - [Bastien Guerry] has a package for using Org-mode as the basis for
+ blogging, it is available at [this page].
+
+ + Translators
+
+ I know about the following attempts to translate from and to
+ Org-mode files:
+
+ - [From Palm TODO database to Orgmode]. This Translator was
+ written by [Olaf Dietsche].
+
+ - [From Org-mode to remind] by [Bastien Guerry].
+
+
+Future Development
+------------------
+ - Here is a [list of ideas] that are still to be processed somehow,
+ when I get to it.
diff --git a/ORGWEBPAGE/org.texi b/ORGWEBPAGE/org.texi
new file mode 100644
index 0000000..7dbd028
--- /dev/null
+++ b/ORGWEBPAGE/org.texi
@@ -0,0 +1,5 @@
+
+@c Local Variables:
+@c mode: texinfo
+@c TeX-master: t
+@c End:
diff --git a/ORGWEBPAGE/org/index.html b/ORGWEBPAGE/org/index.html
new file mode 100644
index 0000000..6bff35d
--- /dev/null
+++ b/ORGWEBPAGE/org/index.html
@@ -0,0 +1,24 @@
+<html lang="en">
+<head>
+<title>Untitled</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Untitled">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="#Top">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+ pre.display { font-family:inherit }
+ pre.format { font-family:inherit }
+ pre.smalldisplay { font-family:inherit; font-size:smaller }
+ pre.smallformat { font-family:inherit; font-size:smaller }
+ pre.smallexample { font-size:smaller }
+ pre.smalllisp { font-size:smaller }
+ span.sc { font-variant:small-caps }
+ span.roman { font-family:serif; font-weight:normal; }
+ span.sansserif { font-family:sans-serif; font-weight:normal; }
+--></style>
+</head>
+<body>
+</body></html>
+
diff --git a/ORGWEBPAGE/qanda.org b/ORGWEBPAGE/qanda.org
new file mode 100644
index 0000000..aa2ba0d
--- /dev/null
+++ b/ORGWEBPAGE/qanda.org
@@ -0,0 +1,231 @@
+
+#+STARTUP: overview align
+#+TYP_TODO: TODO IDEA WISH QUESTION DECLINED INCONSISTENCY BUG DONE
+#+OPTIONS: H:2 num:t toc:t \n:nil @:t ::t |:t ^:t *:t TeX:t
+#+EMAIL: carsten.dominik@gmail.com
+#+TITLE: Org-mode Frequently Asked Questions
+
+* General
+** Use features in other modes
+ *I would like to use editing features of org-mode in other modes, is this possible?*
+
+Not really. For tables there is =orgtbl-mode= which implements the
+table editor as a minor mode. For other features you need to switch to
+Org-mode temporarily, or prepare text in a different buffer.
+
+
+** Visibility cycling in Outline-mode and Outline-minor-mode
+
+%Can I get the visibility-cycling features in outline-mode and
+outline-minor-mode?%
+
+ Yes, these functions are written in a way that they are independent of
+ the outline setup. The following setup provides standard Org-mode
+ functionality in outline-mode on =TAB= and =S-TAB=. For
+ outline-minor-mode, we use =C-TAB= instead of =TAB=,
+ because =TAB= usually has mode-specific tasks.
+
+:(add-hook 'outline-minor-mode-hook
+: (lambda ()
+: (define-key outline-minor-mode-map [(control tab)] 'org-cycle)
+: (define-key outline-minor-mode-map [(shift tab)] 'org-global-cycle)))
+:(add-hook 'outline-mode-hook
+: (lambda ()
+: (define-key outline-mode-map [(tab)] 'org-cycle)
+: (define-key outline-mode-map [(shift tab)] 'org-global-cycle)))
+
+Or check out /outline-magic.el/, which does this and also provides
+promotion and demotion functionality. @file{outline-magic.el} is
+available at [[http://www.astro.uva.nl/~dominik/Tools/OutlineMagic][Outline Magic]].
+
+* Errors
+** =(wrong-type-argument keymapp nil)=
+When I try to use Org-mode, I always get the error message
+@code{(wrong-type-argument keymapp nil)} This is a conflict with an
+outdated version of the /allout.el/.
+
+** CUA mode does not work with Org-mode
+
+%Org-mode takes over the S-cursor keys. I also want to use CUA-mode,
+is there a way to fix this conflict?%
+
+Yes, see the /Conflicts/ section of the manual.
+
+* Setup and Structure
+** Org-mode as default mode
+
+%Org-mode seems to be a useful default mode for the various README
+files I have scattered through my directories%. %How do I turn it on
+for all README files?%
+
+Add the following to your .emacs file:
+
+: (add-to-list 'auto-mode-alist '("README$" . org-mode))
+
+
+** Get rid of extra stars in outline
+
+%All these stars are driving me mad, I just find the Emacs outlines
+unreadable. Can't you just put white space and a single star as a
+starter for headlines?%
+
+See the section /Clean outline view/ in the manual.
+
+** Two windows on same Org-mode file
+%I would like to have two windows on the same Org-mode file, but with
+different outline visibility. Is that possible?%
+
+In GNU Emacs, you may use /indirect buffers/ which do exactly this.
+See the documentation on the command =make-indirect-buffer=. In
+XEmacs, this is currently not possible because of the different outline
+implementation.
+
+* Hyperlinks
+** Broken links after Org-mode 4.20
+
+%Some of my links stopped working after I upgraded to a version 4.20
+or later. Why is this, and how can I fix it?%
+
+These must be links in plain text, containing white space, such as
+
+: bbdb:Richard Stallman
+
+You need to protect these links by putting double brackets around
+them, like
+
+: [[bbdb:Richard Stallman]]
+
+** Converting links to double-bracket format
+
+%I see that Org-mode now creates links using the double bracket
+convention that hides the link part and the brackets, only showing the
+description part. How can I convert my old links to this new format?%
+
+Execute once in each Org-mode file: =M-x org-upgrade-old-links=
+This replaces angular brackets with the new link format.
+
+** Angular bracket links preference
+
+%I don't care if you find the new bracket links great, I am attached
+to the old style using angular brackets and no hiding of the link
+text. Please give them back to me, don't tell me it is not possible!%
+
+Would I let you down like that? If you must, you can do this
+
+: (setq org-link-style 'plain
+: org-link-format "<%s>")
+
+** Confirmation for shell and elips links
+%When I am executing shell/elisp links I always get a confirmation
+prompt and need to type =yes RET=, that's 4 key presses! Can I get
+rid of this?%
+
+The confirmation is there to protect you from unwantingly execute
+potentially dangerous commands. For example, imagine a link
+:[[shell:rm -rf ~/*][ Google Search]]
+
+In an Org-mode buffer, this command would look like /Google Search/,
+but really it would remove your home directory. If you wish, you can
+make it easier to respond to the query by setting
+=org-confirm-shell-link-function= and/or
+=org-confirm-elisp-link-function= to =y-or-n-p=. Then a single yc
+keypress will be enough to confirm those links. It is also possible
+to turn off this check entirely, but I do not recommend to do this.
+Be warned.
+
+
+
+* Export
+** Make TODO entries items, not headlines in HTML export
+
+%When I export my TODO list, every TODO item becomes a separate
+section. How do I enforce these items to be exported as an itemized
+list?%
+
+If you plan to use ASCII or HTML export, make sure things you want to
+be exported as item lists are level 4 at least, even if that does mean
+there is a level jump. For example:
+
+: * Todays top priorities
+: **** TODO write a letter to xyz
+: **** TODO Finish the paper
+: **** Pick up kids at the school
+
+Alternatively, if you need a specific value for the heading/item
+transition in a particular file, use the =#+OPTIONS= line to
+configure the H switch.
+
+: #+OPTIONS: H:2; ...
+
+** Export only a subtree
+
+%I would like to export only a subtree of my file to HTML. How?%
+
+If you want to export a subtree, mark the subtree as region and then
+export. Marking can be done with =C-c @@ C-x C-x=, for example.
+
+* Tables
+** #ERROR fields in tables
+
+%One of my table columns has started to fill up with =#ERROR=. What
+is going on?%
+
+Org-mode tried to compute the column from other fields using a
+formula stored in the =#+TBLFM:= line just below the table, and
+the evaluation of the formula fails. Fix the fields used in the
+formula, or fix the formula, or remove it!
+
+** Unwanted new lines in table
+
+%When I am in the last column of a table and just above a horizontal
+line in the table, pressing TAB creates a new table line before the
+horizontal line%. %How can I quickly move to the line below the
+horizontal line instead?%
+
+Press =down= (to get on the separator line) and then =TAB=
+Or configure the variable =org-table-tab-jumps-over-hlines=.
+
+** Change indentation of a table
+%How can I change the indentation of an entire table without fixing
+every line by hand?%
+
+The indentation of a table is set by the first line. So just fix the
+indentation of the first line and realign with =TAB=.
+
+* Agenda
+** Include Org-mode agenda into Emacs diary
+%Is it possible to include entries from org-mode files into my emacs
+diary?%
+
+Since the org-mode agenda is much more powerful and can contain the
+diary, you should think twice
+before deciding to do this. Integrating Org-mode information into the
+diary is, however, possible. You need to turn on /fancy diary
+display/ by setting in .emacs:
+
+: (add-hook 'diary-display-hook 'fancy-diary-display)
+
+Then include the following line into your ~/diary file, in
+order to get the entries from all files listed in the variable
+=org-agenda-files=
+
+: &%%(org-diary)
+You may also select specific files with
+
+: &%%(org-diary) ~/path/to/some/org-file.org
+: &%%(org-diary) ~/path/to/another/org-file.org
+
+If you now launch the calendar and press d to display a diary, the
+headlines of entries containing a timestamp, date range, schedule, or
+deadline referring to the selected date will be listed. Just like
+Org-mode's agenda view, the diary for @emph{today} contains additional
+entries for overdue deadlines and scheduled items. See also the
+documentation of the @command{org-diary} function. Under XEmacs, it is
+not possible to jump back from the diary to the org, this works only in
+the agenda buffer.
+
+* COMMENT HTML style specifications
+
+# Local Variables:
+# org-export-html-style: "<link rel=stylesheet href=\"freeshell2.css\" type=\"text/css\"> <style type=\"text/css\"> .tag { color: red; font-weight:bold}</style>"
+# End:
diff --git a/ORGWEBPAGE/survey.html b/ORGWEBPAGE/survey.html
new file mode 100644
index 0000000..fab186d
--- /dev/null
+++ b/ORGWEBPAGE/survey.html
@@ -0,0 +1,2195 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-Mode Survey Results</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2008/01/27 22:10:13"/>
+<meta name="author" content="Charles Cave"/>
+<style type="text/css">
+ html {
+ font-family: Times, serif;
+ font-size: 12pt;
+ }
+ .title { text-align: center; }
+ .todo { color: red; }
+ .done { color: green; }
+ .timestamp { color: grey }
+ .timestamp-kwd { color: CadetBlue }
+ .tag { background-color:lightblue; font-weight:normal }
+ .target { background-color: lavender; }
+ pre {
+ border: 1pt solid #AEBDCC;
+ background-color: #F3F5F7;
+ padding: 5pt;
+ font-family: courier, monospace;
+ }
+ table { border-collapse: collapse; }
+ td, th {
+ vertical-align: top;
+ <!--border: 1pt solid #ADB9CC;-->
+ }
+</style>
+</head><body>
+<h1 class="title">Org-Mode Survey Results</h1>
+Some descriptive text to be emitted. Several lines OK.
+
+
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">Survey introduction</a></li>
+<li><a href="#sec-2">1. Which operating system, version and Linux distribution?</a></li>
+<li><a href="#sec-3">2. Which Emacs are you using (GNU/Xemacs, etc) and which version? Paste the result of M-x version.</a></li>
+<li><a href="#sec-4">3. When did you first start using org-mode and how did you find out about it?</a></li>
+<li><a href="#sec-5">4. What are your main uses of org-mode?</a></li>
+<li><a href="#sec-6">5. New features and product maturity?</a></li>
+<li><a href="#sec-7">6. Additional tutorials, documentation and screencasts would you like?</a></li>
+<li><a href="#sec-8">7. Which features of org-mode do you use? (Spreadsheet, LaTeX, HTML, Remember, etc)</a></li>
+<li><a href="#sec-9">8. Your age</a></li>
+<li><a href="#sec-10">9. Which country do you live in?</a></li>
+<li><a href="#sec-11">10. Are there any other comments you would like to make about org-mode?</a></li>
+<li><a href="#sec-12">Appendix: Raw data for some questions:</a></li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-1">Survey introduction</h2>
+
+
+<p>
+A survey was conducted of org-mode users duing November 2007. An
+invitation was sent to the org-mode users list as well as announced on
+the <a href="http://orgmode.org">http://orgmode.org</a> web site. About 80 people resonded. This file
+contains a complete list of the answers, as the base of further
+discussion.
+</p>
+<p>
+Survey created and summarised by Charles Cave
+<a href="mailto:charlesweb@optusnet.com.au">mailto:charlesweb@optusnet.com.au</a>
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-2">1. Which operating system, version and Linux distribution?</h2>
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col><col align="left"></col>
+<thead>
+<tr><th>OS</th><th>N</th><th>bar</th></tr>
+</thead>
+<tbody>
+<tr><td>Windows</td><td>31</td><td>*******************************</td></tr>
+<tr><td>Linux</td><td>55</td><td>*******************************************************</td></tr>
+<tr><td>Mac OS X</td><td>12</td><td>************</td></tr>
+</tbody>
+</table>
+
+
+<p>
+The different Linux distributions:
+</p>
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col><col align="left"></col>
+<thead>
+<tr><th>Distribution</th><th>N</th><th>bar</th></tr>
+</thead>
+<tbody>
+<tr><td>Arch Linux</td><td>1</td><td>*</td></tr>
+<tr><td>Centos</td><td>1</td><td>*</td></tr>
+<tr><td>Debian</td><td>14</td><td>**************</td></tr>
+<tr><td>Fedora</td><td>7</td><td>*******</td></tr>
+<tr><td>FreeBSD</td><td>1</td><td>*</td></tr>
+<tr><td>Gentoo</td><td>7</td><td>*******</td></tr>
+<tr><td>Kununtu</td><td>1</td><td>*</td></tr>
+<tr><td>MagicLinux</td><td>1</td><td>*</td></tr>
+<tr><td>OpenBSD</td><td>1</td><td>*</td></tr>
+<tr><td>RedHat</td><td>2</td><td>**</td></tr>
+<tr><td>Solarus</td><td>2</td><td>**</td></tr>
+<tr><td>Suse</td><td>7</td><td>*******</td></tr>
+<tr><td>Ubuntu</td><td>9</td><td>*********</td></tr>
+<tr><td>Unspecified</td><td>2</td><td>**</td></tr>
+</tbody>
+</table>
+
+
+</div>
+
+<div class="outline-2">
+<h2 id="sec-3">2. Which Emacs are you using (GNU/Xemacs, etc) and which version? Paste the result of M-x version.</h2>
+
+
+<p>
+Summary:
+</p><table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col>
+<thead>
+<tr><th>Emacs/XEmacs</th><th>Number of answers</th></tr>
+</thead>
+<tbody>
+<tr><td>XEmacs</td><td>7</td></tr>
+<tr><td>Emacs total</td><td>73</td></tr>
+<tr><td>Emacs 21</td><td>4</td></tr>
+<tr><td>Emacs 22</td><td>47</td></tr>
+<tr><td>Emacs 23</td><td>18</td></tr>
+</tbody>
+</table>
+
+
+<p>
+The raw replies can be found <a href="#Raw--Emacs--versions">here</a>.
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-4">3. When did you first start using org-mode and how did you find out about it?</h2>
+
+
+<ul>
+<li>
+Org 5.04, Aug 2007 - Searching around the Web
+</li>
+<li>
+2007, December found about in in emacs wiki
+</li>
+<li>
+November 2006, found it while googling GTD tools
+</li>
+<li>
+moved from planner about 6 months ago
+</li>
+<li>
+2005, probably read about it on Sacha Chua's blog.
+</li>
+<li>
+August 2007? Heard of it a long time ago, maybe by following links
+from johnh's notebook mode. Finally switched from planner after a
+friend did the same.
+</li>
+<li>
+October 2007
+</li>
+<li>
+about the begining of 2007. Heard about it on the internet I guess.
+</li>
+<li>
+I found it by way of emacswiki.org. I was an avid user of outline
+mode, and found somebody's screencast (Scott Jaderholm's, I think)
+showing off org mode. I've been using it for probably about six
+months.
+</li>
+<li>
+Oct. 2007. I think I was looking for an alternative to planner.el.
+</li>
+<li>
+august 27, 2006. I found it while looking for an alternative to
+planner.
+</li>
+<li>
+Roughly 2005/6, through a friend.
+</li>
+<li>
+2007-Nov. Google.
+</li>
+<li>
+July 2007 after I saw the entry in Emacswiki
+</li>
+<li>
+april 2007
+</li>
+<li>
+2007-06 thrrough Sacha Chua's blog
+</li>
+<li>
+Oldest entry in my archive file is June 2005, but I think I was
+using org for a while before that. I don't remember when I heard
+about it.
+</li>
+<li>
+Around version 4.76, don't remember when. Found about it on the
+Emacs Wiki.
+</li>
+<li>
+10/2006 by chance looking for pim tools for Emacs
+</li>
+<li>
+One month ago, found a link on a web site
+</li>
+<li>
+11/2005
+</li>
+<li>
+02/2007 After getting annoyed with Muse-mode interaction with
+outline-mode, I googled and found org-mode and never went back.
+</li>
+<li>
+Using for about 2 years. Found org-mode after searching for a better
+version of outline-mode
+</li>
+<li>
+Sometime around Jan. 2005. Someone mentioned it on the 43folders.com
+message board (probably Jason F. McBrayer) and I decided I'd check
+it out.
+</li>
+<li>
+August 2007. I heard it about it on the planner mode mailing list.
+</li>
+<li>
+6-12 months ago!
+</li>
+<li>
+I read about org-mail from an email of a maillist &hellip; dnon't know
+which one
+</li>
+<li>
+A year ago because someone mentioned it in #emacs on freenode as a
+better planner-el solution
+</li>
+<li>
+2 months ago when I started using Emacs. I was also looking for a
+way to organize and found org-mode via blogs etc.
+</li>
+<li>
+3 month ago. I was looking forward some emacs "PIM".
+</li>
+<li>
+2007 September
+</li>
+<li>
+Can't remember; at least two years ago? I think I would have first
+heard about it from the Emacs Wiki.
+</li>
+<li>
+Around May 2007. I don't recall.
+</li>
+<li>
+No idea 6 months back probably; on the wiki site I think
+</li>
+<li>
+2007-08 First heard mention in a GTD mailing list, but realised it
+was going to be great after seeing screencast at
+<a href="http://jaderholm.com/screencasts.html">http://jaderholm.com/screencasts.html</a>
+</li>
+<li>
+2007
+</li>
+<li>
+almost 2 years emacs newsgroups
+</li>
+<li>
+2006-08 (version 4.50)
+</li>
+<li>
+approx. March 2006. I don't recall how I found out about it.
+</li>
+<li>
+I think I began using it in 2005. I found out about it on the
+planner list.
+</li>
+<li>
+it's been about a year, I can't remember how I found out about it,
+maybe on the #emacs channel IRC.
+</li>
+<li>
+2007-03 www.emacswiki.org
+</li>
+<li>
+1/2007 emacs NEWS
+</li>
+<li>
+In 2005, I found out about org-mode while googling for some kind of
+outliner software. My search must have hit upon a listserv post. My
+first try at using it was in June 2005, but I didn't like
+it. Carsten made many improvements and in December 2005, he emailed
+me to ask me what I thought. It thought it was pretty good, and I've
+been using it almost every day since.
+</li>
+<li>
+October 2006. Saw orgmode mentioned in comments on 43folders.com
+</li>
+<li>
+2007 july, emacs wiki
+</li>
+<li>
+Around September 2007. I first knew it from planner-mode mailing
+list. I used to use planner-mode.
+</li>
+<li>
+Oct 2007
+</li>
+<li>
+2007-09 NEWS in Gnu Emacs 22
+</li>
+<li>
+21 april 2006 (was the oldest .org file I could find on my
+system). Found out through&hellip; #emacs I think. dto was talking about
+it.
+</li>
+<li>
+I have a "org version 3.05" in my .emacs So it should be from spring
+2005 (March? May?) I read an article in the web, a blog I think. so
+I began using Emacs to use org (uh! :-)
+</li>
+<li>
+August 2007 Slashdot article on GTD Wired article on GTD Google
+search for GTD found org-mode tutorial.
+</li>
+<li>
+Sep 2005
+</li>
+<li>
+June 2007. At may I started learning Emacs for the first time, and
+together all its related modes. At #emacs at irc.freenode.org and at
+EmacsWiki it was mentioned org-mode.
+</li>
+<li>
+2007-04 I was into emacs learning and stumbled upon org-mode I don't
+remember where.
+</li>
+<li>
+2007 February, emacswiki.org and discussions on the planner.el
+mailing list
+</li>
+<li>
+Sometime before April 2006
+</li>
+<li>
+About 1 year ago.
+</li>
+<li>
+April 2006 (ca org-mode 4.25) Switching from Planner after numerous
+mentions of org on the planner mailing list.
+</li>
+<li>
+October 2006
+</li>
+<li>
+In june 2006. By reading the tutorial here:
+<a href="http://dto.freeshell.org/notebook/OrgTutorial.html">http://dto.freeshell.org/notebook/OrgTutorial.html</a>
+</li>
+<li>
+Aug 2005 After trying out Sacha's planning mode i knew it was close,
+but not quite right for me. Googling around I found org mode.
+</li>
+<li>
+Probably 2004, before it had texinfo documentation or even before
+the agenda view
+</li>
+<li>
+2007/10
+</li>
+<li>
+2007-01 I think I've read a blog about it or I've stumbled across it
+at emacswiki.org.
+</li>
+<li>
+I started to use org-mode a year ago. I found org-mode on the emacs
+wiki
+</li>
+<li>
+2007, September, read about it on the pages explaining how it was
+part of emacs-22
+</li>
+<li>
+November-December 2006, after googling for "emacs pim". Or,
+probably, there was an article (linux.com?).
+</li>
+<li>
+5/2006, after emacswiki or web tutorial
+</li>
+<li>
+at least as long as the newsgroup has been gmane, as I submitted it
+there. I must have found out on emacs wiki?
+</li>
+<li>
+~March 2007. I was using planner and I think I saw references to it
+there and checked it out.
+</li>
+<li>
+I subscribed to the list in 8/06. Maybe a month or two before that.
+</li>
+<li>
+2007-01-01
+</li>
+<li>
+2007/01, by a org-mode tutorial.
+</li>
+<li>
+I can't remember that. I used to use planner-mode. When someone
+mentioned org-mode on that mailing list, I decided to have a try.
+</li>
+<li>
+2006-03 &ndash; via your (Charles Cave) posting of 2006-03-10 to Getting Things Done
+yahoogroup.
+</li>
+<li>
+Around march 2006?
+</li>
+<li>
+Dunno. A while ago.
+</li>
+<li>
+2006 found out indirectly from the Planner mode or maybe Emacs Wiki
+</li>
+<li>
+2006/06 Emacs Wiki
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-5">4. What are your main uses of org-mode?</h2>
+
+
+<ul>
+<li>
+daily task planing, private and at work documenting know-hows,
+collecting informations (web searches etc.), contacts
+</li>
+<li>
+i plan to use it for GTD and (maybe) as replacement for LyX as
+general writing tool (via LaTeX export)
+</li>
+<li>
+Project planning, task management
+</li>
+<li>
+todo list / scheduler
+</li>
+<li>
+TODO list management
+</li>
+<li>
+Task list and note taking
+</li>
+<li>
+Todo-list administration - Time tracking - Creating outlines
+</li>
+<li>
+write lists to keep track of projects and infomation
+</li>
+<li>
+I mostly use it as an extended version of outline mode, as well as
+the agenda mode. Managing TODO lists and the like. I also really
+like the integration with remember mode.
+</li>
+<li>
+TODO list, calendar/appointment app, note-taking, "digital junk
+drawer" a la Yojimbo, minor mode for drafting documents,
+org-publish.el, org-blog.el
+</li>
+<li>
+Planning and taking notes (with remember mode.)
+</li>
+<li>
+TODO lists (GTD methodology) and diary
+</li>
+<li>
+Planning, project, time and task tracking.
+</li>
+<li>
+GTD system at home
+</li>
+<li>
+planning
+</li>
+<li>
+todo-lists
+</li>
+<li>
+Maintaining a GTD system for personal organization, tracking time
+for work reporting and billing.
+</li>
+<li>
+Organizing my tasks and plans at work. Trying to implement GTD with
+it.
+</li>
+<li>
+Reporting (org-outline/exporter!), GTD
+</li>
+<li>
+GTD, weekly planner
+</li>
+<li>
+Managing software development todo lists
+</li>
+<li>
+Agenda, todo tracking, lecture notes, blogging
+</li>
+<li>
+TODO list
+</li>
+<li>
+1) Maintaining my personal lists of projects and tasks 2)
+Maintaining a "wiki" of reference material (org-mode doc that links
+to external files and URLs) 3) Maintaining an archive of completed
+projects 4) Keeping track of my agenda 5) Outlining and
+brainstorming 6) Organizing journal entries
+</li>
+<li>
+Personal task lists.
+</li>
+<li>
+daily planning
+</li>
+<li>
+Organizing and managing projects
+</li>
+<li>
+gtd - project management - generating htmls - minutes, documentation
+</li>
+<li>
+notes, todo-lists, planner
+</li>
+<li>
+Agenda (GTD) Notes keeping Publishing tool
+</li>
+<li>
+Slowly it is becoming my desktop. I write, use it for email
+composition, technical documentation. Slowly getting into planning,
+agenda etc.
+</li>
+<li>
+Project planning and task tracking.
+</li>
+<li>
+keeping track of things to do.
+</li>
+<li>
+TODO and org-table
+</li>
+<li>
+Running my work and home todo lists and notes, but progressively
+more and more using it for everything.
+</li>
+<li>
+TODO list and meeting minutes
+</li>
+<li>
+Task/Todo List information list some local hacks for finance
+</li>
+<li>
+todo lists and knowledge base
+</li>
+<li>
+Task management (TODO lists) * Note taking * Export/Publish (e.g.,
+publish notes to website) * Personal web pages (via org-publish)
+</li>
+<li>
+I use orgtbl-mode most of the time in muse files, that's how I came
+into contact with org-mode. I use it for writing (software)
+documentation, (work related) project planning, and measuring the
+time I work on projects.
+</li>
+<li>
+planning my TODO list and more recently my agenda GTD style
+</li>
+<li>
+Timeplanning, Timekeeping, Todo/Reminder
+</li>
+<li>
+replacement for time management system (todos, project organisation,
+schedules) replacement for spreadsheet helper in LaTeX modes
+(orgtbl-mode)
+
+</li>
+<li>
+1.) Note taking: web links, links to lines of code I'm working on,
+bibtex entries. 2.) Brainstorming. When I'm trying to figure out how
+to do something, I often fire up org-mode, dump a bunch of random
+thoughts into it, and then organize it into something that makes
+sense. 3.) Experiment logging. I use table node to store pretty much
+all the results I've accumulated for my PhD thesis. 4.) TODO
+lists. I thought I'd use the GTD capabilities on org-mode but can't
+force myself to do it. But still, for little projects, I use the
+TODO lists.
+</li>
+<li>
+Action items Notes and lists Tables of passwords Publishing website
+</li>
+<li>
+maintain my thoughts, experimental results and agenda
+</li>
+<li>
+As a GTD tool to keep all aspects of my life organized.
+</li>
+<li>
+Lists GTD
+</li>
+<li>
+Just getting used to it. Try to organize primarily work stuff, maybe
+later will get into private things.
+</li>
+<li>
+note taking, managing todo's, keeping track of time spent on a
+project and making tables.
+</li>
+<li>
+Everything! :-) + keeping notes, + maintaining TODO lists +
+exploiting the Agenda facilities (wow!) + doing project planning +
+writing text and exporting in HTML + a 'database' for experiments
+data (I'm "implementing" it (wow, wow!)
+</li>
+<li>
+Task list/agenda/calendar some "filing" of data, storage of links to
+file system and web
+</li>
+<li>
+Note taking for courses
+</li>
+<li>
+Learn more about organizing tasks - Trying to substitute little
+papers with appointments - Publish works (thesis, articles, web
+pages, &hellip;) - Support a bit the process of writing an article
+(TODOs, deadlines, sections, &hellip;)
+</li>
+<li>
+documentation todo list management complete daily work organisation
+private and at work planing of schedules for church and sports
+créate customer visit protocols (html for colleagues) I have access
+to my org files via svn world-wide
+</li>
+<li>
+all aspects of GTD except calendar
+</li>
+<li>
+Outlining and Organising.
+</li>
+<li>
+Day to day planning. Constantly switching between gtd and John
+Wiegly's setup to find out what suits me best.
+</li>
+<li>
+Todo List management. Task Scheduling. Note taking. Blogging
+(Blorg). Simple Bug Tracking.
+</li>
+<li>
+Organizing my work.
+</li>
+<li>
+Managing all my projects and todo lists using GTD, and managing my
+diary/calendar. Basically, I use it to manage my life - home, work,
+social etc. Also use it for hierarchical editing of files etc, but
+that is secondary.
+</li>
+<li>
+day planner (in agenda view) - generation of hipsterPDA - easy
+folding documentation tool (write text docu, use folding to hide
+sections I'm not working on currently, and finally generate html or
+LaTeX
+</li>
+<li>
+GTD / Agenda
+</li>
+<li>
+I organize all my projects and appointments with org.
+</li>
+<li>
+Mainly todos/tasks planning and follow up
+</li>
+<li>
+I use it to keep track of articles I have to write for clients (I'm
+a journalist). I keep a page per client. I also use it to keep notes
+on personal stuff, such as sport activities, todo things around the
+house, garden and so on
+</li>
+<li>
+advanced todo list, reading diary, simple HTML authoring.
+</li>
+<li>
+Project management
+</li>
+<li>
+note taking, task management, document creation, webpage publishing
+</li>
+<li>
+task management, notes about work and home projects, regular
+journaling &ndash; the list of things is expanding as I spend more and
+more time in emacs/org.
+</li>
+<li>
+Project planning, scheduling. Information
+gathering. Wishlists. Outlines. Todo lists (checkboxes). Data
+munging (tables) Review planning (outline w/ links)
+</li>
+<li>
+For GTD and basic word processing
+</li>
+<li>
+Projects, Notes, Memorial days etc.
+</li>
+<li>
+single file for everything
+</li>
+<li>
+Amassing and sorting to-dos and reference information. (Recovering
+from mild brain injury in 2005 that affected ability to categorize
+and prioritize, need mechanical aids!)
+</li>
+<li>
+Handling notes. Displaying the calendar. Use the agenda view to
+display notes.
+</li>
+<li>
+Outlining and providing group TODO lists with explanations.
+</li>
+<li>
+To Do List and Project Tracking Writing articles for export to HTML
+</li>
+<li>
+Note taking, task management
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-6">5. New features and product maturity?</h2>
+
+
+<p>
+Original question:
+</p>
+<p>
+What new features (if any) would you like to see in org-mode or do you
+think the product has reached maturity?
+</p>
+<ul>
+<li>
+case sensitive search in tag completition - multilingual day name
+input product has reached maturity in my opinion
+</li>
+<li>
+nothing (for now)
+</li>
+<li>
+A way to make it more Gnome friendly would be nice. In the case that
+you don't have emacs started, you lose your ideas until you can note
+them down.
+</li>
+<li>
+I still haven't learnt enough to fully customize my environment.
+</li>
+<li>
+Nothing specific, but I love the current state of development.
+</li>
+<li>
+Syncing todos to other devices such as cellphones and palms, I know
+it would not be very easy to do but would be extremely useful
+</li>
+<li>
+No idea, sorry. I think it has enough features at present that seems
+a bit intimidating, really. (Minor quibble &ndash; I changed some of the
+keybindings. I prefer M-left/right to hide/show subtrees, rather
+than cycling with tab, and use # instead of * for outline
+levels. This is mostly habits from a "todo-mode" used on emacs
+in-house where I work.)
+</li>
+<li>
+I'm on the lookout for a cell phone that runs Emacs, but&hellip; I haven't
+found any mechanisms for remotely adding/editing timestamps,
+changing the state of TODO items, etc. Neither have I found a way to
+trigger reminder sounds, e-mails, phone calls, or IM messages. I'm
+not sure about the best way to approach "mobile org-mode"&hellip; A
+web-interface like Webjimbo? More robust import/export/sync to iCal
+or GData? If we can find a way to usefully sync org-mode with mobile
+devices, it'll be just about perfect.
+</li>
+<li>
+Current features are enough for me.
+</li>
+<li>
+It is certainly mature. However I would also like to be able to use
+it as a wiki and general-purpose document authoring/publishing
+tool. In an ideal (and possibly unrealistic) world I would love to
+see unification with muse-mode. To what extent is this possible?
+</li>
+<li>
+I am still too new to it to comment on this.
+</li>
+<li>
+It's quite mature and I surely don't master it. What I'd like to see
+is easier manipulation of the agenda export.
+</li>
+<li>
+Compatibility with other wiki syntax (importer or exporter)
+</li>
+<li>
+too soon to know
+</li>
+<li>
+Basically mature; I'd like to see refinement within the current
+feature set.
+</li>
+<li>
+You can always add new features! I would like to see an easy way to
+tell how old my entries are. I would like to be able to derive a
+task order based on importance and age (for tasks that don't have a
+deadline but must be completed eventually). Also I would like to see
+it integrated with other tools. I think a MindMap converter (for
+FreeMind) would be cool - although it probably could be an external
+script.
+</li>
+<li>
+Export to WordprocessingML would be perfect. Currently I export to
+HTML and read the reports into Word, saving them as *.doc. But you
+loose some features and details doing this.
+</li>
+<li>
+Integration out-of-the-box with remote calendar systems like Google
+Calendar
+</li>
+<li>
+Close to maturity. Some new features would be nice, but not terribly
+important: Keeping root to leaf tree structure when archiving part
+of a subtree. Simple dependent todos (i.e. dependent todo moves into
+"NEXT" state when previous todo is marked "DONE"). Exporting entries
+in HTML in monospaced font by default (i.e. without specially
+marking individual entries). Auto-sorting of entries within a single
+parent node (e.g. when a node is marked "DONE", move it lower in the
+parent's list of todos). Integration with project management
+software.
+</li>
+<li>
+Some kind of resolution to the line wrapping issue with headlines.
+</li>
+<li>
+Simpler ways of doing things (perhaps with mouse commands)
+</li>
+<li>
+I'd say it's pretty close to maturity. I haven't used most of the
+more recently-added advanced features.
+</li>
+<li>
+I'd like easier customization of "workflow" steps that would make it
+easier to update states and record notes related to state changes
+(and skip these notes when the state transitions are obvious in
+nature).
+</li>
+<li>
+No immediate demands. I do not think the project has reached
+maturity.
+</li>
+<li>
+This product has reached maturity since long! In my point of view
+this is. Excellent work!
+</li>
+<li>
+depending tasks - integrated pdf-generation (especially for
+windows) - visualisation for tasks (like gantt) - a minor mode for
+contacts like vcard.el
+</li>
+<li>
+I think it reached maturity. It would be nice to have some minor
+things, like a posibility to insert todo's right inside your project
+source code and then have them added in agenda automatically.
+</li>
+<li>
+Instead of new features, I'd much prefer keeping XEmacs
+compatibility
+</li>
+<li>
+Wishlist - Adding arbitrary (user specified) relations between nodes
+with a specific relation name. for example, x &lt;part of&gt; y; where x
+and y are two nodes. - Making the above functionality work between
+files - making the above work between nodes published on a
+distributed server In the GNU project GNOWSYS, we do this, where it
+is a web application. We are now exploring how org mode can be used
+as a client to manage the data published in GNOWSYS. Out team would
+be more than willing to collaborate, but our team members are all
+Python hackers, and use Emacs only for coding
+</li>
+<li>
+I am having trouble keeping up with the many new features of the
+last few months!
+</li>
+<li>
+I think it is mature enough for me
+</li>
+<li>
+automatic reminders in Emacs as pop ups?
+</li>
+<li>
+I'm quite content as it is. I guess I could probably think of one or
+two things, but I wouldn't want to spoil its power/simplicity
+balance.
+</li>
+<li>
+ planing times for tasks and compare them to actuel used times (and
+also give out a warning if to many hours are planed for one day) -
+agenda export to latex - simple project management
+</li>
+<li>
+a gtd framework would be a killer feature!! more visual effects with
+overlays However, it's "déjà" a very good work. Thanks.
+</li>
+<li>
+very mature
+</li>
+<li>
+Nearing maturity, but then again, maybe I'm just out of ideas.
+</li>
+<li>
+I would like org-mode (or other parts of it like orgtbl) to become a
+minor mode so I can turn it on/off in other buffers (mainly
+muse). For example I would love to use todo list editing features in
+emails.
+</li>
+<li>
+I don't understant all the features yet :)
+</li>
+<li>
+export facilitie
+</li>
+<li>
+New features, in order of importance to me: 1.) A way to select a
+chunk of text in firefox and paste it into org-mode, along with a
+nicely formatted URL link. I would use this many times a day. MS
+OneNote does this well. 2.) A way to link to email in an IMAP
+folder. Preferably, this link would point directly to the email on
+the IMAP server. The link should look like all the other links, and
+you should be able to just drag it from, say, Thunderbird, into
+org-mode, although a Thunderbird keyboard shortcut would be nice. I
+would use this every day. 3.) More flexible outline prefixes. You
+should be able to make headlines of this type: I. asdlfk i. asdfj
+ii. asdlfkj II. &hellip; Or 1. Introduction 1.1 asdfkj 1.2
+asdfkl 2. Background &hellip; Emacs hyperbole:
+<a href="http://directory.fsf.org/project/hyperbole/">http://directory.fsf.org/project/hyperbole/</a> did this
+beautifully. 4.) Internal links search in a way consistent with
+emacs search (Ctrl-s). When you click on a link, it should go
+towards the end of the buffer for the next match. When there's
+nothing towards the end, it should wrap to the top. 5.) Fix the
+underline/bold/italic stuff (if that is a new feature) 6.) Better
+formatted html table export
+</li>
+<li>
+Better support for working with others.
+</li>
+<li>
+I would like to see different way to view or summarize ageda. Like
+progress, next possible todo
+</li>
+<li>
+I think org-mode is quite mature now except there may be still some
+bugs in it and some features may need more polish
+</li>
+<li>
+Too novice a user yet to comment
+</li>
+<li>
+can't tell yet.
+</li>
+<li>
+I like to be surprised more than wishing
+</li>
+<li>
+I'd like better integration with calendar mode of
+emacs. Specifically, when using the calendar, the command 'i d' to
+insert an appointment, the diary file is used. I'd like to set a
+headline in my orgmode buffer for that insert, for consistency with
+the calendar entries I make by hand while processing my inbox Also,
+navigation from agenda to org-file is easy. navigating back is
+harder.
+</li>
+<li>
+possibly nested numbered lists: 1. head 1 1.1 sub-head 1 1.2
+sub-head 2 Also lettered lists: a. point a b. point b but I'm
+already quite satisfied
+</li>
+<li>
+ implement all features of muse-mode. Ex: list of pages, backlinks,
+following links with Enter, &hellip; - consistent and clear syntax for
+formatting text, which doesn't require memorizing use cases or
+exceptions (ex: <b>a</b> isn't bold)
+</li>
+<li>
+syncing with my palm would be the greatest need. (syncing with
+outlook would do the job as outlook is snced with the palm)
+</li>
+<li>
+mostly small things like an isearch mode that only matches headlines
+(and doesn't auto expand), an allout-copy-exposed-to-buffer
+equivalent, hipster pda publishing
+</li>
+<li>
+I've too many ideas to write here. The only thing i can think of is
+not quite org related. A published bison or antlr grammar, so people
+can write org parsers/processors in other languages, and extend its
+integration into other systems.
+</li>
+<li>
+Org mode is fairly mature. Only the remaining inconsistencies should
+be straightened out.
+</li>
+<li>
+Hard to say, every so often I think of a feature that might be nice
+to have. I have a feeling that alternate views (like the agenda) to
+allow other ways of exploring your information would be handy, but I
+have no concrete ideas yet as to what they might be.
+</li>
+<li>
+Better exporting (for example better LaTeX export).
+</li>
+<li>
+The only thing I need is better integration with mh-e (I suspect it
+is already there - just need to find the time to sort it out). Other
+than that I am very content!
+</li>
+<li>
+ I always wanted to be able to schedule a task for a specific week
+(as oposed to a date) - I would like to improve the hipsterPDA
+generation (export the agenda view as nice LaTeX, improve the
+cal-tex output, etc)
+</li>
+<li>
+Org grows faster than I can learn all those nice features. One
+feature I'd love to see was that the HTML export created docs that
+could be outlined like in an org buffer. I guess that's possible
+with some CSS.
+</li>
+<li>
+Task dependency for project planing
+</li>
+<li>
+At the moment, I'm still on the learning curve. Org-mode has
+soooooooooo many features I have not even discovered yet. I almost
+daily open the manual pages to see I there is something I can use.
+</li>
+<li>
+Probably, customization of built-in agenda view. But I'd rather see
+org-mode streamlined and cleaned of unnecessary
+complications. Properties should be either integrated more tightly
+to replace tags/priorities/etc, or removed.
+</li>
+<li>
+Looking forward to some of the dependency ideas.
+</li>
+<li>
+Import tasks from .ics files, include .ics files in agenda,
+eventually include remote .ics files in agenda. Would like an
+updated blogging tool that takes advantage of recent developments.
+</li>
+<li>
+I'm working on integration with my email client and web browser --
+it's a slow process because I'm not a programmer, but I'm learning
+bits and pieces about bash shell scripts and grabbing what I can
+from experts already using org.
+</li>
+<li>
+I'd like a way to set project (outline item) dependencies and to
+easily list those projects in dependency order. I could do it now
+with properties, a dynamic block and some elisp. I'd use markup more
+if it were more reliable in the emacs buffer. It might be nice to
+have a mode where rigid outline style indenting is enforced while
+editing outlines and lists. Perhaps as a buffer option or subtree
+property. None of this is necessary or worth calling org-mode
+immature.
+</li>
+<li>
+Not new features. But perhaps splitting org.el into different
+modules: one for outlining, one for doc format (Wiki engine), one
+for GTD
+</li>
+<li>
+block quote text support. like wiki {{{ This is quote text }}}
+Currently only putting ':' at beginning of text or heading.
+</li>
+<li>
+I hope a better archive mechanism using C-c C-x C-c, which could
+keep the structure in my org file.
+</li>
+<li>
+Seems mature; new features always interesting but can add a layer of
+too-many-choices distraction. (See prioritizing problems above ;) )
+</li>
+<li>
+New summary type {%} for progress status. Real comment syntax.
+</li>
+<li>
+I use only a fraction of its features.
+</li>
+<li>
+Mature
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-7">6. Additional tutorials, documentation and screencasts would you like?</h2>
+
+
+<p>
+Original question:
+Which topics or "how-to" guides would you like to see in the
+documentation or as a tutorial or screencast?
+</p>
+<ul>
+<li>
+none. documentation is excellent
+</li>
+<li>
+how to prepare/export/print GTD file to A7(index cards hPDA (hipster
+PDA) forms
+</li>
+<li>
+Everything should be a screencast for new users.
+</li>
+<li>
+I'd love to see more examples (with code) of how people use org,
+especially for implementing GTD.
+</li>
+<li>
+More detailed information about blogging would be great, especially
+motivation for using org.
+</li>
+<li>
+The manual and refcard usually have me covered. An in-depth
+screencast on table/calc might be nice.
+</li>
+<li>
+More stuff about methodology to use it.
+</li>
+<li>
+Screencasts are most helpful to me. I would like to see material on
+publishing and blogging in particular
+</li>
+<li>
+Project lifecycle. Timesheet reports.
+</li>
+<li>
+Exporting to other formats and customizing that
+</li>
+<li>
+lot of screencast showing new features of org (such as one already
+done)
+</li>
+<li>
+The documentation is actually rather good as it is, haven't found
+anything lacking yet.
+</li>
+<li>
+Integration with remember
+</li>
+<li>
+Integrating org-mode with pine/alpine mailer.
+</li>
+<li>
+Not sure who you want to target. Advanced users are your bread and
+butter and probably are OK. Beginners should get some screencasts
+that describe a common problem and just focuses an how org mode can
+help them. A good example is something like when someone's todo list
+gets too long and complex and they want to split it, but maintain
+connections between items on various lists, or perhaps view a
+chronological list of all items in one location. Org mode is the
+only program I know of the handles this kind of complexity
+gracefully.
+</li>
+<li>
+In depth explanation of using the agenda to its fullest
+</li>
+<li>
+I'd love to see one on setting up column views. A tutorial on
+publishing files would be great. And one about creating custom
+agenda views.
+</li>
+<li>
+Changing the keybindings to make specific state transitions easier
+to enter
+</li>
+<li>
+don't know as of yet &hellip;
+</li>
+<li>
+using the spreadsheet with merged cells, calculation for rows and
+columns - showing the true meaning of the properties stuff - over
+all there should be examples - i really dislike the manual form
+orgmode.org because it is technical oriented not for the simple
+user - more howtos for gtd -&gt; learning from each other
+</li>
+<li>
+Different usages of org-mode. From GTD to other ways &hellip;
+</li>
+<li>
+I find the manual well written and sufficient.
+</li>
+<li>
+Use of drawers and properties.
+</li>
+<li>
+HOw to organize multiple projects; auto-archival.
+</li>
+<li>
+org spreadsheet
+</li>
+<li>
+Since Org-mode is (to me) a collection of "orthogonal" features, but
+doesn't much impose structure, I'd be interested in seeing how
+others organise their data and "bring it to life" with the Org-mode
+features.
+</li>
+<li>
+none
+</li>
+<li>
+more documentation for org's lisp functions (in fact more examples
+with org's lisp funtions!!)
+</li>
+<li>
+remember mode integration
+</li>
+<li>
+I prefer the documentation and experimentation. Need drives my
+learning.
+</li>
+<li>
+I don't have any preferences.
+</li>
+<li>
+Can't think of any
+</li>
+<li>
+I think a new user would benefit from a screencast showing basic
+hierarchy creation and navigation
+</li>
+<li>
+Remember Practical uses of properties
+</li>
+<li>
+I would like to see more people to share their ways of using org
+model
+</li>
+<li>
+The documentation is already very good and it seems the manual is
+never out of sync from the latest org-mode version. I found the
+mailing list is the best source of "how-to" as people's individual
+situations are so much different.
+</li>
+<li>
+more of org for gtd
+</li>
+<li>
+how to deal with the calendar and insert dates quickly - two-way
+backends for groupware-like behavior - calender functionality for
+scheduled events (receive popups or emails or sms or the like) -
+probably more but it's too early to say
+</li>
+<li>
+drawers + table calculations
+</li>
+<li>
+Using org-mode as a calendar/planner. Perhaps a best practice around
+where date- and time-stamps belong (in the headline? in a SCHEDULED:
+property? DEADLINE: property?) Also, it would be helpful to be shown
+the best practices around Categories (since they show up so
+prominently in the agenda) I wanted them to be like David Allen's
+"Contexts", but that's hard for me to manage.
+</li>
+<li>
+All the variables that you must configure to be able to write and
+export an article successfully and without unexpected results - How
+to move from {muse,kwiki,reST,planner,&hellip;} to org-mode: how to adapt
+the syntax, &hellip;
+</li>
+<li>
+examples of how to columns view
+</li>
+<li>
+real examples of different ways of using org-mode
+</li>
+<li>
+Scope projects? integrate Org into a software development
+process/project? Handle &lt;not at computer&gt; org interactions?
+</li>
+<li>
+Daily use of agenda
+</li>
+<li>
+I'm still not familiar with the more advanced features of org-mode,
+so I'm keen to see these areas explored in tutorials and guides.
+</li>
+<li>
+The spreadsheet.
+</li>
+<li>
+None that I would be interested in, although I accept that new users
+would benefit from them.
+</li>
+<li>
+I think column-view is a great feature. Bastiens tutorial is good,
+but I'm thinking a tutorial focused more on the use case as opposed
+to the config option might be better. If I find time :-)
+</li>
+<li>
+I don't know if it's just me, but currently I make no use of
+tags. So any how-to or screencasts of how to use categories and tags
+together in a senseful way would be nice. Most usages of tags I've
+seen so far where tags like :phonecall: or :appoitment:, but when I
+have a TODO "Call Jim" or "Meet Jim" those are superluous&hellip;
+</li>
+<li>
+I would welcome such how-to's and offer to help. The drawback of
+screencasts is they take a long time, and there is no way a viewer
+can tell it will be usefull to sit it all out. A guide giving
+examples (and using short screencasts, if necessary) gives the
+reader an overview, he/she can skip sections and browse to a
+chapter/paragraph deemed usefull. I would like to learn howto tweak
+my custom built todo-lists so that some of the statuses show up in
+the agenda, and others don't. Example WRITE should be on the agenda,
+but INVOICE not really. But the intermediate VERIFY should.
+</li>
+<li>
+More on GTD. Agenda customization.
+</li>
+<li>
+More on column mode and new uses of properties.
+</li>
+<li>
+I know there are books and howtos about lisp, but it would be great
+to see some smaller howtos that are specific to org applications,
+and code samples.
+</li>
+<li>
+The remember mode stuff scares me. I need to take some time learn
+it. I also know agenda can do a lot more than I do with it. I'd like
+to see screen shots of of column mode to drool over since I'm not
+running emacs 22 yet.
+</li>
+<li>
+can't thing of any
+</li>
+<li>
+Spreadsheet examples.
+</li>
+<li>
+how-to setup a gtd style system is always my favorite.
+</li>
+<li>
+Some experienced users' detailed explication of pros and cons of the
+newer TMTOWTDI (There's More Than One Way To Do It) choices like
+archiving methods, task states, etc. leading to &ndash; you
+guessed it &ndash; prioritizing problems
+</li>
+<li>
+Building complex agenda views.
+</li>
+<li>
+Dunno.
+</li>
+<li>
+Setting up a publishing/blog environment
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-8">7. Which features of org-mode do you use? (Spreadsheet, LaTeX, HTML, Remember, etc)</h2>
+
+
+<ul>
+<li>
+Document Structure, Tables, Spreadsheet, Hyperlinks, TODO items,
+Tags, Properties and Columns, Dates and Times, (Custom) Agenda Views
+</li>
+<li>
+LaTeX, Remember
+</li>
+<li>
+Use the agenda/tags views heavily. Tables, but not really
+spreadsheets.
+</li>
+<li>
+Rememeber
+</li>
+<li>
+remember, agenda views.
+</li>
+<li>
+I'm sure I will use everything at some point. I've finally started
+using remember recently, about to start using HTML for blogging I
+think, and can imaging using LaTeX to print index cards even.
+</li>
+<li>
+Todo-list, agenda - remember
+</li>
+<li>
+Remember, agenda, I learned to use the tags / priorities, but they
+don't seem to fit my style of use.
+</li>
+<li>
+Publish to HTML and LaTeX (although I'd prefer ConTeXt), dynamic
+blocks, orgstruct minor mode, and hyperlinks. I'm not sure if they
+count as a "feature", but I use deadlines, scheduling, and repeated
+tasks <b>a lot</b>.
+</li>
+<li>
+remember, clock summary.
+</li>
+<li>
+TODO keywords, tags, timestamps (inc. deadlines/scheduling),
+priorities, export to HTML/ics, tables, archiving, remember, custom
+agenda commands
+</li>
+<li>
+Still exploring.. starting out with fundamentals as described in
+John Weigly's excellent write-up.
+</li>
+<li>
+HTML, Remember
+</li>
+<li>
+Basic planning, some html export, Wannt to use more features of org
+but lack of time
+</li>
+<li>
+Remember, html
+</li>
+<li>
+Much use of Remember, agenda, agenda todo lists. Some use of HTML
+and LaTeX. A little use of spreadsheet.
+</li>
+<li>
+Starting to use spreadsheets and tables. I use the [/] feature to
+keep track of task counts a lot. I like the "radio" links too. Don't
+use the others much.
+</li>
+<li>
+Export2HTML, Remember, Agenda
+</li>
+<li>
+Remember, LaTex, ical export, Agenda and Diary integration
+</li>
+<li>
+HTML. My usage is pretty basic.
+</li>
+<li>
+LaTeX, HTML, Agenda, diary integration, Todo, outlining like crazy
+</li>
+<li>
+Spreadsheet (for tables)
+</li>
+<li>
+I use Remember, HTML, agenda views, hyperlinks, time-tracking,
+timestamps, and tags. I occasionally use tables, and plan on using
+the PROPERTIES drawer in the future. I don't currently use any
+advanced table formulas or column view, but I'm glad they're there.
+</li>
+<li>
+Remember, basic task lists, and mostly the Agenda views.
+</li>
+<li>
+LaTex, HTML, Remember, Cal, diary
+</li>
+<li>
+all
+</li>
+<li>
+agenda - html - spreadsheet
+</li>
+<li>
+Spreadsheet, remember, time logger and outlines.
+</li>
+<li>
+Document structure + hyperlinks, agenda + remember, exporting and
+publishing
+</li>
+<li>
+writing documents, LaTeX, HTML.
+</li>
+<li>
+Remember; tables.
+</li>
+<li>
+Remember, and the todo features.
+</li>
+<li>
+simple to do listing
+</li>
+<li>
+A lot: Outlines, Tables, Spreadsheets, TODOs, Links, Tags,
+Timestamps, Clocking Time. A little: Agenda views, Properties and
+Columns Not at all: LaTeX, HTML, Remember I plan to increase my
+usage of all the above, apart from LaTeX, which I'll probably never
+use.
+</li>
+<li>
+Remember
+</li>
+<li>
+Remember, Latex, spreadsheet (with calc)
+</li>
+<li>
+just to basic features
+</li>
+<li>
+ * TODO's, including ** Scheduling ** Deadlines ** Archiving (both
+tag and function) * Remember * LaTeX * export/HTML * Tables *
+org-publish * Agendas
+</li>
+<li>
+spreadsheet, HTML
+</li>
+<li>
+remember, agenda, priority
+</li>
+<li>
+Remember
+</li>
+<li>
+all
+</li>
+<li>
+Basic outlining with tons of links of most types allowed. * Tables *
+HTML export * TODO's
+</li>
+<li>
+Tables, HTML, Remember
+</li>
+<li>
+table, agenda, remember
+</li>
+<li>
+Probably the question is bettered asked with "which features of
+org-mode do you not use?" :-) It seems I have almost used everything
+except properties and drawers. Although I did not go into depth of
+many of them, like I never used a formula in the built in org-mode
+table.
+</li>
+<li>
+tags, todos, links, timestamps
+</li>
+<li>
+remember, agenda
+</li>
+<li>
+tables, HTML, ToDo stuff/agenda, column mode, clock features,
+categories
+</li>
+<li>
+Agenda, time tracking, HTML, latex, spreadsheet
+agenda export to ics (iCalendar) file TODO proper- ty drawers
+</li>
+<li>
+headings, tags, links, drawers &amp; properties, table (&amp; occasionally
+spreadsheet), remember, todo's
+</li>
+<li>
+outlining - basic spreadsheet - org-export-as-latex - HTML -
+org-publish - marking TODO/DONE (or equivalents) - agenda
+</li>
+<li>
+Remember HTML
+</li>
+<li>
+HTML, Remember, custom agenda views, tags matches, custom keyword
+states, diary integration, recurring tasks, scheduling and
+deadlines, org-nnml, hyperlinks, categories
+</li>
+<li>
+Agenda, Remember, Tags, Ascii Export, Tables, Outlining
+</li>
+<li>
+Spreadsheet
+</li>
+<li>
+sometimes Spreadsheet remember extensively LaTeX/Html export
+</li>
+<li>
+Remember, Blorg, org-publish, Tables, Lists, Checkboxes, TODO
+sequences.
+</li>
+<li>
+LaTeX, html, remember, spreadsheet
+</li>
+<li>
+Tags, Remember, Diary integration, Logging, sometimes spreadsheet
+usage.
+</li>
+<li>
+folding, TODOs, Agenda view, HTML generation, column-view
+</li>
+<li>
+Spreadsheet, HTML, Remember, fast selection of TODO keywords, links
+to everywhere, extended timestamps and intervals
+</li>
+<li>
+Spreadsheet, HTML
+</li>
+<li>
+I use remember very often. I have not really touched the
+spreadsheet, don't need to. I use the deadline feature all the time
+and the [/] todo list type. I have experimented with export to html,
+in order to transport stuff to a very smart smart phone (iphone) but
+that requires more tweaking on my side.
+</li>
+<li>
+todo and logging state changes, tags, priorities, hyperlinks,
+remember, timestamps, agenda, export to HTML.
+</li>
+<li>
+Folding, spreadsheet, column mode, properties, schedule/agenda,
+org-remember, html export, todo, tags
+</li>
+<li>
+I use everything except radio stuff and dynamic blocks, and I think
+I will use those soon. Don't use XOXO export either, I guess.
+</li>
+<li>
+remember, tables, tasks, tags, archiving, calendar, html export, and
+I'm learning a bit about LaTeX.
+</li>
+<li>
+In no particular order: tables, plain list folding, checkboxes and
+checkbox counting [/], multiple todo sequences, tags, properties,
+inactive dates, elisp formulas, html export, text export, in-buffer
+markups (*/_), subtree in indirect buffer, links
+</li>
+<li>
+latex, html, remember
+</li>
+<li>
+spreadsheet, remember, agenda, outline, property, column view
+</li>
+<li>
+remember, archive, appointment, diary, timeclock
+</li>
+<li>
+Remember for fast to-do adds; use tables occasionally but mostly use
+dedicated spreadsheet s/w for such functions. Hope to learn LaTeX at
+some point.
+</li>
+<li>
+Agenda views Table editing Properties drawers HTML export LaTeX
+export
+</li>
+<li>
+HTML. Remember. Tables.
+</li>
+<li>
+Mainly time stamps, agendas and HTML export
+</li>
+<li>
+LaTeX, Spreadsheet, Remember
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-9">8. Your age</h2>
+
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col><col align="left"></col>
+<thead>
+<tr><th>Age range</th><th>N</th><th>bar</th></tr>
+</thead>
+<tbody>
+<tr><td>16 - 20</td><td>0</td><td></td></tr>
+<tr><td>21 - 25</td><td>5</td><td>*****</td></tr>
+<tr><td>26 - 30</td><td>15</td><td>***************</td></tr>
+<tr><td>31 - 35</td><td>21</td><td>*********************</td></tr>
+<tr><td>36 - 40</td><td>11</td><td>***********</td></tr>
+<tr><td>41 - 45</td><td>13</td><td>*************</td></tr>
+<tr><td>46 - 50</td><td>3</td><td>***</td></tr>
+<tr><td>51 - 55</td><td>3</td><td>***</td></tr>
+<tr><td>56 - 60</td><td>0</td><td></td></tr>
+</tbody>
+</table>
+
+
+</div>
+
+<div class="outline-2">
+<h2 id="sec-10">9. Which country do you live in?</h2>
+
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col><col align="left"></col>
+<thead>
+<tr><th>Country</th><th>N</th><th>bar</th></tr>
+</thead>
+<tbody>
+<tr><td>Australia</td><td>3</td><td>***</td></tr>
+<tr><td>Canada</td><td>2</td><td>**</td></tr>
+<tr><td>China</td><td>2</td><td>**</td></tr>
+<tr><td>Croatia</td><td>2</td><td>*</td></tr>
+<tr><td>France</td><td>5</td><td>*****</td></tr>
+<tr><td>Germany</td><td>17</td><td>*****************</td></tr>
+<tr><td>Hungary</td><td>1</td><td>*</td></tr>
+<tr><td>Iceland</td><td>1</td><td>*</td></tr>
+<tr><td>India</td><td>4</td><td>****</td></tr>
+<tr><td>Italy</td><td>2</td><td>**</td></tr>
+<tr><td>Netherlands</td><td>3</td><td>***</td></tr>
+<tr><td>New Zealand</td><td>1</td><td>*</td></tr>
+<tr><td>Norway</td><td>1</td><td>*</td></tr>
+<tr><td>Pakistan</td><td>1</td><td>*</td></tr>
+<tr><td>Romania</td><td>1</td><td>*</td></tr>
+<tr><td>Russia</td><td>1</td><td>*</td></tr>
+<tr><td>Scotland</td><td>1</td><td>*</td></tr>
+<tr><td>Slovenia</td><td>1</td><td>*</td></tr>
+<tr><td>Spain</td><td>1</td><td>*</td></tr>
+<tr><td>Sweden</td><td>1</td><td>*</td></tr>
+<tr><td>Switzerland</td><td>1</td><td>*</td></tr>
+<tr><td>UK</td><td>7</td><td>*******</td></tr>
+<tr><td>USA</td><td>23</td><td>***********************</td></tr>
+</tbody>
+</table>
+
+
+</div>
+
+<div class="outline-2">
+<h2 id="sec-11">10. Are there any other comments you would like to make about org-mode?</h2>
+
+
+<ul>
+<li>
+Thanks for this great software, I've waited for years for such a
+tool. I've wrote some tools around org in Perl, hopefully I'll find
+some time to contribute. Thanx a lot
+</li>
+<li>
+Great tool to stay even longer in emacs OS :-)
+</li>
+<li>
+Thanks!
+</li>
+<li>
+Great App, Great Support, Great Community
+</li>
+<li>
+org-mode is all-the-way cool.
+</li>
+<li>
+With the possible exception of Emacs itself, org-mode is my very
+favorite bit of software. It has inspired me to learn LISP, so I'm
+looking forward to contributing in the near future.
+</li>
+<li>
+It's fantastic and the maintainership and community are both second
+to none!
+</li>
+<li>
+Later. :)
+</li>
+<li>
+Great mode and very useful. Thanks a lot for your effort and time!
+</li>
+<li>
+Great Work ! Felicitation to its author
+</li>
+<li>
+It's indispensable for my current work and lifestyle.
+</li>
+<li>
+It is a great package, thanks for making it available and keeping
+it alive!
+</li>
+<li>
+Thanks for the org-mode. I just love it! Do all my personal and job
+planning with it!
+</li>
+<li>
+Great tool, thanks thanks thanks :)
+</li>
+<li>
+It's fantastic &ndash; thanks for the great tool. I'm getting older and
+it's the only way I can "remember" everything. It's not just a great
+todo list manager, but I use it to document almost everything about
+my job (e.g. my original intentions about a
+project/implementation). I can bury a TODO right down in the place
+where I have most of the surrounding documentation.
+</li>
+<li>
+I cannot overstate how valuable this mode is. It single handedly has
+the potential to make laypeople aware of Emacs. Thanks so much for
+working on it!
+</li>
+<li>
+Love it. Love it. Love it. Carsten is awesome.
+</li>
+<li>
+It's changing very fast, and I'm worried that my muscle memory will
+start to fight against the changes. Still, it's good to see an Emacs
+package with such active interest and support.
+</li>
+<li>
+I'm a happy user. Thanks to Carten and all contributors
+</li>
+<li>
+great guys on the mailinglist, great spirit, excellent product :-)
+</li>
+<li>
+Carsten, many thanks for this great piece of software! Keep it
+simple and usuable - not everybody follows the power user discussion
+in gmane
+</li>
+<li>
+Keep up the great work! :)
+</li>
+<li>
+Thanks to Carsten and to people on emacs-orgmode !!
+</li>
+<li>
+Been a user of GNU Emacs for the last 18years, never seen such a
+fascinating major mode. I like this kind of apps since I work in
+knowledge organization, and would like to contribute in some
+way. Our lab gnowledge.org would like to develop a java applet that
+provides org mode kind of editing. The buffer thus produced will be
+converted into html when the page is being served in the
+background. This will encourage the community to do structured
+documentation. Our lab is now engaged in developing
+beta.selfplatform.eu, where in we would like to provide this
+feature. Do you think, orgmode developers would like to help us or
+contribute in this endeavor. Orgmode can be very useful for
+furthering semantic computing.
+</li>
+<li>
+It is a great product. I does not need to grow. It might risk
+feature creep.
+</li>
+<li>
+Excellent package
+</li>
+<li>
+Thank you, Carsten!
+</li>
+<li>
+Has increased my productivity a lot!
+</li>
+<li>
+Really a great thank to the author "Carsten Dominik", "chapeau" as
+they say in France!!!!
+</li>
+<li>
+Org-mode was relatively immature when I started using it, and I have
+kept with it for 2 simple reasons: 1. The maintainer (Carsten) is
+friendly, fast, accurate, and thorough 2. It works &ndash; it does what
+it claims to do, and does it well
+</li>
+<li>
+Org mode keeps me organized, it's outstanding!
+</li>
+<li>
+hmmh, org-mode is the first thing I start in the morning and the
+last I close in the evening, I guess this tells it all.
+</li>
+<li>
+Org mode has been an incredibly useful tool that is fun to use. I
+think a main reason for its utility is that basic use requires
+little thought. When I'm using it for brainstorming, it's almost
+like I'm not aware that I'm using any program &ndash; I'm just
+thinking. Any changes to org-mode should preserve this
+simplicity. Thanks a ton to Carsten and all the others who have
+contributed to this great project!
+</li>
+<li>
+Thank you Carsten!
+</li>
+<li>
+Maybe we should consider a separate package or maintainer for
+xemacs&hellip;.
+</li>
+<li>
+Thanks, thanks and thanks.
+</li>
+<li>
+Good stuff. thanks
+</li>
+<li>
+It's Fun. ASCII is usually the only interface I can get used to,
+because it's so fast.
+</li>
+<li>
+org-mode makes me look organised (though a bit quirky). That's
+enough reason to use it.
+</li>
+<li>
+Amazing!!!!!!!!!!!!!!!! :-)
+</li>
+<li>
+Even if org-mode stands right where it is, it has been enormously
+helpful. Thank you very, very much.
+</li>
+<li>
+Well done
+</li>
+<li>
+Yes: org-mode progresses very well and improves with each version
+</li>
+<li>
+for me its the greatest found treasure since I "dicovered" Emacs.
+</li>
+<li>
+Great work! Wish I had time to contribute more.
+</li>
+<li>
+Keep up the good work :)
+</li>
+<li>
+It's a great software project and community. Thanks again to
+everyone involved!
+</li>
+<li>
+Excellent piece of software!
+</li>
+<li>
+I'm very very happy with it.
+</li>
+<li>
+org-mode is fantastic :-)
+</li>
+<li>
+The best feature of Org are its two maintainers Carsten and Bastien
+and its helpful community.
+</li>
+<li>
+Great mode for emacs. I wish I was using it more
+</li>
+<li>
+It is great tool. Uncluttered. Thanks to Carsten et al.
+</li>
+<li>
+Rock on!
+</li>
+<li>
+favorite piece of software I use.
+</li>
+<li>
+I'm continually amazed by what org can do, and also by how intuitive
+it is. It's not at all unusual that I find myself thinking that it
+would be great if org/emacs did "x", trying what seems to me to be
+the way that it would do "x" if it could, and discovering that it
+functions just as I expect. And when it doesn't, there are ways to
+figure it out. (And Carsten is a great developer who shines at
+hearing what his users are doing, responding to expressed needs, and
+even being clear if/when he decides not to do what someone would
+like him to do. Other heavy users and scripters are great as well.
+</li>
+<li>
+I started using Org-mode as an outliner. It is the best outliner
+I've used an much more. The community is valuable but Carsten's
+skill and judgment has made org-mode what it is.
+</li>
+<li>
+It's a killer tool that I could not live without.
+</li>
+<li>
+org-mode is great, I hope it can keep clean text file when adding
+functions.
+</li>
+<li>
+I forced myself to learn emacs after 25+ years in the vi camp in
+order to use org-mode. Loving it. Carsten's enthusiasm and support
+are a joy, and the mailing list is always refreshing.
+</li>
+<li>
+I plan to run a website where users could share Org files and edit
+them together. I plan to write a better exporter (and more formats!)
+I think the Org syntax is mature enough to get more programs
+interacting with it outside Emacs. Org is <b>great</b> :)
+</li>
+<li>
+It's wonderful. Thanks!
+</li>
+<li>
+org-mode is a fantastic program, supported by a lively helpful email
+list. Carsten is very responsive to feature requests and helping.
+
+
+</li>
+</ul>
+<p>-end-
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-12">Appendix: Raw data for some questions:</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-13"><span class="target">Raw Emacs versions</span> </h3>
+
+<p>Here are the detailed responses, for reference.
+</p>
+<p>
+<pre>
+GNU Emacs 22.1.1 (powerpc-unknown-linux-gnu, GTK+ Version 2.10.13) of 2007-07-08 on malo, modified by Debian 2. GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+21.3.1 and 22.1.1
+22.0.96.1 on Windows CVS from the unicode2 branch on Linux
+Emacs 22.1 GNU Emacs 22.1.1 (i686-pc-linux-gnu, GTK+ Version 2.10.11) of 2007-09-16 on zen
+Emacs 22.1. Where I happen to be sitting, M-x version says: GNU Emacs 22.1.1 (sparc-sun-solaris2.8, X toolkit) of 2007-06-15 on sa
+Emacs 23
+Emacs from CVS GNU Emacs 23.0.60.1 (i486-pc-linux-gnu, GTK+ Version 2.12.0) of 2007-10-31 on samarium
+Emacs22
+GNU 22.0.98.1
+GNU Emacs 21.3.1
+GNU Emacs 22.0.50.1 (i386-mingw-nt5.1.2600) of 2006-03-21 on YAMALOK
+GNU Emacs 22.0.91.1
+GNU Emacs 22.0.95.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-03-02 on pacem, modified by Debian
+GNU Emacs 22.0.96.1 (i386-mingw-nt5.1.2600) of 2007-03-24 on NEUTRINO
+GNU Emacs 22.0.990.1 (i386-mingw-nt5.1.2600) of 2007-05-23 on LENNART-69DE564 (patched)
+GNU Emacs 22.1
+GNU Emacs 22.1
+GNU Emacs 22.1.1
+GNU Emacs 22.1.1
+GNU Emacs 22.1.1
+GNU Emacs 22.1.1 (i386-apple-darwin9, Carbon Version 1.6.0)
+GNU Emacs 22.1.1 (i386-apple-darwin9.0.0, X toolkit) of 2007-11-05 on selenium. dmg
+GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+GNU Emacs 22.1.1 (i486-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-07-22 on nautilus, modified by Debian"
+GNU Emacs 22.1.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-08-22 on raven, modified by Debian
+GNU Emacs 22.1.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-11-03 on pacem, modified by Debian
+GNU Emacs 22.1.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-11-03 on pacem, modified by Debian - Gnu Emacs 22.1 windows version
+GNU Emacs 22.1.1 (i586-suse-linux-gnu, GTK+ Version 2.12.0) of 2007-11-06 on balada
+GNU Emacs 22.1.1 (i686-pc-linux-gnu) of 2007-09-27
+GNU Emacs 22.1.1 (i686-pc-linux-gnu, GTK+ Version 2.10.4)
+GNU Emacs 22.1.1 (i686-pc-linux-gnu, GTK+ Version 2.10.6) of 2007-09-14, in an Eterm
+GNU Emacs 22.1.1 (powerpc-apple-darwin7.9.0, Carbon Version 1.6.0) of 2007-07-22 on applecore.inf.ed.ac.uk - Aquamacs Distribution 1.
+GNU Emacs 22.1.1 (powerpc-apple-darwin8.10.0, Carbon Version 1.6.0) of 2007-10-04 on malibu.local
+GNU Emacs 22.1.1 (x86_64-pc-linux-gnu, GTK+ Version 2.12.0) of 2007-11-06 on king, modified by Ubuntu
+GNU Emacs 22.1.2 (i386-unknown-openbsd4.1, X toolkit) of 2007-06-10 on lucien.my.domain
+GNU Emacs 22.1.50.1
+GNU Emacs 22.1.50.1 (i386-apple-darwin8.10.1, Carbon Version 1.6.0) of 2007-10-02 on plume.sr.unh.edu - Aquamacs Distribution 1.2a
+GNU Emacs 22.1.50.1 (i386-mingw-nt5.1.2600) of 2007-07-07 on NEUTRINO
+GNU Emacs 22.1.50.1 (i686-pc-linux-gnu, X toolkit) of 2007-06-18 on ...
+GNU Emacs 23.0.0.1 (i386-mingw-nt5.1.2600) of 2007-07-10 on BREP
+GNU Emacs 23.0.0.1 (i386-mingw-nt5.1.2600) of 2007-08-18 on TPAD
+GNU Emacs 23.0.0.1 (i686-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-03-18
+GNU Emacs 23.0.0.1 (i686-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-08-13 on cera" (emacs-unicode2), Emacs 22.1 under Windows.
+GNU Emacs 23.0.50.1 (i386-mingw-nt5.1.2600) of 2007-11-13 (via CVS, compiled with GnuWin32 native tools rather than cygwin)
+GNU Emacs 23.0.50.1 (i486-pc-linux-gnu, GTK+ Version 2.12.1) of 2007-11-11 on elegiac, modified by Debian
+GNU Emacs 23.0.50.1 (i486-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-10-14 on elegiac, modified by Debian"
+GNU Emacs 23.0.50.1 (i686-pc-linux-gnu, GTK+ Version 2.12.1) of 2007-11-15 on baldur
+GNU Emacs 23.0.60.1
+GNU Emacs 23.0.60.1 (i486-pc-linux-gnu, GTK+ Version 2.12.0) of 2007-10-31 on samarium
+GNU Emacs 23.0.60.1 (i686-pc-linux-gnu, GTK+ Version 2.10.14) of 2007-10-29
+GNU Emacs 23.0.60.1 (i686-suse-linux-gnu, GTK+ Version 2.12.0)
+GNU Emacs 23.0.60.1 (i686-suse-linux-gnu, GTK+ Version 2.12.0)
+GNU Emacs 23.0.60.1 (x86_64-unknown-linux-gnu, GTK+ Version 2.12.1)
+GNU Emacs CVS (~23.0.50.1)
+GNU Emacs CVS 20071101
+GNU Emacs CVS 23.0.0
+GNU Emacs On Windows XP: GNU Emacs 22.0.990.1 (i386-mingw-nt5.1.2600) of 2007-05-23 on LENNART-69DE564 (patched) On Linux: GNU Emacs 22.1.50.1 (armv5tel-unknown-linux-gnu) of 2007-06-22 on homehub
+GNU Emacs and Carbon Emacs, both 22.1
+GNU. On Debian: GNU Emacs 23.0.50.1 (x86_64-pc-linux-gnu, GTK+ Version 2.12.1) of 2007-11-11 on elegiac, modified by Debian The other isn't available right now.
+Gnu Emacs 22.1.1 and 21.4 (patch 20) "Double Solitaire" XEmacs Lucid
+Gnu Emacs v22.1.50.1
+Gnu/Emacs GNU Emacs 23.0.60.1 (x86_64-unknown-linux-gnu, GTK+ Version 2.12.0) of 2007-11-11
+Carbon Emacs, an OS X distro of GNU Emacs 22.1.50
+XEmacs 21.4 (patch 19) "Constant Variable" [Lucid] (i486-linux-gnu, Mule) of Fri Nov 3 2006 on penell
+XEmacs 21.4 (patch 20) "Double Solitaire" [Lucid] (i486-linux-gnu) of Fri Oct 19 2007 on penell
+XEmacs 21.4 (patch 20) "Double Solitaire" [Lucid] (i686-pc-cygwin, Mule) of Fri Dec 15 2006 on vzell-de
+XEmacs 21.4 (patch 20) \"Double Solitaire\" [Lucid] (i686-pc-cygwin, Mule) of Fri Dec 15 2006 on vzell-d
+XEmacs 21.4.20 (distributed with Cygwin)
+XEmacs 21.5 (beta28) "fuki" [Lucid] (i686-pc-linux, Mule) of Wed Jun 13 2007 on n2
+XEmacs Lucid 21.4 (patch 19) "Constant Variable" - on Windows, Similar on linux (not at machine)
+Emacs
+Emacs 21.4.1 emacs 21.?.? (at work, I'm not certain)
+GNU
+GNU 22.1.1
+GNU emacs
+GNU emacs 22.1.50.1 (snapshot)
+GNU emacs GNU Emacs 22.0.97.1 (i686-pc-linux-gnu, GTK+ Version 2.4.13)
+</pre>
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-14"><span class="target">Raw ages</span> </h3>
+
+
+<p>
+<pre>
+22 Sun, 11/25/07 6:38 PM
+22 Thu, 11/15/07 11:55 PM
+24 Fri, 11/16/07 4:15 AM
+25 Sun, 11/18/07 10:05 PM
+25 Sun, 11/25/07 12:04 PM
+
+26 Mon, 11/19/07 10:29 AM
+26 Sat, 11/24/07 4:38 AM
+26 Thu, 11/15/07 2:45 PM
+26 Thu, 11/15/07 7:22 PM
+27 Fri, 11/16/07 9:20 AM
+27 Wed, 11/28/07 3:20 AM
+28 Sun, 12/2/07 5:32 AM
+28 Thu, 11/15/07 10:06 PM
+28 Thu, 11/15/07 12:04 PM
+28 Thu, 11/15/07 12:17 PM
+29 Mon, 11/19/07 8:06 PM
+29 Thu, 11/15/07 11:27 AM
+30 Fri, 11/16/07 3:26 AM
+30 Thu, 11/15/07 10:07 PM
+30 Thu, 11/15/07 3:01 PM
+
+31 Fri, 11/16/07 2:30 AM
+31 Sun, 11/18/07 3:14 PM
+31 yrs. Fri, 11/23/07 7:04 PM
+32 Fri, 11/23/07 10:11 PM
+32 Thu, 11/15/07 12:02 PM
+33 Fri, 11/16/07 12:54 PM
+33 Sat, 11/17/07 4:41 AM
+33 Sat, 11/24/07 2:28 AM
+33 Thu, 11/15/07 11:23 AM
+33 Thu, 11/15/07 11:34 PM
+33 Thu, 11/15/07 12:27 PM
+33 Wed, 11/21/07 11:57 PM
+34 Fri, 11/16/07 1:24 AM
+34 Mon, 11/19/07 7:31 PM
+34 Thu, 11/22/07 6:59 AM
+35 Fri, 11/16/07 3:23 AM
+35 Fri, 11/16/07 7:53 AM
+35 Mon, 11/19/07 10:03 AM
+35 Sun, 12/9/07 2:40 AM
+35 Thu, 11/22/07 6:47 PM
+35 Tue, 11/27/07 11:04 AM
+
+36 Fri, 11/16/07 3:19 AM
+37 Fri, 11/16/07 12:11 PM
+37 Fri, 11/16/07 12:36 AM
+37 Fri, 11/23/07 1:13 AM
+37 Thu, 11/15/07 9:09 PM
+37 Thu, 11/22/07 3:39 AM
+37 Tue, 11/20/07 10:55 PM
+38 Sun, 12/23/07 1:43 AM
+39 Sun, 11/18/07 9:52 PM
+39 Thu, 11/15/07 4:53 PM
+40 Thu, 11/15/07 6:00 PM
+
+41 Fri, 11/16/07 7:36 AM
+41 Sat, 11/17/07 9:27 AM
+42 Fri, 11/23/07 7:58 AM
+42 Mon, 11/19/07 9:18 AM
+42 Sat, 11/17/07 2:31 AM
+42 Sat, 11/17/07 4:32 AM
+42 Thu, 11/15/07 11:45 PM
+42 Thu, 11/15/07 8:23 PM
+43 Mon, 12/10/07 12:58 AM
+45 Fri, 11/16/07 3:21 AM
+45 Fri, 11/16/07 4:40 AM
+45 Fri, 11/16/07 4:40 AM
+45 Sun, 11/18/07 7:39 PM
+
+46 Fri, 11/16/07 4:18 AM
+47 Thu, 11/15/07 8:42 PM
+49 Thu, 11/15/07 11:15 AM
+</pre>
+</p>
+<p>
+52 Mon, 11/19/07 12:40 AM
+54 Thu, 11/15/07 11:38 AM
+54 Thu, 11/15/07 12:27 PM
+</p>
+</div>
+</div>
+<div id="postamble"><p class="author"> Author: Charles Cave
+<a href="mailto:charles.cave@gmail.com">&lt;charles.cave@gmail.com&gt;</a>
+</p>
+<p class="date"> Date: 2008/01/27 22:10:13</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/survey.org b/ORGWEBPAGE/survey.org
new file mode 100644
index 0000000..378c45b
--- /dev/null
+++ b/ORGWEBPAGE/survey.org
@@ -0,0 +1,1158 @@
+#+TITLE: Org-Mode Survey Results
+#+AUTHOR: Charles Cave
+#+EMAIL: charles.cave@gmail.com
+#+LANGUAGE: en
+#+OPTIONS: H:3 num:nil toc:1 \n:nil @:t ::t |:t ^:t -:t f:t *:t TeX:t LaTeX:nil skip:t d:nil tags:not-in-toc
+
+* Survey introduction
+
+A survey was conducted of org-mode users duing November 2007. An
+invitation was sent to the org-mode users list as well as announced on
+the http://orgmode.org web site. About 80 people resonded. This file
+contains a complete list of the answers, as the base of further
+discussion.
+
+Survey created and summarised by Charles Cave
+mailto:charlesweb@optusnet.com.au
+
+* 1. Which operating system, version and Linux distribution?
+| OS | N | bar |
+|----------+----+---------------------------------------------------------|
+| Windows | 31 | ******************************* |
+| Linux | 55 | ******************************************************* |
+| Mac OS X | 12 | ************ |
+
+The different Linux distributions:
+
+| Distribution | N | bar |
+|--------------+----+----------------|
+| Arch Linux | 1 | * |
+| Centos | 1 | * |
+| Debian | 14 | ************** |
+| Fedora | 7 | ******* |
+| FreeBSD | 1 | * |
+| Gentoo | 7 | ******* |
+| Kununtu | 1 | * |
+| MagicLinux | 1 | * |
+| OpenBSD | 1 | * |
+| RedHat | 2 | ** |
+| Solarus | 2 | ** |
+| Suse | 7 | ******* |
+| Ubuntu | 9 | ********* |
+| Unspecified | 2 | ** |
+
+* 2. Which Emacs are you using (GNU/Xemacs, etc) and which version? Paste the result of M-x version.
+
+Summary:
+| Emacs/XEmacs | Number of answers |
+|--------------+-------------------|
+| XEmacs | 7 |
+| Emacs total | 73 |
+| Emacs 21 | 4 |
+| Emacs 22 | 47 |
+| Emacs 23 | 18 |
+
+The raw replies can be found [[Raw Emacs versions][here]].
+
+* 3. When did you first start using org-mode and how did you find out about it?
+
+- Org 5.04, Aug 2007 - Searching around the Web
+- 2007, December found about in in emacs wiki
+- November 2006, found it while googling GTD tools
+- moved from planner about 6 months ago
+- 2005, probably read about it on Sacha Chua's blog.
+- August 2007? Heard of it a long time ago, maybe by following links
+ from johnh's notebook mode. Finally switched from planner after a
+ friend did the same.
+- October 2007
+- about the begining of 2007. Heard about it on the internet I guess.
+- I found it by way of emacswiki.org. I was an avid user of outline
+ mode, and found somebody's screencast (Scott Jaderholm's, I think)
+ showing off org mode. I've been using it for probably about six
+ months.
+- Oct. 2007. I think I was looking for an alternative to planner.el.
+- august 27, 2006. I found it while looking for an alternative to
+ planner.
+- Roughly 2005/6, through a friend.
+- 2007-Nov. Google.
+- July 2007 after I saw the entry in Emacswiki
+- april 2007
+- 2007-06 thrrough Sacha Chua's blog
+- Oldest entry in my archive file is June 2005, but I think I was
+ using org for a while before that. I don't remember when I heard
+ about it.
+- Around version 4.76, don't remember when. Found about it on the
+ Emacs Wiki.
+- 10/2006 by chance looking for pim tools for Emacs
+- One month ago, found a link on a web site
+- 11/2005
+- 02/2007 After getting annoyed with Muse-mode interaction with
+ outline-mode, I googled and found org-mode and never went back.
+- Using for about 2 years. Found org-mode after searching for a better
+ version of outline-mode
+- Sometime around Jan. 2005. Someone mentioned it on the 43folders.com
+ message board (probably Jason F. McBrayer) and I decided I'd check
+ it out.
+- August 2007. I heard it about it on the planner mode mailing list.
+- 6-12 months ago!
+- I read about org-mail from an email of a maillist ... dnon't know
+ which one
+- A year ago because someone mentioned it in #emacs on freenode as a
+ better planner-el solution
+- 2 months ago when I started using Emacs. I was also looking for a
+ way to organize and found org-mode via blogs etc.
+- 3 month ago. I was looking forward some emacs "PIM".
+- 2007 September
+- Can't remember; at least two years ago? I think I would have first
+ heard about it from the Emacs Wiki.
+- Around May 2007. I don't recall.
+- No idea 6 months back probably; on the wiki site I think
+- 2007-08 First heard mention in a GTD mailing list, but realised it
+ was going to be great after seeing screencast at
+ http://jaderholm.com/screencasts.html
+- 2007
+- almost 2 years emacs newsgroups
+- 2006-08 (version 4.50)
+- approx. March 2006. I don't recall how I found out about it.
+- I think I began using it in 2005. I found out about it on the
+ planner list.
+- it's been about a year, I can't remember how I found out about it,
+ maybe on the #emacs channel IRC.
+- 2007-03 www.emacswiki.org
+- 1/2007 emacs NEWS
+- In 2005, I found out about org-mode while googling for some kind of
+ outliner software. My search must have hit upon a listserv post. My
+ first try at using it was in June 2005, but I didn't like
+ it. Carsten made many improvements and in December 2005, he emailed
+ me to ask me what I thought. It thought it was pretty good, and I've
+ been using it almost every day since.
+- October 2006. Saw orgmode mentioned in comments on 43folders.com
+- 2007 july, emacs wiki
+- Around September 2007. I first knew it from planner-mode mailing
+ list. I used to use planner-mode.
+- Oct 2007
+- 2007-09 NEWS in Gnu Emacs 22
+- 21 april 2006 (was the oldest .org file I could find on my
+ system). Found out through... #emacs I think. dto was talking about
+ it.
+- I have a "org version 3.05" in my .emacs So it should be from spring
+ 2005 (March? May?) I read an article in the web, a blog I think. so
+ I began using Emacs to use org (uh! :-)
+- August 2007 Slashdot article on GTD Wired article on GTD Google
+ search for GTD found org-mode tutorial.
+- Sep 2005
+- June 2007. At may I started learning Emacs for the first time, and
+ together all its related modes. At #emacs at irc.freenode.org and at
+ EmacsWiki it was mentioned org-mode.
+- 2007-04 I was into emacs learning and stumbled upon org-mode I don't
+ remember where.
+- 2007 February, emacswiki.org and discussions on the planner.el
+ mailing list
+- Sometime before April 2006
+- About 1 year ago.
+- April 2006 (ca org-mode 4.25) Switching from Planner after numerous
+ mentions of org on the planner mailing list.
+- October 2006
+- In june 2006. By reading the tutorial here:
+ http://dto.freeshell.org/notebook/OrgTutorial.html
+- Aug 2005 After trying out Sacha's planning mode i knew it was close,
+ but not quite right for me. Googling around I found org mode.
+- Probably 2004, before it had texinfo documentation or even before
+ the agenda view
+- 2007/10
+- 2007-01 I think I've read a blog about it or I've stumbled across it
+ at emacswiki.org.
+- I started to use org-mode a year ago. I found org-mode on the emacs
+ wiki
+- 2007, September, read about it on the pages explaining how it was
+ part of emacs-22
+- November-December 2006, after googling for "emacs pim". Or,
+ probably, there was an article (linux.com?).
+- 5/2006, after emacswiki or web tutorial
+- at least as long as the newsgroup has been gmane, as I submitted it
+ there. I must have found out on emacs wiki?
+- ~March 2007. I was using planner and I think I saw references to it
+ there and checked it out.
+- I subscribed to the list in 8/06. Maybe a month or two before that.
+- 2007-01-01
+- 2007/01, by a org-mode tutorial.
+- I can't remember that. I used to use planner-mode. When someone
+ mentioned org-mode on that mailing list, I decided to have a try.
+- 2006-03 -- via your (Charles Cave) posting of 2006-03-10 to Getting Things Done
+ yahoogroup.
+- Around march 2006?
+- Dunno. A while ago.
+- 2006 found out indirectly from the Planner mode or maybe Emacs Wiki
+- 2006/06 Emacs Wiki
+
+* 4. What are your main uses of org-mode?
+
+- daily task planing, private and at work documenting know-hows,
+ collecting informations (web searches etc.), contacts
+- i plan to use it for GTD and (maybe) as replacement for LyX as
+ general writing tool (via LaTeX export)
+- Project planning, task management
+- todo list / scheduler
+- TODO list management
+- Task list and note taking
+- Todo-list administration - Time tracking - Creating outlines
+- write lists to keep track of projects and infomation
+- I mostly use it as an extended version of outline mode, as well as
+ the agenda mode. Managing TODO lists and the like. I also really
+ like the integration with remember mode.
+- TODO list, calendar/appointment app, note-taking, "digital junk
+ drawer" a la Yojimbo, minor mode for drafting documents,
+ org-publish.el, org-blog.el
+- Planning and taking notes (with remember mode.)
+- TODO lists (GTD methodology) and diary
+- Planning, project, time and task tracking.
+- GTD system at home
+- planning
+- todo-lists
+- Maintaining a GTD system for personal organization, tracking time
+ for work reporting and billing.
+- Organizing my tasks and plans at work. Trying to implement GTD with
+ it.
+- Reporting (org-outline/exporter!), GTD
+- GTD, weekly planner
+- Managing software development todo lists
+- Agenda, todo tracking, lecture notes, blogging
+- TODO list
+- 1) Maintaining my personal lists of projects and tasks 2)
+ Maintaining a "wiki" of reference material (org-mode doc that links
+ to external files and URLs) 3) Maintaining an archive of completed
+ projects 4) Keeping track of my agenda 5) Outlining and
+ brainstorming 6) Organizing journal entries
+- Personal task lists.
+- daily planning
+- Organizing and managing projects
+- gtd - project management - generating htmls - minutes, documentation
+- notes, todo-lists, planner
+- Agenda (GTD) Notes keeping Publishing tool
+- Slowly it is becoming my desktop. I write, use it for email
+ composition, technical documentation. Slowly getting into planning,
+ agenda etc.
+- Project planning and task tracking.
+- keeping track of things to do.
+- TODO and org-table
+- Running my work and home todo lists and notes, but progressively
+ more and more using it for everything.
+- TODO list and meeting minutes
+- Task/Todo List information list some local hacks for finance
+- todo lists and knowledge base
+- Task management (TODO lists) * Note taking * Export/Publish (e.g.,
+ publish notes to website) * Personal web pages (via org-publish)
+- I use orgtbl-mode most of the time in muse files, that's how I came
+ into contact with org-mode. I use it for writing (software)
+ documentation, (work related) project planning, and measuring the
+ time I work on projects.
+- planning my TODO list and more recently my agenda GTD style
+- Timeplanning, Timekeeping, Todo/Reminder
+- replacement for time management system (todos, project organisation,
+ schedules) replacement for spreadsheet helper in LaTeX modes
+ (orgtbl-mode)
+
+- 1.) Note taking: web links, links to lines of code I'm working on,
+ bibtex entries. 2.) Brainstorming. When I'm trying to figure out how
+ to do something, I often fire up org-mode, dump a bunch of random
+ thoughts into it, and then organize it into something that makes
+ sense. 3.) Experiment logging. I use table node to store pretty much
+ all the results I've accumulated for my PhD thesis. 4.) TODO
+ lists. I thought I'd use the GTD capabilities on org-mode but can't
+ force myself to do it. But still, for little projects, I use the
+ TODO lists.
+- Action items Notes and lists Tables of passwords Publishing website
+- maintain my thoughts, experimental results and agenda
+- As a GTD tool to keep all aspects of my life organized.
+- Lists GTD
+- Just getting used to it. Try to organize primarily work stuff, maybe
+ later will get into private things.
+- note taking, managing todo's, keeping track of time spent on a
+ project and making tables.
+- Everything! :-) + keeping notes, + maintaining TODO lists +
+ exploiting the Agenda facilities (wow!) + doing project planning +
+ writing text and exporting in HTML + a 'database' for experiments
+ data (I'm "implementing" it (wow, wow!)
+- Task list/agenda/calendar some "filing" of data, storage of links to
+ file system and web
+- Note taking for courses
+- Learn more about organizing tasks - Trying to substitute little
+ papers with appointments - Publish works (thesis, articles, web
+ pages, ...) - Support a bit the process of writing an article
+ (TODOs, deadlines, sections, ...)
+- documentation todo list management complete daily work organisation
+ private and at work planing of schedules for church and sports
+ créate customer visit protocols (html for colleagues) I have access
+ to my org files via svn world-wide
+- all aspects of GTD except calendar
+- Outlining and Organising.
+- Day to day planning. Constantly switching between gtd and John
+ Wiegly's setup to find out what suits me best.
+- Todo List management. Task Scheduling. Note taking. Blogging
+ (Blorg). Simple Bug Tracking.
+- Organizing my work.
+- Managing all my projects and todo lists using GTD, and managing my
+ diary/calendar. Basically, I use it to manage my life - home, work,
+ social etc. Also use it for hierarchical editing of files etc, but
+ that is secondary.
+- day planner (in agenda view) - generation of hipsterPDA - easy
+ folding documentation tool (write text docu, use folding to hide
+ sections I'm not working on currently, and finally generate html or
+ LaTeX
+- GTD / Agenda
+- I organize all my projects and appointments with org.
+- Mainly todos/tasks planning and follow up
+- I use it to keep track of articles I have to write for clients (I'm
+ a journalist). I keep a page per client. I also use it to keep notes
+ on personal stuff, such as sport activities, todo things around the
+ house, garden and so on
+- advanced todo list, reading diary, simple HTML authoring.
+- Project management
+- note taking, task management, document creation, webpage publishing
+- task management, notes about work and home projects, regular
+ journaling -- the list of things is expanding as I spend more and
+ more time in emacs/org.
+- Project planning, scheduling. Information
+ gathering. Wishlists. Outlines. Todo lists (checkboxes). Data
+ munging (tables) Review planning (outline w/ links)
+- For GTD and basic word processing
+- Projects, Notes, Memorial days etc.
+- single file for everything
+- Amassing and sorting to-dos and reference information. (Recovering
+ from mild brain injury in 2005 that affected ability to categorize
+ and prioritize, need mechanical aids!)
+- Handling notes. Displaying the calendar. Use the agenda view to
+ display notes.
+- Outlining and providing group TODO lists with explanations.
+- To Do List and Project Tracking Writing articles for export to HTML
+- Note taking, task management
+
+* 5. New features and product maturity?
+
+Original question:
+
+What new features (if any) would you like to see in org-mode or do you
+think the product has reached maturity?
+
+- case sensitive search in tag completition - multilingual day name
+ input product has reached maturity in my opinion
+- nothing (for now)
+- A way to make it more Gnome friendly would be nice. In the case that
+ you don't have emacs started, you lose your ideas until you can note
+ them down.
+- I still haven't learnt enough to fully customize my environment.
+- Nothing specific, but I love the current state of development.
+- Syncing todos to other devices such as cellphones and palms, I know
+ it would not be very easy to do but would be extremely useful
+- No idea, sorry. I think it has enough features at present that seems
+ a bit intimidating, really. (Minor quibble -- I changed some of the
+ keybindings. I prefer M-left/right to hide/show subtrees, rather
+ than cycling with tab, and use # instead of * for outline
+ levels. This is mostly habits from a "todo-mode" used on emacs
+ in-house where I work.)
+- I'm on the lookout for a cell phone that runs Emacs, but... I haven't
+ found any mechanisms for remotely adding/editing timestamps,
+ changing the state of TODO items, etc. Neither have I found a way to
+ trigger reminder sounds, e-mails, phone calls, or IM messages. I'm
+ not sure about the best way to approach "mobile org-mode"... A
+ web-interface like Webjimbo? More robust import/export/sync to iCal
+ or GData? If we can find a way to usefully sync org-mode with mobile
+ devices, it'll be just about perfect.
+- Current features are enough for me.
+- It is certainly mature. However I would also like to be able to use
+ it as a wiki and general-purpose document authoring/publishing
+ tool. In an ideal (and possibly unrealistic) world I would love to
+ see unification with muse-mode. To what extent is this possible?
+- I am still too new to it to comment on this.
+- It's quite mature and I surely don't master it. What I'd like to see
+ is easier manipulation of the agenda export.
+- Compatibility with other wiki syntax (importer or exporter)
+- too soon to know
+- Basically mature; I'd like to see refinement within the current
+ feature set.
+- You can always add new features! I would like to see an easy way to
+ tell how old my entries are. I would like to be able to derive a
+ task order based on importance and age (for tasks that don't have a
+ deadline but must be completed eventually). Also I would like to see
+ it integrated with other tools. I think a MindMap converter (for
+ FreeMind) would be cool - although it probably could be an external
+ script.
+- Export to WordprocessingML would be perfect. Currently I export to
+ HTML and read the reports into Word, saving them as *.doc. But you
+ loose some features and details doing this.
+- Integration out-of-the-box with remote calendar systems like Google
+ Calendar
+- Close to maturity. Some new features would be nice, but not terribly
+ important: Keeping root to leaf tree structure when archiving part
+ of a subtree. Simple dependent todos (i.e. dependent todo moves into
+ "NEXT" state when previous todo is marked "DONE"). Exporting entries
+ in HTML in monospaced font by default (i.e. without specially
+ marking individual entries). Auto-sorting of entries within a single
+ parent node (e.g. when a node is marked "DONE", move it lower in the
+ parent's list of todos). Integration with project management
+ software.
+- Some kind of resolution to the line wrapping issue with headlines.
+- Simpler ways of doing things (perhaps with mouse commands)
+- I'd say it's pretty close to maturity. I haven't used most of the
+ more recently-added advanced features.
+- I'd like easier customization of "workflow" steps that would make it
+ easier to update states and record notes related to state changes
+ (and skip these notes when the state transitions are obvious in
+ nature).
+- No immediate demands. I do not think the project has reached
+ maturity.
+- This product has reached maturity since long! In my point of view
+ this is. Excellent work!
+- depending tasks - integrated pdf-generation (especially for
+ windows) - visualisation for tasks (like gantt) - a minor mode for
+ contacts like vcard.el
+- I think it reached maturity. It would be nice to have some minor
+ things, like a posibility to insert todo's right inside your project
+ source code and then have them added in agenda automatically.
+- Instead of new features, I'd much prefer keeping XEmacs
+ compatibility
+- Wishlist - Adding arbitrary (user specified) relations between nodes
+ with a specific relation name. for example, x <part of> y; where x
+ and y are two nodes. - Making the above functionality work between
+ files - making the above work between nodes published on a
+ distributed server In the GNU project GNOWSYS, we do this, where it
+ is a web application. We are now exploring how org mode can be used
+ as a client to manage the data published in GNOWSYS. Out team would
+ be more than willing to collaborate, but our team members are all
+ Python hackers, and use Emacs only for coding
+- I am having trouble keeping up with the many new features of the
+ last few months!
+- I think it is mature enough for me
+- automatic reminders in Emacs as pop ups?
+- I'm quite content as it is. I guess I could probably think of one or
+ two things, but I wouldn't want to spoil its power/simplicity
+ balance.
+- planing times for tasks and compare them to actuel used times (and
+ also give out a warning if to many hours are planed for one day) -
+ agenda export to latex - simple project management
+- a gtd framework would be a killer feature!! more visual effects with
+ overlays However, it's "déjà" a very good work. Thanks.
+- very mature
+- Nearing maturity, but then again, maybe I'm just out of ideas.
+- I would like org-mode (or other parts of it like orgtbl) to become a
+ minor mode so I can turn it on/off in other buffers (mainly
+ muse). For example I would love to use todo list editing features in
+ emails.
+- I don't understant all the features yet :)
+- export facilitie
+- New features, in order of importance to me: 1.) A way to select a
+ chunk of text in firefox and paste it into org-mode, along with a
+ nicely formatted URL link. I would use this many times a day. MS
+ OneNote does this well. 2.) A way to link to email in an IMAP
+ folder. Preferably, this link would point directly to the email on
+ the IMAP server. The link should look like all the other links, and
+ you should be able to just drag it from, say, Thunderbird, into
+ org-mode, although a Thunderbird keyboard shortcut would be nice. I
+ would use this every day. 3.) More flexible outline prefixes. You
+ should be able to make headlines of this type: I. asdlfk i. asdfj
+ ii. asdlfkj II. ... Or 1. Introduction 1.1 asdfkj 1.2
+ asdfkl 2. Background ... Emacs hyperbole:
+ http://directory.fsf.org/project/hyperbole/ did this
+ beautifully. 4.) Internal links search in a way consistent with
+ emacs search (Ctrl-s). When you click on a link, it should go
+ towards the end of the buffer for the next match. When there's
+ nothing towards the end, it should wrap to the top. 5.) Fix the
+ underline/bold/italic stuff (if that is a new feature) 6.) Better
+ formatted html table export
+- Better support for working with others.
+- I would like to see different way to view or summarize ageda. Like
+ progress, next possible todo
+- I think org-mode is quite mature now except there may be still some
+ bugs in it and some features may need more polish
+- Too novice a user yet to comment
+- can't tell yet.
+- I like to be surprised more than wishing
+- I'd like better integration with calendar mode of
+ emacs. Specifically, when using the calendar, the command 'i d' to
+ insert an appointment, the diary file is used. I'd like to set a
+ headline in my orgmode buffer for that insert, for consistency with
+ the calendar entries I make by hand while processing my inbox Also,
+ navigation from agenda to org-file is easy. navigating back is
+ harder.
+- possibly nested numbered lists: 1. head 1 1.1 sub-head 1 1.2
+ sub-head 2 Also lettered lists: a. point a b. point b but I'm
+ already quite satisfied
+- implement all features of muse-mode. Ex: list of pages, backlinks,
+ following links with Enter, ... - consistent and clear syntax for
+ formatting text, which doesn't require memorizing use cases or
+ exceptions (ex: *a* isn't bold)
+- syncing with my palm would be the greatest need. (syncing with
+ outlook would do the job as outlook is snced with the palm)
+- mostly small things like an isearch mode that only matches headlines
+ (and doesn't auto expand), an allout-copy-exposed-to-buffer
+ equivalent, hipster pda publishing
+- I've too many ideas to write here. The only thing i can think of is
+ not quite org related. A published bison or antlr grammar, so people
+ can write org parsers/processors in other languages, and extend its
+ integration into other systems.
+- Org mode is fairly mature. Only the remaining inconsistencies should
+ be straightened out.
+- Hard to say, every so often I think of a feature that might be nice
+ to have. I have a feeling that alternate views (like the agenda) to
+ allow other ways of exploring your information would be handy, but I
+ have no concrete ideas yet as to what they might be.
+- Better exporting (for example better LaTeX export).
+- The only thing I need is better integration with mh-e (I suspect it
+ is already there - just need to find the time to sort it out). Other
+ than that I am very content!
+- I always wanted to be able to schedule a task for a specific week
+ (as oposed to a date) - I would like to improve the hipsterPDA
+ generation (export the agenda view as nice LaTeX, improve the
+ cal-tex output, etc)
+- Org grows faster than I can learn all those nice features. One
+ feature I'd love to see was that the HTML export created docs that
+ could be outlined like in an org buffer. I guess that's possible
+ with some CSS.
+- Task dependency for project planing
+- At the moment, I'm still on the learning curve. Org-mode has
+ soooooooooo many features I have not even discovered yet. I almost
+ daily open the manual pages to see I there is something I can use.
+- Probably, customization of built-in agenda view. But I'd rather see
+ org-mode streamlined and cleaned of unnecessary
+ complications. Properties should be either integrated more tightly
+ to replace tags/priorities/etc, or removed.
+- Looking forward to some of the dependency ideas.
+- Import tasks from .ics files, include .ics files in agenda,
+ eventually include remote .ics files in agenda. Would like an
+ updated blogging tool that takes advantage of recent developments.
+- I'm working on integration with my email client and web browser --
+ it's a slow process because I'm not a programmer, but I'm learning
+ bits and pieces about bash shell scripts and grabbing what I can
+ from experts already using org.
+- I'd like a way to set project (outline item) dependencies and to
+ easily list those projects in dependency order. I could do it now
+ with properties, a dynamic block and some elisp. I'd use markup more
+ if it were more reliable in the emacs buffer. It might be nice to
+ have a mode where rigid outline style indenting is enforced while
+ editing outlines and lists. Perhaps as a buffer option or subtree
+ property. None of this is necessary or worth calling org-mode
+ immature.
+- Not new features. But perhaps splitting org.el into different
+ modules: one for outlining, one for doc format (Wiki engine), one
+ for GTD
+- block quote text support. like wiki {{{ This is quote text }}}
+ Currently only putting ':' at beginning of text or heading.
+- I hope a better archive mechanism using C-c C-x C-c, which could
+ keep the structure in my org file.
+- Seems mature; new features always interesting but can add a layer of
+ too-many-choices distraction. (See prioritizing problems above ;) )
+- New summary type {%} for progress status. Real comment syntax.
+- I use only a fraction of its features.
+- Mature
+
+* 6. Additional tutorials, documentation and screencasts would you like?
+
+Original question:
+Which topics or "how-to" guides would you like to see in the
+documentation or as a tutorial or screencast?
+
+- none. documentation is excellent
+- how to prepare/export/print GTD file to A7(index cards hPDA (hipster
+ PDA) forms
+- Everything should be a screencast for new users.
+- I'd love to see more examples (with code) of how people use org,
+ especially for implementing GTD.
+- More detailed information about blogging would be great, especially
+ motivation for using org.
+- The manual and refcard usually have me covered. An in-depth
+ screencast on table/calc might be nice.
+- More stuff about methodology to use it.
+- Screencasts are most helpful to me. I would like to see material on
+ publishing and blogging in particular
+- Project lifecycle. Timesheet reports.
+- Exporting to other formats and customizing that
+- lot of screencast showing new features of org (such as one already
+ done)
+- The documentation is actually rather good as it is, haven't found
+ anything lacking yet.
+- Integration with remember
+- Integrating org-mode with pine/alpine mailer.
+- Not sure who you want to target. Advanced users are your bread and
+ butter and probably are OK. Beginners should get some screencasts
+ that describe a common problem and just focuses an how org mode can
+ help them. A good example is something like when someone's todo list
+ gets too long and complex and they want to split it, but maintain
+ connections between items on various lists, or perhaps view a
+ chronological list of all items in one location. Org mode is the
+ only program I know of the handles this kind of complexity
+ gracefully.
+- In depth explanation of using the agenda to its fullest
+- I'd love to see one on setting up column views. A tutorial on
+ publishing files would be great. And one about creating custom
+ agenda views.
+- Changing the keybindings to make specific state transitions easier
+ to enter
+- don't know as of yet ...
+- using the spreadsheet with merged cells, calculation for rows and
+ columns - showing the true meaning of the properties stuff - over
+ all there should be examples - i really dislike the manual form
+ orgmode.org because it is technical oriented not for the simple
+ user - more howtos for gtd -> learning from each other
+- Different usages of org-mode. From GTD to other ways ...
+- I find the manual well written and sufficient.
+- Use of drawers and properties.
+- HOw to organize multiple projects; auto-archival.
+- org spreadsheet
+- Since Org-mode is (to me) a collection of "orthogonal" features, but
+ doesn't much impose structure, I'd be interested in seeing how
+ others organise their data and "bring it to life" with the Org-mode
+ features.
+- none
+- more documentation for org's lisp functions (in fact more examples
+ with org's lisp funtions!!)
+- remember mode integration
+- I prefer the documentation and experimentation. Need drives my
+ learning.
+- I don't have any preferences.
+- Can't think of any
+- I think a new user would benefit from a screencast showing basic
+ hierarchy creation and navigation
+- Remember Practical uses of properties
+- I would like to see more people to share their ways of using org
+ model
+- The documentation is already very good and it seems the manual is
+ never out of sync from the latest org-mode version. I found the
+ mailing list is the best source of "how-to" as people's individual
+ situations are so much different.
+- more of org for gtd
+- how to deal with the calendar and insert dates quickly - two-way
+ backends for groupware-like behavior - calender functionality for
+ scheduled events (receive popups or emails or sms or the like) -
+ probably more but it's too early to say
+- drawers + table calculations
+- Using org-mode as a calendar/planner. Perhaps a best practice around
+ where date- and time-stamps belong (in the headline? in a SCHEDULED:
+ property? DEADLINE: property?) Also, it would be helpful to be shown
+ the best practices around Categories (since they show up so
+ prominently in the agenda) I wanted them to be like David Allen's
+ "Contexts", but that's hard for me to manage.
+- All the variables that you must configure to be able to write and
+ export an article successfully and without unexpected results - How
+ to move from {muse,kwiki,reST,planner,...} to org-mode: how to adapt
+ the syntax, ...
+- examples of how to columns view
+- real examples of different ways of using org-mode
+- Scope projects? integrate Org into a software development
+ process/project? Handle <not at computer> org interactions?
+- Daily use of agenda
+- I'm still not familiar with the more advanced features of org-mode,
+ so I'm keen to see these areas explored in tutorials and guides.
+- The spreadsheet.
+- None that I would be interested in, although I accept that new users
+ would benefit from them.
+- I think column-view is a great feature. Bastiens tutorial is good,
+ but I'm thinking a tutorial focused more on the use case as opposed
+ to the config option might be better. If I find time :-)
+- I don't know if it's just me, but currently I make no use of
+ tags. So any how-to or screencasts of how to use categories and tags
+ together in a senseful way would be nice. Most usages of tags I've
+ seen so far where tags like :phonecall: or :appoitment:, but when I
+ have a TODO "Call Jim" or "Meet Jim" those are superluous...
+- I would welcome such how-to's and offer to help. The drawback of
+ screencasts is they take a long time, and there is no way a viewer
+ can tell it will be usefull to sit it all out. A guide giving
+ examples (and using short screencasts, if necessary) gives the
+ reader an overview, he/she can skip sections and browse to a
+ chapter/paragraph deemed usefull. I would like to learn howto tweak
+ my custom built todo-lists so that some of the statuses show up in
+ the agenda, and others don't. Example WRITE should be on the agenda,
+ but INVOICE not really. But the intermediate VERIFY should.
+- More on GTD. Agenda customization.
+- More on column mode and new uses of properties.
+- I know there are books and howtos about lisp, but it would be great
+ to see some smaller howtos that are specific to org applications,
+ and code samples.
+- The remember mode stuff scares me. I need to take some time learn
+ it. I also know agenda can do a lot more than I do with it. I'd like
+ to see screen shots of of column mode to drool over since I'm not
+ running emacs 22 yet.
+- can't thing of any
+- Spreadsheet examples.
+- how-to setup a gtd style system is always my favorite.
+- Some experienced users' detailed explication of pros and cons of the
+ newer TMTOWTDI (There's More Than One Way To Do It) choices like
+ archiving methods, task states, etc. leading to -- you
+ guessed it -- prioritizing problems
+- Building complex agenda views.
+- Dunno.
+- Setting up a publishing/blog environment
+
+* 7. Which features of org-mode do you use? (Spreadsheet, LaTeX, HTML, Remember, etc)
+
+- Document Structure, Tables, Spreadsheet, Hyperlinks, TODO items,
+ Tags, Properties and Columns, Dates and Times, (Custom) Agenda Views
+- LaTeX, Remember
+- Use the agenda/tags views heavily. Tables, but not really
+ spreadsheets.
+- Rememeber
+- remember, agenda views.
+- I'm sure I will use everything at some point. I've finally started
+ using remember recently, about to start using HTML for blogging I
+ think, and can imaging using LaTeX to print index cards even.
+- Todo-list, agenda - remember
+- Remember, agenda, I learned to use the tags / priorities, but they
+ don't seem to fit my style of use.
+- Publish to HTML and LaTeX (although I'd prefer ConTeXt), dynamic
+ blocks, orgstruct minor mode, and hyperlinks. I'm not sure if they
+ count as a "feature", but I use deadlines, scheduling, and repeated
+ tasks *a lot*.
+- remember, clock summary.
+- TODO keywords, tags, timestamps (inc. deadlines/scheduling),
+ priorities, export to HTML/ics, tables, archiving, remember, custom
+ agenda commands
+- Still exploring.. starting out with fundamentals as described in
+ John Weigly's excellent write-up.
+- HTML, Remember
+- Basic planning, some html export, Wannt to use more features of org
+ but lack of time
+- Remember, html
+- Much use of Remember, agenda, agenda todo lists. Some use of HTML
+ and LaTeX. A little use of spreadsheet.
+- Starting to use spreadsheets and tables. I use the [/] feature to
+ keep track of task counts a lot. I like the "radio" links too. Don't
+ use the others much.
+- Export2HTML, Remember, Agenda
+- Remember, LaTex, ical export, Agenda and Diary integration
+- HTML. My usage is pretty basic.
+- LaTeX, HTML, Agenda, diary integration, Todo, outlining like crazy
+- Spreadsheet (for tables)
+- I use Remember, HTML, agenda views, hyperlinks, time-tracking,
+ timestamps, and tags. I occasionally use tables, and plan on using
+ the PROPERTIES drawer in the future. I don't currently use any
+ advanced table formulas or column view, but I'm glad they're there.
+- Remember, basic task lists, and mostly the Agenda views.
+- LaTex, HTML, Remember, Cal, diary
+- all
+- agenda - html - spreadsheet
+- Spreadsheet, remember, time logger and outlines.
+- Document structure + hyperlinks, agenda + remember, exporting and
+ publishing
+- writing documents, LaTeX, HTML.
+- Remember; tables.
+- Remember, and the todo features.
+- simple to do listing
+- A lot: Outlines, Tables, Spreadsheets, TODOs, Links, Tags,
+ Timestamps, Clocking Time. A little: Agenda views, Properties and
+ Columns Not at all: LaTeX, HTML, Remember I plan to increase my
+ usage of all the above, apart from LaTeX, which I'll probably never
+ use.
+- Remember
+- Remember, Latex, spreadsheet (with calc)
+- just to basic features
+- * TODO's, including ** Scheduling ** Deadlines ** Archiving (both
+ tag and function) * Remember * LaTeX * export/HTML * Tables *
+ org-publish * Agendas
+- spreadsheet, HTML
+- remember, agenda, priority
+- Remember
+- all
+- Basic outlining with tons of links of most types allowed. * Tables *
+ HTML export * TODO's
+- Tables, HTML, Remember
+- table, agenda, remember
+- Probably the question is bettered asked with "which features of
+ org-mode do you not use?" :-) It seems I have almost used everything
+ except properties and drawers. Although I did not go into depth of
+ many of them, like I never used a formula in the built in org-mode
+ table.
+- tags, todos, links, timestamps
+- remember, agenda
+- tables, HTML, ToDo stuff/agenda, column mode, clock features,
+ categories
+- Agenda, time tracking, HTML, latex, spreadsheet
+ agenda export to ics (iCalendar) file TODO proper- ty drawers
+- headings, tags, links, drawers & properties, table (& occasionally
+ spreadsheet), remember, todo's
+- outlining - basic spreadsheet - org-export-as-latex - HTML -
+ org-publish - marking TODO/DONE (or equivalents) - agenda
+- Remember HTML
+- HTML, Remember, custom agenda views, tags matches, custom keyword
+ states, diary integration, recurring tasks, scheduling and
+ deadlines, org-nnml, hyperlinks, categories
+- Agenda, Remember, Tags, Ascii Export, Tables, Outlining
+- Spreadsheet
+- sometimes Spreadsheet remember extensively LaTeX/Html export
+- Remember, Blorg, org-publish, Tables, Lists, Checkboxes, TODO
+ sequences.
+- LaTeX, html, remember, spreadsheet
+- Tags, Remember, Diary integration, Logging, sometimes spreadsheet
+ usage.
+- folding, TODOs, Agenda view, HTML generation, column-view
+- Spreadsheet, HTML, Remember, fast selection of TODO keywords, links
+ to everywhere, extended timestamps and intervals
+- Spreadsheet, HTML
+- I use remember very often. I have not really touched the
+ spreadsheet, don't need to. I use the deadline feature all the time
+ and the [/] todo list type. I have experimented with export to html,
+ in order to transport stuff to a very smart smart phone (iphone) but
+ that requires more tweaking on my side.
+- todo and logging state changes, tags, priorities, hyperlinks,
+ remember, timestamps, agenda, export to HTML.
+- Folding, spreadsheet, column mode, properties, schedule/agenda,
+ org-remember, html export, todo, tags
+- I use everything except radio stuff and dynamic blocks, and I think
+ I will use those soon. Don't use XOXO export either, I guess.
+- remember, tables, tasks, tags, archiving, calendar, html export, and
+ I'm learning a bit about LaTeX.
+- In no particular order: tables, plain list folding, checkboxes and
+ checkbox counting [/], multiple todo sequences, tags, properties,
+ inactive dates, elisp formulas, html export, text export, in-buffer
+ markups (*/_), subtree in indirect buffer, links
+- latex, html, remember
+- spreadsheet, remember, agenda, outline, property, column view
+- remember, archive, appointment, diary, timeclock
+- Remember for fast to-do adds; use tables occasionally but mostly use
+ dedicated spreadsheet s/w for such functions. Hope to learn LaTeX at
+ some point.
+- Agenda views Table editing Properties drawers HTML export LaTeX
+ export
+- HTML. Remember. Tables.
+- Mainly time stamps, agendas and HTML export
+- LaTeX, Spreadsheet, Remember
+
+* 8. Your age
+
+| Age range | N | bar |
+|-----------+----+-----------------------|
+| 16 - 20 | 0 | |
+| 21 - 25 | 5 | ***** |
+| 26 - 30 | 15 | *************** |
+| 31 - 35 | 21 | ********************* |
+| 36 - 40 | 11 | *********** |
+| 41 - 45 | 13 | ************* |
+| 46 - 50 | 3 | *** |
+| 51 - 55 | 3 | *** |
+| 56 - 60 | 0 | |
+
+* 9. Which country do you live in?
+
+| Country | N | bar |
+|-------------+----+-------------------------|
+| Australia | 3 | *** |
+| Canada | 2 | ** |
+| China | 2 | ** |
+| Croatia | 2 | * |
+| France | 5 | ***** |
+| Germany | 17 | ***************** |
+| Hungary | 1 | * |
+| Iceland | 1 | * |
+| India | 4 | **** |
+| Italy | 2 | ** |
+| Netherlands | 3 | *** |
+| New Zealand | 1 | * |
+| Norway | 1 | * |
+| Pakistan | 1 | * |
+| Romania | 1 | * |
+| Russia | 1 | * |
+| Scotland | 1 | * |
+| Slovenia | 1 | * |
+| Spain | 1 | * |
+| Sweden | 1 | * |
+| Switzerland | 1 | * |
+| UK | 7 | ******* |
+| USA | 23 | *********************** |
+
+* 10. Are there any other comments you would like to make about org-mode?
+
+- Thanks for this great software, I've waited for years for such a
+ tool. I've wrote some tools around org in Perl, hopefully I'll find
+ some time to contribute. Thanx a lot
+- Great tool to stay even longer in emacs OS :-)
+- Thanks!
+- Great App, Great Support, Great Community
+- org-mode is all-the-way cool.
+- With the possible exception of Emacs itself, org-mode is my very
+ favorite bit of software. It has inspired me to learn LISP, so I'm
+ looking forward to contributing in the near future.
+- It's fantastic and the maintainership and community are both second
+ to none!
+- Later. :)
+- Great mode and very useful. Thanks a lot for your effort and time!
+- Great Work ! Felicitation to its author
+- It's indispensable for my current work and lifestyle.
+- It is a great package, thanks for making it available and keeping
+ it alive!
+- Thanks for the org-mode. I just love it! Do all my personal and job
+ planning with it!
+- Great tool, thanks thanks thanks :)
+- It's fantastic -- thanks for the great tool. I'm getting older and
+ it's the only way I can "remember" everything. It's not just a great
+ todo list manager, but I use it to document almost everything about
+ my job (e.g. my original intentions about a
+ project/implementation). I can bury a TODO right down in the place
+ where I have most of the surrounding documentation.
+- I cannot overstate how valuable this mode is. It single handedly has
+ the potential to make laypeople aware of Emacs. Thanks so much for
+ working on it!
+- Love it. Love it. Love it. Carsten is awesome.
+- It's changing very fast, and I'm worried that my muscle memory will
+ start to fight against the changes. Still, it's good to see an Emacs
+ package with such active interest and support.
+- I'm a happy user. Thanks to Carten and all contributors
+- great guys on the mailinglist, great spirit, excellent product :-)
+- Carsten, many thanks for this great piece of software! Keep it
+ simple and usuable - not everybody follows the power user discussion
+ in gmane
+- Keep up the great work! :)
+- Thanks to Carsten and to people on emacs-orgmode !!
+- Been a user of GNU Emacs for the last 18years, never seen such a
+ fascinating major mode. I like this kind of apps since I work in
+ knowledge organization, and would like to contribute in some
+ way. Our lab gnowledge.org would like to develop a java applet that
+ provides org mode kind of editing. The buffer thus produced will be
+ converted into html when the page is being served in the
+ background. This will encourage the community to do structured
+ documentation. Our lab is now engaged in developing
+ beta.selfplatform.eu, where in we would like to provide this
+ feature. Do you think, orgmode developers would like to help us or
+ contribute in this endeavor. Orgmode can be very useful for
+ furthering semantic computing.
+- It is a great product. I does not need to grow. It might risk
+ feature creep.
+- Excellent package
+- Thank you, Carsten!
+- Has increased my productivity a lot!
+- Really a great thank to the author "Carsten Dominik", "chapeau" as
+ they say in France!!!!
+- Org-mode was relatively immature when I started using it, and I have
+ kept with it for 2 simple reasons: 1. The maintainer (Carsten) is
+ friendly, fast, accurate, and thorough 2. It works -- it does what
+ it claims to do, and does it well
+- Org mode keeps me organized, it's outstanding!
+- hmmh, org-mode is the first thing I start in the morning and the
+ last I close in the evening, I guess this tells it all.
+- Org mode has been an incredibly useful tool that is fun to use. I
+ think a main reason for its utility is that basic use requires
+ little thought. When I'm using it for brainstorming, it's almost
+ like I'm not aware that I'm using any program -- I'm just
+ thinking. Any changes to org-mode should preserve this
+ simplicity. Thanks a ton to Carsten and all the others who have
+ contributed to this great project!
+- Thank you Carsten!
+- Maybe we should consider a separate package or maintainer for
+ xemacs....
+- Thanks, thanks and thanks.
+- Good stuff. thanks
+- It's Fun. ASCII is usually the only interface I can get used to,
+ because it's so fast.
+- org-mode makes me look organised (though a bit quirky). That's
+ enough reason to use it.
+- Amazing!!!!!!!!!!!!!!!! :-)
+- Even if org-mode stands right where it is, it has been enormously
+ helpful. Thank you very, very much.
+- Well done
+- Yes: org-mode progresses very well and improves with each version
+- for me its the greatest found treasure since I "dicovered" Emacs.
+- Great work! Wish I had time to contribute more.
+- Keep up the good work :)
+- It's a great software project and community. Thanks again to
+ everyone involved!
+- Excellent piece of software!
+- I'm very very happy with it.
+- org-mode is fantastic :-)
+- The best feature of Org are its two maintainers Carsten and Bastien
+ and its helpful community.
+- Great mode for emacs. I wish I was using it more
+- It is great tool. Uncluttered. Thanks to Carsten et al.
+- Rock on!
+- favorite piece of software I use.
+- I'm continually amazed by what org can do, and also by how intuitive
+ it is. It's not at all unusual that I find myself thinking that it
+ would be great if org/emacs did "x", trying what seems to me to be
+ the way that it would do "x" if it could, and discovering that it
+ functions just as I expect. And when it doesn't, there are ways to
+ figure it out. (And Carsten is a great developer who shines at
+ hearing what his users are doing, responding to expressed needs, and
+ even being clear if/when he decides not to do what someone would
+ like him to do. Other heavy users and scripters are great as well.
+- I started using Org-mode as an outliner. It is the best outliner
+ I've used an much more. The community is valuable but Carsten's
+ skill and judgment has made org-mode what it is.
+- It's a killer tool that I could not live without.
+- org-mode is great, I hope it can keep clean text file when adding
+ functions.
+- I forced myself to learn emacs after 25+ years in the vi camp in
+ order to use org-mode. Loving it. Carsten's enthusiasm and support
+ are a joy, and the mailing list is always refreshing.
+- I plan to run a website where users could share Org files and edit
+ them together. I plan to write a better exporter (and more formats!)
+ I think the Org syntax is mature enough to get more programs
+ interacting with it outside Emacs. Org is *great* :)
+- It's wonderful. Thanks!
+- org-mode is a fantastic program, supported by a lively helpful email
+ list. Carsten is very responsive to feature requests and helping.
+
+
+-end-
+
+* Appendix: Raw data for some questions:
+
+** <<Raw Emacs versions>>
+Here are the detailed responses, for reference.
+
+:GNU Emacs 22.1.1 (powerpc-unknown-linux-gnu, GTK+ Version 2.10.13) of 2007-07-08 on malo, modified by Debian 2. GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+:21.3.1 and 22.1.1
+:22.0.96.1 on Windows CVS from the unicode2 branch on Linux
+:Emacs 22.1 GNU Emacs 22.1.1 (i686-pc-linux-gnu, GTK+ Version 2.10.11) of 2007-09-16 on zen
+:Emacs 22.1. Where I happen to be sitting, M-x version says: GNU Emacs 22.1.1 (sparc-sun-solaris2.8, X toolkit) of 2007-06-15 on sa
+:Emacs 23
+:Emacs from CVS GNU Emacs 23.0.60.1 (i486-pc-linux-gnu, GTK+ Version 2.12.0) of 2007-10-31 on samarium
+:Emacs22
+:GNU 22.0.98.1
+:GNU Emacs 21.3.1
+:GNU Emacs 22.0.50.1 (i386-mingw-nt5.1.2600) of 2006-03-21 on YAMALOK
+:GNU Emacs 22.0.91.1
+:GNU Emacs 22.0.95.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-03-02 on pacem, modified by Debian
+:GNU Emacs 22.0.96.1 (i386-mingw-nt5.1.2600) of 2007-03-24 on NEUTRINO
+:GNU Emacs 22.0.990.1 (i386-mingw-nt5.1.2600) of 2007-05-23 on LENNART-69DE564 (patched)
+:GNU Emacs 22.1
+:GNU Emacs 22.1
+:GNU Emacs 22.1.1
+:GNU Emacs 22.1.1
+:GNU Emacs 22.1.1
+:GNU Emacs 22.1.1 (i386-apple-darwin9, Carbon Version 1.6.0)
+:GNU Emacs 22.1.1 (i386-apple-darwin9.0.0, X toolkit) of 2007-11-05 on selenium. dmg
+:GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+:GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+:GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+:GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+:GNU Emacs 22.1.1 (i486-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-07-22 on nautilus, modified by Debian"
+:GNU Emacs 22.1.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-08-22 on raven, modified by Debian
+:GNU Emacs 22.1.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-11-03 on pacem, modified by Debian
+:GNU Emacs 22.1.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-11-03 on pacem, modified by Debian - Gnu Emacs 22.1 windows version
+:GNU Emacs 22.1.1 (i586-suse-linux-gnu, GTK+ Version 2.12.0) of 2007-11-06 on balada
+:GNU Emacs 22.1.1 (i686-pc-linux-gnu) of 2007-09-27
+:GNU Emacs 22.1.1 (i686-pc-linux-gnu, GTK+ Version 2.10.4)
+:GNU Emacs 22.1.1 (i686-pc-linux-gnu, GTK+ Version 2.10.6) of 2007-09-14, in an Eterm
+:GNU Emacs 22.1.1 (powerpc-apple-darwin7.9.0, Carbon Version 1.6.0) of 2007-07-22 on applecore.inf.ed.ac.uk - Aquamacs Distribution 1.
+:GNU Emacs 22.1.1 (powerpc-apple-darwin8.10.0, Carbon Version 1.6.0) of 2007-10-04 on malibu.local
+:GNU Emacs 22.1.1 (x86_64-pc-linux-gnu, GTK+ Version 2.12.0) of 2007-11-06 on king, modified by Ubuntu
+:GNU Emacs 22.1.2 (i386-unknown-openbsd4.1, X toolkit) of 2007-06-10 on lucien.my.domain
+:GNU Emacs 22.1.50.1
+:GNU Emacs 22.1.50.1 (i386-apple-darwin8.10.1, Carbon Version 1.6.0) of 2007-10-02 on plume.sr.unh.edu - Aquamacs Distribution 1.2a
+:GNU Emacs 22.1.50.1 (i386-mingw-nt5.1.2600) of 2007-07-07 on NEUTRINO
+:GNU Emacs 22.1.50.1 (i686-pc-linux-gnu, X toolkit) of 2007-06-18 on ...
+:GNU Emacs 23.0.0.1 (i386-mingw-nt5.1.2600) of 2007-07-10 on BREP
+:GNU Emacs 23.0.0.1 (i386-mingw-nt5.1.2600) of 2007-08-18 on TPAD
+:GNU Emacs 23.0.0.1 (i686-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-03-18
+:GNU Emacs 23.0.0.1 (i686-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-08-13 on cera" (emacs-unicode2), Emacs 22.1 under Windows.
+:GNU Emacs 23.0.50.1 (i386-mingw-nt5.1.2600) of 2007-11-13 (via CVS, compiled with GnuWin32 native tools rather than cygwin)
+:GNU Emacs 23.0.50.1 (i486-pc-linux-gnu, GTK+ Version 2.12.1) of 2007-11-11 on elegiac, modified by Debian
+:GNU Emacs 23.0.50.1 (i486-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-10-14 on elegiac, modified by Debian"
+:GNU Emacs 23.0.50.1 (i686-pc-linux-gnu, GTK+ Version 2.12.1) of 2007-11-15 on baldur
+:GNU Emacs 23.0.60.1
+:GNU Emacs 23.0.60.1 (i486-pc-linux-gnu, GTK+ Version 2.12.0) of 2007-10-31 on samarium
+:GNU Emacs 23.0.60.1 (i686-pc-linux-gnu, GTK+ Version 2.10.14) of 2007-10-29
+:GNU Emacs 23.0.60.1 (i686-suse-linux-gnu, GTK+ Version 2.12.0)
+:GNU Emacs 23.0.60.1 (i686-suse-linux-gnu, GTK+ Version 2.12.0)
+:GNU Emacs 23.0.60.1 (x86_64-unknown-linux-gnu, GTK+ Version 2.12.1)
+:GNU Emacs CVS (~23.0.50.1)
+:GNU Emacs CVS 20071101
+:GNU Emacs CVS 23.0.0
+:GNU Emacs On Windows XP: GNU Emacs 22.0.990.1 (i386-mingw-nt5.1.2600) of 2007-05-23 on LENNART-69DE564 (patched) On Linux: GNU Emacs 22.1.50.1 (armv5tel-unknown-linux-gnu) of 2007-06-22 on homehub
+:GNU Emacs and Carbon Emacs, both 22.1
+:GNU. On Debian: GNU Emacs 23.0.50.1 (x86_64-pc-linux-gnu, GTK+ Version 2.12.1) of 2007-11-11 on elegiac, modified by Debian The other isn't available right now.
+:Gnu Emacs 22.1.1 and 21.4 (patch 20) "Double Solitaire" XEmacs Lucid
+:Gnu Emacs v22.1.50.1
+:Gnu/Emacs GNU Emacs 23.0.60.1 (x86_64-unknown-linux-gnu, GTK+ Version 2.12.0) of 2007-11-11
+:Carbon Emacs, an OS X distro of GNU Emacs 22.1.50
+:XEmacs 21.4 (patch 19) "Constant Variable" [Lucid] (i486-linux-gnu, Mule) of Fri Nov 3 2006 on penell
+:XEmacs 21.4 (patch 20) "Double Solitaire" [Lucid] (i486-linux-gnu) of Fri Oct 19 2007 on penell
+:XEmacs 21.4 (patch 20) "Double Solitaire" [Lucid] (i686-pc-cygwin, Mule) of Fri Dec 15 2006 on vzell-de
+:XEmacs 21.4 (patch 20) \"Double Solitaire\" [Lucid] (i686-pc-cygwin, Mule) of Fri Dec 15 2006 on vzell-d
+:XEmacs 21.4.20 (distributed with Cygwin)
+:XEmacs 21.5 (beta28) "fuki" [Lucid] (i686-pc-linux, Mule) of Wed Jun 13 2007 on n2
+:XEmacs Lucid 21.4 (patch 19) "Constant Variable" - on Windows, Similar on linux (not at machine)
+:Emacs
+:Emacs 21.4.1 emacs 21.?.? (at work, I'm not certain)
+:GNU
+:GNU 22.1.1
+:GNU emacs
+:GNU emacs 22.1.50.1 (snapshot)
+:GNU emacs GNU Emacs 22.0.97.1 (i686-pc-linux-gnu, GTK+ Version 2.4.13)
+
+** <<Raw ages>>
+
+:22 Sun, 11/25/07 6:38 PM
+:22 Thu, 11/15/07 11:55 PM
+:24 Fri, 11/16/07 4:15 AM
+:25 Sun, 11/18/07 10:05 PM
+:25 Sun, 11/25/07 12:04 PM
+:
+:26 Mon, 11/19/07 10:29 AM
+:26 Sat, 11/24/07 4:38 AM
+:26 Thu, 11/15/07 2:45 PM
+:26 Thu, 11/15/07 7:22 PM
+:27 Fri, 11/16/07 9:20 AM
+:27 Wed, 11/28/07 3:20 AM
+:28 Sun, 12/2/07 5:32 AM
+:28 Thu, 11/15/07 10:06 PM
+:28 Thu, 11/15/07 12:04 PM
+:28 Thu, 11/15/07 12:17 PM
+:29 Mon, 11/19/07 8:06 PM
+:29 Thu, 11/15/07 11:27 AM
+:30 Fri, 11/16/07 3:26 AM
+:30 Thu, 11/15/07 10:07 PM
+:30 Thu, 11/15/07 3:01 PM
+:
+:31 Fri, 11/16/07 2:30 AM
+:31 Sun, 11/18/07 3:14 PM
+:31 yrs. Fri, 11/23/07 7:04 PM
+:32 Fri, 11/23/07 10:11 PM
+:32 Thu, 11/15/07 12:02 PM
+:33 Fri, 11/16/07 12:54 PM
+:33 Sat, 11/17/07 4:41 AM
+:33 Sat, 11/24/07 2:28 AM
+:33 Thu, 11/15/07 11:23 AM
+:33 Thu, 11/15/07 11:34 PM
+:33 Thu, 11/15/07 12:27 PM
+:33 Wed, 11/21/07 11:57 PM
+:34 Fri, 11/16/07 1:24 AM
+:34 Mon, 11/19/07 7:31 PM
+:34 Thu, 11/22/07 6:59 AM
+:35 Fri, 11/16/07 3:23 AM
+:35 Fri, 11/16/07 7:53 AM
+:35 Mon, 11/19/07 10:03 AM
+:35 Sun, 12/9/07 2:40 AM
+:35 Thu, 11/22/07 6:47 PM
+:35 Tue, 11/27/07 11:04 AM
+:
+:36 Fri, 11/16/07 3:19 AM
+:37 Fri, 11/16/07 12:11 PM
+:37 Fri, 11/16/07 12:36 AM
+:37 Fri, 11/23/07 1:13 AM
+:37 Thu, 11/15/07 9:09 PM
+:37 Thu, 11/22/07 3:39 AM
+:37 Tue, 11/20/07 10:55 PM
+:38 Sun, 12/23/07 1:43 AM
+:39 Sun, 11/18/07 9:52 PM
+:39 Thu, 11/15/07 4:53 PM
+:40 Thu, 11/15/07 6:00 PM
+:
+:41 Fri, 11/16/07 7:36 AM
+:41 Sat, 11/17/07 9:27 AM
+:42 Fri, 11/23/07 7:58 AM
+:42 Mon, 11/19/07 9:18 AM
+:42 Sat, 11/17/07 2:31 AM
+:42 Sat, 11/17/07 4:32 AM
+:42 Thu, 11/15/07 11:45 PM
+:42 Thu, 11/15/07 8:23 PM
+:43 Mon, 12/10/07 12:58 AM
+:45 Fri, 11/16/07 3:21 AM
+:45 Fri, 11/16/07 4:40 AM
+:45 Fri, 11/16/07 4:40 AM
+:45 Sun, 11/18/07 7:39 PM
+:
+:46 Fri, 11/16/07 4:18 AM
+:47 Thu, 11/15/07 8:42 PM
+:49 Thu, 11/15/07 11:15 AM
+
+52 Mon, 11/19/07 12:40 AM
+54 Thu, 11/15/07 11:38 AM
+54 Thu, 11/15/07 12:27 PM
+
diff --git a/ORGWEBPAGE/tmp/.DS_Store b/ORGWEBPAGE/tmp/.DS_Store
new file mode 100644
index 0000000..820fdd6
--- /dev/null
+++ b/ORGWEBPAGE/tmp/.DS_Store
Binary files differ
diff --git a/ORGWEBPAGE/tmp/Changes.html b/ORGWEBPAGE/tmp/Changes.html
new file mode 100644
index 0000000..5e177ff
--- /dev/null
+++ b/ORGWEBPAGE/tmp/Changes.html
@@ -0,0 +1,6368 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-mode list of User-visible changes</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2008/01/27 10:12:09"/>
+<meta name="author" content="Carsten Dominik"/>
+<link rel=stylesheet href="freeshell2.css" type="text/css">
+</head><body>
+<h1 class="title">Org-mode list of User-visible changes</h1>
+
+<div class="outline-2">
+<h2>Version 5.20</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Remember and Refile</h4>
+
+
+<ul>
+<li>
+The use of prefix arguments for the commands `org-remember'
+and `org-refile' has been normalized:
+<ul>
+<li>
+when called without prefix argment, the command does its
+normal job, starting a remember note or refiling a tree.
+</li>
+<li>
+when called with a single C-u pefix, these commands can be
+used to select a target location and to jump there. In
+the case of `org-remember', you will be prompted for a
+template and then Emacs jumpt to the default target
+location or this template. In the case of `org-refile',
+you select a location from the refile target list and jump
+there.
+</li>
+<li>
+when called with two prefixes (`C-u C-u'), the command
+jumps to the location last used for storing a note or a
+moved tree.
+
+</li>
+</ul></li>
+<li>
+When the clock is running inside an remember buffer, storing
+the remember buffer with `C-c C-c' will automatically clock
+out. This was inspired by a request by Rainer Stengle.
+
+</li>
+<li>
+Outline-path-completion is now available as an alternative
+interface in the command `org-goto'. Please select the
+default interface you'd like to use with the new variable
+`org-goto-interface'. You can then select the alternative
+interface with a prefix argument to `C-c C-j' (org-goto). I
+am considering to make outline-path-completion the default
+interface. Comments?
+
+</li>
+<li>
+The variable `org-remember-use-refile-when-interactive'
+introduced only in 5.19 is obsolete. Please use
+`org-remember-interactive-interface' instead. This new
+variable does select the interface that is used to select
+the target for a remember note in an interactive way.
+Possible values are:
+
+<ul>
+<li>
+`outline': Use an outline of the document to select a
+location.
+</li>
+<li>
+`outline-path-completion': Use completion of an outline
+path to select a location.
+</li>
+<li>
+`refile': Offer the `org-refile-targets' as possible
+targets.
+
+</li>
+</ul></li>
+<li>
+You can now also have a plain (as opposed to deadline or
+scheduled) repeater timestamp in a task. Switching the task
+to DONE will now also shift a plain time stamp. This was a
+request by Austin Frank.
+
+</li>
+<li>
+It is no longer necessary to update the refiling targets -
+they are always current.
+
+</li>
+</ul>
+<p>*** Misc
+</p>
+<ul>
+<li>
+In `org-goto', typing characters now automatically starts
+isearch from the beginning of the buffer. The isearch is
+special also because it only matches in headline. This goes
+some way toward saving org-goto from being removed from
+Org-mode. Thanks to Piotr Zielinski for the code, and sorry
+that it took me o long to ut it in. If you prefer to use
+single letters n,p,f,b,u,q for navigation as before,
+configure the variable `org-goto-auto-isearch'.
+
+</li>
+<li>
+The clock table accepts a new parameter <code>:step</code>. This
+parameter can be `day' or `week' and will result in separate
+tables for each day or week in the requested time interval.
+This was triggered by a proposal by Sacha Chua in her <a href="http://sachachua.com/wp/2007/12/30/clocking-time-with-emacs-org/">blog</a>.
+
+</li>
+<li>
+A time-stamp with a repeater now no longer refers to the
+date <b>closest</b> to the current day. Instead, it means either
+today or the most recent match. This change makes sure that
+overdue scheduled or deadline items never disappear from the
+agenda. With the previous convention, an overdue sheduled
+item would disappear. For example, a weekly item scheduled
+for Sunday would appear as overdue until Wednesday, and the
+suddenly disappear until next Sunday. Now the item will
+show up as "Sched 7x" on Saturday. From Sunday on it will
+be in the list as "Scheduled", i.e. old sins will be
+forgiven. This follows a request by Warong, Dennis and
+Bernt.
+
+</li>
+<li>
+Archving a subtree now creates an additional property,
+<code>ARCHIVE_OLPATH</code>. This property contains the "path" in the
+outline tree to the archived entry, as it was in the
+original file. For example, archiving <code>Fix the door</code> in the
+following hierarchy
+
+<p>
+<pre>
+ * Tasks
+ ** HOME
+ *** Garage
+ **** Fix the door
+</pre>
+</p>
+<p>
+will file is with the following property
+</p>
+<p>
+<pre>
+ :ARCHIVE_PATH: Task/HOME/Garage
+</pre>
+</p>
+<p>
+Note that you can configure (i.e. limit) the information
+that gets stored upon archiving with the variable
+`org-archive-save-context-info'.
+</p>
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.19</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Column view can list the clocked times of a subtree.
+
+</li>
+<li>
+Storing remember notes can use the `org-refile' interface.
+
+</li>
+<li>
+Storing remember notes no longer produced empty lines.
+
+</li>
+<li>
+Moving subtrees now folds all siblings of the subtree.
+
+</li>
+<li>
+New variable `org-agenda-todo-keyword-format'.
+
+</li>
+<li>
+Hack to allow brackets in link descriptions.
+
+</li>
+<li>
+Clocking into an entry can enforce a specific TODO state.
+
+</li>
+<li>
+EXPORT_FILE_NAME may be an absolute file name with "~".
+
+</li>
+<li>
+Bug fixes, lots of them.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+A new special column definition lists the sum of all CLOCK
+entries in a subtree. For example
+
+<p>
+<pre>
+ #+COLUMNS: %20ITEM %10Time_Estimate{:} %CLOCKSUM
+</pre>
+</p>
+<p>
+will allow you to compare estimated times (as given in the
+Time_Estimate property) with the clocked times. This was a
+request by Bernt Hansen.
+</p>
+</li>
+<li>
+Storing remember notes can now use the `org-refile'
+interface instead of the `org-goto' interface (see the
+variable `org-remember-use-refile-when-interactive').
+Nothing will change if the note is stored immediately after
+pressing `C-c C-c' in the <code>*Remember*</code> buffer. But if you
+have chosen (e.g. by pressing `C-u C-c C-c') to
+interactively select the filing location (file and
+headline), the refile interface will be used instead. I am
+excited about this change, because the `org-goto' interface
+is basically a failure, at least for this application. Note
+that in any case the refile interface has to be configured
+first by customizing `org-refile-targets'.
+
+</li>
+<li>
+Notes inserted with remember now remove any whitespace
+before and after the note before being pasted, so that there
+will be no empty lines inserted together with the note. We
+could invent special syntax in remember templates to allow
+creating empty lines before a note - is there anyone who'd
+want this?
+
+</li>
+<li>
+Moving subtrees now folds all siblings of the subtree. This
+is the only reasonably simple way I could find to avoid the
+reported inconsistencies in the folding state of the outline
+tree after moving entries. There are reasons to like this
+new behavior, because it easily visualizes where the tree is
+located after the move. Still, not everyone might be happy
+with this. Massive complaining would be needed to make me
+fix this.
+
+</li>
+<li>
+New variable `org-agenda-todo-keyword-format' to specify the
+width of the TODO keyword field in the agenda display. Use
+it to get things to line up better. This was a proposal by
+Rainer Stengele.
+
+</li>
+<li>
+If a link description inserted with `C-c C-l' contains
+brackets, the brackets will now be converted into curly
+braces. This looks similar enough. Supporting brackets in
+link descriptions is, for technical reasons too long to
+explain here, complex.
+
+</li>
+<li>
+The new option `org-clock-in-switch-to-state' can be set to
+a TODO state that will be enforced when the clock is started
+on an entry. This follows an idea by Sacha Chua.
+
+</li>
+<li>
+The EXPORT_FILE_NAME property may now also be an absolute
+file name, and it may contain abbreviations like "~" for the
+users home directory. This was requested by Adam Spiers.
+
+</li>
+<li>
+Bug fixes, lots of them.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.18</h2>
+
+
+<p>
+Minor fixes.
+</p>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.17</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Whitespace</h4>
+
+
+<ul>
+<li>
+When cutting, pasting, or moving subtrees and items, the
+empty lines <b>before</b> the subtree/item now belong to the
+part and will be moved with it. There is one exception to
+this rule: If the first child is moved down (or,
+equivalently, the second is moved up), the amount of empty
+lines <b>above</b> the first child to be moved along with it is
+limited by the number of empty lines <b>below</b> it. This
+sounds complicated, but it allows to have extra empty space
+before the first child and still have good behavior of the
+subtree motion commands.
+
+</li>
+<li>
+Plain lists items work the same.
+
+</li>
+</ul>
+<p>I believe we have finally nailed this one. Thanks to Daniel
+Pittman for bring this up again and to Eric Schulte for
+pointing out that it is the empty lines <b>before</b> an entry
+that really count.
+</p>
+<p>
+This change was non-trivial, please give it a good test and
+let me know about any problems.
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Remember</h4>
+
+
+<ul>
+<li>
+The new command `org-remember-goto-last-stored' will jump
+to the location of the remember note stored most recently.
+If you have `org-remember' on a key like `C-c r', then you
+can go to the location with a double prefix arg: `C-u C-u
+C-c r'. This was a proposal by Rainer Stengele.
+
+</li>
+<li>
+Template items that are being prompted for can now specify
+a default value and a completion table. Furthermore,
+previous inputs at a specific prompt are captured in a
+history variable. For example:
+
+<p>
+<pre>
+ %^{Author|Roald Dahl|Thomas Mann|Larry Niven}
+</pre>
+</p>
+<p>
+will prompt for an author name. Pressing RET without
+typing anything will select "Roald Dahl". Completion will
+give you any of the three names. And a history will be
+kept, so you can use the arrow keys to get to previous
+input. The history is tied to the prompt. By using the
+same prompt in different templates, you can build a history
+across templates. The ideas for this came from proposals
+by Bastien and Adam.
+</p>
+</li>
+<li>
+When a remember template contains the string `%!', the note
+will be stored immediately after all template parts have
+been filled in, so you don't even have to press `C-c
+C-c'. The was a proposal by Adam Spiers.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Refile</h4>
+
+
+<ul>
+<li>
+`org-refile-targets' has a new parameter to specify a
+maximum level for target selection. Thanks to Wanrong Lin
+for this proposal.
+
+</li>
+<li>
+When the new option `org-refile-use-outline-path' is set,
+refile targets will be presented like a file path to the
+completion interface: "level 1/level 2/level 3". This
+may be the fastest interface yet to get to a certain
+outline entry. Do we need to use this interface in other
+places? Thanks to Jose Ruiz for this proposal.
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.16</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Restriction lock on agenda scope</h4>
+
+
+<p>
+You can now permanently lock the agenda construction to a
+certain scope, like a file or a subtree. So instead of
+pressing "&lt;" for each command in the agenda dispatcher, you
+only once select a restriction scope. All subsequent agenda
+commands will than respect this restriction. For example,
+you can use this at work, to limit agendas to your work file
+or tree, and at home to limit to the home file or tree. Or
+you can use it during the day in order to focus in on certain
+projects.
+</p>
+<p>
+You select a scope with the command `C-c C-x &lt;', which
+restricts to the current subtree. When called with a `C-u'
+prefix, the restriction is to the current file. You can also
+make restrictions from the speedbar frame, see below.
+</p>
+<p>
+When making a new restriction and an agenda window is
+currently visible, it will immediately be updated to reflect
+the new scope. TO if you like you can display an agenda view
+and then watch it change in various scopes.
+</p>
+<p>
+To get rid of the restriction, use the command "C-c C-x &gt;".
+Or press "&gt;" in the agenda dispatcher. Also, and use of "&lt;"
+in the dispatcher will disable the restriction lock and
+select a new restriction.
+</p>
+<p>
+Thanks to Rick Moynihan for triggering this development.
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Imenu and Speedbar support</h4>
+
+
+<ul>
+<li>
+Org-mode now supports Imenu. For example, with the setting
+
+<p>
+<pre>
+ (add-hook 'org-mode-hook
+ (lambda () 'imenu-add-to-menubar "Imenu"))
+</pre>
+</p>
+<p>
+a menu will be created in each Org-mode buffer that
+provides access to all level 1 and level 2 headings. The
+depth of the menu can be set with the variable
+`org-imenu-depth'.
+</p>
+</li>
+<li>
+org-mode now supports Speedbar. This means that you can
+drill into the first and second level headlines of an
+Org-mode file right from the speedbar frame.
+
+</li>
+<li>
+You can set a restriction lock for the Org-mode agenda to a
+file or a subtree directly from the speedbar frame. Just
+press "&lt;" with the cursor on an Org-mode file or subtree to
+set the lock and immediately update the agenda if it is
+visible. Use "&gt;" to get rid of the lock again.
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.15</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+There are new special properties TIMESTAMP and TIMESTAMP_IA.
+These can be used to access the first keyword-less active
+and inactive timestamp in an entry, respectively.
+
+</li>
+<li>
+New variable `org-clock-heading-function'. It can be set to
+a function that creates the string shown in the mode line
+when a clock is running. Thanks to Tom Weissmann for this
+idea.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.14</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Remember and related stuff
+<ul>
+<li>
+New command `org-refile' to quickly move a note.
+</li>
+<li>
+Easy way to jump to the target location of remember template.
+</li>
+<li>
+New %-escapes in remember templates: %c %(&hellip;) and %[&hellip;]
+</li>
+<li>
+`org-remember-insinuate' simplifies remember setup
+
+</li>
+</ul></li>
+<li>
+Emphasis and Font-lock stuff
+<ul>
+<li>
+Stacked emphasis is no longer allowed.
+</li>
+<li>
+You may finally emphasize a single character like *a*.
+</li>
+<li>
+Font-lock now can hide the emphasis markers
+</li>
+<li>
+Text in the "=" emphasis is exported verbatim
+</li>
+<li>
+There is a new emphasis marker "~" for verbatim text
+</li>
+<li>
+Constructs treated specially by the exporters can be highlighted
+
+</li>
+</ul></li>
+<li>
+Properties and Column view
+<ul>
+<li>
+More control over which properties use inheritance
+</li>
+<li>
+CATEGORY="work" can now be used in a tags/property search
+</li>
+<li>
+the {+} summary type can specify a printf-style output format
+</li>
+<li>
+New currency summary type {$}
+
+</li>
+</ul></li>
+<li>
+The date/time prompt
+<ul>
+<li>
+While entering data, watch live the current interpretation.
+</li>
+<li>
+The date prompt now prefers to select the future
+</li>
+<li>
+Easier modification of time in an existing time stamp.
+
+</li>
+</ul></li>
+<li>
+Export
+<ul>
+<li>
+You can now export some special strings in HTML, like "&hellip;"
+</li>
+<li>
+#+EMAIL: may contain several email addresses
+
+</li>
+</ul></li>
+<li>
+Agenda
+<ul>
+<li>
+In the agenda, a few keys have changed: `g', `G', and `e'.
+
+</li>
+</ul></li>
+<li>
+Miscellaneous
+<ul>
+<li>
+Class-dependent sectioning structures in LaTeX export.
+</li>
+<li>
+Radio-lists modeled after the radio tables.
+</li>
+<li>
+The default for `org-ellipsis' is back to nil
+</li>
+<li>
+Support for pabbrev-mode
+</li>
+<li>
+New variable `org-show-entry-below'.
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+If you have customized the variable `org-emphasis-alist' or
+org-export-emphasis-alist', you need to do it again by first
+canceling your customization and then adding it again.
+
+</li>
+<li>
+I know that some people have defined their own private helper
+functions to select a specific remember template, without being
+prompted, like this:
+
+<p>
+<pre>
+ (defun my-remember-template-n ()
+ (interactive)
+ (org-remember ?n))
+</pre>
+</p>
+<p>
+You need to modify this. The character selecting the template
+must now be the <i>second</i> argument to `org-remember':
+</p>
+<p>
+<pre>
+ (defun my-remember-template-n ()
+ (interactive)
+ (org-remember nil ?n))
+</pre>
+</p>
+</li>
+<li>
+`C-c C-w' now refiles an entry. To get a sparse tree of
+deadlines, use `C-c / d' instead.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Remember and related stuff</h4>
+
+
+<ul>
+<li>
+New command `org-refile' to quickly move a note to a
+different place. It is bound to `C-c C-w'. The foremost
+application might be to put a note or task captured with
+`remember' into the proper list or project. The command
+offers a list of possible refiling targets for completion.
+These are headings under which the entry will be inserted
+as a subitem. By default, this will offer all top-level
+headings in the current buffer, but you can configure the
+variable `org-refile-targets' to get more complex
+definitions. For example:
+
+<p>
+<pre>
+ (setq org-refile-targets '((nil . (:level . 2))))
+</pre>
+</p>
+<p>
+selects all level 2 headlines in the current buffer as
+targets. And
+</p>
+<p>
+<pre>
+ (setq org-refile-targets
+ '((org-agenda-files . (:tag . "refile"))))
+</pre>
+</p>
+<p>
+searches all agenda files and selects headlines that are
+explicitly marked with the tag :refile: . Note that the
+list of targets is built upon first use only, to rebuilt
+it, call the command `C-c C-w' with a double prefix
+argument.
+</p>
+<p>
+This is based on an idea and example implementation by Max
+Mikhanosha. Many thanks Max.
+</p>
+</li>
+<li>
+You can now use a C-u prefix on `org-remember' to jump to
+the location where a specific templates stores its notes.
+For example, if you have `org-remember' bound to `C-c r',
+then `C-u C-c r n' will get you to the file and headline
+given in the template associated with the letter "n".
+
+<p>
+This was proposed by someone, but I have lost track who.
+Sorry, and thanks anyway.
+</p>
+</li>
+<li>
+New %-escapes in remember templates:
+
+<p>
+<pre>
+ %c insert the current clipboard, like C-y would do
+ %(..) evaluate Lisp expression and insert the result
+ %[..] include file
+</pre>
+</p>
+<p>
+Thanks to Adam Spiers and Tim O'Callaghan.
+</p>
+</li>
+<li>
+New function `org-remember-insinuate' that makes is easier
+to set Org-mode specific values for remember variables.
+Thanks to Michael Olson for this proposal. It is
+equivalent to:
+
+<p>
+<pre>
+ (require 'remember)
+ (setq remember-annotation-functions '(org-remember-annotation))
+ (setq remember-handler-functions '(org-remember-handler))
+ (add-hook 'remember-mode-hook 'org-remember-apply-template))
+</pre>
+</p>
+<p>
+You might still want to set `org-default-notes-file' to
+provide a default for templates without a file, and
+`org-directory' to show where to find other org files.
+</p>
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Emphasis and Font-lock stuff</h4>
+
+
+<ul>
+<li>
+Stacked emphasis like */bold italic/* is no longer allowed.
+
+</li>
+<li>
+You may finally emphasize a single character like *a*.
+
+</li>
+<li>
+Font-lock now can hide the emphasis markers, just like Muse
+does. Configure the variable `org-hide-emphasis-markers'
+if you want this. Showing the characters continues to be
+the default in Org-mode.
+
+</li>
+<li>
+Text in the "=" emphasis is now exported verbatim, i.e. no
+further parsing and interpretation of this text takes place. So
+you can write =quoted *xxx* a_x = b=. This and the following
+point implement a request by Daniel Clemente.
+
+</li>
+<li>
+There is a new emphasis marker "~" which marks text to be
+exported verbatim, without special formatting. Inside an
+org-mode file, this text is highlighted with the org-verbatim
+face. I am not happy with the face yet (currently is is like
+org-code, but underlined), please suggest a better one.
+
+</li>
+<li>
+Whether an emphasis environment is verbatim or not is now an
+extra flag in the variable `org-emphasis-alist'. If you have
+configured this variable, do it again by first canceling your
+customization to revert to the default, and then adding it
+again.
+
+</li>
+<li>
+New variable `org-highlight-latex-fragments-and-specials'.
+When turned on, Org-mode will highlight all strings that
+are treated in a special way by the exporters. This is
+great for export-oriented writing, but maybe a bit noisy
+for note taking, so this feature is off by default.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Properties and Column view</h4>
+
+
+<ul>
+<li>
+`org-use-property-inheritance' may now also be a list of
+property names that should be treated with inheritance
+during searches.
+
+</li>
+<li>
+CATEGORY="work" can now be used in a tags/property search,
+even if the category is not specified as a property in the
+entry, but rather is inherited or derived from #+CATEGORY.
+Thanks to Adam, Tim, and Bastien for an interesting
+discussion around this issue.
+
+</li>
+<li>
+Summary type improvements in column view.
+<ul>
+<li>
+The {+} summary type can specify a printf-style output
+format for computed values like this: {+;%5.2f}
+This was triggered by a report by Levin.
+</li>
+<li>
+New currency summary type {$}, which so far is just a
+shorthand for {+;%.2f}. Do we need to have a currency
+symbol in front of each value. Scott Jaderholm asked for
+this, but I am not sure if this is already what he meant.
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-4">
+<h4>The date/time prompt</h4>
+
+
+<p>
+There have been several small but <b>very</b> useful additions to
+the date prompt.
+</p>
+<ul>
+<li>
+While entering data at the date prompt, the current
+interpretation of your input is shown next to your input in
+the minibuffer. I find this great to understand how the
+input works. If you find the extra stuff in the minibuffer
+annoying, turn it off with `org-read-date-display-live'.
+
+</li>
+<li>
+The date prompt now prefers to select the future. If you
+enter a date without a month, and the day number is before
+today (for example, on the 16th of the month you enter
+"9"), Org-mode will assume next month. Similarly, if you
+enter a month and no year, next year will be assumed if the
+entered month is before the current, for example if you
+enter "May" in September. Thanks to John Rakestraw for
+this great suggestion. If you find it confusing, turn it
+off with `org-read-date-prefer-future'.
+
+</li>
+<li>
+When modifying an existing date using `C-c .' at the stamp,
+the time or time range in the stamp are now offered as
+default input at the prompt. This goes a long way to
+simplifying the modification of an existing date. Thanks
+to Adam Spiers for this proposal.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Export (all implemented by Bastien&hellip;)</h4>
+
+
+<ul>
+<li>
+You can now export special strings in HTML. Here is the
+list of newly performed conversions:
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="left"></col><col align="left"></col>
+<thead>
+<tr><th>Org</th><th>Description</th><th>HTML</th></tr>
+</thead>
+<tbody>
+<tr><td>\\-</td><td>double backslash followed by minus</td><td>&amp;shy;</td></tr>
+<tr><td>--</td><td>two dashes (minuses)</td><td>&amp;ndash;</td></tr>
+<tr><td>---</td><td>three dashes (minuses)</td><td>&amp;mdash;</td></tr>
+<tr><td>...</td><td>three dots</td><td>&amp;hellip;</td></tr>
+</tbody>
+</table>
+
+
+<p>
+You can turn this globally on or off with
+`org-export-with-special-strings' or locally with "-:t" or
+"-:nil" in the #+OPTIONS line. Thanks to Adam Spiers for
+starting the discussion, and thanks to Daniel Clemente and
+William Henney for relevant inputs.
+</p>
+</li>
+<li>
+Comma-separated emails in #+EMAIL: are correctly exported.
+Thanks to Raman for pointing out this omission.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Agenda</h4>
+
+
+<ul>
+<li>
+In the agenda, a few keys have changed
+<pre>
+ g does now the same a "r", refresh current display,
+ because "g" is the Emacs standard for "refresh"
+ G toggle the time grid, used to be "g"
+ e Execute another agenda command, pretty much the same as
+ `C-c a', but shorter and keep the same agenda window.
+</pre>
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Miscellaneous (much of it from Bastien)</h4>
+
+
+<ul>
+<li>
+You can now select the sectioning structure of your LaTeX
+export by setting it either globally
+(`org-export-latex-default-class') or locally in each Org
+file (with #+LaTeX_CLASS: myclass). You can also customize
+the list of available classes and their sectioning
+structures through the new `org-export-latex-classes'
+option. Thanks to Daniel for discussions and suggestion on
+this issue.
+
+</li>
+<li>
+You can send and receive radio lists in HTML,
+LaTeX or TeXInfo, just as you send and receive radio
+tables. Check the documentation for details and examples.
+
+</li>
+<li>
+The default for `org-ellipsis' is back to nil, some people
+seem to have had problems with the face as a default.
+
+</li>
+<li>
+Support for pabbrev-mode, needs pabbrev version 1.1. Thanks
+to Phillip Lord for adapting his package to make this
+possible.
+
+</li>
+<li>
+New variable `org-show-entry-below' to force context-showing
+commands to expose the body of a headline that is being
+shown. Thanks to Harald Weis for pointing out this omission.
+
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.13i</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+On the date/time prompt, you can now also answer with
+something like +2tue to pick the second tuesday from today.
+This was a proposal by Sacha Chua.
+
+</li>
+<li>
+When interpopating into Lisp formulas in the spreadsheet,
+the values of constants and properties are no longer
+enclosed into parenthesis. When interpolating for calc,
+this still happens in order to allow expressions in
+constants. This problem was reported by Eddward DeVilla.
+
+</li>
+<li>
+When a directory is listed in `org-agenda-files', all files
+with extension matched by the new variable
+`org-agenda-file-regexp' in that directory will be agenda
+files.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.13</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Bug fixes and improvements in column view
+<ul>
+<li>
+All known bugs fixed.
+</li>
+<li>
+A Column view can be captured into a dynamic block.
+</li>
+<li>
+The ITEM column is formatted core compactly.
+</li>
+<li>
+Also ITEM can be edited with `e'
+
+</li>
+</ul></li>
+<li>
+The agenda dispatcher
+<ul>
+<li>
+`&lt;' cycles through restriction states.
+</li>
+<li>
+Multi-character access codes to commands (= sub-keymaps).
+
+</li>
+</ul></li>
+<li>
+Sorting improvements
+<ul>
+<li>
+User-defined sorting keys.
+</li>
+<li>
+Sorting by properties.
+</li>
+<li>
+Sorting of plain lists.
+
+</li>
+</ul></li>
+<li>
+HTML &lt;div&gt; structure
+
+</li>
+<li>
+Other stuff
+<ul>
+<li>
+New variables, several of them.
+</li>
+<li>
+Drawers can be set on a per-file basis.
+</li>
+<li>
+Better control over priority fontification in agenda.
+</li>
+<li>
+M-up and M-down now move the current line up and down.
+</li>
+<li>
+Abort remember template selection with C-g.
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Bug fixes and improvements in column view</h4>
+
+
+<ul>
+<li>
+All the bugs described by Scott Jaderholm have been fixed
+(at least I hope so&hellip;).
+
+</li>
+<li>
+You can now capture a column view into a dynamic block, for
+exporting or printing it. The column view can be
+
+<ul>
+<li>
+global, i.e. for the entire file
+</li>
+<li>
+local, i.e. for the subtree where the dynamic block is
+</li>
+<li>
+from an entry with a specific :ID: property.
+
+</li>
+</ul>
+<p>You can identify the entry whose column view you want to
+capture by assigning an :ID: property, and use that property
+in the dynamic block definition. For example:
+</p>
+<p>
+<pre>
+ * Planning
+ :PROPERTIES:
+ :ID: planning-overview
+ :END:
+
+ [...]
+
+ * The column view
+ #+BEGIN: columnview :hlines 1 :id "planning-overview"
+
+ #+END:
+</pre>
+</p>
+<p>
+Use `C-c C-x r' to insert such a dynamic block, and you will
+be prompted for the ID.
+</p>
+</li>
+<li>
+When the current column format displays TODO keyword,
+priority or tags, these parts are stripped from the content
+of the ITEM column, making for more compact and readable
+entries. When any of these "properties" are not listed in
+the current column format, they are instead retained in the
+ITEM column.
+
+</li>
+<li>
+You can now also edit the ITEM column with `e'.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>The agenda dispatcher</h4>
+
+
+<ul>
+<li>
+Instead of pressing `1' to restrict an agenda command to
+the current buffer, or `0' to restrict it to the current
+subtree or region, you can now also press `&lt;' once or
+twice, respectively. This frees up `1' and `0' for user
+commands, a request by Bastien. In fact, "&lt;" cycles
+through different restriction states. "1" and "0" are
+still available for backward compatibility, until you bind
+them to custom commands.
+
+</li>
+<li>
+The access code to custom agenda commands can now contain
+several characters, effectively allowing to bundle several
+similar commands into a sub-keymap. This follows an
+excellent proposal by Adam Spiers. For example:
+
+<p>
+<pre>
+ (setq org-agenda-custom-commands
+ '(("h" . "HOME + Name tag searches") ; describe prefix "h"
+ ("hl" tags "+HOME+Lisa")
+ ("hp" tags "+HOME+Peter")
+ ("hk" tags "+HOME+Kim")))
+</pre>
+</p>
+</li>
+<li>
+The user function option in org-agenda-custom-commands may
+now also be a lambda expression, following a request by
+Adam Spiers.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Sorting improvements</h4>
+
+
+<p>
+We are using a new routine for sorting entries, courtesy of
+John Wiegley. Many thanks to John.
+</p>
+<ul>
+<li>
+You can define your own function to extract a sorting key
+and in this way sort entries by anything you like.
+
+</li>
+<li>
+Entries can now be sorted according to the value of a
+property.
+
+</li>
+<li>
+Plain lists can be sorted.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>HTML &lt;div&gt; structure</h4>
+
+
+<p>
+There is now a &lt;div&gt;-based structure in exported HTML.
+</p>
+<ul>
+<li>
+The table of context is wrapped into a div with a class
+"table-of-contents".
+
+</li>
+<li>
+The outline structure is embedded in &lt;div&gt; elements with
+classes "outline-1", "outline-2" etc.
+
+</li>
+<li>
+The postamble, containing the author information and the
+date is wrapped into a div with class "postamble".
+
+</li>
+</ul>
+<p>I am not sure if the class names are the best choice, let me
+know if there are more "canonical" choices.
+</p>
+<p>
+Thanks to Mike Newman and Cezar for input, and in particular
+to Mike for his clearly formulated specification.
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Other stuff</h4>
+
+
+<ul>
+<li>
+New variable `org-agenda-window-frame-fractions' to
+customize the size limits of the agenda window in the case
+that you display the agenda window by reorganizing the
+frame.
+
+</li>
+<li>
+Drawers can be set on a per-file basis using
+
+<p>
+<pre>
+ #+DRAWERS: HIDDEN STATE PROPERTIES
+</pre>
+</p>
+<p>
+This will define the drawers :HIDDEN: and :STATE:.
+The :PROPERTY: drawer should always be part of this list, or
+your properties will not be folded away.
+Thanks to Richard G. Riley for this proposal.
+</p>
+</li>
+<li>
+`org-agenda-fontify-priorities' may now also be an
+association list of priorities and faces, to specify the
+faces of priorities in the agenda individually.
+
+</li>
+<li>
+The variable `org-export-with-property-drawer' no longer
+exists, please use `org-export-with-drawers' instead. Also,
+the corresponding switch in the #+OPTIONS line has changed
+from "p" to "d". Thanks to Bastien for pointing out that we
+needed to handle not only the property drawer.
+
+</li>
+<li>
+M-up and M-down now move the current line up and down (if
+not at a headline, item or table). Among other things you
+can use this to re-order properties in the drawer. This was
+a proposal by Bastien.
+
+</li>
+<li>
+New variable `org-agenda-todo-ignore-with-date', based on a
+request by Wanrong Lin.
+
+</li>
+<li>
+Aborting remember template selection with C-g now kills the
+remember buffer and restores the old window configuration.
+This was a request by Nuutti Kotivuori.
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.12</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Remember templates can now have name.
+</li>
+<li>
+`C-c C-k' will abort taking a note (remember of log)
+</li>
+<li>
+`C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg.
+</li>
+<li>
+Lines in the agenda can be fontified according to priority.
+</li>
+<li>
+New variable `org-scheduled-past-days'.
+</li>
+<li>
+New variables `org-agenda-deadline-leaders' and
+`org-agenda-scheduled-leaders'.
+</li>
+<li>
+New sparse tree function `org-sparse-tree'.
+</li>
+<li>
+The variable `org-ellipsis' now defaults to `org-link'.
+</li>
+<li>
+The #+OPTIONS line has a new option "tags".
+</li>
+<li>
+New variable `org-use-property-inheritance'.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+`C-c /' now calls `org-sparse-tree'.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Remember templates can now have a template name as the first
+element. The name will be listed along with the selection
+character when prompting for a template. It is best to have
+the name start with the selection character, for example if
+you use ("Note" "n"), you will be prompted like "[n]ote".
+Thanks to Matiyam for this proposal.
+
+</li>
+<li>
+`C-c C-k' will abort taking a note. You can use this in remember
+buffers and when taking a logging note (e.g. for a state
+change). Thanks to Bastien.
+
+</li>
+<li>
+`C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg to
+cut N sequential subtrees. This was a proposal by John.
+
+</li>
+<li>
+Lines in the agenda are now bold if they have priority A and
+italic if they have priority C. You can turn this off using
+the variable `org-agenda-fontify-priorities'. Thanks to
+John Wiegley for the idea and code.
+
+</li>
+<li>
+New variable `org-scheduled-past-days' to set the number a
+scheduled item will be listed after its date has passed.
+Default is 10000, i.e. indefinitely.
+
+</li>
+<li>
+New variables `org-agenda-deadline-leaders' and
+`org-agenda-scheduled-leaders' to adjust the leading text o
+scheduled items and deadline in the agenda. Thanks to John
+Wiegley for a patch.
+
+</li>
+<li>
+New sparse tree function `org-sparse-tree'. This is now the
+default binding for `C-c /'. It requires one additional
+keypress to select a command, but in return is provides a
+single interface to all the different sparse tree commands,
+with full completion support.
+
+</li>
+<li>
+The variable `org-ellipsis' now defaults to the face
+`org-link' because the visibility of the dots is really bad
+and I have found this change very useful indeed.
+
+</li>
+<li>
+The #+OPTIONS line has a new option "tags" which can be used
+to set `org-export-with-tags'. Thanks to Wanrong Lin for
+this proposal.
+
+</li>
+<li>
+New variable `org-use-property-inheritance'. Configure it
+to `t' if you want that searching for entries with certain
+properties always should assume inheritance. This is not
+well tested yet, please check it out.
+
+</li>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.11</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+SUMMARY, DESCRIPTION, LOCATION properties for iCalendar
+</li>
+<li>
+Command to jump to the running clock
+</li>
+<li>
+Clock entries can now have their own drawer
+</li>
+<li>
+`C-c C-x C-r' only updates a clocktable at point
+</li>
+<li>
+New way to assign a remember template to a single key
+</li>
+<li>
+`C-n' and `C-p' are back to their default binding
+</li>
+<li>
+`C-x C-s' in agenda buffer saves all org-mode buffers
+</li>
+<li>
+Schedule/deadline leaves note in agenda buffer
+</li>
+<li>
+Prefix argument for `C-c C-d/s' will remove date
+</li>
+<li>
+New variable to make block aranda more compact
+</li>
+<li>
+Better tag alignment in agenda
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+If you have customized `org-drawers', you need to add
+"CLOCK" to the list of drawers.
+
+</li>
+<li>
+The variable `org-agenda-align-tags-to-column' has been
+renamed to `org-agenda-tags-column'. The old name is still
+an alias, in Emacs 22 and in XEmacs, but not in Emacs 21.
+
+</li>
+<li>
+The default value for both `org-tags-column' and
+`org-agenda-tags-column' is now -80.
+
+</li>
+<li>
+The variable
+`org-insert-labeled-timestamps-before-properties-drawer'
+is now obsolete.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+The LOGGING property allows to modify the settings for
+progress logging for a single entry. For example:
+
+<p>
+<pre>
+ :PROPERTIES:
+ :LOGGING: nologging nologrepeat
+ :END:
+</pre>
+</p>
+<p>
+turns off all progress logging for the current entry and its
+children.
+</p>
+</li>
+<li>
+The properties SUMMARY, DESCRIPTION and LOCATION have
+special meaning during iCalendar export, when they translate
+to the corresponding VEVENT and VTODO fields. If not given,
+Org-ode continues to use cleaned-up version of the headline
+and body as the summary and the description, respectively.
+
+</li>
+<li>
+New function to go to the entry with the currently running
+clock. Bound to `C-c C-x C-j', in agenda also to "J". If
+you use this often, you might even want to assign a global
+key. Thanks to Bernt and Bastien.
+
+</li>
+<li>
+Clock entries can now have their own drawer, the :CLOCK:
+drawer. Check out the variable `org-clock-into-drawer' for
+configuration of this feature. The default is to create a
+drawer when the second clocking line gets added to an entry.
+Note that "CLOCK" has been added to the default value of
+`org-drawers', but if you have configured that variable, you
+must go back and add "CLOCK" yourself to get this drawer
+folded away. Thanks to Tom Weissman for pointing out that
+too many clock entries are visually annoying.
+
+</li>
+<li>
+`C-c C-x C-r' no longer tries to find the first clocktable
+in a buffer and then updates it. Instead, it will update
+the clocktable at point if there is one (same as C-c C-c
+will do if the cursor is in the "#+BEGIN" line of the
+table). If there is none at point, a new one will be
+inserted. This change was necessary because the new :scope
+parameter allows to have several clocktables in a buffer.
+Thanks to Bastien for pointing this out.
+To update all dynamic blocks in a file, use `C-u C-c C-x C-u'.
+
+</li>
+<li>
+The function `org-remember' can now be called with a
+template selection key as argument. This helps to make key
+bindings that go directly to a specific template without
+being prompted for a template, like this:
+
+<p>
+<pre>
+ (global-set-key [f5] (lambda () (interactive) (org-remember "j")))
+</pre>
+</p>
+<p>
+Thanks to Richard G Riley for bringing this up.
+</p>
+</li>
+<li>
+`C-n' and `C-p' are back to their default binding
+(next/previous line) in the agenda buffer. Enough people,
+including recently Denis Bueno, have complained about this,
+and I agree it is not good to break habits like that.
+
+</li>
+<li>
+`C-x C-s' in an agenda buffer now saves all org-mode buffers
+(also `s' does this).
+
+</li>
+<li>
+Setting schedule or deadline dates from the agenda now
+produces a note in the agenda, similarly to what happens
+with S-left/right.
+
+</li>
+<li>
+Using a prefix argument for `C-c C-d' or `C-c C-s' will
+remove the deadline or scheduling date from an item. Thanks
+to Wanrong Lin for this proposal.
+
+</li>
+<li>
+New variable `org-agenda-compact-blocks'. When set, the
+space between blocks in a block agenda is reduced as much as
+possible, to show more items on a single screen.
+
+</li>
+<li>
+The variable `org-agenda-tags-column' (renamed from
+`org-agenda-align-tags-to-column') can now also be negative,
+to mean alignment to the left. The new default is -80, just
+like it is now for `org-tags-column'.
+
+</li>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.10</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Category and the archive location can be properties.
+</li>
+<li>
+The clocktable has a new <code>:scope</code> parameter.
+</li>
+<li>
+CSV support when importing a table.
+</li>
+<li>
+Better defaults when modifying a time stamp.
+</li>
+<li>
+New way to specify the duration of an appointment.
+</li>
+<li>
+More aggressive version of orgstruct-mode improved wrapping.
+</li>
+<li>
+Modifications to priority cycling.
+</li>
+<li>
+Modifications to computations in column view.
+</li>
+<li>
+New command `org-occur-in-agenda-files'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Both the category and the archive location in a (sub)tree of
+the buffer can now be specified using a property, for
+example:
+
+<p>
+<pre>
+ * Tree with special properties
+ :PROPERTIES:
+ :CATEGORY: Examples
+ :ARCHIVE: /some/special/file::
+ :END:
+</pre>
+</p>
+<p>
+This is a much cleaner way of dealing with multiple
+categories and archives in a single file. The preferred use
+of the <code>#+CATEGORY</code> and <code>#+ARCHIVE</code> lines is now to set a
+<b>single</b> default for the file which is then locally
+overruled by properties. This was a proposal from Bastien
+if I remember correctly. Multiple <code>#+</code> lines still work
+and I don't plan to remove this support soon, but I
+encourage you to stop using them.
+</p>
+</li>
+<li>
+The clocktable has a new <code>:scope</code> parameter that determines
+the range in the file from which clock entries should be
+taken. This can be anything from the local subtree to the
+entire buffer to even the full list of agenda files. Legal
+values are:
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="left"></col>
+<thead>
+<tr><th>value</th><th>scope</th></tr>
+</thead>
+<tbody>
+<tr><td>nil</td><td>the current buffer or narrowed region</td></tr>
+<tr><td>file</td><td>the full current buffer</td></tr>
+<tr><td>subtree</td><td>the subtree where the clocktable is located</td></tr>
+<tr><td>treeN</td><td>the surrounding level N tree, for example tree3</td></tr>
+<tr><td>tree</td><td>the surrounding level 1 tree</td></tr>
+<tr><td>agenda</td><td>all agenda files</td></tr>
+</tbody>
+</table>
+
+
+<p>
+Thanks to Jason F. McBrayer and Bernt Hansen for
+inspiration. Thanks to cranreuch (what is you full name?)
+for mentioning, at the right moment, that the clocktable is
+not so bad - that remark made it seem worthwhile to add
+features.
+</p>
+</li>
+<li>
+The commands to import a table and to convert a region to a
+table can now handle comma-separated values (CSV). The
+algorithm does not yet treat quoting correctly, but for
+basic input it works.
+
+</li>
+<li>
+When modifying an existing time stamp, or when entering the
+second stamp of a range, the date prompt will now
+consistently default to the date/time in the existing stamp.
+This was triggered by Nuutti Kotivuori's request.
+
+</li>
+<li>
+At the date/time prompt, there is a new way to specify a
+range of hours, by using "+DURATION" after the time. For
+example:
+
+<p>
+<pre>
+ 14:00+2 means 14:00-16:00
+ 2pm+2:30 means 14:00-16:30
+</pre>
+</p>
+<p>
+Again, Nuutti Kotivuori's request.
+</p>
+</li>
+<li>
+When you use the function `turn-on-orgstruct++' to turn on
+orgstruct-mode, the special org-mode settings for
+auto-filling, indentation and paragraphs are exported into
+the buffer, so that typing list items with indentation works
+better. This was Bastien's idea and request.
+
+</li>
+<li>
+New variable `org-priority-start-cycle-with-default'. When
+t (the default), priority cycling will initially set the
+default priority and then increase or decrease. When nil,
+the first priority set by cycling is already 1 different
+from the default priority. This was mostly driven by
+Bastien.
+
+</li>
+<li>
+In column view: When an entry has a property for a summary
+column defined, its value is normally overwritten by the sum
+of all the children's values each time you enter column
+view. Now there is an exception to this rule: If none of
+the children has that particular property defined, the
+parent's value stays. In this way you can still place TODO
+items under such an entry without getting the property value
+changed. Thanks to Russel Adams for pointing out that this
+is a better way of doing things.
+
+</li>
+<li>
+In column view, computed values are now bold face, and
+trying to edit them is an error. I think this works, but
+testing is appreciated.
+
+</li>
+<li>
+New command `org-occur-in-agenda-files', this is basically
+the quick command John Wiegley proposed the other day, but
+it also works when the agenda files are not yet in buffers.
+The key is `C-c C-x /', any better proposals?
+
+</li>
+<li>
+Links containing a space will now be handled correctly when
+calling the browser. Note that you need to enclose such
+links in square or angular brackets.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.09</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Taking a note upon TODO state changes can be restricted to
+selected states.
+
+</li>
+<li>
+The format in which dates are shown in the daily/weekly
+agenda can be configured.
+
+</li>
+<li>
+The default for `org-remember-store-without-prompt' is now t.
+
+</li>
+<li>
+`org-goto' has been made into a general lookup command.
+
+</li>
+<li>
+Priority cycling goes back to the nil state.
+
+</li>
+<li>
+You can store a remember note to the <b>last used</b> location.
+
+</li>
+<li>
+On Emacs 23, the headline faces for org-mode are now
+inherited from the outline faces.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+The default for `org-remember-store-without-prompt' is now
+t, in order to better match the original intent of
+remember.el (storing a note with minimum interruption of
+work flow). I expect that many people will be hit by this
+incompatible change - nevertheless I believe it is the right
+thing to do.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+You can now select specific states for recording a note when
+switching to that state. With the setting
+
+<p>
+<pre>
+ #+SEQ_TODO: TODO(t) ORDERED(o@) INVOICE(i@) PAYED(p) | RECEIVED(r)
+ #+STARTUP: lognotestate
+</pre>
+</p>
+<p>
+only the states ORDERED and INVOICE will record a timestamp
+and a note.
+</p>
+</li>
+<li>
+You can now set the format of the string for each day in the
+agenda and timeline buffers. You can use a format string
+interpreted by `format-time-string', or you can write your
+own function. Configure the new variable
+`org-agenda-format-date'. Thanks to Levin for triggering
+this development with a patch.
+
+</li>
+<li>
+The default for `org-remember-store-without-prompt' is now
+t, in order to better match the original intent of
+remember.el (storing a note with minimum interruption of
+work flow). Since we can assign files and headlines to
+templates, I guess this takes care of selecting a filing
+location in most cases. For interactive filing, you now
+need a prefix command when exiting `remember'.
+
+</li>
+<li>
+`org-goto' (bound to `C-c C-j') now uses an indirect buffer
+and has additional commands enabled: Org-occur with `C-c /'
+or even faster with `/', and the commands needed to select
+and copy a region. This make `org-goto' a more general
+lookup command instead of only a jumping command. Remember
+that you can exit with `Q' to go back to the original
+location. Thanks to William Henney for this idea.
+
+</li>
+<li>
+Setting the priority with S-up/down now cycles back to a
+state where no priority is specified. This was requested by
+Rick Moynihan.
+
+</li>
+<li>
+You can store a remember note to the <b>last used</b> location.
+So if you select a location interactively once, you can
+re-use it without having to find it again. For this, exit
+the remember buffer with `C-u C-u C-c C-c'. The leading
+comment in the remember buffer will tell exactly where the
+note goes if you exit with a particular command.
+Thanks to Maxim Loginov for this idea.
+
+</li>
+<li>
+On Emacs 23, the headline faces for org-mode are now
+inherited from the outline faces. This is just a
+convenience, so that you only have to configure one set of
+faces, and that will then be outline-1 .. outline-8. You
+will actually not see any difference in org-mode, because
+Stefan Monnier has made the outline faces in Emacs 23 to
+match the current org-mode faces.
+
+<p>
+This change does not effect XEmacs, nor Emacs 21 and 22.
+</p>
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.08</h2>
+
+
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+The default for `org-deadline-warning-days' is now 14.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+There is now a separate interface for fast and directly
+setting a TODO keyword. This interface kicks in when you
+have configured keys for TODO keywords like
+
+<p>
+<pre>
+ #+SEQ_TODO: TODO(t) WAITING(w) | DONE(d) CANCELED(c)
+</pre>
+</p>
+<p>
+C-c C-t still does the cycling thing, you need to use a
+prefix argument to get to the fast interface. Or configure
+the variable `org-use-fast-todo-selection' to t, then this
+will be the default and the prefix argument will make the
+command fall back to cycling.
+</p>
+<p>
+The tag selection no longer does include TODO keywords -
+Leo's arguments have convinced me that this is not a good
+idea. If you'd like to see the TODO keywords in the tags
+interface anyway, set the variable
+`org-fast-tag-selection-include-todo'. Thanks to Leo and
+others for input on this issue.
+</p>
+</li>
+<li>
+New variable `org-edit-timestamp-down-means-later'. When
+set, `S-down' on a timestamp will change the timestamp to
+later. Thanks to Raman for this idea.
+
+</li>
+<li>
+Property names can now contain non-ascii word characters.
+This follows a request from Daniel Clemente.
+
+</li>
+<li>
+For export, the date that should be given in the exported
+file can now be set to a specific value with a line like
+
+<p>
+<pre>
+ #+DATE: 15 November 2003
+</pre>
+</p>
+<p>
+If you want to use the date/time when the file was created,
+use a format string that will be interpreted by
+`format-time-string', for example:
+</p>
+<p>
+<pre>
+ #+DATE: %Y/%m/%d %X
+</pre>
+</p>
+</li>
+<li>
+The default of `org-deadline-warning-days' has changed to 14
+days. 30 was really too much, I suspect most people (me
+included) have changed this.
+
+</li>
+<li>
+When a deadline has an individual lead time, this lead time
+obviously overrules `org-deadline-warning-days'. However,
+if you bind `org-deadline-warning-days' to a number &lt;=0, for
+example during a custom agenda command, then the absolute
+value of this number will be enforced also when a different
+lead time has been specified. This is useful to get a list
+of all deadlines coming up in the next N days.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.07</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Different faces for different TODO keywords.
+
+</li>
+<li>
+Setting TODO states through the TAG setting interface.
+
+</li>
+<li>
+Context information is stored when moving a tree to the archive.
+
+</li>
+<li>
+Sorting can be done by priority.
+
+</li>
+<li>
+`Org-ellipsis' can now also be a face.
+
+</li>
+<li>
+Scheduling info is no longer removed entry is marked CLOSED.
+
+</li>
+<li>
+Unavailable files in `org-agenda-files' can be skipped.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+The time of archiving is now stored as a property.
+ARCHIVED is no longer a special time keyword.
+
+</li>
+<li>
+Scheduling info is no longer removed entry is marked CLOSED.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+You can now define different faces for different TODO
+keywords. This request has come up frequently, so here it
+is: Use the variable `org-todo-keyword-faces'.
+
+<p>
+A Here is a configuration example:
+</p>
+<p>
+<pre>
+ (setq org-todo-keyword-faces
+ '(("TODO" . org-warning)
+ ("DEFERRED" . shadow)
+ ("CANCELED" . (:foreground "blue" :weight bold
+ :underline t))))
+</pre>
+</p>
+<p>
+Org-mode continue still use `org-todo' and `org-done' for
+keywords that have no specific face assigned.
+</p>
+</li>
+<li>
+Some People use TODO states more like tags. For them the
+TODO keywords mark special states and they like to quickly
+switch between states in arbitrary sequence. The standard
+TODO interface is not perfect for this, because it assumes
+that the states are reached in sequence. However, the fast
+tag setting interface is in fact perfect for this. You can
+now "misuse" the TAG selection interface to also set TODO
+states. All you need to do is to assign keys to the TODO
+states, just like you also do for tags.
+
+<p>
+<pre>
+ #+SEQ_TODO: TODO(t) WAITING(w) | CANCELED(c) DONE(d)
+ #+TAGS: @HOME(h) @OFFICE(o) @SHOP(s)
+</pre>
+</p>
+<p>
+Next time you try to set tags with C-c C-c, the todo states
+will be offered as well, and the corresponding key will
+switch the entry to that state.
+</p>
+</li>
+<li>
+New variable `org-archive-save-context-info' governs if
+information that would be lost by moving a subtree to the
+archive file, should be stored as special properties. For
+example,
+
+<p>
+<pre>
+ (setq org-archive-save-context-info '(itags category))
+</pre>
+</p>
+<p>
+will store the inherited tags and the category in properties
+ARCHIVE_ITAGS and ARCHIVE_CATEGORY, respectively. The
+default setting for this variable is to save everything that
+could be lost. This was a proposal by John Wiegley.
+</p>
+</li>
+<li>
+Sorting (`C-c ^') can use the use the priority to sort. Use
+the "p" and "P" keys at the prompt. John Wiegley, again.
+
+</li>
+<li>
+`Org-ellipsis' can now also be a face to make the folding
+ellipsis more visible. This is based on a post by Tassilo
+Horn. Since `org-ellipsis' only works in Org-mode, you
+might want to use Tassilo Horn's hack directly in order to
+affect the folding ellipsis globally.
+
+</li>
+<li>
+Scheduling info is no longer removed when an entry is marked
+CLOSED. This was a request by Brian van den Broek. Let me
+know if this breaks anything for you - then it will become
+an option.
+
+</li>
+<li>
+New option `org-agenda-skip-unavailable-files'. Currently,
+if a file does not exist, it will be removed from
+`org-agenda-files' after a query. When this option is set,
+the file will simply be skipped.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.06</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+When exporting only a region and this region is a single
+(sub)tree (for example selected with `C-c @'), the title for
+the exported document is taken to be the heading of the
+subtree. The sublevels become top-level entries in the
+export. Furthermore, if the head entry of the tree has or
+inherits an EXPORT_FILE_NAME property, that file name (with
+appropriately substituted extension) will be used for the
+exported tree. Thanks to Patrick Drechsler and Jost Burkart
+for these ideas.
+
+</li>
+<li>
+org-special-ctrl-a/e has a third allowed value, `reversed'.
+When it is set to this value, the first C-a or C-e command
+behaves normally, i.e. it goes to the true beginning or end
+of the line. Only when you press C-a or C-e immediately
+again, the the "special" position will be found. Additional
+presses of the same key jump between the two positions. I
+like this a lot better than the `t' setting, because now the
+keys behave more predictable and still give easy access to
+the special locations.
+
+</li>
+<li>
+New command to set or remove a tag from all headlines in a
+region.
+
+</li>
+<li>
+When Org-mode visits a file, it will initially hide all
+drawers.
+
+</li>
+<li>
+The default of the variable `org-cycle-global-at-bob' is now
+nil, meaning that TAB no longer does global visibility
+cycling at the beginning of the buffer.
+
+</li>
+<li>
+Bug fixes, in particular the problems with scheduling and
+deadlines introduced in 5.05. Please check carefully if
+this works correctly again, and complain if not.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.05</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+LaTeX export, finally, thanks to Bastien.
+
+</li>
+<li>
+Extension mechanism for the hyperlink system.
+
+</li>
+<li>
+Global access to commands inserting and following links.
+
+</li>
+<li>
+Individual lead-times for deadlines.
+
+</li>
+<li>
+Option to show only the next instance of repeating timestamp.
+
+</li>
+<li>
+Store remember notes with only 2 keys: C-c C-c
+
+</li>
+<li>
+Appointment reminders from Org-mode.
+
+</li>
+<li>
+Global values for selected properties.
+
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Bastien's `org-export-latex.el' is now part of the org-mode
+distribution. You can export an Org-mode document to a
+LaTeX file with `C-c C-e l'. For more options, see the
+manual, and the commentary in the Lisp file. Kudos to
+Bastien for contributing this frequently requested feature.
+I am sure this has been tough because of the many different
+ways I have been allowing LaTeX snippets and environments to
+be incorporated in lazy free-format ways.
+
+</li>
+<li>
+Org-mode has now an extension mechanism for the hyperlink
+system. This should clear the road for all those mairix and
+other ideas that have been floating around. Now it is on
+<b>you</b> to write and share new link types for Org-mode. The
+interface for adding a new link type is described in the
+appendix of the manual, section A2. The unsolved problem is
+currently how to handle the new link types for
+export/publishing.
+
+</li>
+<li>
+New <b>global</b> commands `org-open-at-point-global' and
+`org-insert-link-global'. You can bind these commands to
+global keys and use them to insert and follow Org-mode-like
+links anywhere in Emacs. Thanks to Adam Spiers for this
+excellent idea.
+
+</li>
+<li>
+Each deadline timestamp may now specify its own interval of
+lead-time display, given in days, weeks, months or years.
+The syntax is like this
+
+<p>
+<pre>
+ DEADLINE: &lt;2007-08-13 Mon -5d&gt;
+</pre>
+</p>
+<p>
+When combined with a repeater, the repeater has to come
+first:
+</p>
+<p>
+<pre>
+ DEADLINE: &lt;2007-08-13 Mon +2w -5d&gt;
+</pre>
+</p>
+<p>
+You may now also customize the faces that are used in the
+agenda to indicate the distance of an approaching deadline.
+See the new option `org-agenda-deadline-faces'.
+</p>
+<p>
+Thanks to Pavel Chalmoviansky and John Wiegley proposals in
+this direction.
+</p>
+</li>
+<li>
+New option `org-agenda-repeating-timestamp-show-all'. When
+set to nil, repeating time stamps will only show up once in
+the agenda, either today or in the near future. Other
+matches will be ignored. Thanks to John Wiegley for this
+proposal.
+
+</li>
+<li>
+New variable `org-remember-store-without-prompt'. When set,
+exiting the remember buffer with C-c C-c will store the note
+without further prompts to the default location, and `C-u
+C-c C-c' will get the prompts for file and location. So
+this variable reverses the prefix-argument functionality for
+storing remember notes. This follows a request from John
+Wiegley.
+
+</li>
+<li>
+A new function `org-agenda-to-appt' activates all
+appointments for the current day so that Emacs will display
+reminders. This uses appt.el. Thanks to Bastien for this
+function.
+
+</li>
+<li>
+You can now set default values for properties that can be
+inherited by all entries in a buffer, or by all entries
+globally. Global properties are set in the variable
+`org-global-properties', like this:
+
+<p>
+(setq org-global-properties '(("NAME" "This is the value")))
+</p>
+<p>
+Buffer-local values are set like this:
+</p>
+<p>
+#+PROPERTY: NAME This is the value
+</p>
+<p>
+When using org-entry-get to get the value of a property with
+the `inherit' flag and the hierarchy above the entry does
+not contain this property, the buffer-local and global lists
+are checked as well. This is mostly useful (I think) to set
+the list of allowed values for a property. Thanks to Bernt
+Hansen and Bastien for these ideas.
+</p>
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.04</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+New variables `org-export-author-info' and
+`org-export-time-stamp-file' to turn off inclusion of author
+and time information into exported files. Thank to Patrick
+Drechsler for pointing out that this would be useful.
+
+</li>
+<li>
+New variable to avoid moving DEADLINE and SCHEDULED info
+into the property drawer. The default is now to not move
+this stuff into the drawer.
+`org-insert-labeled-timestamps-before-properties-drawer'
+
+</li>
+<li>
+`org-archive-mark-done' can be a string now, to select a
+specific keyword that should be used for archived entries.
+
+</li>
+<li>
+New command "j" in agenda to jump to an arbitrary date.
+Thanks to Bernt Hansen for the patch.
+
+</li>
+<li>
+Lots of minor fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.03</h2>
+
+
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+The variable `org-special-ctrl-a' has been renamed to
+`org-special-ctrl-a/e'. The old one is still an alias (but
+not on Emacs 21 where variable aliases cannot be defined).
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+When the variable `org-special-ctrl-a/e' is set, C-e in a
+headline first goes to the end of the headline ignoring the
+tags. A second C-e then goes to after the tags.
+
+</li>
+<li>
+Typing and removing single characters in a headline now
+keeps the tags in the headline aligned. This could have a
+little impact on performance while deleting stuff - let me
+know if we need to make this customizable.
+
+</li>
+<li>
+New option `org-n-level-faces' can be used to set the number
+of different faces that are used for headlines. Default is
+all 8 faces Org-mode defines for this purpose, level 9 uses
+again the level-1 face. However, you can use fewer, and then
+the level-1 face will be reused already for level N+1, etc.
+
+</li>
+<li>
+Column View and hidestars now work together.
+
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.02</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+The interfaces for properties and column view are finished
+now and work well.
+
+</li>
+<li>
+Properties can be summaries, i.e. the parent nodes can
+compute their value from the children's values.
+
+</li>
+<li>
+Headlines finally require a space ofter the star(s). The
+conflict with bold text at the beginning of the line is no
+longer there.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+Bad news. It looks like it is going to be really hard to
+make column view work on XEmacs and on Emacs 21. Emacs 22
+is currently the only Emacs where this works. If you are
+using Emacs 21 or XEmacs, you can still use properties, but
+not column view.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Improvements for properties:
+
+<ul>
+<li>
+There are interactive commands to insert and delete
+properties. Read the manual chapter 7 for details.
+
+</li>
+<li>
+You can define <i>allowed values</i> for a property. When
+these are defined, you can change the value of a property
+with S-left and S-right. And you may use completion when
+inserting the property. This goes a long way to prevent
+typos when entering properties.
+
+</li>
+</ul></li>
+<li>
+Improvements for column view.
+
+<ul>
+<li>
+In column view, you may use the keys S-left/right (and
+also the keys `n' and `p') to switch from one allowed
+value to the next.
+
+</li>
+<li>
+You can define summaries for columns. For example,
+parents can contain the sum of all children values of a
+property, or the parent node can have a check box property
+that is automatically checked when all children's boxes are
+checked.
+
+</li>
+<li>
+There are interactive commands to add and remove columns,
+and to change the attributes of a column like the summary
+type.
+
+</li>
+</ul>
+<p>These additions lead to the exciting fact that the example
+from <a href="http://www.omnigroup.com/images/applications/omnioutliner/features/multicolumn.jpg">omni outliner</a> posted by Scott Jaderholm can now be
+accurately <a href="omni-org.jpg">reproduced by Org-mode</a>.
+</p>
+</li>
+<li>
+The space after the stars is now required in a headline, in
+order to remove the conflict with bold words at the
+beginning of a line. So
+
+<p>
+<pre>
+ * This is a level 1 headline
+ *this is bold text*
+</pre>
+</p>
+</li>
+<li>
+S-up and S-down to navigate plain item lists are now also
+available in orgstruct-mode.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 5.01</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+A new minor mode, orgstruct-mode, exports the Org-mode
+structure editing commands into any other mode.
+
+</li>
+<li>
+DRAWERS are a new level off folding for special sections
+that should stay closed during visibility cycling and only
+open if explicitly asked.
+
+</li>
+<li>
+Entries can now have PROPERTIES.
+
+</li>
+<li>
+A COLUMN VIEW implementation allows to easily view and edit
+the properties of a hierarchy of entries (Emacs only, for
+now).
+
+</li>
+<li>
+Formula evaluation in the spreadsheet is more consistent
+now. Properties and per-file constants can be used during
+evaluation.
+
+</li>
+<li>
+Bug fixes and minor changes.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+When using LEVEL=N in a tags search, things have changed if
+you are also using `org-odd-levels-only'. If you are using
+only odd levels (i.e. 1 or 3 or 5&hellip; stars), LEVEL=2 will
+now refer to 3 stars, LEVEL=3 to 5 stars etc. Many thanks
+to Leo (or blame on him if you must) who has convinced me
+that this is the better convention.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+
+<div class="outline-4">
+<h4>Orgstruct minor mode</h4>
+
+
+<p>
+There is a new minor mode, orgstruct-mode. This modes works
+in a similar way as Orgtbl-mode. It can be used to export
+the Org-mode structure-editing commands into arbitrary major
+modes in Emacs. For example, you can use it in Mail-mode to
+easily create lists.
+</p>
+<p>
+The functionality in Orgstruct mode is only active, if the
+cursor is in a line that looks either like a headline, or
+like the first line of a plain list item. Then the commands
+`TAB', `M-cursor', `M-S-cursor', `M-RET', `M-S-RET', `C-c ^',
+`C-c C-c', and `C-c -' will do structure-related editing just
+like in Org-mode. If the cursor is not in such a line, all
+these keys will do whatever the major mode or other active
+minor modes have assigned to them.
+</p>
+<p>
+Orgstruct-mode is the result of a proposal by Raman, quite
+some time ago. It has taken a long time, but here is finally
+the promised implementation.
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Drawers</h4>
+
+
+<p>
+The new concept of <i>drawers</i> allows to create sections
+that remain folded during visibility cycling. Drawers need
+to be configured using the variable `org-drawers'. A drawer
+starts with a line containing only the name of the drawer
+bracketed by colons. It ends with :END:. For example,
+after setting
+</p>
+<p>
+<pre>
+ (setq org-drawers '("PROPERTIES" "HIDDEN"))
+</pre>
+</p>
+<p>
+you can then create drawers like this:
+</p>
+<p>
+<pre>
+ :HIDDEN:
+ here is some stuff that remains hidden
+ unless TAB is pressed directly in that line
+ :END:
+</pre>
+</p>
+<p>
+The PROPERTIES drawer has special meaning for ORG-mode, it
+contains properties of an entry (see below).
+</p>
+</div>
+
+<div class="outline-4">
+<h4>Properties and Column View</h4>
+
+
+<ul>
+<li>
+Entries in Org-mode can now have arbitrary <i>properties</i>
+associated with them. Org-mode handles some default
+properties like the TODO state, the priority, the local
+tags, and planning information like DEADLINE and SCHEDULED.
+In addition, you can assign arbitrary properties by creating
+a property drawer and inserting a line like
+
+<p>
+<pre>
+ :PROPNAME: This is the value of the property
+</pre>
+</p>
+<p>
+Org-mode has an API for properties, if you want to write a
+program using properties, use the functions
+`org-entry-properties', `org-entry-get', `org-entry-put',
+and `org-entry-delete'.
+</p>
+</li>
+<li>
+Planning information like DEADLINE can be hidden in the
+properties drawer.
+
+<p>
+If the PROPERTIES drawer starts in the first line after a
+headline, also the DEADLINE, SCHEDULED and CLOCK information
+will be inserted inside the drawer. If no PROPERTIES drawer
+is present, or if it does not start in the line right after
+the headline, this information remains in the lines directly
+after the headline, outside the drawer.
+</p>
+</li>
+<li>
+TAGS searches can now also query properties. For example,
+the search
+
+<p>
+<pre>
+ LEVEL=3+BOSS+ASSIGNED="Hans"/WAITING
+</pre>
+</p>
+<p>
+will find entries that
+</p><ul>
+<li>
+are level 3
+</li>
+<li>
+have the tag BOSS
+</li>
+<li>
+have an ASSIGNED property with the value "Hans"
+</li>
+<li>
+are TODO status WAITING.
+
+<p>
+So here is an entry that will match:
+</p>
+<p>
+<pre>
+ *** WAITING Clean up the factory :BOSS:
+ :PROPERTIES:
+ :ASSIGNED: Hans
+ :END:
+</pre>
+</p>
+<p>
+You may also use a regular expression to match against a
+property value. For example, to find stuff assigned to Hans
+or Sarah, use
+</p>
+<p>
+<pre>
+ ASSIGNED={^\(Hans\|Sarah\)$}
+</pre>
+</p>
+</li>
+</ul></li>
+<li>
+Column View is a special way to look at property values in
+tabular form. Column View can be used in any org-mode
+file, and also in any agenda buffer. It works by placing
+an overlay over each headline (or agenda line) that shows a
+table of selected properties. You can look at and edit
+properties from this view. Which properties are shown in
+the table must be set up using the COLUMNS property. You
+can set up different property columns on different levels
+of an outline tree. For example:
+
+<p>
+<pre>
+ * People
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name
+ :END:
+ ** Family
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name %3Age
+ :END:
+ *** Sam
+ Info about Sam, including a property list with Name and Age.
+ *** Sarah
+ Info about Sarah, including a property list with Name and Age.
+ ** Office
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name %Function %Salary
+ :END:
+ *** Boss
+ Info about the Boss, including a property list with Name,
+ Function and Salary (if only we knew....).
+</pre>
+</p>
+<p>
+Now we have defined three different sets of columns. If
+you switch to column view in the <i>Family</i> section, you
+will get a different table than if you do it in the
+<i>Office</i> section. However, if you switch to column
+view with the cursor on the <i>People</i> section, the
+table will cover all entries, but contain only the
+<i>Name</i>.
+</p>
+<p>
+Column view does, for the time being, only work on Emacs.
+The XEmacs implementation needs a bit of work.
+</p>
+</li>
+<li>
+Properties can be used in table formulas. To access the
+value of the property :XYZ:, use $PROP_XYZ. The property
+needs to be defined in the hierarchy above the table, not
+necessarily in the same entry as the table. This was a
+request by Eddward. File-wide constants can be defined with
+#+CONSTANTS, see below.
+
+</li>
+<li>
+Things that still need to be sorted out about drawers,
+properties and column view - comments and suggestions
+welcome!
+
+<ul>
+<li>
+How to deal with drawers and properties in HTML and ASCII
+export?
+</li>
+<li>
+What key could be used to insert an empty property drawer
+into an entry?
+</li>
+<li>
+Right now column view is invoked through the command C-c
+C-x C-c. It is too easy to type C-x C-c by mistake, and
+that causes Emacs to quit. Suggestions for a different
+key?
+</li>
+<li>
+Fontification of drawers and properties is not good yet.
+Any suggestions for better defaults?
+</li>
+<li>
+Mouse support for editing properties in column view would
+be nice - maybe Piotr is interested to add this to
+org-mouse.el?
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Spreadsheet</h4>
+
+
+<ul>
+<li>
+In the spreadsheet, the evaluation of formulas has changed.
+Previously, first the column formulas would be evaluated
+everywhere, and then the field formulas would kick in, and
+in some cases overwrite the results of column formulas in
+the appropriate fields. This had the side effect that some
+formulas might always use the wrong, intermediate content of
+a field that is computed both by a column and a field
+formula.
+
+<p>
+From now on, column formulas will no longer temporarily
+overwrite field formulas. This gives much more consistent
+results. For example you can now finally have a column of
+increasing numbers by setting the first field to a fixed
+number, and let the rest follow from a column formula.
+</p>
+<p>
+Here is an example
+</p>
+<p>
+<pre>
+ | 1 |
+ | 2 |
+ | 3 |
+ #+TBLFM: $1=@-1+1::@1$1=1
+</pre>
+</p>
+</li>
+<li>
+Constants for formulas in spreadsheets are globally defined
+with the variable `org-table-formula-constants'. File-local
+constants can now be set with a line like:
+
+<p>
+<pre>
+ #+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6
+</pre>
+</p>
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4>Minor changes</h4>
+
+
+<ul>
+<li>
+When entries are archived, a timestamp for the moment of
+archiving is added to the line with planning information.
+It looks like this:
+
+<p>
+<pre>
+ ARCHIVED: [2007-07-02 Mon 11:34]
+</pre>
+</p>
+<p>
+Thanks to J. David Boyd for constructive comments.
+</p>
+</li>
+<li>
+Bug fixes
+
+<p>
+Many bugs are fixed, as usually all the ones where I replied
+"fixed" on emacs-orgmode. If you reported one of these
+bugs, please check if it really has disappeared in the new
+version, and complain if not. Thanks!
+</p>
+
+</li>
+</ul></div>
+</div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.79</h2>
+
+
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+We are back to a single file org.el that works both on Emacs
+and on XEmacs. Merging comes at a speed penalty for you as
+an XEmacs user, but <b>only if you do not compile</b> org.el.
+Compilation completely removes the penalty.
+
+</li>
+<li>
+New L flag for literal interpolation in Lisp formulas.
+See manual section 3.5.3.
+
+</li>
+<li>
+New options for turning off footnotes.
+This was a request from Ignotus.
+See the option `org-export-with-footnotes'.
+
+</li>
+<li>
+Default length for Agenda entries, but this is off by
+default. This was a request from Micheal.
+See the option `org-agenda-default-appointment-duration'.
+
+</li>
+<li>
+Bug fixes:
+
+<ul>
+<li>
+org-agenda-date-later (Juraj Kubelka)
+</li>
+<li>
+letters off margin in orgcard.ps (Charles Cave)
+</li>
+<li>
+TODO export problems on XEmacs (ignotus@freemail.hu)
+</li>
+<li>
+args-out-of-range with table formulas (Cecil Westerhof)
+</li>
+<li>
+problem with org-file without a heading (Tim O'Callaghan)
+
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.78</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Time stamps with a time range <b>included</b>, like
+<pre>
+ &lt;2007-06-18 Mon 17:33-18:23&gt;
+</pre>
+
+</li>
+<li>
+Clock times without clocking in/out: CLOCK: =&gt; 2:00
+
+</li>
+<li>
+Language-specific characters allowed in TAGS (Emacs only).
+
+</li>
+<li>
+Promotion and demotion of items gets the indentation right.
+
+</li>
+<li>
+Indenting lines with TAB is more intelligent.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+There is now a special version of `org.el' for XEmacs.
+Before installation, as an XEmacs user you must rename the
+file org_xemacs.el to org.el, i.e. you must overwrite org.el
+with the xemacs version. For example:
+
+<p>
+<pre>
+ mv org_xemacs.el org.el
+</pre>
+</p>
+<p>
+This is necessary so that I can make use of some features
+that would be cumbersome to support in a single file. The
+XEmacs version is derived from the Emacs version with a
+program, so no reason to fear that I might be dropping
+XEmacs support any time soon. Sorry for the trouble.
+</p>
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+A time stamp may now contain a range of times. So you no
+longer need to use two separate stamps to indicate a time
+interval on a single day. For example
+
+<p>
+<pre>
+ &lt;2007-06-18 Mon 17:30-18:20&gt;
+</pre>
+</p>
+<p>
+This is now fully supported, including changing the time
+with S-up/down while the cursor is on the end time. Also,
+da the date/time prompt, you can simply write your time like
+12:00-14:00 and the range will be inserted.
+</p>
+<p>
+This was proposed by Leo some time ago, and recently by
+Michael.
+</p>
+</li>
+<li>
+You may specify clocking times by hand (i.e. without
+clocking in and out) using this syntax.
+
+<p>
+<pre>
+ CLOCK: =&gt; 2:00
+</pre>
+</p>
+<p>
+Thanks to Scott Jaderholm for this proposal.
+</p>
+</li>
+<li>
+TAGS may now contain language-specific word characters, as
+long as they are matched by the "[:alnum:]" regexp syntax.
+This is for Emacs only, the XEmacs version continues to use
+the character class "a-zA-Z0-9_@" for tag names. Thanks to
+David Smith for a patch to this effect (a modified version
+of that patch was applied). I am considering to make the
+same change for TODO keywords, but not yet. Note that files
+using localization features may not work correctly in the
+Emacs configuration of another user, so if you are sharing
+org-mode files with other users, it might still be best to
+stick to the ASCII characters.
+
+</li>
+<li>
+Promotion and demotion of plain list items (commands M-left,
+M-right) no longer changes the indentation by just one
+space. Instead, it uses intelligence gathered from the
+surrounding list structure to do the right thing. Thanks to
+William Henney for starting the discussion about this.
+
+</li>
+<li>
+TAB does now a better job of indenting lines.
+
+<ul>
+<li>
+After tables and code segments (lines starting with ":"),
+indentation goes back to what it was before (thanks to
+William Henney for suggesting this behavior).
+
+</li>
+<li>
+When plain lists items are involved, we had a long
+discussion on emacs-orgmode where I tried to show that a
+too-sophisticated implementation will still be easily
+fooled. Here is what I have implemented now - lets see
+if we can agree on this:
+
+<p>
+Indentation will flatten lists with the same bullet type,
+but indent another bullet type further. The time when
+this fails is in a nested list, when you want to get back
+out to a previous level. For example
+</p>
+<p>
+<pre>
+ - item 1
+ - item 2
+ + item 2a
+ + item 2b
+ - item 3
+</pre>
+</p>
+<p>
+When using TAB on every line in this list, the structure
+will change to
+</p>
+<p>
+<pre>
+ - item 1
+ - item 2
+ + item 2a
+ + item 2b
+ - item 3
+</pre>
+</p>
+<p>
+So you need to change the level of the last line by hand,
+using promotion and demotion functions.
+</p>
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.77</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Vertical lines in exported tables.
+</li>
+<li>
+New default for `org-show-following-heading'.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+The default for `org-show-following-heading' is now nil.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+You can now specify column groups in tables, to the effect
+that the groups will be separated by vertical lines in HTML
+and ASCII output. Column groups are specified by the
+characters "&lt;" and "&gt;" in a special table row. "&lt;" starts a
+group, "&gt;" ends a group (in each case including the the
+column where the character is specified). You may also use
+"&lt;&gt;" to make a group a single column wide. For example:
+
+<p>
+<pre>
+ | | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N) |
+ |---+----+-----+-----+-----+---------+------------|
+ | / | &lt;&gt; | &lt; | | &gt; | &lt; | &gt; |
+ | # | 1 | 1 | 1 | 1 | 1 | 1 |
+ | # | 2 | 4 | 8 | 16 | 1.4142 | 1.1892 |
+ | # | 3 | 9 | 27 | 81 | 1.7321 | 1.3161 |
+ #+TBLFM: $3=$2^2::$4=$2^3::$5=$2^4::$6=sqrt($2)::$7=sqrt(sqrt(($2))
+</pre>
+</p>
+<p>
+A table row with with nothing but "/" in the first field is
+never exported, but can be used to place column group
+information into the table. In this table, we create a
+group for column 2, one for columns 3-5 and one for columns
+6-7. HTML export will render a vertical line between these
+groups.
+</p>
+<p>
+Because HTML does not require closing &lt;colgroup&gt; tags with
+&lt;/colgroup&gt;), you can also simply start a new column
+wherever you want a vertical line:
+</p>
+<p>
+<pre>
+ | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N0 |
+ |---+-----+-----+-----+---------+------------|
+ | / | &lt; | &lt; | | &lt; | |
+</pre>
+</p>
+</li>
+<li>
+Vertical lines are now also omitted in ASCII export, unless
+grouping explicitly requests these lines.
+
+</li>
+<li>
+The default for `org-show-following-heading' is now nil,
+meaning that sparse trees will be more compact. This has
+become possible due to in important remark by Jason Dunsmore
+who pointed out that TAB should behave differently in the
+inconsistent trees produced by the sparse tree commands.
+TAB does now make sure that the heading after a freshly
+unfolded tree is made visible at all, removing the confusing
+behavior we had before.
+
+</li>
+<li>
+Several bugs fixed. In particular:
+
+<ul>
+<li>
+Strings produced by agenda batch processing with
+`org-batch-agenda' and `org-batch-agenda-csv' are now
+properly encoded, so that you should be able to use
+special characters in other languages as along as your
+post-processing program handles them correctly. At least
+for Emacs this should work now, but have not yet figured
+out how to do this in XEmacs.
+
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.76</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Exporting Footnotes to HTML
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Footnotes like<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup> are now exported to HTML
+
+<p class="footnote"><sup><a class="footnum" name="fn.1" href="#fnr.1">1</a></sup>This is a footnote
+
+<p>
+Thanks to Scott Jaderholm for this proposal and a detailed
+HTML example on how the exported text should look like.
+</p>
+</li>
+<li>
+Special version of the reference card, for letter paper.
+
+</li>
+<li>
+Switching to OVERVIEW with S-TAB no loner moves the cursor,
+so after three `S-TAB' commands, you will be back where you
+started.
+
+</li>
+<li>
+Bug fixes, lots of them again.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.75</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Cyclic time stamps that repeat after an interval.
+</li>
+<li>
+Special timestamps for appointments like "every 2nd Thursday
+in a month".
+</li>
+<li>
+Completion of link abbreviation prefixes inside `C-c C-l'.
+</li>
+<li>
+Replacing a region of org-mode syntax with HTML.
+</li>
+<li>
+iCalendar export now honors ARCHIVE etc.
+</li>
+<li>
+New command to add/change emphasis markers.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+The REPEAT(&hellip;) cookie is no longer supported, the repeater
+interval now goes directly into the time stamp.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Time stamps can contain a repeater code, like +1w for once
+every week, +2d for every two days, etc. For example,
+
+</li>
+</ul>
+<p><span class="timestamp">2007-05-16 Wed 12:30 +1w</span><br/>
+</p>
+<p>
+will apply to every Wednesday, starting from the date given.
+I believe this syntax was actually suggested by someone on
+the mailing list, but I cannot find the email back. To
+collect your credit, let me know!
+</p>
+<ul>
+<li>
+You can use an sexp diary entry (with the syntax used by the
+Emacs calendar/diary) in a time stamp, like this:
+
+<p>
+*** The nerd club meets on 2nd Thursday of every month
+</p></li>
+</ul>
+<p><span class="timestamp">%%(diary-float t 4 2)</span><br/>
+</p>
+<ul>
+<li>
+You can put diary-style sexp entries directly into an
+org-mode file, where they will be interpreted just like they
+would in the diary. For example
+
+<ul>
+<li>
+Birthdays and similar stuff
+</li>
+</ul>
+<p>#+CATEGORY: Holiday
+%%(org-calendar-holiday) ; special function for holiday names
+#+CATEGORY: Ann
+%%(diary-anniversary 14 5 1956) Artur Dent %d is years old
+%%(diary-anniversary 2 10 1869) Mahatma Gandhi
+</p>
+<p>
+These entries must start at column 0 to be evaluated.
+</p>
+<p>
+It turns out that evaluating the entries in an org-mode file
+is actually faster than in the diary itself, because using
+the diary has some overhead (creating fancy diary display,
+then reading and re-interpreting the entries). I have moved
+all the sexp entries from my diary into an org-mode file,
+put in a few categories, and then turned off
+`org-agenda-include-diary'. This has led to a noticeably
+faster agenda display.
+</p>
+</li>
+<li>
+New command `org-replace-region-by-html' that converts the
+current region from org-mode syntax into HTML. For example,
+you might write an itemized list in plain text in an HTML
+buffer, and then invoke this command to convert it. Thanks
+to Raman for this idea.
+
+</li>
+<li>
+When inserting a link with `C-c C-l', completion will now
+fill in all valid link prefixes, like http or ftp, but also
+link abbreviation prefixes. This is based on an idea by
+Bastien.
+
+</li>
+<li>
+Highest, lowest, and default priority can be set on a
+per-file basis with #+PRIORITIES: H L D
+For example, to use priorities from 1 to 9, you could use
+
+<p>
+#+PRIORITIES: 1 9 9
+</p>
+<p>
+Thanks to Dmitri Minaev for a patch to this effect.
+</p>
+</li>
+<li>
+iCalendar export now honors (i.e. skips) subtrees marked as
+ARCHIVE, COMMENT, or QUOTE.
+
+</li>
+<li>
+There is a new command to add or change the emphasis (like
+bold or italic) of a piece of text. For lack of better
+available keys the command is at `C-c C-x C-f', but you may
+well want to choose a more convenient key like `C-c f' in
+your private setup:
+
+<p>
+(add-hook 'org-load-hook
+(lambda () (define-key org-mode-map "\C-cf" 'org-emphasize)))
+</p>
+<p>
+The command will prompt for an emphasis type, and you may
+reply either with the marker that triggers the emphasis, or
+with the first letter of the corresponding HTML tag. For
+example, to select italic, press either "/" or "i".
+</p>
+<p>
+If there is an active region, the emphasis of this region
+will be set or changed. If there is no region, only the
+emphasis markers will be inserted and the cursor positioned
+between them. Thanks to Bastien for proposing this feature.
+</p>
+</li>
+<li>
+Bug fixes, everything where I have replied "fixed" on the
+mailing list. Thanks to all of you for keeping these reports
+coming.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.74</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<p>
+This release is about exporting agenda views, to HTML, to
+postscript for printing, and to a special format (CSV) for
+further processing in scripts.
+</p>
+</div>
+
+<div class="outline-3">
+<h3>Incompatible Changes</h3>
+
+
+<ul>
+<li>
+The variable `org-agenda-remove-tags-when-in-prefix' has
+been renamed to `org-agenda-remove-tags'.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Agenda views can be exported as plain text, as HTML, and as
+Postscript(R). This can simply be done from the agenda
+buffer with `C-x C-w' and then specifying a filename like
+`myagenda.html' or `myagenda.ps'. See section 8.6.4 of the
+manual.
+
+</li>
+<li>
+Each custom agenda view can specify a list of associated
+files names. The command `C-c a e' then creates all views
+that have associated file names and exports the views to
+these files. This is great for producing paper versions of
+your views, to take with you when you don't have your
+computer. The manual has an example on how to do this, and
+in particular on how to customize the format of the printed
+version. See section 8.6.4 of the manual.
+
+</li>
+<li>
+You can produce a CSV format of agenda information with an
+Emacs batch command. This is greate for further processing
+in scipts. Thanks to Jason F. McBrayer for this idea.
+See section 8.6.5 of the manual.
+
+</li>
+<li>
+New variable `org-agenda-skip-deadline-if-done'. When set,
+a deadline associated with a DONE item will not be shown in
+the agenda. This is based upon a report by Denis Bueno.
+
+</li>
+<li>
+Quite a few bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.73</h2>
+
+
+<p>
+Minor bug fixes.
+</p>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.72</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Control over blank lines between trees in collapsed view.
+
+</li>
+<li>
+Info about the running clock is shown in the modeline.
+
+</li>
+<li>
+C-a can behave specially in headlines.
+
+</li>
+<li>
+Better color and scaling defaults for LaTeX fragments.
+
+</li>
+<li>
+Customizable list of keys in org-mode to be replaced.
+
+</li>
+<li>
+Stuck project descriptions have been extended.
+
+</li>
+<li>
+Emphasis code has been modified to fix some issues.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+The option `org-format-latex-options' has changed. If you
+have customized it, please revert to default and then redo
+your customization.
+
+</li>
+<li>
+`org-CUA-compatible' no longer modifies S-RET by default,
+because newer versions of CUA don't use this key anymore.
+If you need this replacement, customize the variable
+`org-disputed-keys'.
+
+</li>
+<li>
+The variable `org-CUA-compatible' is obsolete, please use
+`org-replace-disputed-keys' instead. `org-CUA-compatible'
+is still an alias for this new variable, though.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Better control over blank lines between trees in collapsed
+view. This has come up several times in the past and most
+recently by Scott Jaderholm. There is now a new variable
+`org-cycle-separator-lines' with default value 2. It says
+how many empty lines there need to be after the end of a
+subtree to get an empty line in collapsed view. So with the
+default, if you leave only one empty line it will disappear
+in collapsed view. If you leave two, one empty line will
+remain so that you can use double empty lines to structure
+the collapsed views of a file. I love it, so many thanks to
+Scott fro bringing this up again.
+
+<p>
+One property of the new setup is that you will never get
+more than one blank line in collapsed view. We could do
+something special to allow <b>several</b> empty lines in
+collapsed view, but I think this is counter-productive.
+</p>
+<p>
+In Emacs 22, if you want to make full use of this, make sure
+that you have not set `outline-blank-line'.
+</p>
+</li>
+<li>
+When the clock is running, Org-mode will put info about it
+into the modeline. The info consists of the elapsed time
+and the heading of the clocked item. This was a proposal
+from Bastien who got the idea from Muse.
+
+</li>
+<li>
+C-a can behave specially in headlines when you set the
+variable `org-special-ctrl-a'. It will bring the cursor
+first back only to the beginning of the headline <b>text</b>,
+i.e. after the stars and the TODO keyword, if any. A second
+C-a will then move the cursor to the beginning of the line.
+If the cursor is already at the beginning of the line, C-a
+will spring <b>forward</b> to the headline text. This was a
+proposal from Leo, based on a request from Scott Jaderholm.
+
+<p>
+I have not turned this turned this on by default, should I?
+</p>
+</li>
+<li>
+When LaTeX fragments are processed into images, there is now
+more control and (hopefully) betters defaults for colors and
+scaling. Special values can be set for HTML export, so that
+these values can differ from what is used for display in an
+emacs buffer. The default foreground and background colors
+for images embedded in emacs are now taken from the default
+emacs face. Thanks to Xiao-Yong Jin for proposing these
+changes.
+
+</li>
+<li>
+There is now a much better mechanism to change some keys in
+org-mode if these keys clash with other modes you use. Turn
+this on by setting `org-replace-disputed-keys' (aliased to
+`org-CUA-compatible'). The list of keys to replace is now
+fully customizable, see the option `org-disputed-keys'.
+Many thanks to Meciej Katafiasz for a patch implementing
+this.
+
+</li>
+<li>
+Stuck project descriptions have been extended. You can now
+use "*" as a TODO keyword or tag to say that <b>any</b> TODO
+keyword or TAG marks a project as non-stuck. You also can
+give an arbitrary regular expression that, if it matches,
+indicates a non-stuck project.
+
+</li>
+<li>
+The code for emphasis like bold, italic etc has been
+modified - I might have broken something in the process,
+please let me know if you find problems.
+
+</li>
+<li>
+A number of bugs have been fixed - those where I have
+replied "Fixed" on the mailing list.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.71</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+</div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+New variables to customize the header and data tags in
+exported HTML. These are the variables
+`org-export-table-header-tags' and
+`org-export-table-data-tags'. This follows a request from
+Scott Otterson.
+
+</li>
+<li>
+New option `org-format-latex-header' for customizing the
+header of the LaTeX file used to convert embedded LaTeX to
+images. Thanks to `Matthieu Lemerre' for the suggestion.
+
+</li>
+<li>
+The prefix version of `org-todo-list' works again. This
+means that `C-1 C-c a t' produces the list of TODO entries
+for the first TODO keyword. If you use different TODO setups
+in different agenda files, be careful: This number now
+refers to the list of <b>all</b> todo keywords used in files
+that are scanned for the agenda.
+
+</li>
+<li>
+Many bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.70</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Dust settles after revamp of TODO keyword system.
+</li>
+<li>
+The export title can be taken from the first text line.
+</li>
+<li>
+TTY replacement keys have changed.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+Some TTY replacement keys are changed, see below.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+Further development concerning TODO keywords.
+
+<ul>
+<li>
+You can now have several DONE states in a sequence, like
+
+<p>
+#+SEQ_TODO: TODO VERIFY | DONE DELEGATED
+</p>
+<p>
+The difference to the proposal discussed on the mailing
+list (and which is also works!)
+</p>
+<p>
+#+SEQ_TODO: TODO VERIFY | DONE
+#+SEQ_TODO: | CANCELED
+</p>
+<p>
+is that in the first case, the extra DONE states will be
+reached with `C-c C-t' (or with `t' from the agenda), while
+in the second case you need S-&lt;right&gt; to get to the special
+states. I guess both ideas can be useful - I am leaning
+toward using the latter.
+</p>
+</li>
+<li>
+Setting up TODO keywords in Lisp previously used two
+separate variables: `org-todo-keywords' and
+`org-todo-interpretation'. The preferred way is now to use
+only `org-todo-keywords', with a new structure:
+
+<p>
+(setq org-todo-keywords
+'((sequence "TODO" "|" "DONE")
+(sequence "BUG" "KNOWNCAUSE" "|" "FIXED" "IGNORED")
+(type "Fred" "Lisa" "Peter" "|" "DONE")
+(sequence "CANCELED") ; for things we decide to not do.
+))
+</p>
+<p>
+If your setting has this new structure,
+`org-todo-interpretation' will be ignored. This change
+does not break backward compatibility. The old way of
+using a flat list in `org-todo-keywords' and taking the
+interpretation from the other variable still works.
+</p>
+</li>
+<li>
+When listing <b>specific</b> TODO entries via a sparse tree
+(`C-u C-c C-v') or via the agenda (`C-c a T' or `C-u C-c a
+t'), you can now specify several keywords to be selected,
+like "TODO|VERIFY|WAITING". This also works for custom
+agenda commands. Thanks to Jason F. McBrayer for pointing
+out this omission.
+
+</li>
+</ul></li>
+<li>
+If you have configured Org-mode to export also the text
+before the first headline (this is done by setting the
+variable `org-export-skip-text-before-1st-heading' to nil),
+then the first normal text line in the buffer becomes the
+title of the exported document. A title set with #+TITLE
+overules this default, and the first line then belongs to the
+normal text. Thanks to David House for this proposal.
+
+</li>
+<li>
+TTY replacement keys. Some of the key bindings used by
+Org-mode do not work on a tty, so replacement key sequences
+are provided on ttys. In version 4.70, there are some
+changes in the tty replacements. Thanks to Jason F. McBrayer
+for coming up with the idea to use C-c &lt;cursor&gt; keys.
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="left"></col><col align="left"></col><col align="left"></col>
+<thead>
+<tr><th>Command</th><th></th><th>Old TTY</th><th>New TTY</th></tr>
+<tr><th>org-&hellip;..</th><th>Main Key</th><th>Replacement</th><th>Replacement</th></tr>
+</thead>
+<tbody>
+<tr><td>shiftleft</td><td>S-left</td><td>C-c C-x left</td><td>C-c left</td></tr>
+<tr><td>shiftright</td><td>S-right</td><td>C-c C-x right</td><td>C-c right</td></tr>
+<tr><td>shiftup</td><td>S-up</td><td>C-c C-x up</td><td>C-c up</td></tr>
+<tr><td>shiftdown</td><td>S-down</td><td>C-c C-x down</td><td>C-c down</td></tr>
+<tr><td>shiftcontrolleft</td><td>C-S-left</td><td></td><td>C-c C-x left</td></tr>
+<tr><td>shiftcontrolright</td><td>C-s-right</td><td></td><td>C-c C-x right</td></tr>
+</tbody>
+</table>
+
+
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.69</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<p>
+This time the changes affect the following areas:
+</p>
+<ul>
+<li>
+TODO keywords: Multiple sequences in a single file.
+</li>
+<li>
+Export: More control over text before the first heading.
+</li>
+<li>
+Export: More control over sub/superscript interpretation.
+</li>
+<li>
+Plain lists: Option to let empty lines terminate lists.
+</li>
+<li>
+Tables: New command to insert hline and move into line below.
+</li>
+<li>
+REPEATing items: Turn of note taking.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Incompatible changes</h3>
+
+
+<ul>
+<li>
+It used to be possible to spread the list of TODO keywords
+over several lines, like
+
+<p>
+#+SEQ_TODO: TODO
+#+SEQ_TODO: PROGRESS
+#+SEQ_TODO: DONE
+</p>
+<p>
+This is no longer possible. Each such line now specifies an
+independent set of TODO keywords, with its own DONE state.
+See below for details.
+</p>
+</li>
+<li>
+The #+TEXT construct has been used to insert unchanged HTML
+into an exported file. This is no longer possible, the TEXT
+lines will be processed like any other lines. However,
+there are now much better ways of getting quoted HTML into
+the exported file.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+
+<ul>
+<li>
+You can now use multiple sets of TODO keywords in the same
+buffer. For example, you may put the following three lines
+into a file:
+
+<p>
+#+SEQ_TODO: TODO DONE
+#+SEQ_TODO: REPORT BUG KNOWNCAUSE RESOLVED
+#+TYP_TODO: Fred Laura Peter Me OK
+</p>
+<p>
+Each sub-sequence has its own DONE state. It is best to use
+different keywords in all sequences, to make sure Org-mode
+does not loose track in which specific sequence it is
+working. You could use the same word for all DONE states,
+but then cycling through to a TODO state might not bring you
+where you want to be.
+</p>
+<p>
+After initially setting a keyword, `C-c C-t' cycles through
+a sublist, i.e. is cycles from TODO to DONE or from
+KNOWNCAUSE to RESOLVED and further to (nothing) and back to
+REPORT.
+</p>
+<p>
+S-right and S-left allow to select any keyword, so they move
+from DONE to REPORT and from RESOLVED to Fred.
+</p>
+<p>
+C-S-right and C-S-left jump from one sub-sequence to the
+next, for example from TODO or DONE to REPORT to Fred.
+</p>
+<p>
+Thanks to Rick Moynihan for triggering this development.
+</p>
+</li>
+<li>
+Text before the first headline can now be exported if you
+configure Org-mode accordingly. Either set the variable
+`org-export-skip-text-before-1st-heading' to nil, or use the
+new in-buffer option
+
+<p>
+#+OPTION: skip:nil
+</p>
+</li>
+<li>
+Export content specified via the #+TEXT construct is now
+fully processed, i.e. links, emphasis etc. are all
+interpreted. #+TEXT lines may include
+#+BEGIN_HTML&hellip;#+END_HTML sections to embed literal HTML.
+
+</li>
+<li>
+During HTML export, you can request to have a<sub>b</sub>
+interpreted as a subscript, but to leave a_b as it is. This
+can be done by setting the variable
+org-export-sub-superscript to the symbol `{}' with
+
+<p>
+(setq org-export-sub-superscript '{})
+</p>
+<p>
+or by using
+</p>
+<p>
+#+OPTIONS: ^:{}
+</p>
+<p>
+Thanks to Eddward DeVilla for this idea.
+</p>
+</li>
+<li>
+New variable `org-empty-line-terminates-plain-lists'.
+Default is nil, meaning that empty lines are part of the
+previous list item, and that you can have several paragraphs
+in one such item. Set this to t if you want an empty line
+terminate all levels of plain list items.
+
+<p>
+Thanks to Mike Newman for triggering this development.
+</p>
+</li>
+<li>
+C-c RET does insert a horizontal separator line and move the
+cursor into the table line below it. Thanks to Bastien for
+this proposal.
+
+</li>
+<li>
+Org-mode always offers you to record a note when a TODO item
+automatically repeats, even if you are not logging state
+changes. The new variable `org-log-repeat' allows to turn
+this off, so that notes are really only been taken if you
+are logging all state changes.
+
+</li>
+<li>
+Various Bug fixes, thanks to everyone who reported.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.68</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+<ul>
+<li>
+Priority handling in the tags view
+</li>
+<li>
+Date/time prompt follows the popup calender, and accepts AM/PM times.
+</li>
+<li>
+Standard references like B4 in the spreadsheet.
+</li>
+<li>
+Improvements to the formula editor.
+</li>
+<li>
+C-j does better indentation.
+</li>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Details</h3>
+
+<ul>
+<li>
+Priority handling in the tags view
+
+<ul>
+<li>
+Agenda lists selected by tag are now sorted by priority.
+Thanks to Andrew Korty for reporting this omission.
+
+</li>
+</ul></li>
+<li>
+Improvements to the date/time prompt.
+
+<ul>
+<li>
+When you move (using S-cursor keys) the cursor in the pop-up
+calendar window while responding to a date/time prompt, the
+prompt is updated with the new default date (Emacs only).
+
+</li>
+<li>
+You can now enter AM/PM times at this prompt.
+
+</li>
+</ul></li>
+<li>
+Changes in the spreadsheet
+
+<ul>
+<li>
+You can now also write B4 instead of @4$2 as a reference in
+formulas. The column references without specified row can be
+written as C&amp; instead of $3. Such references make formulas
+easier to read and are now the default way how references are
+shown when you edit existing formulas. To get the old behavior
+back (i.e. only @row$col references), set the variable
+`org-table-use-standard-references' to nil.
+
+<p>
+Relative references like @-3$-2 or @II..III continue to use the
+internal format.
+</p>
+</li>
+</ul></li>
+<li>
+Changes in the formula editor (the one you get with "C-c '")
+
+<ul>
+<li>
+The formulas are organized in a more logical way.
+
+</li>
+<li>
+There is now a menu with commands.
+
+</li>
+<li>
+When starting the formula editor with "C-c '", the cursor
+immediately moves to the formula for the current field.
+
+</li>
+<li>
+With the cursor on a reference in the formula, you can use
+S-cursor keys to change the field being referenced.
+
+</li>
+</ul></li>
+<li>
+C-j indents the following line correctly whe used in a headline
+or in aplain list item. Thanks to Leo for this suggestion.
+
+</li>
+<li>
+Bug fixes
+
+<ul>
+<li>
+Flyspell now knows about special org-mode commands.
+Thanks to Vinod Valsalam for reporting this problem, and to
+Andrew Korty for showing how to fix it.
+
+</li>
+<li>
+Most other bugs discussed recently on emacs-orgmode@gnu.org
+should be fixed, except the problem with non-ASCII characters
+in tags&hellip;.
+
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.67</h2>
+
+
+<ul>
+<li>
+Expert mode for fast tag selection.
+When org-fast-tag-selection-single-key is `expert', not even
+the selection window is shown, only the prompt. One more C-c
+gets you the window, another one goes to multiple selection mode.
+
+</li>
+<li>
+Synchronized with Emacs once more: Emacs CVS has now org-mode
+4.67. At least until it causes a problem, then the Emacs people
+will switch back to 4.56. Lets hope there will be no problem.
+
+</li>
+<li>
+Code cleanup
+
+</li>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.66</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Sorting of top-level entries works now if the region contains
+top-level entries, or if the cursor is before the first headline.
+Thanks to "redblue" for reporting this bug.
+
+</li>
+<li>
+When entering date and time at the prompt, you can now mix
+entering text and selecting something in the calendar. For
+example, enter 22:15 at the prompt without pressing RET, and then
+click on a date in the calendar. Both pieces of information will
+be included in the resulting time stamp. You can also use
+S-curser to move the cursor in the calendar to the desired date
+and then enter 22:15 and press RET at the prompt.
+
+</li>
+<li>
+When setting a deadline or a schedule, entering a time now
+automatically selects the time stamp format that includes the
+time. Bug report (by means of a question) from Bastre.
+
+</li>
+<li>
+C-c C-l can be used to convert a plain link into a bracket link.
+
+</li>
+<li>
+Internal links now match inside (the visible part of) other
+links. Thanks to Scott Otterson for reporting this bug.
+
+</li>
+<li>
+iCalendar export of TODO items fixed, see also the variable
+`org-icalendar-include-todo'. Thanks to Philipp Raschdorf.
+
+</li>
+<li>
+The number of levels in the table of contents of an exported
+document can now be set independently of the number of headline
+levels. For example:
+
+<p>
+#+OPTIONS: H:4 toc:2
+</p>
+</li>
+<li>
+The command `C-c }' toggles the display of row and column numbers
+the the current table, to aid constructing formulas. To try it,
+move the cursor to a table and press `C-c }', or use the menu
+entry.
+
+</li>
+<li>
+Orgtbl translation functions (introduced in 4.65) have been
+simplified using a generic function `orgtbl-to-generic' that can
+be used for very general languanges. Writing your own translator
+should be very easy now. More info in the manual.
+
+</li>
+<li>
+CONTENTS visibility can be limited to a certain level. The
+command `C-3 S-TAB' will switch to CONTENTS view and show the
+first 3 levels.
+
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.65</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Orgtbl can be used to maintain tables in LaTeX, and in any other mode
+</li>
+<li>
+Editing Lisp formulas for tables improved.
+</li>
+<li>
+Better structure for HTML exported tables.
+</li>
+<li>
+New "calculation" marker "/" to mark lines that should not be exported.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Detailed description of changes</h3>
+
+
+<ul>
+<li>
+You can use orgtbl mode to maintain a LaTeX table, or pretty much
+any table in any mode.
+
+<p>
+This does <b>not</b> work by making Orgtbl aware of LaTeX syntax. That
+would be a box of Pandora I am not willing to open. Instead, you
+use a normal Orgtbl-mode table, and a converter program to
+automatically place a LaTeX version of the table into the correct
+spot in the LaTeX file. The orgtbl-mode table can be maintained
+inside the same file, in a block comment.
+</p>
+<p>
+I am providing translators for LaTeX, HTML, and TeXInfo. For
+other applications, you need to write one yourself - but that is
+not hard if you start from the LaTeX version and just modify it.
+Thanks to Thomas Baumann for triggering this development through
+a request for a table-to-LaTeX converter.
+</p>
+</li>
+<li>
+In the special buffer to edit the formulas of a table (created
+with "C-c '"), there is now better support for editing Lisp
+formulas. TAB and M-TAB work like in an Emacs Lisp buffer,
+indenting lines and completing lisp symbols. With the cursor on
+a line defining a complex Lisp formula, a first press on TAB will
+convert the formula into a pretty-printed version with proper
+linebreaks and indentation. A second TAB folds the line back to
+the compact form.
+
+</li>
+<li>
+Tables in HTML export have now additional structure elements
+defined. The header (before the first hline) is wrapped into
+&lt;thead&gt;..&lt;/thead&gt;, and each part of the body (as separated in
+org-mode by hlines) is wrapped into &lt;tbody&gt;..&lt;/tbody&gt; tags. I
+have also changed the CSS style for &lt;td&gt; fields and the value of
+`org-export-html-table-tag' to get cleaner tables. Basically,
+tables now have horizontal lines only where needed, and no
+vertical lines at all, as generally recommended for tables in
+printed text. I like the new look, but I am not sure if this
+change will find general approval, please throw in your view if
+you like. Thanks to Scott for driving this, and to goud-H for
+pointing me to the row grouping in tables.
+
+</li>
+<li>
+In a table with calculation markers in the first column, you can
+now also put "/" into the first column. It indicates that this
+line should not be exported. The foremost application for this
+are lines containing only "&lt;N&gt;" markers for narrowing columns.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.64</h2>
+
+
+
+<div class="outline-3">
+<h3>Overview</h3>
+
+
+<ul>
+<li>
+Email links get better, configurable descriptions
+</li>
+<li>
+When inserting a link, selected text becomes the description
+</li>
+<li>
+Easier access to the list of stored links.
+</li>
+<li>
+Horizontal lines in HTML export.
+</li>
+<li>
+Remember templates and storing of notes improved.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3>Detailed description of changes</h3>
+
+
+<ul>
+<li>
+The descriptive part of links to email messages can be configured
+using the variable `org-email-link-description-format'. The new
+default is "Email %c: %.30s" and leads to
+
+<p>
+Email from NAME: SUBJECT
+</p>
+<p>
+If you configure the variable `org-from-is-user-regexp'
+correctly, then for email you <b>sent</b> this will actually change to
+</p>
+<p>
+Email to NAME: SUBJECT
+</p>
+<p>
+The subject is limited to 30 characters. If you have become
+attached to the previous default (look twice, the new one is
+better), use "%f on: %s" as your format.
+</p>
+</li>
+<li>
+Selecting text before entering a new link with C-c C-l now really
+works, the selected text becomes the description part of the
+link. Requested by Scott, buggy 4.62 implementation is now fixed.
+
+</li>
+<li>
+Stored links are part of the history list for C-c C-l, so to
+reach them, you can use up/down rather than completion. Thanks
+to Raman for this excellent idea.
+
+</li>
+<li>
+A line consisting only of "-", and at least 5 of them, is
+exported into HTML as &lt;hr/&gt;, as proposed by Giovanni Ridolfi.
+
+</li>
+<li>
+Several changes to org &lt;-&gt; remember integration
+
+<ul>
+<li>
+You can use `org-remember' as your default command to start
+remember. It will automatically detect if there is an active
+region and use it as initial content (we will probably make
+remember.el work like this as well).
+Also, when calling `org-remember' in a remember buffer that
+was created with a template, you will again be asked to
+select a template. The buffer is then re-created with the
+new template, but the old context information. This is
+useful if you change your mind about the template to use
+(Leo's idea).
+
+</li>
+<li>
+Besides specifying a default <b>target</b> file for a note, you
+can also give a default <b>heading</b> of which the note should
+become a subitem. In many cases this avoids or speeds up
+navigating to the right location. Both file and heading can
+be different for each template. Both are non-binding, you
+can change them while storing the note. However, when you
+exit remember with C-u C-c C-c, these defaults will be used
+without interaction.
+
+</li>
+<li>
+Templates can specify interactive fields. During expansion
+of the template, you will be prompted for the information in
+that field. For example %^t will pop up a calendar and ask
+you to select a date. This new feature follows a proposal
+from Leo, who in the mean time has said he does not need it
+anymore. But I liked it, so here it is :-)
+
+</li>
+<li>
+Templates can access information specific to the link type
+created, for example the author and subject of an email.
+Syntax is %:fromname, %:fromaddress, %:subject etc, details
+in the manual. Proposed by Peder O. Klingenberg.
+
+</li>
+<li>
+I have been considering to move, at some stage, the template
+functionality into remember.el itself - which would of course
+require consent of the remember.el maintainers. I am not
+sure how well this would work though, since some things like
+the interactive time stamps are org.el specific, so treating
+them would require special hooks. Comments?
+
+</li>
+</ul></li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2>Version 4.63</h2>
+
+<ul>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.62</h2>
+
+<ul>
+<li>
+Many changes to the spreadsheet functions in the table editor.
+For details, please re-read the manual section 3.4.
+<ul>
+<li>
+New Features
+<ul>
+<li>
+It is much easier to assign formulas to individual fields.
+</li>
+<li>
+References to arbitrary fields and ranges.
+</li>
+<li>
+Absolute references are modified in row-editing commands.
+</li>
+<li>
+Formula editor that highlights referenced fields.
+</li>
+</ul></li>
+<li>
+Incompatible changes
+<ul>
+<li>
+Empty fields are excluded in range references, see "E" mode flag.
+</li>
+<li>
+&amp;&hellip; ranges no longer supported, use new @&hellip; ranges.
+</li>
+<li>
+Variable insertion into Lisp formulas work differently.
+</li>
+</ul></li>
+</ul></li>
+<li>
+Selected text becomes the default description for C-c C-l links.(Scott)
+</li>
+<li>
+The date format in the agenda/timeline views is now customizable.
+See the new option `org-agenda-date-format'. (request by Victor)
+</li>
+<li>
+Link abbreviations no longer need a double colon, single colon is fine.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.61</h2>
+
+<ul>
+<li>
+Avoiding keybinding clashes with flyspell
+<ul>
+<li>
+Archiving is now also on `C-C C-x C-s' (was just `C-c $')
+</li>
+<li>
+Cycling through agenda files is now also on "C-'" (was just "C-,")
+</li>
+</ul></li>
+<li>
+Colon is considered part of number, to align times in clock tables.
+</li>
+<li>
+Fixed bug for list of stuck projects.
+</li>
+<li>
+Fixed several bugs/problems concerning linking to gnus.
+</li>
+<li>
+Block agendas can contain the list of stuck projects.
+</li>
+<li>
+#+ARCHIVE may now appear several times in the buffer.
+</li>
+<li>
+More bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.60</h2>
+
+<ul>
+<li>
+HTML export: inlining images, clickable images (manual 10.2.4).
+</li>
+<li>
+Incremental search now shows proper context when exiting.
+</li>
+<li>
+Tables calculation and Calc package.
+<ul>
+<li>
+Calc is no longer needed when using only elisp formulas.
+</li>
+<li>
+Proper error messages when calc is needed and not available.
+</li>
+</ul></li>
+<li>
+Tracking TODO state changes with time stamps and notes.
+</li>
+<li>
+Empty entries go full circle.
+</li>
+<li>
+Links in iCalendar export cleaned up.
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.59</h2>
+
+<ul>
+<li>
+Cleanup code, bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.58</h2>
+
+<ul>
+<li>
+Full undo support in the agenda buffer.
+</li>
+<li>
+Listing stuck GTD projects (projects without any NEXT ACTIONS).
+Configure `org-stuck-projects' before using it.
+</li>
+<li>
+C-c C-x b shows the current subtree in an indirect buffer, in
+another, dedicated frame.
+</li>
+<li>
+Custom agenda commands take precedence over builtin commands.
+</li>
+<li>
+auto-fill for comments works on the Emacs side, XEmacs not yet.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.57</h2>
+
+<ul>
+<li>
+Sorting of outline items on same level.
+</li>
+<li>
+Sorting tables automatically selects line range between hlines.
+</li>
+<li>
+Changes in Agenda buffer
+<ul>
+<li>
+`C-c C-o' follows a link in the current line.
+</li>
+<li>
+`C-c $' archives the subtree corresponding to the line.
+</li>
+<li>
+Changing dates with S-left and S-right show new date in agenda,
+but still do not move the entry to the new date.
+</li>
+<li>
+new option `org-agenda-skip-scheduled-if-done'.
+</li>
+</ul></li>
+<li>
+Agenda and sparse tree construction using tag matches can now
+use regular expressions.
+</li>
+<li>
+When prompted for a date/time, entering "+7" indicates a date
+7 days from now - but only this is the only thing you give.
+</li>
+<li>
+Custom time formats also apply to exported html and ascii.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.56</h2>
+
+<ul>
+<li>
+`C-k' in agenda kills current line and corresponding subtree in file.
+</li>
+<li>
+XEmacs compatibility issues fixed, in particular tag alignment.
+</li>
+<li>
+M-left/right now in/outdents plain list items, no Shift needed.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.55</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.54</h2>
+
+<ul>
+<li>
+Improvements to fast tag selection
+<ul>
+<li>
+show status also in target line.
+</li>
+<li>
+option to auto-exit after first change to tags list (see manual).
+</li>
+</ul></li>
+<li>
+Tags sparse trees now also respect the settings in
+`org-show-hierarchy-above' and `org-show-following-heading'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.53</h2>
+
+<ul>
+<li>
+Custom time formats can be overlayed over time stamps.
+</li>
+<li>
+New option `org-agenda-todo-ignore-deadlines'.
+</li>
+<li>
+Work-around for flyspell bug (CVS Emacs has this fixed in flyspell.el).
+</li>
+<li>
+Work-around for session.el problem with circular data structures.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.52</h2>
+
+<ul>
+<li>
+TAG matches can also specify conditions on TODO keywords.
+</li>
+<li>
+The fast tag interface allows setting tags that are not in the
+predefined list.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.51</h2>
+
+<ul>
+<li>
+Link abbreviations (manual section 4.5).
+</li>
+<li>
+More control over how agenda is displayed. See the new variables
+`org-agenda-window-setup', `org-agenda-restore-windows-after-quit'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.50</h2>
+
+<ul>
+<li>
+Closing a TODO item can record an additional note.
+See variables `org-log-done' and `org-log-note-headings'.
+</li>
+<li>
+Inserting headlines and bullets can leave an extra blank line.
+See variable `org-blank-before-new-entry'. (Ed Hirgelt patch)
+</li>
+<li>
+<a href="#bracket--links">bracket links</a> in the agenda are active just as in org-mode buffers.
+</li>
+<li>
+C-c C-o on a date range displays the agenda for exactly this range.
+</li>
+<li>
+The default for `org-cycle-include-plain-lists' is back to nil.
+</li>
+<li>
+Calls to `org-occur' can be stacked by using a prefix argument.
+</li>
+<li>
+The options `org-show-hierarchy-above' and `org-show-following-heading'
+now always default to `t', but can be customized differently for
+different types of sparse trees or jump commands.
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.49</h2>
+
+<ul>
+<li>
+Agenda views can be made in batch mode from the command line.
+</li>
+<li>
+`org-store-link' does the right thing in dired-mode.
+</li>
+<li>
+File links can contain environment variables.
+</li>
+<li>
+Full Emacs 21 compatibility has been restored.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.47</h2>
+
+<ul>
+<li>
+Custom commands may produce an agenda which contains several blocks,
+each block created by a different agenda command.
+</li>
+<li>
+Agenda commands can be restricted to the current file, region, subtree.
+</li>
+<li>
+The timeline command must now be called through the agenda
+dispatcher (C-c a L). `C-c C-r' no longer works.
+</li>
+<li>
+Agenda items can be sorted by tag. The <b>last</b> tag is used for this.
+</li>
+<li>
+The prefix and the sorting strategy for agenda items can depend
+upon the agenda type.
+</li>
+<li>
+The handling of `<a href="mailto:'">mailto:'</a> links can be customized, see the new
+variable `org-link-mailto-program'.
+</li>
+<li>
+`mailto' links can specify a subject after a double colon,
+like <a href="mailto:carsten@orgmode.org::Org-mode is buggy">mailto:carsten@orgmode.org::Org-mode is buggy</a>.
+</li>
+<li>
+In the #+STARTUP line, M-TAB completes valid keywords.
+</li>
+<li>
+In the #+TAGS: line, M-TAB after ":" inserts all currently used tags.
+</li>
+<li>
+Again full Emacs 21 support: Checkboxes and publishing are fixed.
+</li>
+<li>
+More minor bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.45</h2>
+
+<ul>
+<li>
+Checkbox lists can show statistics about checked items.
+</li>
+<li>
+C-TAB will cycle the visibility of archived subtrees.
+</li>
+<li>
+Documentation about checkboxes has been moved to chapter 5.
+</li>
+<li>
+Bux fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.44</h2>
+
+<ul>
+<li>
+Clock table can be done for a limited time interval.
+</li>
+<li>
+Obsolete support for the old outline mode has been removed.
+</li>
+<li>
+Bug fixes and code cleaning.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.43</h2>
+
+<ul>
+<li>
+Bug fixes
+</li>
+<li>
+`s' key in the agenda saves all org-mode buffers.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.41</h2>
+
+<ul>
+<li>
+Shift-curser keys can modify inactive time stamps (inactive time
+stamps are the ones in [&hellip;] brackets.
+</li>
+<li>
+Toggle all checkboxes in a region/below a headline.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.40</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.39</h2>
+
+<ul>
+<li>
+Special tag ARCHIVE keeps a subtree closed and away from agenda lists.
+</li>
+<li>
+LaTeX code in Org-mode files can be converted to images for HTML.
+</li>
+<li>
+Bug fixes.
+</li>
+<li>
+CDLaTeX-mode features can be used in Org-mode to help inserting
+LaTeX environment and math.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.38</h2>
+
+<ul>
+<li>
+noutline.el is now required (important for XEmacs users only).
+</li>
+<li>
+Dynamic blocks.
+</li>
+<li>
+Archiving of all level 1 trees without open TODO items.
+</li>
+<li>
+Clock reports can be inserted into the file in a special section.
+</li>
+<li>
+FAQ removed from the manual, now only on the web.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.37</h2>
+
+<ul>
+<li>
+Clock-feature for measuring time spent on specific items.
+</li>
+<li>
+Improved emphasizing allows configuration and stacking.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.36</h2>
+
+<ul>
+<li>
+Improved indentation of ASCII export, when headlines become items.
+</li>
+<li>
+Handling of 12am and 12pm fixed. Times beyond 24:00 can be used
+and will not lead to conflicts.
+</li>
+<li>
+Support for mutually exclusive TAGS with the fast tags interface.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.35</h2>
+
+<ul>
+<li>
+HTML export is now valid XHTML.
+</li>
+<li>
+Timeline can also show dates without entries. See new option
+`org-timeline-show-empty-dates'.
+</li>
+<li>
+The bullets created by the ASCII exporter can now be configured.
+See the new option `org-export-ascii-bullets'.
+</li>
+<li>
+New face `org-upcoming-deadline' (was `org-scheduled-previously').
+</li>
+<li>
+New function `org-context' to allow testing for local context.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.34</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.33</h2>
+
+<ul>
+<li>
+New commands to move through plain lists: S-up and S-down.
+</li>
+<li>
+Bug fixes and documentation update.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.32</h2>
+
+<ul>
+<li>
+Fast (single-key-per-tag) interface for setting TAGS.
+</li>
+<li>
+The list of legal tags can be configured globally and locally.
+</li>
+<li>
+Elisp and Info links (thanks to Todd Neal).
+</li>
+<li>
+`org-export-publishing-directory' can be an alist, with different
+directories for different export types.
+</li>
+<li>
+All context-sensitive commands use `call-interactively' to dispatch.
+</li>
+<li>
+`org-confirm-shell-links' renamed to `org-confirm-shell-link-function'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.31</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.30</h2>
+
+<ul>
+<li>
+Modified installation: Autoloads have been collected in org-install.el.
+</li>
+<li>
+Logging (org-log-done) is now a #+STARTUP option.
+</li>
+<li>
+Checkboxes in plain list items, following up on Frank Ruell's idea.
+</li>
+<li>
+File links inserted with C-c C-l will use relative paths if the linked
+file is in the current directory or a subdirectory of it.
+</li>
+<li>
+New variable `org-link-file-path-type' to specify preference for
+relative and absolute paths.
+</li>
+<li>
+New CSS classes for tags, timestamps, timestamp keywords.
+</li>
+<li>
+Bug and typo fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.29</h2>
+
+<ul>
+<li>
+Inlining images in HTML export now depends on wheather the link
+contains a description or not.
+</li>
+<li>
+TODO items can be scheduled from the global TODO list using C-c C-s.
+</li>
+<li>
+TODO items already scheduled can be made to disappear from the global
+todo list, see `org-agenda-todo-ignore-scheduled'.
+</li>
+<li>
+In Tables, formulas may also be Lisp forms.
+</li>
+<li>
+Exporting the visible part of an outline with `C-c C-x v' works now
+for all available exporters.
+</li>
+<li>
+Bug fixes, lots of them :-(
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.28</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.27</h2>
+
+<ul>
+<li>
+HTML exporter generalized to receive external options.
+As part of the process, author, email and date have been moved to the
+end of the HTML file.
+</li>
+<li>
+Support for customizable file search in file links.
+</li>
+<li>
+BibTeX database links as first application of the above.
+</li>
+<li>
+New option `org-agenda-todo-list-sublevels' to turn off listing TODO
+entries that are sublevels of another TODO entry.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.26</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.25</h2>
+
+<ul>
+<li>
+Revision of the font-lock faces section, with better tty support.
+</li>
+<li>
+TODO keywords in Agenda buffer are fontified.
+</li>
+<li>
+Export converts links between .org files to links between .html files.
+</li>
+<li>
+Better support for bold/italic/underline emphasis.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.24</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.23</h2>
+
+<ul>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.22</h2>
+
+<ul>
+<li>
+Bug fixes.
+</li>
+<li>
+In agenda buffer, mouse-1 no longer follows link.
+See `org-agenda-mouse-1-follows-link' and `org-mouse-1-follows-link'.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.20</h2>
+
+<ul>
+<li>
+Links use now the <a href="#link">description</a> format by default.
+When inserting links, the user is prompted for a description.
+</li>
+<li>
+If a link has a description, only the description is displayed
+the link part is hidden. Use C-c C-l to edit the link part.
+</li>
+<li>
+TAGS are now bold, but in the same color as the headline.
+</li>
+<li>
+The width of a table column can be limited by using a field "&lt;N&gt;".
+</li>
+<li>
+New structure for the customization tree.
+</li>
+<li>
+Bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.13</h2>
+
+<ul>
+<li>
+The list of agenda files can be maintainted in an external file.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 4.12</h2>
+
+<ul>
+<li>
+Templates for remember buffer. Note that the remember setup changes.
+To set up templates, see `org-remember-templates'.
+</li>
+<li>
+The time in new time stamps can be rounded, see new option
+`org-time-stamp-rounding-minutes'.
+</li>
+<li>
+Bug fixes (there are <b>always</b> more bugs).
+
+</li>
+</ul>
+<p>[&hellip;]
+</p>
+<p>
+Version 4.00
+</p><ul>
+<li>
+Headlines can contain TAGS, and Org-mode can produced a list
+of matching headlines based on a TAG search expression.
+</li>
+<li>
+`org-agenda' has now become a dispatcher that will produce the agenda
+and other views on org-mode data with an additional keypress.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.24</h2>
+
+<ul>
+<li>
+Switching and item to DONE records a time stamp when the variable
+`org-log-done' is turned on. Default is off.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.23</h2>
+
+<ul>
+<li>
+M-RET makes new items as well as new headings.
+</li>
+<li>
+Various small bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.22</h2>
+
+<ul>
+<li>
+CamelCase words link to other locations in the same file.
+</li>
+<li>
+File links accept search options, to link to specific locations.
+</li>
+<li>
+Plain list items can be folded with `org-cycle'. See new option
+`org-cycle-include-plain-lists'.
+</li>
+<li>
+Sparse trees for specific TODO keywords through numeric prefix
+argument to `C-c C-v'.
+</li>
+<li>
+Global TODO list, also for specific keywords.
+</li>
+<li>
+Matches in sparse trees are highlighted (highlights disappear with
+next buffer change due to editing).
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.21</h2>
+
+<ul>
+<li>
+Improved CSS support for the HTML export. Thanks to Christian Egli.
+</li>
+<li>
+Editing support for hand-formatted lists
+<ul>
+<li>
+M-S-cursor keys handle plain list items
+</li>
+<li>
+C-c C-c renumbers ordered plain lists
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.20</h2>
+
+<ul>
+<li>
+There is finally an option to make TAB jump over horizontal lines
+in tables instead of creating a new line before that line.
+The option is `org-table-tab-jumps-over-hlines', default nil.
+</li>
+<li>
+New command for sorting tables, on `C-c ^'.
+</li>
+<li>
+Changes to the HTML exporter
+<ul>
+<li>
+hand-formatted lists are exported correctly, similar to
+markdown lists. Nested lists are possible. See the docstring
+of the variable `org-export-plain-list-max-depth'.
+</li>
+<li>
+cleaned up to produce valid HTML 4.0 (transitional).
+</li>
+<li>
+support for cascading style sheets.
+</li>
+</ul></li>
+<li>
+New command to cycle through all agenda files, on C-,
+</li>
+<li>
+C-c [ can now also be used to change the sequence of agenda files.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.19</h2>
+
+<ul>
+<li>
+Bug fixes
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.18</h2>
+
+<ul>
+<li>
+Export of calendar information in the standard iCalendar format.
+</li>
+<li>
+Some bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.17</h2>
+
+<ul>
+<li>
+HTML export specifies character set depending on coding-system.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.16</h2>
+
+<ul>
+<li>
+In tables, directly after the field motion commands like TAB and RET,
+typing a character will blank the field. Can be turned off with
+variable `org-table-auto-blank-field'.
+</li>
+<li>
+Inactive timestamps with `C-c !'. These do not trigger the agenda
+and are not linked to the calendar.
+</li>
+<li>
+Additional key bindings to allow Org-mode to function on a tty emacs.
+</li>
+<li>
+`C-c C-h' prefix key replaced by `C-c C-x', and `C-c C-x C-h' replaced
+by `C-c C-x b' (b=Browser). This was necessary to recover the
+standard meaning of C-h after a prefix key (show prefix bindings).
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.15</h2>
+
+<ul>
+<li>
+QUOTE keyword at the beginning of an entry causes fixed-width export
+of unmodified entry text. `C-c :' toggles this keyword.
+</li>
+<li>
+New face `org-special-keyword' which is used for COMMENT, QUOTE,
+DEADLINE and SCHEDULED, and priority cookies. Default is only a weak
+color, to reduce the amount of aggressive color in the buffer.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.14</h2>
+
+<ul>
+<li>
+Formulas for individual fields in table.
+</li>
+<li>
+Automatic recalculation in calculating tables.
+</li>
+<li>
+Named fields and columns in tables.
+</li>
+<li>
+Fixed bug with calling `org-archive' several times in a row.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.13</h2>
+
+<ul>
+<li>
+Efficiency improvements: Fewer table re-alignments needed.
+</li>
+<li>
+New special lines in tables, for defining names for individual cells.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.12</h2>
+
+<ul>
+<li>
+Tables can store formulas (one per column) and compute fields.
+Not quite like a full spreadsheet, but very powerful.
+</li>
+<li>
+table.el keybinding is now `C-c ~'.
+</li>
+<li>
+Numeric argument to org-cycle does `show-subtree' above on level ARG.
+</li>
+<li>
+Small changes to keys in agenda buffer. Affected keys:
+[w] weekly view; [d] daily view; [D] toggle diary inclusion.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.11</h2>
+
+<ul>
+<li>
+Links inserted with C-c C-l are now by default enclosed in angle
+brackets. See the new variable `org-link-format'.
+</li>
+<li>
+"&gt;" terminates a link, this is a way to have several links in a line.
+Both "&lt;" and "&gt;" are no longer allowed as characters in a link.
+</li>
+<li>
+Archiving of finished tasks.
+</li>
+<li>
+C-&lt;up&gt;/&lt;down&gt; bindings removed, to allow access to paragraph commands.
+</li>
+<li>
+Compatibility with CUA-mode (see variable `org-CUA-compatible').
+</li>
+<li>
+Compatibility problems with viper-mode fixed.
+</li>
+<li>
+Improved html export of tables.
+</li>
+<li>
+Various clean-up changes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.10</h2>
+
+<ul>
+<li>
+Using `define-derived-mode' to derive `org-mode' from `outline-mode'.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.09</h2>
+
+<ul>
+<li>
+Time-of-day specifications in agenda are extracted and placed
+into the prefix. Timed entries can be placed into a time grid for
+day.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.08</h2>
+
+<ul>
+<li>
+"|" no longer allowed as part of a link, to allow links in tables.
+</li>
+<li>
+The prefix of items in the agenda buffer can be configured.
+</li>
+<li>
+Cleanup.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.07</h2>
+
+<ul>
+<li>
+Some folding inconsistencies removed.
+</li>
+<li>
+BBDB links to company-only entries.
+</li>
+<li>
+Bug fixes and global cleanup.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.06</h2>
+
+<ul>
+<li>
+M-S-RET inserts a new TODO heading.
+</li>
+<li>
+New startup option `content'.
+</li>
+<li>
+Better visual response when TODO items in agenda change status.
+</li>
+<li>
+Window positioning after visibility state changes optimized and made
+configurable. See `org-cycle-hook' and `org-occur-hook'.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.05</h2>
+
+<ul>
+<li>
+Agenda entries from the diary are linked to the diary file, so
+adding and editing diary entries can be done directly from the agenda.
+</li>
+<li>
+Many calendar/diary commands available directly from agenda.
+</li>
+<li>
+Field copying in tables with S-RET does increment.
+</li>
+<li>
+C-c C-x C-v extracts the visible part of the buffer for printing.
+</li>
+<li>
+Moving subtrees up and down preserves the whitespace at the tree end.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.04</h2>
+
+<ul>
+<li>
+Table editor optimized to need fewer realignments, and to keep
+table shape when typing in fields.
+</li>
+<li>
+A new minor mode, orgtbl-mode, introduces the Org-mode table editor
+into arbitrary major modes.
+</li>
+<li>
+Fixed bug with realignment in XEmacs.
+</li>
+<li>
+Startup options can be set with special #+STARTUP line.
+</li>
+<li>
+Heading following a match in org-occur can be suppressed.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.03</h2>
+
+<ul>
+<li>
+Copyright transfer to the FSF.
+</li>
+<li>
+Effect of C-u and C-u C-u in org-timeline swapped.
+</li>
+<li>
+Timeline now always contains today, and `.' jumps to it.
+</li>
+<li>
+Table editor:
+<ul>
+<li>
+cut and paste of rectangular regions in tables
+</li>
+<li>
+command to convert org-mode table to table.el table and back
+</li>
+<li>
+command to treat several cells like a paragraph and fill it
+</li>
+<li>
+command to convert a buffer region to a table
+</li>
+<li>
+import/export tables as tab-separated files (exchange with Excel)
+</li>
+</ul></li>
+<li>
+Agenda:
+<ul>
+<li>
+Sorting mechanism for agenda items rewritten from scratch.
+</li>
+<li>
+Sorting fully configurable.
+</li>
+<li>
+Entries specifying a time are sorted together.
+</li>
+</ul></li>
+<li>
+Completion also covers option keywords after `#-'.
+</li>
+<li>
+Bug fixes.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.01</h2>
+
+<ul>
+<li>
+New reference card, thanks to Philip Rooke for creating it.
+</li>
+<li>
+Single file agenda renamed to "Timeline". It no longer shows
+warnings about upcoming deadlines/overdue scheduled items.
+That functionality is now limited to the (multifile) agenda.
+</li>
+<li>
+When reading a date, the calendar can be manipulated with keys.
+</li>
+<li>
+Link support for RMAIL and Wanderlust (from planner.el, untested).
+</li>
+<li>
+Minor bug fixes and documentation improvements.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 3.00</h2>
+
+<ul>
+<li>
+Multifile Agenda shows current entries from many different files.
+</li>
+<li>
+TeXInfo documentation (thanks to Christian Egli for the conversion).
+</li>
+<li>
+Additional applications for TODO keywords, see documentation.
+Different files may have different TODO keywords etc.
+</li>
+<li>
+Priorities for TODO items.
+</li>
+<li>
+The browser mode used by `org-remember-handler' is improved.
+</li>
+<li>
+Images get inlined in HTML export (thanks to Carsten Wimmer).
+</li>
+<li>
+File links can contain line numbers, like <a href="/usr/etc/config:255">file:/usr/etc/config:255</a>
+</li>
+<li>
+Minor bug fixes.
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 2.10</h2>
+
+<ul>
+<li>
+TODO entries can have additional states besides TODO and DONE.
+See new variable `org-todo-keywords'.
+</li>
+<li>
+TODO keywords can be interpreted as categories. See variable
+`org-todo-interpretation'.
+</li>
+<li>
+M-TAB completion on TODO keywords, TeX symbols, and normal words.
+</li>
+<li>
+All keywords (like TODO, DEADLINE etc) are configurable.
+</li>
+<li>
+Cursor positioning optimized after pro/demotion and TODO cycling.
+</li>
+<li>
+Emphasizing in HTML works now for <b>bold</b>, <i>italic</i> and <u>underline</u>.
+</li>
+<li>
+New commands to kill, copy and yank entire subtrees. Yanking
+modifies the level of the tree before insertion.
+</li>
+<li>
+New command `org-goto' (C-c C-j) to quickly move to other locations
+in the buffer without affecting outline visibility.
+</li>
+<li>
+Hooks for John Wiegley's remember.el.
+</li>
+<li>
+`org-read-date' pops up calendar for date selection with the mouse.
+See variable `org-popup-calendar-for-date-prompt'.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 2.6</h2>
+
+<ul>
+<li>
+TODO items can be SCHEDULED to a certain date.
+</li>
+<li>
+Expired DEADLINEs are ignored if in an entry marked DONE.
+</li>
+<li>
+From the diary or time-sorted view (C-c C-r), C-c C-t can be used to
+change the TODO state of an item remotely.
+</li>
+<li>
+Horizontal computations in table editor. See `org-table-eval-formula'.
+</li>
+<li>
+Fixed bug with summing tables (command `org-table-sum', `C-c +').
+</li>
+<li>
+Calendar window follows the timestamp when a timestamp is changed.
+New variable `org-calendar-follow-timestamp-change'.
+</li>
+<li>
+Time-sorted view (`org-diary-view', C-c C-r) now uses the prefix
+argument to force inclusion of unscheduled TODO items.
+</li>
+<li>
+New variable `org-confirm-shell-links' to turn of safety query.
+</li>
+<li>
+New variable `org-open-non-existing-files'.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 2.4</h2>
+
+<ul>
+<li>
+A time-sorted view on all time stamps can be created with C-c C-r.
+</li>
+<li>
+Timestamps and Deadlines can be shown in the Emacs diary.
+</li>
+<li>
+Date ranges introduced.
+</li>
+<li>
+Time-string formats are no longer configurable.
+</li>
+<li>
+Vertical lines in tables can be made invisible with `C-c |'.
+</li>
+<li>
+New "link" type to execute shell commands, like "<i>&lt;shell:ls&gt;</i> *.org"
+</li>
+<li>
+Upon export, "myfile.org" becomes "myfile.html" or "myfile.txt",
+instead of "myfile.org.html" or "myfile.org.txt".
+</li>
+<li>
+When the cursor is in the white space at the beginning of a line,
+TAB removes the whitespace before indenting again.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 2.0</h2>
+
+<ul>
+<li>
+Windows (NT/2000) support.
+</li>
+<li>
+Works with both Emacs and XEmacs.
+</li>
+<li>
+Fully automatic table editor.
+</li>
+<li>
+New link types into Gnus, VM and BBDB.
+</li>
+<li>
+Other link system changes
+<ul>
+<li>
+Time stamps are treated as links to the calendar.
+</li>
+<li>
+Easy creation of links with global command `org-store-link'.
+</li>
+<li>
+Insertion of links with `C-c C-l' works differently now.
+</li>
+<li>
+Space characters allowed as part of a link.
+</li>
+<li>
+Options in `org-file-apps' extended. The command may now be
+symbol 'emacs', or a lisp form.
+</li>
+</ul></li>
+</ul>
+<p>Please re-read the manual section about links.
+</p><ul>
+<li>
+Timestamp changes
+<ul>
+<li>
+`org-deadline' now prompts for a date.
+</li>
+<li>
+A line can now contain several timestamps. Updating of a
+timestamp only happens if the cursor is at the timestamp.
+</li>
+<li>
+Changed the time-stamp-format to ISO, to make sure it will
+always work (non-English month names had caused problems
+with `parse-time-string'.). Changing the time stamp format
+is not recommended.
+</li>
+</ul></li>
+<li>
+Picture mode enhancements have been removed from org.el
+
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 1.4</h2>
+
+<ul>
+<li>
+Some option name changes, not backward compatible.
+</li>
+<li>
+ASCII exporter upgrade: Table of contents.
+</li>
+<li>
+HTML exporter upgrade: fixed-width regions, better
+sub/superscripts, many TeX symbols supported.
+</li>
+<li>
+Calendar support.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2>Version 1.3</h2>
+
+<ul>
+<li>
+HTML exporter upgrade, in particular table of contents
+
+
+
+</li>
+</ul>
+</div>
+<div id="postamble"><p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten at orgmode dot org">&lt;carsten at orgmode dot org&gt;</a>
+</p>
+<p class="date"> Date: 2008/01/27 10:12:09</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/tmp/Changes.txt b/ORGWEBPAGE/tmp/Changes.txt
new file mode 100644
index 0000000..b64dca7
--- /dev/null
+++ b/ORGWEBPAGE/tmp/Changes.txt
@@ -0,0 +1,3562 @@
+ Org-mode list of User-visible changes
+ =====================================
+
+Author: Carsten Dominik <carsten at orgmode dot org>
+Date: 2008/01/28 09:04:09
+
+
+Version 5.20
+~~~~~~~~~~~~
+
+Overview
+========
+
+Incompatible Changes
+====================
+
+Details
+=======
+
+Remember and Refile
+-------------------
+
+ - The use of prefix arguments for the commands `org-remember'
+ and `org-refile' has been normalized:
+ + when called without prefix argment, the command does its
+ normal job, starting a remember note or refiling a tree.
+ + when called with a single C-u pefix, these commands can be
+ used to select a target location and to jump there. In
+ the case of `org-remember', you will be prompted for a
+ template and then Emacs jumpt to the default target
+ location or this template. In the case of `org-refile',
+ you select a location from the refile target list and jump
+ there.
+ + when called with two prefixes (`C-u C-u'), the command
+ jumps to the location last used for storing a note or a
+ moved tree.
+
+ - When the clock is running inside an remember buffer, storing
+ the remember buffer with `C-c C-c' will automatically clock
+ out. This was inspired by a request by Rainer Stengle.
+
+ - Outline-path-completion is now available as an alternative
+ interface in the command `org-goto'. Please select the
+ default interface you'd like to use with the new variable
+ `org-goto-interface'. You can then select the alternative
+ interface with a prefix argument to `C-c C-j' (org-goto). I
+ am considering to make outline-path-completion the default
+ interface. Comments?
+
+ - The variable `org-remember-use-refile-when-interactive'
+ introduced only in 5.19 is obsolete. Please use
+ `org-remember-interactive-interface' instead. This new
+ variable does select the interface that is used to select
+ the target for a remember note in an interactive way.
+ Possible values are:
+
+ + `outline': Use an outline of the document to select a
+ location.
+ + `outline-path-completion': Use completion of an outline
+ path to select a location.
+ + `refile': Offer the `org-refile-targets' as possible
+ targets.
+
+ - You can now also have a plain (as opposed to deadline or
+ scheduled) repeater timestamp in a task. Switching the task
+ to DONE will now also shift a plain time stamp. This was a
+ request by Austin Frank.
+
+ - It is no longer necessary to update the refiling targets -
+ they are always current.
+
+ *** Misc
+
+ - In `org-goto', typing characters now automatically starts
+ isearch from the beginning of the buffer. The isearch is
+ special also because it only matches in headline. This goes
+ some way toward saving org-goto from being removed from
+ Org-mode. Thanks to Piotr Zielinski for the code, and sorry
+ that it took me o long to ut it in. If you prefer to use
+ single letters n,p,f,b,u,q for navigation as before,
+ configure the variable `org-goto-auto-isearch'.
+
+ - The clock table accepts a new parameter `:step'. This
+ parameter can be `day' or `week' and will result in separate
+ tables for each day or week in the requested time interval.
+ This was triggered by a proposal by Sacha Chua in her [blog].
+
+ - A time-stamp with a repeater now no longer refers to the
+ date *closest* to the current day. Instead, it means either
+ today or the most recent match. This change makes sure that
+ overdue scheduled or deadline items never disappear from the
+ agenda. With the previous convention, an overdue sheduled
+ item would disappear. For example, a weekly item scheduled
+ for Sunday would appear as overdue until Wednesday, and the
+ suddenly disappear until next Sunday. Now the item will
+ show up as "Sched 7x" on Saturday. From Sunday on it will
+ be in the list as "Scheduled", i.e. old sins will be
+ forgiven. This follows a request by Warong, Dennis and
+ Bernt.
+
+ - Archving a subtree now creates an additional property,
+ `ARCHIVE_OLPATH'. This property contains the "path" in the
+ outline tree to the archived entry, as it was in the
+ original file. For example, archiving `Fix the door' in the
+ following hierarchy
+
+ * Tasks
+ ** HOME
+ *** Garage
+ **** Fix the door
+
+ will file is with the following property
+
+ :ARCHIVE_PATH: Task/HOME/Garage
+
+ Note that you can configure (i.e. limit) the information
+ that gets stored upon archiving with the variable
+ `org-archive-save-context-info'.
+
+Version 5.19
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Column view can list the clocked times of a subtree.
+
+ - Storing remember notes can use the `org-refile' interface.
+
+ - Storing remember notes no longer produced empty lines.
+
+ - Moving subtrees now folds all siblings of the subtree.
+
+ - New variable `org-agenda-todo-keyword-format'.
+
+ - Hack to allow brackets in link descriptions.
+
+ - Clocking into an entry can enforce a specific TODO state.
+
+ - EXPORT_FILE_NAME may be an absolute file name with "~".
+
+ - Bug fixes, lots of them.
+
+Details
+=======
+
+ - A new special column definition lists the sum of all CLOCK
+ entries in a subtree. For example
+
+ #+COLUMNS: %20ITEM %10Time_Estimate{:} %CLOCKSUM
+
+ will allow you to compare estimated times (as given in the
+ Time_Estimate property) with the clocked times. This was a
+ request by Bernt Hansen.
+
+ - Storing remember notes can now use the `org-refile'
+ interface instead of the `org-goto' interface (see the
+ variable `org-remember-use-refile-when-interactive').
+ Nothing will change if the note is stored immediately after
+ pressing `C-c C-c' in the `*Remember*' buffer. But if you
+ have chosen (e.g. by pressing `C-u C-c C-c') to
+ interactively select the filing location (file and
+ headline), the refile interface will be used instead. I am
+ excited about this change, because the `org-goto' interface
+ is basically a failure, at least for this application. Note
+ that in any case the refile interface has to be configured
+ first by customizing `org-refile-targets'.
+
+ - Notes inserted with remember now remove any whitespace
+ before and after the note before being pasted, so that there
+ will be no empty lines inserted together with the note. We
+ could invent special syntax in remember templates to allow
+ creating empty lines before a note - is there anyone who'd
+ want this?
+
+ - Moving subtrees now folds all siblings of the subtree. This
+ is the only reasonably simple way I could find to avoid the
+ reported inconsistencies in the folding state of the outline
+ tree after moving entries. There are reasons to like this
+ new behavior, because it easily visualizes where the tree is
+ located after the move. Still, not everyone might be happy
+ with this. Massive complaining would be needed to make me
+ fix this.
+
+ - New variable `org-agenda-todo-keyword-format' to specify the
+ width of the TODO keyword field in the agenda display. Use
+ it to get things to line up better. This was a proposal by
+ Rainer Stengele.
+
+ - If a link description inserted with `C-c C-l' contains
+ brackets, the brackets will now be converted into curly
+ braces. This looks similar enough. Supporting brackets in
+ link descriptions is, for technical reasons too long to
+ explain here, complex.
+
+ - The new option `org-clock-in-switch-to-state' can be set to
+ a TODO state that will be enforced when the clock is started
+ on an entry. This follows an idea by Sacha Chua.
+
+ - The EXPORT_FILE_NAME property may now also be an absolute
+ file name, and it may contain abbreviations like "~" for the
+ users home directory. This was requested by Adam Spiers.
+
+ - Bug fixes, lots of them.
+
+Version 5.18
+~~~~~~~~~~~~
+
+ Minor fixes.
+
+Version 5.17
+~~~~~~~~~~~~
+
+Details
+=======
+
+Whitespace
+----------
+
+ - When cutting, pasting, or moving subtrees and items, the
+ empty lines *before* the subtree/item now belong to the
+ part and will be moved with it. There is one exception to
+ this rule: If the first child is moved down (or,
+ equivalently, the second is moved up), the amount of empty
+ lines *above* the first child to be moved along with it is
+ limited by the number of empty lines *below* it. This
+ sounds complicated, but it allows to have extra empty space
+ before the first child and still have good behavior of the
+ subtree motion commands.
+
+ - Plain lists items work the same.
+
+ I believe we have finally nailed this one. Thanks to Daniel
+ Pittman for bring this up again and to Eric Schulte for
+ pointing out that it is the empty lines *before* an entry
+ that really count.
+
+ This change was non-trivial, please give it a good test and
+ let me know about any problems.
+
+Remember
+--------
+
+ - The new command `org-remember-goto-last-stored' will jump
+ to the location of the remember note stored most recently.
+ If you have `org-remember' on a key like `C-c r', then you
+ can go to the location with a double prefix arg: `C-u C-u
+ C-c r'. This was a proposal by Rainer Stengele.
+
+ - Template items that are being prompted for can now specify
+ a default value and a completion table. Furthermore,
+ previous inputs at a specific prompt are captured in a
+ history variable. For example:
+
+ %^{Author|Roald Dahl|Thomas Mann|Larry Niven}
+
+ will prompt for an author name. Pressing RET without
+ typing anything will select "Roald Dahl". Completion will
+ give you any of the three names. And a history will be
+ kept, so you can use the arrow keys to get to previous
+ input. The history is tied to the prompt. By using the
+ same prompt in different templates, you can build a history
+ across templates. The ideas for this came from proposals
+ by Bastien and Adam.
+
+ - When a remember template contains the string `%!', the note
+ will be stored immediately after all template parts have
+ been filled in, so you don't even have to press `C-c
+ C-c'. The was a proposal by Adam Spiers.
+
+Refile
+------
+
+ - `org-refile-targets' has a new parameter to specify a
+ maximum level for target selection. Thanks to Wanrong Lin
+ for this proposal.
+
+ - When the new option `org-refile-use-outline-path' is set,
+ refile targets will be presented like a file path to the
+ completion interface: "level 1/level 2/level 3". This
+ may be the fastest interface yet to get to a certain
+ outline entry. Do we need to use this interface in other
+ places? Thanks to Jose Ruiz for this proposal.
+
+Version 5.16
+~~~~~~~~~~~~
+
+Details
+=======
+
+Restriction lock on agenda scope
+--------------------------------
+
+ You can now permanently lock the agenda construction to a
+ certain scope, like a file or a subtree. So instead of
+ pressing "<" for each command in the agenda dispatcher, you
+ only once select a restriction scope. All subsequent agenda
+ commands will than respect this restriction. For example,
+ you can use this at work, to limit agendas to your work file
+ or tree, and at home to limit to the home file or tree. Or
+ you can use it during the day in order to focus in on certain
+ projects.
+
+ You select a scope with the command `C-c C-x <', which
+ restricts to the current subtree. When called with a `C-u'
+ prefix, the restriction is to the current file. You can also
+ make restrictions from the speedbar frame, see below.
+
+ When making a new restriction and an agenda window is
+ currently visible, it will immediately be updated to reflect
+ the new scope. TO if you like you can display an agenda view
+ and then watch it change in various scopes.
+
+ To get rid of the restriction, use the command "C-c C-x >".
+ Or press ">" in the agenda dispatcher. Also, and use of "<"
+ in the dispatcher will disable the restriction lock and
+ select a new restriction.
+
+ Thanks to Rick Moynihan for triggering this development.
+
+Imenu and Speedbar support
+--------------------------
+
+ - Org-mode now supports Imenu. For example, with the setting
+
+ (add-hook 'org-mode-hook
+ (lambda () 'imenu-add-to-menubar "Imenu"))
+
+ a menu will be created in each Org-mode buffer that
+ provides access to all level 1 and level 2 headings. The
+ depth of the menu can be set with the variable
+ `org-imenu-depth'.
+
+ - org-mode now supports Speedbar. This means that you can
+ drill into the first and second level headlines of an
+ Org-mode file right from the speedbar frame.
+
+ - You can set a restriction lock for the Org-mode agenda to a
+ file or a subtree directly from the speedbar frame. Just
+ press "<" with the cursor on an Org-mode file or subtree to
+ set the lock and immediately update the agenda if it is
+ visible. Use ">" to get rid of the lock again.
+
+Version 5.15
+~~~~~~~~~~~~
+
+Details
+=======
+
+ - There are new special properties TIMESTAMP and TIMESTAMP_IA.
+ These can be used to access the first keyword-less active
+ and inactive timestamp in an entry, respectively.
+
+ - New variable `org-clock-heading-function'. It can be set to
+ a function that creates the string shown in the mode line
+ when a clock is running. Thanks to Tom Weissmann for this
+ idea.
+
+ - Bug fixes.
+
+Version 5.14
+~~~~~~~~~~~~
+
+Overview
+========
+
+ + Remember and related stuff
+ - New command `org-refile' to quickly move a note.
+ - Easy way to jump to the target location of remember template.
+ - New %-escapes in remember templates: %c %(...) and %[...]
+ - `org-remember-insinuate' simplifies remember setup
+
+ + Emphasis and Font-lock stuff
+ - Stacked emphasis is no longer allowed.
+ - You may finally emphasize a single character like `*a*'.
+ - Font-lock now can hide the emphasis markers
+ - Text in the "=" emphasis is exported verbatim
+ - There is a new emphasis marker "~" for verbatim text
+ - Constructs treated specially by the exporters can be highlighted
+
+ + Properties and Column view
+ - More control over which properties use inheritance
+ - CATEGORY="work" can now be used in a tags/property search
+ - the {+} summary type can specify a printf-style output format
+ - New currency summary type {$}
+
+ + The date/time prompt
+ - While entering data, watch live the current interpretation.
+ - The date prompt now prefers to select the future
+ - Easier modification of time in an existing time stamp.
+
+ + Export
+ - You can now export some special strings in HTML, like "..."
+ - #+EMAIL: may contain several email addresses
+
+ + Agenda
+ - In the agenda, a few keys have changed: `g', `G', and `e'.
+
+ + Miscellaneous
+ - Class-dependent sectioning structures in LaTeX export.
+ - Radio-lists modeled after the radio tables.
+ - The default for `org-ellipsis' is back to nil
+ - Support for pabbrev-mode
+ - New variable `org-show-entry-below'.
+
+Incompatible changes
+====================
+
+ - If you have customized the variable `org-emphasis-alist' or
+ org-export-emphasis-alist', you need to do it again by first
+ canceling your customization and then adding it again.
+
+ - I know that some people have defined their own private helper
+ functions to select a specific remember template, without being
+ prompted, like this:
+
+ (defun my-remember-template-n ()
+ (interactive)
+ (org-remember ?n))
+
+ You need to modify this. The character selecting the template
+ must now be the /second/ argument to `org-remember':
+
+ (defun my-remember-template-n ()
+ (interactive)
+ (org-remember nil ?n))
+
+ - `C-c C-w' now refiles an entry. To get a sparse tree of
+ deadlines, use `C-c / d' instead.
+
+Details
+=======
+
+Remember and related stuff
+--------------------------
+
+ - New command `org-refile' to quickly move a note to a
+ different place. It is bound to `C-c C-w'. The foremost
+ application might be to put a note or task captured with
+ `remember' into the proper list or project. The command
+ offers a list of possible refiling targets for completion.
+ These are headings under which the entry will be inserted
+ as a subitem. By default, this will offer all top-level
+ headings in the current buffer, but you can configure the
+ variable `org-refile-targets' to get more complex
+ definitions. For example:
+
+ (setq org-refile-targets '((nil . (:level . 2))))
+
+ selects all level 2 headlines in the current buffer as
+ targets. And
+
+ (setq org-refile-targets
+ '((org-agenda-files . (:tag . "refile"))))
+
+ searches all agenda files and selects headlines that are
+ explicitly marked with the tag :refile: . Note that the
+ list of targets is built upon first use only, to rebuilt
+ it, call the command `C-c C-w' with a double prefix
+ argument.
+
+ This is based on an idea and example implementation by Max
+ Mikhanosha. Many thanks Max.
+
+ - You can now use a C-u prefix on `org-remember' to jump to
+ the location where a specific templates stores its notes.
+ For example, if you have `org-remember' bound to `C-c r',
+ then `C-u C-c r n' will get you to the file and headline
+ given in the template associated with the letter "n".
+
+ This was proposed by someone, but I have lost track who.
+ Sorry, and thanks anyway.
+
+ - New %-escapes in remember templates:
+
+ %c insert the current clipboard, like C-y would do
+ %(..) evaluate Lisp expression and insert the result
+ %[..] include file
+
+ Thanks to Adam Spiers and Tim O'Callaghan.
+
+ - New function `org-remember-insinuate' that makes is easier
+ to set Org-mode specific values for remember variables.
+ Thanks to Michael Olson for this proposal. It is
+ equivalent to:
+
+ (require 'remember)
+ (setq remember-annotation-functions '(org-remember-annotation))
+ (setq remember-handler-functions '(org-remember-handler))
+ (add-hook 'remember-mode-hook 'org-remember-apply-template))
+
+ You might still want to set `org-default-notes-file' to
+ provide a default for templates without a file, and
+ `org-directory' to show where to find other org files.
+
+Emphasis and Font-lock stuff
+----------------------------
+
+ - Stacked emphasis like `*/bold italic/*' is no longer allowed.
+
+ - You may finally emphasize a single character like `*a*'.
+
+ - Font-lock now can hide the emphasis markers, just like Muse
+ does. Configure the variable `org-hide-emphasis-markers'
+ if you want this. Showing the characters continues to be
+ the default in Org-mode.
+
+ - Text in the "=" emphasis is now exported verbatim, i.e. no
+ further parsing and interpretation of this text takes place. So
+ you can write `=quoted *xxx* a_x = b='. This and the following
+ point implement a request by Daniel Clemente.
+
+ - There is a new emphasis marker "~" which marks text to be
+ exported verbatim, without special formatting. Inside an
+ org-mode file, this text is highlighted with the org-verbatim
+ face. I am not happy with the face yet (currently is is like
+ org-code, but underlined), please suggest a better one.
+
+ - Whether an emphasis environment is verbatim or not is now an
+ extra flag in the variable `org-emphasis-alist'. If you have
+ configured this variable, do it again by first canceling your
+ customization to revert to the default, and then adding it
+ again.
+
+ - New variable `org-highlight-latex-fragments-and-specials'.
+ When turned on, Org-mode will highlight all strings that
+ are treated in a special way by the exporters. This is
+ great for export-oriented writing, but maybe a bit noisy
+ for note taking, so this feature is off by default.
+
+Properties and Column view
+--------------------------
+
+ - `org-use-property-inheritance' may now also be a list of
+ property names that should be treated with inheritance
+ during searches.
+
+ - CATEGORY="work" can now be used in a tags/property search,
+ even if the category is not specified as a property in the
+ entry, but rather is inherited or derived from #+CATEGORY.
+ Thanks to Adam, Tim, and Bastien for an interesting
+ discussion around this issue.
+
+ - Summary type improvements in column view.
+ * The {+} summary type can specify a printf-style output
+ format for computed values like this: {+;%5.2f}
+ This was triggered by a report by Levin.
+ * New currency summary type {$}, which so far is just a
+ shorthand for {+;%.2f}. Do we need to have a currency
+ symbol in front of each value. Scott Jaderholm asked for
+ this, but I am not sure if this is already what he meant.
+
+The date/time prompt
+--------------------
+
+ There have been several small but *very* useful additions to
+ the date prompt.
+
+ - While entering data at the date prompt, the current
+ interpretation of your input is shown next to your input in
+ the minibuffer. I find this great to understand how the
+ input works. If you find the extra stuff in the minibuffer
+ annoying, turn it off with `org-read-date-display-live'.
+
+ - The date prompt now prefers to select the future. If you
+ enter a date without a month, and the day number is before
+ today (for example, on the 16th of the month you enter
+ "9"), Org-mode will assume next month. Similarly, if you
+ enter a month and no year, next year will be assumed if the
+ entered month is before the current, for example if you
+ enter "May" in September. Thanks to John Rakestraw for
+ this great suggestion. If you find it confusing, turn it
+ off with `org-read-date-prefer-future'.
+
+ - When modifying an existing date using `C-c .' at the stamp,
+ the time or time range in the stamp are now offered as
+ default input at the prompt. This goes a long way to
+ simplifying the modification of an existing date. Thanks
+ to Adam Spiers for this proposal.
+
+Export (all implemented by Bastien...)
+--------------------------------------
+
+ - You can now export special strings in HTML. Here is the
+ list of newly performed conversions:
+
+ Org Description HTML
+ -----+------------------------------------+----------
+ `\\-' double backslash followed by minus &shy;
+ `--' two dashes (minuses) &ndash;
+ `---' three dashes (minuses) &mdash;
+ `...' three dots &hellip;
+
+ You can turn this globally on or off with
+ `org-export-with-special-strings' or locally with "-:t" or
+ "-:nil" in the #+OPTIONS line. Thanks to Adam Spiers for
+ starting the discussion, and thanks to Daniel Clemente and
+ William Henney for relevant inputs.
+
+ - Comma-separated emails in #+EMAIL: are correctly exported.
+ Thanks to Raman for pointing out this omission.
+
+Agenda
+------
+
+ - In the agenda, a few keys have changed
+ g does now the same a "r", refresh current display,
+ because "g" is the Emacs standard for "refresh"
+ G toggle the time grid, used to be "g"
+ e Execute another agenda command, pretty much the same as
+ `C-c a', but shorter and keep the same agenda window.
+
+Miscellaneous (much of it from Bastien)
+---------------------------------------
+
+ - You can now select the sectioning structure of your LaTeX
+ export by setting it either globally
+ (`org-export-latex-default-class') or locally in each Org
+ file (with #+LaTeX_CLASS: myclass). You can also customize
+ the list of available classes and their sectioning
+ structures through the new `org-export-latex-classes'
+ option. Thanks to Daniel for discussions and suggestion on
+ this issue.
+
+ - You can send and receive radio lists in HTML,
+ LaTeX or TeXInfo, just as you send and receive radio
+ tables. Check the documentation for details and examples.
+
+ - The default for `org-ellipsis' is back to nil, some people
+ seem to have had problems with the face as a default.
+
+ - Support for pabbrev-mode, needs pabbrev version 1.1. Thanks
+ to Phillip Lord for adapting his package to make this
+ possible.
+
+ - New variable `org-show-entry-below' to force context-showing
+ commands to expose the body of a headline that is being
+ shown. Thanks to Harald Weis for pointing out this omission.
+
+
+Version 5.13i
+~~~~~~~~~~~~~
+
+Details
+=======
+
+ - On the date/time prompt, you can now also answer with
+ something like +2tue to pick the second tuesday from today.
+ This was a proposal by Sacha Chua.
+
+ - When interpopating into Lisp formulas in the spreadsheet,
+ the values of constants and properties are no longer
+ enclosed into parenthesis. When interpolating for calc,
+ this still happens in order to allow expressions in
+ constants. This problem was reported by Eddward DeVilla.
+
+ - When a directory is listed in `org-agenda-files', all files
+ with extension matched by the new variable
+ `org-agenda-file-regexp' in that directory will be agenda
+ files.
+
+ - Bug fixes.
+
+Version 5.13
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Bug fixes and improvements in column view
+ + All known bugs fixed.
+ + A Column view can be captured into a dynamic block.
+ + The ITEM column is formatted core compactly.
+ + Also ITEM can be edited with `e'
+
+ - The agenda dispatcher
+ + `<' cycles through restriction states.
+ + Multi-character access codes to commands (= sub-keymaps).
+
+ - Sorting improvements
+ + User-defined sorting keys.
+ + Sorting by properties.
+ + Sorting of plain lists.
+
+ - HTML <div> structure
+
+ - Other stuff
+ + New variables, several of them.
+ + Drawers can be set on a per-file basis.
+ + Better control over priority fontification in agenda.
+ + M-up and M-down now move the current line up and down.
+ + Abort remember template selection with C-g.
+
+Details
+=======
+
+Bug fixes and improvements in column view
+-----------------------------------------
+
+ - All the bugs described by Scott Jaderholm have been fixed
+ (at least I hope so...).
+
+ - You can now capture a column view into a dynamic block, for
+ exporting or printing it. The column view can be
+
+ + global, i.e. for the entire file
+ + local, i.e. for the subtree where the dynamic block is
+ + from an entry with a specific :ID: property.
+
+ You can identify the entry whose column view you want to
+ capture by assigning an :ID: property, and use that property
+ in the dynamic block definition. For example:
+
+ * Planning
+ :PROPERTIES:
+ :ID: planning-overview
+ :END:
+
+ [...]
+
+ * The column view
+ #+BEGIN: columnview :hlines 1 :id "planning-overview"
+
+ #+END:
+
+ Use `C-c C-x r' to insert such a dynamic block, and you will
+ be prompted for the ID.
+
+ - When the current column format displays TODO keyword,
+ priority or tags, these parts are stripped from the content
+ of the ITEM column, making for more compact and readable
+ entries. When any of these "properties" are not listed in
+ the current column format, they are instead retained in the
+ ITEM column.
+
+ - You can now also edit the ITEM column with `e'.
+
+The agenda dispatcher
+---------------------
+
+ - Instead of pressing `1' to restrict an agenda command to
+ the current buffer, or `0' to restrict it to the current
+ subtree or region, you can now also press `<' once or
+ twice, respectively. This frees up `1' and `0' for user
+ commands, a request by Bastien. In fact, "<" cycles
+ through different restriction states. "1" and "0" are
+ still available for backward compatibility, until you bind
+ them to custom commands.
+
+ - The access code to custom agenda commands can now contain
+ several characters, effectively allowing to bundle several
+ similar commands into a sub-keymap. This follows an
+ excellent proposal by Adam Spiers. For example:
+
+ (setq org-agenda-custom-commands
+ '(("h" . "HOME + Name tag searches") ; describe prefix "h"
+ ("hl" tags "+HOME+Lisa")
+ ("hp" tags "+HOME+Peter")
+ ("hk" tags "+HOME+Kim")))
+
+ - The user function option in org-agenda-custom-commands may
+ now also be a lambda expression, following a request by
+ Adam Spiers.
+
+Sorting improvements
+--------------------
+
+ We are using a new routine for sorting entries, courtesy of
+ John Wiegley. Many thanks to John.
+
+ - You can define your own function to extract a sorting key
+ and in this way sort entries by anything you like.
+
+ - Entries can now be sorted according to the value of a
+ property.
+
+ - Plain lists can be sorted.
+
+HTML <div> structure
+--------------------
+
+ There is now a <div>-based structure in exported HTML.
+
+ - The table of context is wrapped into a div with a class
+ "table-of-contents".
+
+ - The outline structure is embedded in <div> elements with
+ classes "outline-1", "outline-2" etc.
+
+ - The postamble, containing the author information and the
+ date is wrapped into a div with class "postamble".
+
+ I am not sure if the class names are the best choice, let me
+ know if there are more "canonical" choices.
+
+ Thanks to Mike Newman and Cezar for input, and in particular
+ to Mike for his clearly formulated specification.
+
+Other stuff
+-----------
+
+ - New variable `org-agenda-window-frame-fractions' to
+ customize the size limits of the agenda window in the case
+ that you display the agenda window by reorganizing the
+ frame.
+
+ - Drawers can be set on a per-file basis using
+
+ #+DRAWERS: HIDDEN STATE PROPERTIES
+
+ This will define the drawers :HIDDEN: and :STATE:.
+ The :PROPERTY: drawer should always be part of this list, or
+ your properties will not be folded away.
+ Thanks to Richard G. Riley for this proposal.
+
+ - `org-agenda-fontify-priorities' may now also be an
+ association list of priorities and faces, to specify the
+ faces of priorities in the agenda individually.
+
+ - The variable `org-export-with-property-drawer' no longer
+ exists, please use `org-export-with-drawers' instead. Also,
+ the corresponding switch in the #+OPTIONS line has changed
+ from "p" to "d". Thanks to Bastien for pointing out that we
+ needed to handle not only the property drawer.
+
+ - M-up and M-down now move the current line up and down (if
+ not at a headline, item or table). Among other things you
+ can use this to re-order properties in the drawer. This was
+ a proposal by Bastien.
+
+ - New variable `org-agenda-todo-ignore-with-date', based on a
+ request by Wanrong Lin.
+
+ - Aborting remember template selection with C-g now kills the
+ remember buffer and restores the old window configuration.
+ This was a request by Nuutti Kotivuori.
+
+Version 5.12
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Remember templates can now have name.
+ - `C-c C-k' will abort taking a note (remember of log)
+ - `C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg.
+ - Lines in the agenda can be fontified according to priority.
+ - New variable `org-scheduled-past-days'.
+ - New variables `org-agenda-deadline-leaders' and
+ `org-agenda-scheduled-leaders'.
+ - New sparse tree function `org-sparse-tree'.
+ - The variable `org-ellipsis' now defaults to `org-link'.
+ - The #+OPTIONS line has a new option "tags".
+ - New variable `org-use-property-inheritance'.
+
+Incompatible Changes
+====================
+
+ - `C-c /' now calls `org-sparse-tree'.
+
+Details
+=======
+
+ - Remember templates can now have a template name as the first
+ element. The name will be listed along with the selection
+ character when prompting for a template. It is best to have
+ the name start with the selection character, for example if
+ you use ("Note" "n"), you will be prompted like "[n]ote".
+ Thanks to Matiyam for this proposal.
+
+ - `C-c C-k' will abort taking a note. You can use this in remember
+ buffers and when taking a logging note (e.g. for a state
+ change). Thanks to Bastien.
+
+ - `C-c C-x C-w' and `C-c C-x M-w' now accept a prefix arg to
+ cut N sequential subtrees. This was a proposal by John.
+
+ - Lines in the agenda are now bold if they have priority A and
+ italic if they have priority C. You can turn this off using
+ the variable `org-agenda-fontify-priorities'. Thanks to
+ John Wiegley for the idea and code.
+
+ - New variable `org-scheduled-past-days' to set the number a
+ scheduled item will be listed after its date has passed.
+ Default is 10000, i.e. indefinitely.
+
+ - New variables `org-agenda-deadline-leaders' and
+ `org-agenda-scheduled-leaders' to adjust the leading text o
+ scheduled items and deadline in the agenda. Thanks to John
+ Wiegley for a patch.
+
+ - New sparse tree function `org-sparse-tree'. This is now the
+ default binding for `C-c /'. It requires one additional
+ keypress to select a command, but in return is provides a
+ single interface to all the different sparse tree commands,
+ with full completion support.
+
+ - The variable `org-ellipsis' now defaults to the face
+ `org-link' because the visibility of the dots is really bad
+ and I have found this change very useful indeed.
+
+ - The #+OPTIONS line has a new option "tags" which can be used
+ to set `org-export-with-tags'. Thanks to Wanrong Lin for
+ this proposal.
+
+ - New variable `org-use-property-inheritance'. Configure it
+ to `t' if you want that searching for entries with certain
+ properties always should assume inheritance. This is not
+ well tested yet, please check it out.
+
+ - Bug fixes
+
+Version 5.11
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - SUMMARY, DESCRIPTION, LOCATION properties for iCalendar
+ - Command to jump to the running clock
+ - Clock entries can now have their own drawer
+ - `C-c C-x C-r' only updates a clocktable at point
+ - New way to assign a remember template to a single key
+ - `C-n' and `C-p' are back to their default binding
+ - `C-x C-s' in agenda buffer saves all org-mode buffers
+ - Schedule/deadline leaves note in agenda buffer
+ - Prefix argument for `C-c C-d/s' will remove date
+ - New variable to make block aranda more compact
+ - Better tag alignment in agenda
+
+Incompatible changes
+====================
+
+ - If you have customized `org-drawers', you need to add
+ "CLOCK" to the list of drawers.
+
+ - The variable `org-agenda-align-tags-to-column' has been
+ renamed to `org-agenda-tags-column'. The old name is still
+ an alias, in Emacs 22 and in XEmacs, but not in Emacs 21.
+
+ - The default value for both `org-tags-column' and
+ `org-agenda-tags-column' is now -80.
+
+ - The variable
+ `org-insert-labeled-timestamps-before-properties-drawer'
+ is now obsolete.
+
+Details
+=======
+
+ - The LOGGING property allows to modify the settings for
+ progress logging for a single entry. For example:
+
+ :PROPERTIES:
+ :LOGGING: nologging nologrepeat
+ :END:
+
+ turns off all progress logging for the current entry and its
+ children.
+
+ - The properties SUMMARY, DESCRIPTION and LOCATION have
+ special meaning during iCalendar export, when they translate
+ to the corresponding VEVENT and VTODO fields. If not given,
+ Org-ode continues to use cleaned-up version of the headline
+ and body as the summary and the description, respectively.
+
+ - New function to go to the entry with the currently running
+ clock. Bound to `C-c C-x C-j', in agenda also to "J". If
+ you use this often, you might even want to assign a global
+ key. Thanks to Bernt and Bastien.
+
+ - Clock entries can now have their own drawer, the :CLOCK:
+ drawer. Check out the variable `org-clock-into-drawer' for
+ configuration of this feature. The default is to create a
+ drawer when the second clocking line gets added to an entry.
+ Note that "CLOCK" has been added to the default value of
+ `org-drawers', but if you have configured that variable, you
+ must go back and add "CLOCK" yourself to get this drawer
+ folded away. Thanks to Tom Weissman for pointing out that
+ too many clock entries are visually annoying.
+
+ - `C-c C-x C-r' no longer tries to find the first clocktable
+ in a buffer and then updates it. Instead, it will update
+ the clocktable at point if there is one (same as C-c C-c
+ will do if the cursor is in the "#+BEGIN" line of the
+ table). If there is none at point, a new one will be
+ inserted. This change was necessary because the new :scope
+ parameter allows to have several clocktables in a buffer.
+ Thanks to Bastien for pointing this out.
+ To update all dynamic blocks in a file, use `C-u C-c C-x C-u'.
+
+ - The function `org-remember' can now be called with a
+ template selection key as argument. This helps to make key
+ bindings that go directly to a specific template without
+ being prompted for a template, like this:
+
+ (global-set-key [f5] (lambda () (interactive) (org-remember "j")))
+
+ Thanks to Richard G Riley for bringing this up.
+
+ - `C-n' and `C-p' are back to their default binding
+ (next/previous line) in the agenda buffer. Enough people,
+ including recently Denis Bueno, have complained about this,
+ and I agree it is not good to break habits like that.
+
+ - `C-x C-s' in an agenda buffer now saves all org-mode buffers
+ (also `s' does this).
+
+ - Setting schedule or deadline dates from the agenda now
+ produces a note in the agenda, similarly to what happens
+ with S-left/right.
+
+ - Using a prefix argument for `C-c C-d' or `C-c C-s' will
+ remove the deadline or scheduling date from an item. Thanks
+ to Wanrong Lin for this proposal.
+
+ - New variable `org-agenda-compact-blocks'. When set, the
+ space between blocks in a block agenda is reduced as much as
+ possible, to show more items on a single screen.
+
+ - The variable `org-agenda-tags-column' (renamed from
+ `org-agenda-align-tags-to-column') can now also be negative,
+ to mean alignment to the left. The new default is -80, just
+ like it is now for `org-tags-column'.
+
+ - Bug fixes
+
+Version 5.10
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Category and the archive location can be properties.
+ - The clocktable has a new `:scope' parameter.
+ - CSV support when importing a table.
+ - Better defaults when modifying a time stamp.
+ - New way to specify the duration of an appointment.
+ - More aggressive version of orgstruct-mode improved wrapping.
+ - Modifications to priority cycling.
+ - Modifications to computations in column view.
+ - New command `org-occur-in-agenda-files'.
+ - Bug fixes.
+
+Details
+=======
+
+ - Both the category and the archive location in a (sub)tree of
+ the buffer can now be specified using a property, for
+ example:
+
+ * Tree with special properties
+ :PROPERTIES:
+ :CATEGORY: Examples
+ :ARCHIVE: /some/special/file::
+ :END:
+
+ This is a much cleaner way of dealing with multiple
+ categories and archives in a single file. The preferred use
+ of the `#+CATEGORY' and `#+ARCHIVE' lines is now to set a
+ *single* default for the file which is then locally
+ overruled by properties. This was a proposal from Bastien
+ if I remember correctly. Multiple `#+' lines still work
+ and I don't plan to remove this support soon, but I
+ encourage you to stop using them.
+
+ - The clocktable has a new `:scope' parameter that determines
+ the range in the file from which clock entries should be
+ taken. This can be anything from the local subtree to the
+ entire buffer to even the full list of agenda files. Legal
+ values are:
+
+ value scope
+ ---------+-------------------------------------------------
+ nil the current buffer or narrowed region
+ file the full current buffer
+ subtree the subtree where the clocktable is located
+ treeN the surrounding level N tree, for example tree3
+ tree the surrounding level 1 tree
+ agenda all agenda files
+
+ Thanks to Jason F. McBrayer and Bernt Hansen for
+ inspiration. Thanks to cranreuch (what is you full name?)
+ for mentioning, at the right moment, that the clocktable is
+ not so bad - that remark made it seem worthwhile to add
+ features.
+
+ - The commands to import a table and to convert a region to a
+ table can now handle comma-separated values (CSV). The
+ algorithm does not yet treat quoting correctly, but for
+ basic input it works.
+
+ - When modifying an existing time stamp, or when entering the
+ second stamp of a range, the date prompt will now
+ consistently default to the date/time in the existing stamp.
+ This was triggered by Nuutti Kotivuori's request.
+
+ - At the date/time prompt, there is a new way to specify a
+ range of hours, by using "+DURATION" after the time. For
+ example:
+
+ 14:00+2 means 14:00-16:00
+ 2pm+2:30 means 14:00-16:30
+
+ Again, Nuutti Kotivuori's request.
+
+ - When you use the function `turn-on-orgstruct++' to turn on
+ orgstruct-mode, the special org-mode settings for
+ auto-filling, indentation and paragraphs are exported into
+ the buffer, so that typing list items with indentation works
+ better. This was Bastien's idea and request.
+
+ - New variable `org-priority-start-cycle-with-default'. When
+ t (the default), priority cycling will initially set the
+ default priority and then increase or decrease. When nil,
+ the first priority set by cycling is already 1 different
+ from the default priority. This was mostly driven by
+ Bastien.
+
+ - In column view: When an entry has a property for a summary
+ column defined, its value is normally overwritten by the sum
+ of all the children's values each time you enter column
+ view. Now there is an exception to this rule: If none of
+ the children has that particular property defined, the
+ parent's value stays. In this way you can still place TODO
+ items under such an entry without getting the property value
+ changed. Thanks to Russel Adams for pointing out that this
+ is a better way of doing things.
+
+ - In column view, computed values are now bold face, and
+ trying to edit them is an error. I think this works, but
+ testing is appreciated.
+
+ - New command `org-occur-in-agenda-files', this is basically
+ the quick command John Wiegley proposed the other day, but
+ it also works when the agenda files are not yet in buffers.
+ The key is `C-c C-x /', any better proposals?
+
+ - Links containing a space will now be handled correctly when
+ calling the browser. Note that you need to enclose such
+ links in square or angular brackets.
+
+ - Bug fixes.
+
+Version 5.09
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Taking a note upon TODO state changes can be restricted to
+ selected states.
+
+ - The format in which dates are shown in the daily/weekly
+ agenda can be configured.
+
+ - The default for `org-remember-store-without-prompt' is now t.
+
+ - `org-goto' has been made into a general lookup command.
+
+ - Priority cycling goes back to the nil state.
+
+ - You can store a remember note to the *last used* location.
+
+ - On Emacs 23, the headline faces for org-mode are now
+ inherited from the outline faces.
+
+Incompatible Changes
+====================
+
+ - The default for `org-remember-store-without-prompt' is now
+ t, in order to better match the original intent of
+ remember.el (storing a note with minimum interruption of
+ work flow). I expect that many people will be hit by this
+ incompatible change - nevertheless I believe it is the right
+ thing to do.
+
+Details
+=======
+
+ - You can now select specific states for recording a note when
+ switching to that state. With the setting
+
+ #+SEQ_TODO: TODO(t) ORDERED(o@) INVOICE(i@) PAYED(p) | RECEIVED(r)
+ #+STARTUP: lognotestate
+
+ only the states ORDERED and INVOICE will record a timestamp
+ and a note.
+
+ - You can now set the format of the string for each day in the
+ agenda and timeline buffers. You can use a format string
+ interpreted by `format-time-string', or you can write your
+ own function. Configure the new variable
+ `org-agenda-format-date'. Thanks to Levin for triggering
+ this development with a patch.
+
+ - The default for `org-remember-store-without-prompt' is now
+ t, in order to better match the original intent of
+ remember.el (storing a note with minimum interruption of
+ work flow). Since we can assign files and headlines to
+ templates, I guess this takes care of selecting a filing
+ location in most cases. For interactive filing, you now
+ need a prefix command when exiting `remember'.
+
+ - `org-goto' (bound to `C-c C-j') now uses an indirect buffer
+ and has additional commands enabled: Org-occur with `C-c /'
+ or even faster with `/', and the commands needed to select
+ and copy a region. This make `org-goto' a more general
+ lookup command instead of only a jumping command. Remember
+ that you can exit with `Q' to go back to the original
+ location. Thanks to William Henney for this idea.
+
+ - Setting the priority with S-up/down now cycles back to a
+ state where no priority is specified. This was requested by
+ Rick Moynihan.
+
+ - You can store a remember note to the *last used* location.
+ So if you select a location interactively once, you can
+ re-use it without having to find it again. For this, exit
+ the remember buffer with `C-u C-u C-c C-c'. The leading
+ comment in the remember buffer will tell exactly where the
+ note goes if you exit with a particular command.
+ Thanks to Maxim Loginov for this idea.
+
+ - On Emacs 23, the headline faces for org-mode are now
+ inherited from the outline faces. This is just a
+ convenience, so that you only have to configure one set of
+ faces, and that will then be outline-1 .. outline-8. You
+ will actually not see any difference in org-mode, because
+ Stefan Monnier has made the outline faces in Emacs 23 to
+ match the current org-mode faces.
+
+ This change does not effect XEmacs, nor Emacs 21 and 22.
+
+Version 5.08
+~~~~~~~~~~~~
+
+Incompatible changes
+====================
+
+ - The default for `org-deadline-warning-days' is now 14.
+
+Details
+=======
+
+ - There is now a separate interface for fast and directly
+ setting a TODO keyword. This interface kicks in when you
+ have configured keys for TODO keywords like
+
+ #+SEQ_TODO: TODO(t) WAITING(w) | DONE(d) CANCELED(c)
+
+ C-c C-t still does the cycling thing, you need to use a
+ prefix argument to get to the fast interface. Or configure
+ the variable `org-use-fast-todo-selection' to t, then this
+ will be the default and the prefix argument will make the
+ command fall back to cycling.
+
+ The tag selection no longer does include TODO keywords -
+ Leo's arguments have convinced me that this is not a good
+ idea. If you'd like to see the TODO keywords in the tags
+ interface anyway, set the variable
+ `org-fast-tag-selection-include-todo'. Thanks to Leo and
+ others for input on this issue.
+
+ - New variable `org-edit-timestamp-down-means-later'. When
+ set, `S-down' on a timestamp will change the timestamp to
+ later. Thanks to Raman for this idea.
+
+ - Property names can now contain non-ascii word characters.
+ This follows a request from Daniel Clemente.
+
+ - For export, the date that should be given in the exported
+ file can now be set to a specific value with a line like
+
+ #+DATE: 15 November 2003
+
+ If you want to use the date/time when the file was created,
+ use a format string that will be interpreted by
+ `format-time-string', for example:
+
+ #+DATE: %Y/%m/%d %X
+
+ - The default of `org-deadline-warning-days' has changed to 14
+ days. 30 was really too much, I suspect most people (me
+ included) have changed this.
+
+ - When a deadline has an individual lead time, this lead time
+ obviously overrules `org-deadline-warning-days'. However,
+ if you bind `org-deadline-warning-days' to a number <=0, for
+ example during a custom agenda command, then the absolute
+ value of this number will be enforced also when a different
+ lead time has been specified. This is useful to get a list
+ of all deadlines coming up in the next N days.
+
+Version 5.07
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Different faces for different TODO keywords.
+
+ - Setting TODO states through the TAG setting interface.
+
+ - Context information is stored when moving a tree to the archive.
+
+ - Sorting can be done by priority.
+
+ - `Org-ellipsis' can now also be a face.
+
+ - Scheduling info is no longer removed entry is marked CLOSED.
+
+ - Unavailable files in `org-agenda-files' can be skipped.
+
+Incompatible changes
+====================
+
+ - The time of archiving is now stored as a property.
+ ARCHIVED is no longer a special time keyword.
+
+ - Scheduling info is no longer removed entry is marked CLOSED.
+
+Details
+=======
+
+ - You can now define different faces for different TODO
+ keywords. This request has come up frequently, so here it
+ is: Use the variable `org-todo-keyword-faces'.
+
+ A Here is a configuration example:
+
+ (setq org-todo-keyword-faces
+ '(("TODO" . org-warning)
+ ("DEFERRED" . shadow)
+ ("CANCELED" . (:foreground "blue" :weight bold
+ :underline t))))
+
+ Org-mode continue still use `org-todo' and `org-done' for
+ keywords that have no specific face assigned.
+
+ - Some People use TODO states more like tags. For them the
+ TODO keywords mark special states and they like to quickly
+ switch between states in arbitrary sequence. The standard
+ TODO interface is not perfect for this, because it assumes
+ that the states are reached in sequence. However, the fast
+ tag setting interface is in fact perfect for this. You can
+ now "misuse" the TAG selection interface to also set TODO
+ states. All you need to do is to assign keys to the TODO
+ states, just like you also do for tags.
+
+ #+SEQ_TODO: TODO(t) WAITING(w) | CANCELED(c) DONE(d)
+ #+TAGS: @HOME(h) @OFFICE(o) @SHOP(s)
+
+ Next time you try to set tags with C-c C-c, the todo states
+ will be offered as well, and the corresponding key will
+ switch the entry to that state.
+
+ - New variable `org-archive-save-context-info' governs if
+ information that would be lost by moving a subtree to the
+ archive file, should be stored as special properties. For
+ example,
+
+ (setq org-archive-save-context-info '(itags category))
+
+ will store the inherited tags and the category in properties
+ ARCHIVE_ITAGS and ARCHIVE_CATEGORY, respectively. The
+ default setting for this variable is to save everything that
+ could be lost. This was a proposal by John Wiegley.
+
+ - Sorting (`C-c ^') can use the use the priority to sort. Use
+ the "p" and "P" keys at the prompt. John Wiegley, again.
+
+ - `Org-ellipsis' can now also be a face to make the folding
+ ellipsis more visible. This is based on a post by Tassilo
+ Horn. Since `org-ellipsis' only works in Org-mode, you
+ might want to use Tassilo Horn's hack directly in order to
+ affect the folding ellipsis globally.
+
+ - Scheduling info is no longer removed when an entry is marked
+ CLOSED. This was a request by Brian van den Broek. Let me
+ know if this breaks anything for you - then it will become
+ an option.
+
+ - New option `org-agenda-skip-unavailable-files'. Currently,
+ if a file does not exist, it will be removed from
+ `org-agenda-files' after a query. When this option is set,
+ the file will simply be skipped.
+
+ - Bug fixes.
+
+Version 5.06
+~~~~~~~~~~~~
+
+Overview
+========
+
+Details
+=======
+
+ - When exporting only a region and this region is a single
+ (sub)tree (for example selected with `C-c @'), the title for
+ the exported document is taken to be the heading of the
+ subtree. The sublevels become top-level entries in the
+ export. Furthermore, if the head entry of the tree has or
+ inherits an EXPORT_FILE_NAME property, that file name (with
+ appropriately substituted extension) will be used for the
+ exported tree. Thanks to Patrick Drechsler and Jost Burkart
+ for these ideas.
+
+ - org-special-ctrl-a/e has a third allowed value, `reversed'.
+ When it is set to this value, the first C-a or C-e command
+ behaves normally, i.e. it goes to the true beginning or end
+ of the line. Only when you press C-a or C-e immediately
+ again, the the "special" position will be found. Additional
+ presses of the same key jump between the two positions. I
+ like this a lot better than the `t' setting, because now the
+ keys behave more predictable and still give easy access to
+ the special locations.
+
+ - New command to set or remove a tag from all headlines in a
+ region.
+
+ - When Org-mode visits a file, it will initially hide all
+ drawers.
+
+ - The default of the variable `org-cycle-global-at-bob' is now
+ nil, meaning that TAB no longer does global visibility
+ cycling at the beginning of the buffer.
+
+ - Bug fixes, in particular the problems with scheduling and
+ deadlines introduced in 5.05. Please check carefully if
+ this works correctly again, and complain if not.
+
+Version 5.05
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - LaTeX export, finally, thanks to Bastien.
+
+ - Extension mechanism for the hyperlink system.
+
+ - Global access to commands inserting and following links.
+
+ - Individual lead-times for deadlines.
+
+ - Option to show only the next instance of repeating timestamp.
+
+ - Store remember notes with only 2 keys: C-c C-c
+
+ - Appointment reminders from Org-mode.
+
+ - Global values for selected properties.
+
+ - Bug fixes.
+
+
+Details
+=======
+
+ - Bastien's `org-export-latex.el' is now part of the org-mode
+ distribution. You can export an Org-mode document to a
+ LaTeX file with `C-c C-e l'. For more options, see the
+ manual, and the commentary in the Lisp file. Kudos to
+ Bastien for contributing this frequently requested feature.
+ I am sure this has been tough because of the many different
+ ways I have been allowing LaTeX snippets and environments to
+ be incorporated in lazy free-format ways.
+
+ - Org-mode has now an extension mechanism for the hyperlink
+ system. This should clear the road for all those mairix and
+ other ideas that have been floating around. Now it is on
+ *you* to write and share new link types for Org-mode. The
+ interface for adding a new link type is described in the
+ appendix of the manual, section A2. The unsolved problem is
+ currently how to handle the new link types for
+ export/publishing.
+
+ - New *global* commands `org-open-at-point-global' and
+ `org-insert-link-global'. You can bind these commands to
+ global keys and use them to insert and follow Org-mode-like
+ links anywhere in Emacs. Thanks to Adam Spiers for this
+ excellent idea.
+
+ - Each deadline timestamp may now specify its own interval of
+ lead-time display, given in days, weeks, months or years.
+ The syntax is like this
+
+ DEADLINE: <2007-08-13 Mon -5d>
+
+ When combined with a repeater, the repeater has to come
+ first:
+
+ DEADLINE: <2007-08-13 Mon +2w -5d>
+
+ You may now also customize the faces that are used in the
+ agenda to indicate the distance of an approaching deadline.
+ See the new option `org-agenda-deadline-faces'.
+
+ Thanks to Pavel Chalmoviansky and John Wiegley proposals in
+ this direction.
+
+ - New option `org-agenda-repeating-timestamp-show-all'. When
+ set to nil, repeating time stamps will only show up once in
+ the agenda, either today or in the near future. Other
+ matches will be ignored. Thanks to John Wiegley for this
+ proposal.
+
+ - New variable `org-remember-store-without-prompt'. When set,
+ exiting the remember buffer with C-c C-c will store the note
+ without further prompts to the default location, and `C-u
+ C-c C-c' will get the prompts for file and location. So
+ this variable reverses the prefix-argument functionality for
+ storing remember notes. This follows a request from John
+ Wiegley.
+
+ - A new function `org-agenda-to-appt' activates all
+ appointments for the current day so that Emacs will display
+ reminders. This uses appt.el. Thanks to Bastien for this
+ function.
+
+ - You can now set default values for properties that can be
+ inherited by all entries in a buffer, or by all entries
+ globally. Global properties are set in the variable
+ `org-global-properties', like this:
+
+ (setq org-global-properties '(("NAME" "This is the value")))
+
+ Buffer-local values are set like this:
+
+ #+PROPERTY: NAME This is the value
+
+ When using org-entry-get to get the value of a property with
+ the `inherit' flag and the hierarchy above the entry does
+ not contain this property, the buffer-local and global lists
+ are checked as well. This is mostly useful (I think) to set
+ the list of allowed values for a property. Thanks to Bernt
+ Hansen and Bastien for these ideas.
+
+ - Bug fixes.
+
+Version 5.04
+~~~~~~~~~~~~
+
+Details
+=======
+
+ - New variables `org-export-author-info' and
+ `org-export-time-stamp-file' to turn off inclusion of author
+ and time information into exported files. Thank to Patrick
+ Drechsler for pointing out that this would be useful.
+
+ - New variable to avoid moving DEADLINE and SCHEDULED info
+ into the property drawer. The default is now to not move
+ this stuff into the drawer.
+ `org-insert-labeled-timestamps-before-properties-drawer'
+
+ - `org-archive-mark-done' can be a string now, to select a
+ specific keyword that should be used for archived entries.
+
+ - New command "j" in agenda to jump to an arbitrary date.
+ Thanks to Bernt Hansen for the patch.
+
+ - Lots of minor fixes.
+
+Version 5.03
+~~~~~~~~~~~~
+
+Incompatible Changes
+====================
+
+ - The variable `org-special-ctrl-a' has been renamed to
+ `org-special-ctrl-a/e'. The old one is still an alias (but
+ not on Emacs 21 where variable aliases cannot be defined).
+
+Details
+=======
+
+ - When the variable `org-special-ctrl-a/e' is set, C-e in a
+ headline first goes to the end of the headline ignoring the
+ tags. A second C-e then goes to after the tags.
+
+ - Typing and removing single characters in a headline now
+ keeps the tags in the headline aligned. This could have a
+ little impact on performance while deleting stuff - let me
+ know if we need to make this customizable.
+
+ - New option `org-n-level-faces' can be used to set the number
+ of different faces that are used for headlines. Default is
+ all 8 faces Org-mode defines for this purpose, level 9 uses
+ again the level-1 face. However, you can use fewer, and then
+ the level-1 face will be reused already for level N+1, etc.
+
+ - Column View and hidestars now work together.
+
+ - Bug fixes.
+
+
+Version 5.02
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - The interfaces for properties and column view are finished
+ now and work well.
+
+ - Properties can be summaries, i.e. the parent nodes can
+ compute their value from the children's values.
+
+ - Headlines finally require a space ofter the star(s). The
+ conflict with bold text at the beginning of the line is no
+ longer there.
+
+Incompatible Changes
+====================
+
+ - Bad news. It looks like it is going to be really hard to
+ make column view work on XEmacs and on Emacs 21. Emacs 22
+ is currently the only Emacs where this works. If you are
+ using Emacs 21 or XEmacs, you can still use properties, but
+ not column view.
+
+Details
+=======
+
+ - Improvements for properties:
+
+ + There are interactive commands to insert and delete
+ properties. Read the manual chapter 7 for details.
+
+ + You can define /allowed values/ for a property. When
+ these are defined, you can change the value of a property
+ with S-left and S-right. And you may use completion when
+ inserting the property. This goes a long way to prevent
+ typos when entering properties.
+
+ - Improvements for column view.
+
+ + In column view, you may use the keys S-left/right (and
+ also the keys `n' and `p') to switch from one allowed
+ value to the next.
+
+ + You can define summaries for columns. For example,
+ parents can contain the sum of all children values of a
+ property, or the parent node can have a check box property
+ that is automatically checked when all children's boxes are
+ checked.
+
+ + There are interactive commands to add and remove columns,
+ and to change the attributes of a column like the summary
+ type.
+
+ These additions lead to the exciting fact that the example
+ from [omni outliner] posted by Scott Jaderholm can now be
+ accurately [reproduced by Org-mode].
+
+ - The space after the stars is now required in a headline, in
+ order to remove the conflict with bold words at the
+ beginning of a line. So
+
+ * This is a level 1 headline
+ *this is bold text*
+
+ - S-up and S-down to navigate plain item lists are now also
+ available in orgstruct-mode.
+
+Version 5.01
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - A new minor mode, orgstruct-mode, exports the Org-mode
+ structure editing commands into any other mode.
+
+ - DRAWERS are a new level off folding for special sections
+ that should stay closed during visibility cycling and only
+ open if explicitly asked.
+
+ - Entries can now have PROPERTIES.
+
+ - A COLUMN VIEW implementation allows to easily view and edit
+ the properties of a hierarchy of entries (Emacs only, for
+ now).
+
+ - Formula evaluation in the spreadsheet is more consistent
+ now. Properties and per-file constants can be used during
+ evaluation.
+
+ - Bug fixes and minor changes.
+
+Incompatible changes
+====================
+
+ - When using LEVEL=N in a tags search, things have changed if
+ you are also using `org-odd-levels-only'. If you are using
+ only odd levels (i.e. 1 or 3 or 5... stars), LEVEL=2 will
+ now refer to 3 stars, LEVEL=3 to 5 stars etc. Many thanks
+ to Leo (or blame on him if you must) who has convinced me
+ that this is the better convention.
+
+Details
+=======
+
+Orgstruct minor mode
+--------------------
+
+ There is a new minor mode, orgstruct-mode. This modes works
+ in a similar way as Orgtbl-mode. It can be used to export
+ the Org-mode structure-editing commands into arbitrary major
+ modes in Emacs. For example, you can use it in Mail-mode to
+ easily create lists.
+
+ The functionality in Orgstruct mode is only active, if the
+ cursor is in a line that looks either like a headline, or
+ like the first line of a plain list item. Then the commands
+ `TAB', `M-cursor', `M-S-cursor', `M-RET', `M-S-RET', `C-c ^',
+ `C-c C-c', and `C-c -' will do structure-related editing just
+ like in Org-mode. If the cursor is not in such a line, all
+ these keys will do whatever the major mode or other active
+ minor modes have assigned to them.
+
+ Orgstruct-mode is the result of a proposal by Raman, quite
+ some time ago. It has taken a long time, but here is finally
+ the promised implementation.
+
+Drawers
+-------
+
+ The new concept of /drawers/ allows to create sections
+ that remain folded during visibility cycling. Drawers need
+ to be configured using the variable `org-drawers'. A drawer
+ starts with a line containing only the name of the drawer
+ bracketed by colons. It ends with :END:. For example,
+ after setting
+
+ (setq org-drawers '("PROPERTIES" "HIDDEN"))
+
+ you can then create drawers like this:
+
+ :HIDDEN:
+ here is some stuff that remains hidden
+ unless TAB is pressed directly in that line
+ :END:
+
+ The PROPERTIES drawer has special meaning for ORG-mode, it
+ contains properties of an entry (see below).
+
+Properties and Column View
+--------------------------
+
+ - Entries in Org-mode can now have arbitrary /properties/
+ associated with them. Org-mode handles some default
+ properties like the TODO state, the priority, the local
+ tags, and planning information like DEADLINE and SCHEDULED.
+ In addition, you can assign arbitrary properties by creating
+ a property drawer and inserting a line like
+
+ :PROPNAME: This is the value of the property
+
+ Org-mode has an API for properties, if you want to write a
+ program using properties, use the functions
+ `org-entry-properties', `org-entry-get', `org-entry-put',
+ and `org-entry-delete'.
+
+ - Planning information like DEADLINE can be hidden in the
+ properties drawer.
+
+ If the PROPERTIES drawer starts in the first line after a
+ headline, also the DEADLINE, SCHEDULED and CLOCK information
+ will be inserted inside the drawer. If no PROPERTIES drawer
+ is present, or if it does not start in the line right after
+ the headline, this information remains in the lines directly
+ after the headline, outside the drawer.
+
+ - TAGS searches can now also query properties. For example,
+ the search
+
+ LEVEL=3+BOSS+ASSIGNED="Hans"/WAITING
+
+ will find entries that
+ - are level 3
+ - have the tag BOSS
+ - have an ASSIGNED property with the value "Hans"
+ - are TODO status WAITING.
+
+ So here is an entry that will match:
+
+ *** WAITING Clean up the factory :BOSS:
+ :PROPERTIES:
+ :ASSIGNED: Hans
+ :END:
+
+ You may also use a regular expression to match against a
+ property value. For example, to find stuff assigned to Hans
+ or Sarah, use
+
+ ASSIGNED={^\(Hans\|Sarah\)$}
+
+ - Column View is a special way to look at property values in
+ tabular form. Column View can be used in any org-mode
+ file, and also in any agenda buffer. It works by placing
+ an overlay over each headline (or agenda line) that shows a
+ table of selected properties. You can look at and edit
+ properties from this view. Which properties are shown in
+ the table must be set up using the COLUMNS property. You
+ can set up different property columns on different levels
+ of an outline tree. For example:
+
+ * People
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name
+ :END:
+ ** Family
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name %3Age
+ :END:
+ *** Sam
+ Info about Sam, including a property list with Name and Age.
+ *** Sarah
+ Info about Sarah, including a property list with Name and Age.
+ ** Office
+ :PROPERTIES:
+ :COLUMNS: %25ITEM %Name %Function %Salary
+ :END:
+ *** Boss
+ Info about the Boss, including a property list with Name,
+ Function and Salary (if only we knew....).
+
+ Now we have defined three different sets of columns. If
+ you switch to column view in the /Family/ section, you
+ will get a different table than if you do it in the
+ /Office/ section. However, if you switch to column
+ view with the cursor on the /People/ section, the
+ table will cover all entries, but contain only the
+ /Name/.
+
+ Column view does, for the time being, only work on Emacs.
+ The XEmacs implementation needs a bit of work.
+
+ - Properties can be used in table formulas. To access the
+ value of the property :XYZ:, use $PROP_XYZ. The property
+ needs to be defined in the hierarchy above the table, not
+ necessarily in the same entry as the table. This was a
+ request by Eddward. File-wide constants can be defined with
+ #+CONSTANTS, see below.
+
+ - Things that still need to be sorted out about drawers,
+ properties and column view - comments and suggestions
+ welcome!
+
+ + How to deal with drawers and properties in HTML and ASCII
+ export?
+ + What key could be used to insert an empty property drawer
+ into an entry?
+ + Right now column view is invoked through the command C-c
+ C-x C-c. It is too easy to type C-x C-c by mistake, and
+ that causes Emacs to quit. Suggestions for a different
+ key?
+ + Fontification of drawers and properties is not good yet.
+ Any suggestions for better defaults?
+ + Mouse support for editing properties in column view would
+ be nice - maybe Piotr is interested to add this to
+ org-mouse.el?
+
+Spreadsheet
+-----------
+
+ - In the spreadsheet, the evaluation of formulas has changed.
+ Previously, first the column formulas would be evaluated
+ everywhere, and then the field formulas would kick in, and
+ in some cases overwrite the results of column formulas in
+ the appropriate fields. This had the side effect that some
+ formulas might always use the wrong, intermediate content of
+ a field that is computed both by a column and a field
+ formula.
+
+ From now on, column formulas will no longer temporarily
+ overwrite field formulas. This gives much more consistent
+ results. For example you can now finally have a column of
+ increasing numbers by setting the first field to a fixed
+ number, and let the rest follow from a column formula.
+
+ Here is an example
+
+ | 1 |
+ | 2 |
+ | 3 |
+ #+TBLFM: $1=@-1+1::@1$1=1
+
+ - Constants for formulas in spreadsheets are globally defined
+ with the variable `org-table-formula-constants'. File-local
+ constants can now be set with a line like:
+
+ #+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6
+
+Minor changes
+-------------
+
+ - When entries are archived, a timestamp for the moment of
+ archiving is added to the line with planning information.
+ It looks like this:
+
+ ARCHIVED: [2007-07-02 Mon 11:34]
+
+ Thanks to J. David Boyd for constructive comments.
+
+ - Bug fixes
+
+ Many bugs are fixed, as usually all the ones where I replied
+ "fixed" on emacs-orgmode. If you reported one of these
+ bugs, please check if it really has disappeared in the new
+ version, and complain if not. Thanks!
+
+
+Version 4.79
+~~~~~~~~~~~~
+
+Details
+=======
+
+ - We are back to a single file org.el that works both on Emacs
+ and on XEmacs. Merging comes at a speed penalty for you as
+ an XEmacs user, but *only if you do not compile* org.el.
+ Compilation completely removes the penalty.
+
+ - New L flag for literal interpolation in Lisp formulas.
+ See manual section 3.5.3.
+
+ - New options for turning off footnotes.
+ This was a request from Ignotus.
+ See the option `org-export-with-footnotes'.
+
+ - Default length for Agenda entries, but this is off by
+ default. This was a request from Micheal.
+ See the option `org-agenda-default-appointment-duration'.
+
+ - Bug fixes:
+
+ + org-agenda-date-later (Juraj Kubelka)
+ + letters off margin in orgcard.ps (Charles Cave)
+ + TODO export problems on XEmacs (ignotus@freemail.hu)
+ + args-out-of-range with table formulas (Cecil Westerhof)
+ + problem with org-file without a heading (Tim O'Callaghan)
+
+Version 4.78
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Time stamps with a time range *included*, like
+ <2007-06-18 Mon 17:33-18:23>
+
+ - Clock times without clocking in/out: CLOCK: => 2:00
+
+ - Language-specific characters allowed in TAGS (Emacs only).
+
+ - Promotion and demotion of items gets the indentation right.
+
+ - Indenting lines with TAB is more intelligent.
+
+Incompatible changes
+====================
+
+ - There is now a special version of `org.el' for XEmacs.
+ Before installation, as an XEmacs user you must rename the
+ file org_xemacs.el to org.el, i.e. you must overwrite org.el
+ with the xemacs version. For example:
+
+ mv org_xemacs.el org.el
+
+ This is necessary so that I can make use of some features
+ that would be cumbersome to support in a single file. The
+ XEmacs version is derived from the Emacs version with a
+ program, so no reason to fear that I might be dropping
+ XEmacs support any time soon. Sorry for the trouble.
+
+Details
+=======
+
+ - A time stamp may now contain a range of times. So you no
+ longer need to use two separate stamps to indicate a time
+ interval on a single day. For example
+
+ <2007-06-18 Mon 17:30-18:20>
+
+ This is now fully supported, including changing the time
+ with S-up/down while the cursor is on the end time. Also,
+ da the date/time prompt, you can simply write your time like
+ 12:00-14:00 and the range will be inserted.
+
+ This was proposed by Leo some time ago, and recently by
+ Michael.
+
+ - You may specify clocking times by hand (i.e. without
+ clocking in and out) using this syntax.
+
+ CLOCK: => 2:00
+
+ Thanks to Scott Jaderholm for this proposal.
+
+ - TAGS may now contain language-specific word characters, as
+ long as they are matched by the "[:alnum:]" regexp syntax.
+ This is for Emacs only, the XEmacs version continues to use
+ the character class "a-zA-Z0-9_@" for tag names. Thanks to
+ David Smith for a patch to this effect (a modified version
+ of that patch was applied). I am considering to make the
+ same change for TODO keywords, but not yet. Note that files
+ using localization features may not work correctly in the
+ Emacs configuration of another user, so if you are sharing
+ org-mode files with other users, it might still be best to
+ stick to the ASCII characters.
+
+ - Promotion and demotion of plain list items (commands M-left,
+ M-right) no longer changes the indentation by just one
+ space. Instead, it uses intelligence gathered from the
+ surrounding list structure to do the right thing. Thanks to
+ William Henney for starting the discussion about this.
+
+ - TAB does now a better job of indenting lines.
+
+ + After tables and code segments (lines starting with ":"),
+ indentation goes back to what it was before (thanks to
+ William Henney for suggesting this behavior).
+
+ + When plain lists items are involved, we had a long
+ discussion on emacs-orgmode where I tried to show that a
+ too-sophisticated implementation will still be easily
+ fooled. Here is what I have implemented now - lets see
+ if we can agree on this:
+
+ Indentation will flatten lists with the same bullet type,
+ but indent another bullet type further. The time when
+ this fails is in a nested list, when you want to get back
+ out to a previous level. For example
+
+ - item 1
+ - item 2
+ + item 2a
+ + item 2b
+ - item 3
+
+ When using TAB on every line in this list, the structure
+ will change to
+
+ - item 1
+ - item 2
+ + item 2a
+ + item 2b
+ - item 3
+
+ So you need to change the level of the last line by hand,
+ using promotion and demotion functions.
+
+Version 4.77
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Vertical lines in exported tables.
+ - New default for `org-show-following-heading'.
+
+Incompatible changes
+====================
+
+ - The default for `org-show-following-heading' is now nil.
+
+Details
+=======
+
+ - You can now specify column groups in tables, to the effect
+ that the groups will be separated by vertical lines in HTML
+ and ASCII output. Column groups are specified by the
+ characters "<" and ">" in a special table row. "<" starts a
+ group, ">" ends a group (in each case including the the
+ column where the character is specified). You may also use
+ "<>" to make a group a single column wide. For example:
+
+ | | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N) |
+ |---+----+-----+-----+-----+---------+------------|
+ | / | <> | < | | > | < | > |
+ | # | 1 | 1 | 1 | 1 | 1 | 1 |
+ | # | 2 | 4 | 8 | 16 | 1.4142 | 1.1892 |
+ | # | 3 | 9 | 27 | 81 | 1.7321 | 1.3161 |
+ #+TBLFM: $3=$2^2::$4=$2^3::$5=$2^4::$6=sqrt($2)::$7=sqrt(sqrt(($2))
+
+ A table row with with nothing but "/" in the first field is
+ never exported, but can be used to place column group
+ information into the table. In this table, we create a
+ group for column 2, one for columns 3-5 and one for columns
+ 6-7. HTML export will render a vertical line between these
+ groups.
+
+ Because HTML does not require closing <colgroup> tags with
+ </colgroup>), you can also simply start a new column
+ wherever you want a vertical line:
+
+ | N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N0 |
+ |---+-----+-----+-----+---------+------------|
+ | / | < | < | | < | |
+
+ - Vertical lines are now also omitted in ASCII export, unless
+ grouping explicitly requests these lines.
+
+ - The default for `org-show-following-heading' is now nil,
+ meaning that sparse trees will be more compact. This has
+ become possible due to in important remark by Jason Dunsmore
+ who pointed out that TAB should behave differently in the
+ inconsistent trees produced by the sparse tree commands.
+ TAB does now make sure that the heading after a freshly
+ unfolded tree is made visible at all, removing the confusing
+ behavior we had before.
+
+ - Several bugs fixed. In particular:
+
+ + Strings produced by agenda batch processing with
+ `org-batch-agenda' and `org-batch-agenda-csv' are now
+ properly encoded, so that you should be able to use
+ special characters in other languages as along as your
+ post-processing program handles them correctly. At least
+ for Emacs this should work now, but have not yet figured
+ out how to do this in XEmacs.
+
+Version 4.76
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Exporting Footnotes to HTML
+
+Details
+=======
+
+ - Footnotes like[1] are now exported to HTML
+
+ [1]This is a footnote
+
+ Thanks to Scott Jaderholm for this proposal and a detailed
+ HTML example on how the exported text should look like.
+
+ - Special version of the reference card, for letter paper.
+
+ - Switching to OVERVIEW with S-TAB no loner moves the cursor,
+ so after three `S-TAB' commands, you will be back where you
+ started.
+
+ - Bug fixes, lots of them again.
+
+Version 4.75
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Cyclic time stamps that repeat after an interval.
+ - Special timestamps for appointments like "every 2nd Thursday
+ in a month".
+ - Completion of link abbreviation prefixes inside `C-c C-l'.
+ - Replacing a region of org-mode syntax with HTML.
+ - iCalendar export now honors ARCHIVE etc.
+ - New command to add/change emphasis markers.
+
+Incompatible Changes
+====================
+
+ - The REPEAT(...) cookie is no longer supported, the repeater
+ interval now goes directly into the time stamp.
+
+Details
+=======
+
+ - Time stamps can contain a repeater code, like +1w for once
+ every week, +2d for every two days, etc. For example,
+
+ <2007-05-16 Wed 12:30 +1w>
+
+ will apply to every Wednesday, starting from the date given.
+ I believe this syntax was actually suggested by someone on
+ the mailing list, but I cannot find the email back. To
+ collect your credit, let me know!
+
+ - You can use an sexp diary entry (with the syntax used by the
+ Emacs calendar/diary) in a time stamp, like this:
+
+ *** The nerd club meets on 2nd Thursday of every month
+ <%%(diary-float t 4 2)>
+
+ - You can put diary-style sexp entries directly into an
+ org-mode file, where they will be interpreted just like they
+ would in the diary. For example
+
+ * Birthdays and similar stuff
+ #+CATEGORY: Holiday
+ %%(org-calendar-holiday) ; special function for holiday names
+ #+CATEGORY: Ann
+ %%(diary-anniversary 14 5 1956) Artur Dent %d is years old
+ %%(diary-anniversary 2 10 1869) Mahatma Gandhi
+
+ These entries must start at column 0 to be evaluated.
+
+ It turns out that evaluating the entries in an org-mode file
+ is actually faster than in the diary itself, because using
+ the diary has some overhead (creating fancy diary display,
+ then reading and re-interpreting the entries). I have moved
+ all the sexp entries from my diary into an org-mode file,
+ put in a few categories, and then turned off
+ `org-agenda-include-diary'. This has led to a noticeably
+ faster agenda display.
+
+ - New command `org-replace-region-by-html' that converts the
+ current region from org-mode syntax into HTML. For example,
+ you might write an itemized list in plain text in an HTML
+ buffer, and then invoke this command to convert it. Thanks
+ to Raman for this idea.
+
+ - When inserting a link with `C-c C-l', completion will now
+ fill in all valid link prefixes, like http or ftp, but also
+ link abbreviation prefixes. This is based on an idea by
+ Bastien.
+
+ - Highest, lowest, and default priority can be set on a
+ per-file basis with #+PRIORITIES: H L D
+ For example, to use priorities from 1 to 9, you could use
+
+ #+PRIORITIES: 1 9 9
+
+ Thanks to Dmitri Minaev for a patch to this effect.
+
+ - iCalendar export now honors (i.e. skips) subtrees marked as
+ ARCHIVE, COMMENT, or QUOTE.
+
+ - There is a new command to add or change the emphasis (like
+ bold or italic) of a piece of text. For lack of better
+ available keys the command is at `C-c C-x C-f', but you may
+ well want to choose a more convenient key like `C-c f' in
+ your private setup:
+
+ (add-hook 'org-load-hook
+ (lambda () (define-key org-mode-map "\C-cf" 'org-emphasize)))
+
+ The command will prompt for an emphasis type, and you may
+ reply either with the marker that triggers the emphasis, or
+ with the first letter of the corresponding HTML tag. For
+ example, to select italic, press either "/" or "i".
+
+ If there is an active region, the emphasis of this region
+ will be set or changed. If there is no region, only the
+ emphasis markers will be inserted and the cursor positioned
+ between them. Thanks to Bastien for proposing this feature.
+
+ - Bug fixes, everything where I have replied "fixed" on the
+ mailing list. Thanks to all of you for keeping these reports
+ coming.
+
+Version 4.74
+~~~~~~~~~~~~
+
+Overview
+========
+
+ This release is about exporting agenda views, to HTML, to
+ postscript for printing, and to a special format (CSV) for
+ further processing in scripts.
+
+Incompatible Changes
+====================
+
+ - The variable `org-agenda-remove-tags-when-in-prefix' has
+ been renamed to `org-agenda-remove-tags'.
+
+Details
+=======
+
+ - Agenda views can be exported as plain text, as HTML, and as
+ Postscript(R). This can simply be done from the agenda
+ buffer with `C-x C-w' and then specifying a filename like
+ `myagenda.html' or `myagenda.ps'. See section 8.6.4 of the
+ manual.
+
+ - Each custom agenda view can specify a list of associated
+ files names. The command `C-c a e' then creates all views
+ that have associated file names and exports the views to
+ these files. This is great for producing paper versions of
+ your views, to take with you when you don't have your
+ computer. The manual has an example on how to do this, and
+ in particular on how to customize the format of the printed
+ version. See section 8.6.4 of the manual.
+
+ - You can produce a CSV format of agenda information with an
+ Emacs batch command. This is greate for further processing
+ in scipts. Thanks to Jason F. McBrayer for this idea.
+ See section 8.6.5 of the manual.
+
+ - New variable `org-agenda-skip-deadline-if-done'. When set,
+ a deadline associated with a DONE item will not be shown in
+ the agenda. This is based upon a report by Denis Bueno.
+
+ - Quite a few bug fixes.
+
+Version 4.73
+~~~~~~~~~~~~
+
+ Minor bug fixes.
+
+Version 4.72
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Control over blank lines between trees in collapsed view.
+
+ - Info about the running clock is shown in the modeline.
+
+ - C-a can behave specially in headlines.
+
+ - Better color and scaling defaults for LaTeX fragments.
+
+ - Customizable list of keys in org-mode to be replaced.
+
+ - Stuck project descriptions have been extended.
+
+ - Emphasis code has been modified to fix some issues.
+
+ - Bug fixes.
+
+Incompatible changes
+====================
+
+ - The option `org-format-latex-options' has changed. If you
+ have customized it, please revert to default and then redo
+ your customization.
+
+ - `org-CUA-compatible' no longer modifies S-RET by default,
+ because newer versions of CUA don't use this key anymore.
+ If you need this replacement, customize the variable
+ `org-disputed-keys'.
+
+ - The variable `org-CUA-compatible' is obsolete, please use
+ `org-replace-disputed-keys' instead. `org-CUA-compatible'
+ is still an alias for this new variable, though.
+
+Details
+=======
+
+ - Better control over blank lines between trees in collapsed
+ view. This has come up several times in the past and most
+ recently by Scott Jaderholm. There is now a new variable
+ `org-cycle-separator-lines' with default value 2. It says
+ how many empty lines there need to be after the end of a
+ subtree to get an empty line in collapsed view. So with the
+ default, if you leave only one empty line it will disappear
+ in collapsed view. If you leave two, one empty line will
+ remain so that you can use double empty lines to structure
+ the collapsed views of a file. I love it, so many thanks to
+ Scott fro bringing this up again.
+
+ One property of the new setup is that you will never get
+ more than one blank line in collapsed view. We could do
+ something special to allow *several* empty lines in
+ collapsed view, but I think this is counter-productive.
+
+ In Emacs 22, if you want to make full use of this, make sure
+ that you have not set `outline-blank-line'.
+
+ - When the clock is running, Org-mode will put info about it
+ into the modeline. The info consists of the elapsed time
+ and the heading of the clocked item. This was a proposal
+ from Bastien who got the idea from Muse.
+
+ - C-a can behave specially in headlines when you set the
+ variable `org-special-ctrl-a'. It will bring the cursor
+ first back only to the beginning of the headline *text*,
+ i.e. after the stars and the TODO keyword, if any. A second
+ C-a will then move the cursor to the beginning of the line.
+ If the cursor is already at the beginning of the line, C-a
+ will spring *forward* to the headline text. This was a
+ proposal from Leo, based on a request from Scott Jaderholm.
+
+ I have not turned this turned this on by default, should I?
+
+ - When LaTeX fragments are processed into images, there is now
+ more control and (hopefully) betters defaults for colors and
+ scaling. Special values can be set for HTML export, so that
+ these values can differ from what is used for display in an
+ emacs buffer. The default foreground and background colors
+ for images embedded in emacs are now taken from the default
+ emacs face. Thanks to Xiao-Yong Jin for proposing these
+ changes.
+
+ - There is now a much better mechanism to change some keys in
+ org-mode if these keys clash with other modes you use. Turn
+ this on by setting `org-replace-disputed-keys' (aliased to
+ `org-CUA-compatible'). The list of keys to replace is now
+ fully customizable, see the option `org-disputed-keys'.
+ Many thanks to Meciej Katafiasz for a patch implementing
+ this.
+
+ - Stuck project descriptions have been extended. You can now
+ use "*" as a TODO keyword or tag to say that *any* TODO
+ keyword or TAG marks a project as non-stuck. You also can
+ give an arbitrary regular expression that, if it matches,
+ indicates a non-stuck project.
+
+ - The code for emphasis like bold, italic etc has been
+ modified - I might have broken something in the process,
+ please let me know if you find problems.
+
+ - A number of bugs have been fixed - those where I have
+ replied "Fixed" on the mailing list.
+
+Version 4.71
+~~~~~~~~~~~~
+
+Overview
+========
+
+Incompatible changes
+====================
+
+Details
+=======
+
+ - New variables to customize the header and data tags in
+ exported HTML. These are the variables
+ `org-export-table-header-tags' and
+ `org-export-table-data-tags'. This follows a request from
+ Scott Otterson.
+
+ - New option `org-format-latex-header' for customizing the
+ header of the LaTeX file used to convert embedded LaTeX to
+ images. Thanks to `Matthieu Lemerre' for the suggestion.
+
+ - The prefix version of `org-todo-list' works again. This
+ means that `C-1 C-c a t' produces the list of TODO entries
+ for the first TODO keyword. If you use different TODO setups
+ in different agenda files, be careful: This number now
+ refers to the list of *all* todo keywords used in files
+ that are scanned for the agenda.
+
+ - Many bug fixes.
+
+Version 4.70
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Dust settles after revamp of TODO keyword system.
+ - The export title can be taken from the first text line.
+ - TTY replacement keys have changed.
+
+Incompatible changes
+====================
+
+ - Some TTY replacement keys are changed, see below.
+
+Details
+=======
+
+ - Further development concerning TODO keywords.
+
+ + You can now have several DONE states in a sequence, like
+
+ #+SEQ_TODO: TODO VERIFY | DONE DELEGATED
+
+ The difference to the proposal discussed on the mailing
+ list (and which is also works!)
+
+ #+SEQ_TODO: TODO VERIFY | DONE
+ #+SEQ_TODO: | CANCELED
+
+ is that in the first case, the extra DONE states will be
+ reached with `C-c C-t' (or with `t' from the agenda), while
+ in the second case you need S-<right> to get to the special
+ states. I guess both ideas can be useful - I am leaning
+ toward using the latter.
+
+ + Setting up TODO keywords in Lisp previously used two
+ separate variables: `org-todo-keywords' and
+ `org-todo-interpretation'. The preferred way is now to use
+ only `org-todo-keywords', with a new structure:
+
+ (setq org-todo-keywords
+ '((sequence "TODO" "|" "DONE")
+ (sequence "BUG" "KNOWNCAUSE" "|" "FIXED" "IGNORED")
+ (type "Fred" "Lisa" "Peter" "|" "DONE")
+ (sequence "CANCELED") ; for things we decide to not do.
+ ))
+
+ If your setting has this new structure,
+ `org-todo-interpretation' will be ignored. This change
+ does not break backward compatibility. The old way of
+ using a flat list in `org-todo-keywords' and taking the
+ interpretation from the other variable still works.
+
+ + When listing *specific* TODO entries via a sparse tree
+ (`C-u C-c C-v') or via the agenda (`C-c a T' or `C-u C-c a
+ t'), you can now specify several keywords to be selected,
+ like "TODO|VERIFY|WAITING". This also works for custom
+ agenda commands. Thanks to Jason F. McBrayer for pointing
+ out this omission.
+
+ - If you have configured Org-mode to export also the text
+ before the first headline (this is done by setting the
+ variable `org-export-skip-text-before-1st-heading' to nil),
+ then the first normal text line in the buffer becomes the
+ title of the exported document. A title set with #+TITLE
+ overules this default, and the first line then belongs to the
+ normal text. Thanks to David House for this proposal.
+
+ - TTY replacement keys. Some of the key bindings used by
+ Org-mode do not work on a tty, so replacement key sequences
+ are provided on ttys. In version 4.70, there are some
+ changes in the tty replacements. Thanks to Jason F. McBrayer
+ for coming up with the idea to use C-c <cursor> keys.
+
+ Command Old TTY New TTY
+ org-..... Main Key Replacement Replacement
+ -------------------+-----------+---------------+---------------
+ shiftleft S-left C-c C-x left C-c left
+ shiftright S-right C-c C-x right C-c right
+ shiftup S-up C-c C-x up C-c up
+ shiftdown S-down C-c C-x down C-c down
+ shiftcontrolleft C-S-left C-c C-x left
+ shiftcontrolright C-s-right C-c C-x right
+
+
+Version 4.69
+~~~~~~~~~~~~
+
+Overview
+========
+
+ This time the changes affect the following areas:
+
+ - TODO keywords: Multiple sequences in a single file.
+ - Export: More control over text before the first heading.
+ - Export: More control over sub/superscript interpretation.
+ - Plain lists: Option to let empty lines terminate lists.
+ - Tables: New command to insert hline and move into line below.
+ - REPEATing items: Turn of note taking.
+ - Bug fixes.
+
+Incompatible changes
+====================
+
+ - It used to be possible to spread the list of TODO keywords
+ over several lines, like
+
+ #+SEQ_TODO: TODO
+ #+SEQ_TODO: PROGRESS
+ #+SEQ_TODO: DONE
+
+ This is no longer possible. Each such line now specifies an
+ independent set of TODO keywords, with its own DONE state.
+ See below for details.
+
+ - The #+TEXT construct has been used to insert unchanged HTML
+ into an exported file. This is no longer possible, the TEXT
+ lines will be processed like any other lines. However,
+ there are now much better ways of getting quoted HTML into
+ the exported file.
+
+Details
+=======
+
+ - You can now use multiple sets of TODO keywords in the same
+ buffer. For example, you may put the following three lines
+ into a file:
+
+ #+SEQ_TODO: TODO DONE
+ #+SEQ_TODO: REPORT BUG KNOWNCAUSE RESOLVED
+ #+TYP_TODO: Fred Laura Peter Me OK
+
+ Each sub-sequence has its own DONE state. It is best to use
+ different keywords in all sequences, to make sure Org-mode
+ does not loose track in which specific sequence it is
+ working. You could use the same word for all DONE states,
+ but then cycling through to a TODO state might not bring you
+ where you want to be.
+
+ After initially setting a keyword, `C-c C-t' cycles through
+ a sublist, i.e. is cycles from TODO to DONE or from
+ KNOWNCAUSE to RESOLVED and further to (nothing) and back to
+ REPORT.
+
+ S-right and S-left allow to select any keyword, so they move
+ from DONE to REPORT and from RESOLVED to Fred.
+
+ C-S-right and C-S-left jump from one sub-sequence to the
+ next, for example from TODO or DONE to REPORT to Fred.
+
+ Thanks to Rick Moynihan for triggering this development.
+
+ - Text before the first headline can now be exported if you
+ configure Org-mode accordingly. Either set the variable
+ `org-export-skip-text-before-1st-heading' to nil, or use the
+ new in-buffer option
+
+ #+OPTION: skip:nil
+
+ - Export content specified via the #+TEXT construct is now
+ fully processed, i.e. links, emphasis etc. are all
+ interpreted. #+TEXT lines may include
+ #+BEGIN_HTML...#+END_HTML sections to embed literal HTML.
+
+ - During HTML export, you can request to have a_{b}
+ interpreted as a subscript, but to leave a_b as it is. This
+ can be done by setting the variable
+ org-export-sub-superscript to the symbol `{}' with
+
+ (setq org-export-sub-superscript '{})
+
+ or by using
+
+ #+OPTIONS: ^:{}
+
+ Thanks to Eddward DeVilla for this idea.
+
+ - New variable `org-empty-line-terminates-plain-lists'.
+ Default is nil, meaning that empty lines are part of the
+ previous list item, and that you can have several paragraphs
+ in one such item. Set this to t if you want an empty line
+ terminate all levels of plain list items.
+
+ Thanks to Mike Newman for triggering this development.
+
+ - C-c RET does insert a horizontal separator line and move the
+ cursor into the table line below it. Thanks to Bastien for
+ this proposal.
+
+ - Org-mode always offers you to record a note when a TODO item
+ automatically repeats, even if you are not logging state
+ changes. The new variable `org-log-repeat' allows to turn
+ this off, so that notes are really only been taken if you
+ are logging all state changes.
+
+ - Various Bug fixes, thanks to everyone who reported.
+
+Version 4.68
+~~~~~~~~~~~~
+
+Overview
+========
+ - Priority handling in the tags view
+ - Date/time prompt follows the popup calender, and accepts AM/PM times.
+ - Standard references like B4 in the spreadsheet.
+ - Improvements to the formula editor.
+ - C-j does better indentation.
+ - Bug fixes
+
+Details
+=======
+ - Priority handling in the tags view
+
+ + Agenda lists selected by tag are now sorted by priority.
+ Thanks to Andrew Korty for reporting this omission.
+
+ - Improvements to the date/time prompt.
+
+ + When you move (using S-cursor keys) the cursor in the pop-up
+ calendar window while responding to a date/time prompt, the
+ prompt is updated with the new default date (Emacs only).
+
+ + You can now enter AM/PM times at this prompt.
+
+ - Changes in the spreadsheet
+
+ + You can now also write B4 instead of @4$2 as a reference in
+ formulas. The column references without specified row can be
+ written as C& instead of $3. Such references make formulas
+ easier to read and are now the default way how references are
+ shown when you edit existing formulas. To get the old behavior
+ back (i.e. only @row$col references), set the variable
+ `org-table-use-standard-references' to nil.
+
+ Relative references like @-3$-2 or @II..III continue to use the
+ internal format.
+
+ - Changes in the formula editor (the one you get with "C-c '")
+
+ + The formulas are organized in a more logical way.
+
+ + There is now a menu with commands.
+
+ + When starting the formula editor with "C-c '", the cursor
+ immediately moves to the formula for the current field.
+
+ + With the cursor on a reference in the formula, you can use
+ S-cursor keys to change the field being referenced.
+
+ - C-j indents the following line correctly whe used in a headline
+ or in aplain list item. Thanks to Leo for this suggestion.
+
+ - Bug fixes
+
+ + Flyspell now knows about special org-mode commands.
+ Thanks to Vinod Valsalam for reporting this problem, and to
+ Andrew Korty for showing how to fix it.
+
+ + Most other bugs discussed recently on emacs-orgmode@gnu.org
+ should be fixed, except the problem with non-ASCII characters
+ in tags....
+
+Version 4.67
+~~~~~~~~~~~~
+
+ - Expert mode for fast tag selection.
+ When org-fast-tag-selection-single-key is `expert', not even
+ the selection window is shown, only the prompt. One more C-c
+ gets you the window, another one goes to multiple selection mode.
+
+ - Synchronized with Emacs once more: Emacs CVS has now org-mode
+ 4.67. At least until it causes a problem, then the Emacs people
+ will switch back to 4.56. Lets hope there will be no problem.
+
+ - Code cleanup
+
+ - Bug fixes
+
+Version 4.66
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Sorting of top-level entries works now if the region contains
+ top-level entries, or if the cursor is before the first headline.
+ Thanks to "redblue" for reporting this bug.
+
+ - When entering date and time at the prompt, you can now mix
+ entering text and selecting something in the calendar. For
+ example, enter 22:15 at the prompt without pressing RET, and then
+ click on a date in the calendar. Both pieces of information will
+ be included in the resulting time stamp. You can also use
+ S-curser to move the cursor in the calendar to the desired date
+ and then enter 22:15 and press RET at the prompt.
+
+ - When setting a deadline or a schedule, entering a time now
+ automatically selects the time stamp format that includes the
+ time. Bug report (by means of a question) from Bastre.
+
+ - C-c C-l can be used to convert a plain link into a bracket link.
+
+ - Internal links now match inside (the visible part of) other
+ links. Thanks to Scott Otterson for reporting this bug.
+
+ - iCalendar export of TODO items fixed, see also the variable
+ `org-icalendar-include-todo'. Thanks to Philipp Raschdorf.
+
+ - The number of levels in the table of contents of an exported
+ document can now be set independently of the number of headline
+ levels. For example:
+
+ #+OPTIONS: H:4 toc:2
+
+ - The command `C-c }' toggles the display of row and column numbers
+ the the current table, to aid constructing formulas. To try it,
+ move the cursor to a table and press `C-c }', or use the menu
+ entry.
+
+ - Orgtbl translation functions (introduced in 4.65) have been
+ simplified using a generic function `orgtbl-to-generic' that can
+ be used for very general languanges. Writing your own translator
+ should be very easy now. More info in the manual.
+
+ - CONTENTS visibility can be limited to a certain level. The
+ command `C-3 S-TAB' will switch to CONTENTS view and show the
+ first 3 levels.
+
+ - Bug fixes.
+
+Version 4.65
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Orgtbl can be used to maintain tables in LaTeX, and in any other mode
+ - Editing Lisp formulas for tables improved.
+ - Better structure for HTML exported tables.
+ - New "calculation" marker "/" to mark lines that should not be exported.
+
+Detailed description of changes
+===============================
+
+ - You can use orgtbl mode to maintain a LaTeX table, or pretty much
+ any table in any mode.
+
+ This does *not* work by making Orgtbl aware of LaTeX syntax. That
+ would be a box of Pandora I am not willing to open. Instead, you
+ use a normal Orgtbl-mode table, and a converter program to
+ automatically place a LaTeX version of the table into the correct
+ spot in the LaTeX file. The orgtbl-mode table can be maintained
+ inside the same file, in a block comment.
+
+ I am providing translators for LaTeX, HTML, and TeXInfo. For
+ other applications, you need to write one yourself - but that is
+ not hard if you start from the LaTeX version and just modify it.
+ Thanks to Thomas Baumann for triggering this development through
+ a request for a table-to-LaTeX converter.
+
+ - In the special buffer to edit the formulas of a table (created
+ with "C-c '"), there is now better support for editing Lisp
+ formulas. TAB and M-TAB work like in an Emacs Lisp buffer,
+ indenting lines and completing lisp symbols. With the cursor on
+ a line defining a complex Lisp formula, a first press on TAB will
+ convert the formula into a pretty-printed version with proper
+ linebreaks and indentation. A second TAB folds the line back to
+ the compact form.
+
+ - Tables in HTML export have now additional structure elements
+ defined. The header (before the first hline) is wrapped into
+ <thead>..</thead>, and each part of the body (as separated in
+ org-mode by hlines) is wrapped into <tbody>..</tbody> tags. I
+ have also changed the CSS style for <td> fields and the value of
+ `org-export-html-table-tag' to get cleaner tables. Basically,
+ tables now have horizontal lines only where needed, and no
+ vertical lines at all, as generally recommended for tables in
+ printed text. I like the new look, but I am not sure if this
+ change will find general approval, please throw in your view if
+ you like. Thanks to Scott for driving this, and to goud-H for
+ pointing me to the row grouping in tables.
+
+ - In a table with calculation markers in the first column, you can
+ now also put "/" into the first column. It indicates that this
+ line should not be exported. The foremost application for this
+ are lines containing only "<N>" markers for narrowing columns.
+
+Version 4.64
+~~~~~~~~~~~~
+
+Overview
+========
+
+ - Email links get better, configurable descriptions
+ - When inserting a link, selected text becomes the description
+ - Easier access to the list of stored links.
+ - Horizontal lines in HTML export.
+ - Remember templates and storing of notes improved.
+
+Detailed description of changes
+===============================
+
+ - The descriptive part of links to email messages can be configured
+ using the variable `org-email-link-description-format'. The new
+ default is "Email %c: %.30s" and leads to
+
+ Email from NAME: SUBJECT
+
+ If you configure the variable `org-from-is-user-regexp'
+ correctly, then for email you *sent* this will actually change to
+
+ Email to NAME: SUBJECT
+
+ The subject is limited to 30 characters. If you have become
+ attached to the previous default (look twice, the new one is
+ better), use "%f on: %s" as your format.
+
+ - Selecting text before entering a new link with C-c C-l now really
+ works, the selected text becomes the description part of the
+ link. Requested by Scott, buggy 4.62 implementation is now fixed.
+
+ - Stored links are part of the history list for C-c C-l, so to
+ reach them, you can use up/down rather than completion. Thanks
+ to Raman for this excellent idea.
+
+ - A line consisting only of "-", and at least 5 of them, is
+ exported into HTML as <hr/>, as proposed by Giovanni Ridolfi.
+
+ - Several changes to org <-> remember integration
+
+ - You can use `org-remember' as your default command to start
+ remember. It will automatically detect if there is an active
+ region and use it as initial content (we will probably make
+ remember.el work like this as well).
+ Also, when calling `org-remember' in a remember buffer that
+ was created with a template, you will again be asked to
+ select a template. The buffer is then re-created with the
+ new template, but the old context information. This is
+ useful if you change your mind about the template to use
+ (Leo's idea).
+
+ - Besides specifying a default *target* file for a note, you
+ can also give a default *heading* of which the note should
+ become a subitem. In many cases this avoids or speeds up
+ navigating to the right location. Both file and heading can
+ be different for each template. Both are non-binding, you
+ can change them while storing the note. However, when you
+ exit remember with C-u C-c C-c, these defaults will be used
+ without interaction.
+
+ - Templates can specify interactive fields. During expansion
+ of the template, you will be prompted for the information in
+ that field. For example %^t will pop up a calendar and ask
+ you to select a date. This new feature follows a proposal
+ from Leo, who in the mean time has said he does not need it
+ anymore. But I liked it, so here it is :-)
+
+ - Templates can access information specific to the link type
+ created, for example the author and subject of an email.
+ Syntax is %:fromname, %:fromaddress, %:subject etc, details
+ in the manual. Proposed by Peder O. Klingenberg.
+
+ - I have been considering to move, at some stage, the template
+ functionality into remember.el itself - which would of course
+ require consent of the remember.el maintainers. I am not
+ sure how well this would work though, since some things like
+ the interactive time stamps are org.el specific, so treating
+ them would require special hooks. Comments?
+
+Version 4.63
+~~~~~~~~~~~~
+ - Bug fixes
+
+Version 4.62
+~~~~~~~~~~~~
+ - Many changes to the spreadsheet functions in the table editor.
+ For details, please re-read the manual section 3.4.
+ + New Features
+ - It is much easier to assign formulas to individual fields.
+ - References to arbitrary fields and ranges.
+ - Absolute references are modified in row-editing commands.
+ - Formula editor that highlights referenced fields.
+ + Incompatible changes
+ - Empty fields are excluded in range references, see "E" mode flag.
+ - &... ranges no longer supported, use new @... ranges.
+ - Variable insertion into Lisp formulas work differently.
+ - Selected text becomes the default description for C-c C-l links.(Scott)
+ - The date format in the agenda/timeline views is now customizable.
+ See the new option `org-agenda-date-format'. (request by Victor)
+ - Link abbreviations no longer need a double colon, single colon is fine.
+ - Bug fixes.
+
+Version 4.61
+~~~~~~~~~~~~
+ - Avoiding keybinding clashes with flyspell
+ - Archiving is now also on `C-C C-x C-s' (was just `C-c $')
+ - Cycling through agenda files is now also on "C-'" (was just "C-,")
+ - Colon is considered part of number, to align times in clock tables.
+ - Fixed bug for list of stuck projects.
+ - Fixed several bugs/problems concerning linking to gnus.
+ - Block agendas can contain the list of stuck projects.
+ - #+ARCHIVE may now appear several times in the buffer.
+ - More bug fixes.
+
+Version 4.60
+~~~~~~~~~~~~
+ - HTML export: inlining images, clickable images (manual 10.2.4).
+ - Incremental search now shows proper context when exiting.
+ - Tables calculation and Calc package.
+ - Calc is no longer needed when using only elisp formulas.
+ - Proper error messages when calc is needed and not available.
+ - Tracking TODO state changes with time stamps and notes.
+ - Empty entries go full circle.
+ - Links in iCalendar export cleaned up.
+ - Bug fixes.
+
+
+Version 4.59
+~~~~~~~~~~~~
+ - Cleanup code, bug fixes.
+
+Version 4.58
+~~~~~~~~~~~~
+ - Full undo support in the agenda buffer.
+ - Listing stuck GTD projects (projects without any NEXT ACTIONS).
+ Configure `org-stuck-projects' before using it.
+ - C-c C-x b shows the current subtree in an indirect buffer, in
+ another, dedicated frame.
+ - Custom agenda commands take precedence over builtin commands.
+ - auto-fill for comments works on the Emacs side, XEmacs not yet.
+
+Version 4.57
+~~~~~~~~~~~~
+ - Sorting of outline items on same level.
+ - Sorting tables automatically selects line range between hlines.
+ - Changes in Agenda buffer
+ - `C-c C-o' follows a link in the current line.
+ - `C-c $' archives the subtree corresponding to the line.
+ - Changing dates with S-left and S-right show new date in agenda,
+ but still do not move the entry to the new date.
+ - new option `org-agenda-skip-scheduled-if-done'.
+ - Agenda and sparse tree construction using tag matches can now
+ use regular expressions.
+ - When prompted for a date/time, entering "+7" indicates a date
+ 7 days from now - but only this is the only thing you give.
+ - Custom time formats also apply to exported html and ascii.
+ - Bug fixes.
+
+Version 4.56
+~~~~~~~~~~~~
+ - `C-k' in agenda kills current line and corresponding subtree in file.
+ - XEmacs compatibility issues fixed, in particular tag alignment.
+ - M-left/right now in/outdents plain list items, no Shift needed.
+ - Bug fixes.
+
+Version 4.55
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.54
+~~~~~~~~~~~~
+ - Improvements to fast tag selection
+ + show status also in target line.
+ + option to auto-exit after first change to tags list (see manual).
+ - Tags sparse trees now also respect the settings in
+ `org-show-hierarchy-above' and `org-show-following-heading'.
+ - Bug fixes.
+
+Version 4.53
+~~~~~~~~~~~~
+ - Custom time formats can be overlayed over time stamps.
+ - New option `org-agenda-todo-ignore-deadlines'.
+ - Work-around for flyspell bug (CVS Emacs has this fixed in flyspell.el).
+ - Work-around for session.el problem with circular data structures.
+ - Bug fixes.
+
+Version 4.52
+~~~~~~~~~~~~
+ - TAG matches can also specify conditions on TODO keywords.
+ - The fast tag interface allows setting tags that are not in the
+ predefined list.
+ - Bug fixes.
+
+Version 4.51
+~~~~~~~~~~~~
+ - Link abbreviations (manual section 4.5).
+ - More control over how agenda is displayed. See the new variables
+ `org-agenda-window-setup', `org-agenda-restore-windows-after-quit'.
+ - Bug fixes.
+
+Version 4.50
+~~~~~~~~~~~~
+ - Closing a TODO item can record an additional note.
+ See variables `org-log-done' and `org-log-note-headings'.
+ - Inserting headlines and bullets can leave an extra blank line.
+ See variable `org-blank-before-new-entry'. (Ed Hirgelt patch)
+ - [bracket links] in the agenda are active just as in org-mode buffers.
+ - C-c C-o on a date range displays the agenda for exactly this range.
+ - The default for `org-cycle-include-plain-lists' is back to nil.
+ - Calls to `org-occur' can be stacked by using a prefix argument.
+ - The options `org-show-hierarchy-above' and `org-show-following-heading'
+ now always default to `t', but can be customized differently for
+ different types of sparse trees or jump commands.
+ - Bug fixes.
+
+
+Version 4.49
+~~~~~~~~~~~~
+ - Agenda views can be made in batch mode from the command line.
+ - `org-store-link' does the right thing in dired-mode.
+ - File links can contain environment variables.
+ - Full Emacs 21 compatibility has been restored.
+ - Bug fixes.
+
+Version 4.47
+~~~~~~~~~~~~
+ - Custom commands may produce an agenda which contains several blocks,
+ each block created by a different agenda command.
+ - Agenda commands can be restricted to the current file, region, subtree.
+ - The timeline command must now be called through the agenda
+ dispatcher (C-c a L). `C-c C-r' no longer works.
+ - Agenda items can be sorted by tag. The *last* tag is used for this.
+ - The prefix and the sorting strategy for agenda items can depend
+ upon the agenda type.
+ - The handling of `[mailto:'] links can be customized, see the new
+ variable `org-link-mailto-program'.
+ - `mailto' links can specify a subject after a double colon,
+ like [mailto:carsten@orgmode.org::Org-mode is buggy].
+ - In the #+STARTUP line, M-TAB completes valid keywords.
+ - In the #+TAGS: line, M-TAB after ":" inserts all currently used tags.
+ - Again full Emacs 21 support: Checkboxes and publishing are fixed.
+ - More minor bug fixes.
+
+Version 4.45
+~~~~~~~~~~~~
+ - Checkbox lists can show statistics about checked items.
+ - C-TAB will cycle the visibility of archived subtrees.
+ - Documentation about checkboxes has been moved to chapter 5.
+ - Bux fixes.
+
+Version 4.44
+~~~~~~~~~~~~
+ - Clock table can be done for a limited time interval.
+ - Obsolete support for the old outline mode has been removed.
+ - Bug fixes and code cleaning.
+
+Version 4.43
+~~~~~~~~~~~~
+ - Bug fixes
+ - `s' key in the agenda saves all org-mode buffers.
+
+Version 4.41
+~~~~~~~~~~~~
+ - Shift-curser keys can modify inactive time stamps (inactive time
+ stamps are the ones in [...] brackets.
+ - Toggle all checkboxes in a region/below a headline.
+ - Bug fixes.
+
+Version 4.40
+~~~~~~~~~~~~
+ - Bug fixes.
+
+
+Version 4.39
+~~~~~~~~~~~~
+ - Special tag ARCHIVE keeps a subtree closed and away from agenda lists.
+ - LaTeX code in Org-mode files can be converted to images for HTML.
+ - Bug fixes.
+ - CDLaTeX-mode features can be used in Org-mode to help inserting
+ LaTeX environment and math.
+
+Version 4.38
+~~~~~~~~~~~~
+ - noutline.el is now required (important for XEmacs users only).
+ - Dynamic blocks.
+ - Archiving of all level 1 trees without open TODO items.
+ - Clock reports can be inserted into the file in a special section.
+ - FAQ removed from the manual, now only on the web.
+ - Bug fixes.
+
+Version 4.37
+~~~~~~~~~~~~
+ - Clock-feature for measuring time spent on specific items.
+ - Improved emphasizing allows configuration and stacking.
+
+Version 4.36
+~~~~~~~~~~~~
+ - Improved indentation of ASCII export, when headlines become items.
+ - Handling of 12am and 12pm fixed. Times beyond 24:00 can be used
+ and will not lead to conflicts.
+ - Support for mutually exclusive TAGS with the fast tags interface.
+ - Bug fixes.
+
+Version 4.35
+~~~~~~~~~~~~
+ - HTML export is now valid XHTML.
+ - Timeline can also show dates without entries. See new option
+ `org-timeline-show-empty-dates'.
+ - The bullets created by the ASCII exporter can now be configured.
+ See the new option `org-export-ascii-bullets'.
+ - New face `org-upcoming-deadline' (was `org-scheduled-previously').
+ - New function `org-context' to allow testing for local context.
+
+Version 4.34
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.33
+~~~~~~~~~~~~
+ - New commands to move through plain lists: S-up and S-down.
+ - Bug fixes and documentation update.
+
+Version 4.32
+~~~~~~~~~~~~
+ - Fast (single-key-per-tag) interface for setting TAGS.
+ - The list of legal tags can be configured globally and locally.
+ - Elisp and Info links (thanks to Todd Neal).
+ - `org-export-publishing-directory' can be an alist, with different
+ directories for different export types.
+ - All context-sensitive commands use `call-interactively' to dispatch.
+ - `org-confirm-shell-links' renamed to `org-confirm-shell-link-function'.
+ - Bug fixes.
+
+Version 4.31
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.30
+~~~~~~~~~~~~
+ - Modified installation: Autoloads have been collected in org-install.el.
+ - Logging (org-log-done) is now a #+STARTUP option.
+ - Checkboxes in plain list items, following up on Frank Ruell's idea.
+ - File links inserted with C-c C-l will use relative paths if the linked
+ file is in the current directory or a subdirectory of it.
+ - New variable `org-link-file-path-type' to specify preference for
+ relative and absolute paths.
+ - New CSS classes for tags, timestamps, timestamp keywords.
+ - Bug and typo fixes.
+
+
+Version 4.29
+~~~~~~~~~~~~
+ - Inlining images in HTML export now depends on wheather the link
+ contains a description or not.
+ - TODO items can be scheduled from the global TODO list using C-c C-s.
+ - TODO items already scheduled can be made to disappear from the global
+ todo list, see `org-agenda-todo-ignore-scheduled'.
+ - In Tables, formulas may also be Lisp forms.
+ - Exporting the visible part of an outline with `C-c C-x v' works now
+ for all available exporters.
+ - Bug fixes, lots of them :-(
+
+Version 4.28
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.27
+~~~~~~~~~~~~
+ - HTML exporter generalized to receive external options.
+ As part of the process, author, email and date have been moved to the
+ end of the HTML file.
+ - Support for customizable file search in file links.
+ - BibTeX database links as first application of the above.
+ - New option `org-agenda-todo-list-sublevels' to turn off listing TODO
+ entries that are sublevels of another TODO entry.
+
+Version 4.26
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.25
+~~~~~~~~~~~~
+ - Revision of the font-lock faces section, with better tty support.
+ - TODO keywords in Agenda buffer are fontified.
+ - Export converts links between .org files to links between .html files.
+ - Better support for bold/italic/underline emphasis.
+
+Version 4.24
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.23
+~~~~~~~~~~~~
+ - Bug fixes.
+
+Version 4.22
+~~~~~~~~~~~~
+ - Bug fixes.
+ - In agenda buffer, mouse-1 no longer follows link.
+ See `org-agenda-mouse-1-follows-link' and `org-mouse-1-follows-link'.
+
+Version 4.20
+~~~~~~~~~~~~
+ - Links use now the [description] format by default.
+ When inserting links, the user is prompted for a description.
+ - If a link has a description, only the description is displayed
+ the link part is hidden. Use C-c C-l to edit the link part.
+ - TAGS are now bold, but in the same color as the headline.
+ - The width of a table column can be limited by using a field "<N>".
+ - New structure for the customization tree.
+ - Bug fixes.
+
+
+Version 4.13
+~~~~~~~~~~~~
+ - The list of agenda files can be maintainted in an external file.
+ - Bug fixes.
+
+Version 4.12
+~~~~~~~~~~~~
+ - Templates for remember buffer. Note that the remember setup changes.
+ To set up templates, see `org-remember-templates'.
+ - The time in new time stamps can be rounded, see new option
+ `org-time-stamp-rounding-minutes'.
+ - Bug fixes (there are *always* more bugs).
+
+[...]
+
+Version 4.00
+ - Headlines can contain TAGS, and Org-mode can produced a list
+ of matching headlines based on a TAG search expression.
+ - `org-agenda' has now become a dispatcher that will produce the agenda
+ and other views on org-mode data with an additional keypress.
+
+
+Version 3.24
+~~~~~~~~~~~~
+ - Switching and item to DONE records a time stamp when the variable
+ `org-log-done' is turned on. Default is off.
+
+Version 3.23
+~~~~~~~~~~~~
+ - M-RET makes new items as well as new headings.
+ - Various small bug fixes
+
+Version 3.22
+~~~~~~~~~~~~
+ - CamelCase words link to other locations in the same file.
+ - File links accept search options, to link to specific locations.
+ - Plain list items can be folded with `org-cycle'. See new option
+ `org-cycle-include-plain-lists'.
+ - Sparse trees for specific TODO keywords through numeric prefix
+ argument to `C-c C-v'.
+ - Global TODO list, also for specific keywords.
+ - Matches in sparse trees are highlighted (highlights disappear with
+ next buffer change due to editing).
+
+Version 3.21
+~~~~~~~~~~~~
+ - Improved CSS support for the HTML export. Thanks to Christian Egli.
+ - Editing support for hand-formatted lists
+ - M-S-cursor keys handle plain list items
+ - C-c C-c renumbers ordered plain lists
+
+Version 3.20
+~~~~~~~~~~~~
+ - There is finally an option to make TAB jump over horizontal lines
+ in tables instead of creating a new line before that line.
+ The option is `org-table-tab-jumps-over-hlines', default nil.
+ - New command for sorting tables, on `C-c ^'.
+ - Changes to the HTML exporter
+ - hand-formatted lists are exported correctly, similar to
+ markdown lists. Nested lists are possible. See the docstring
+ of the variable `org-export-plain-list-max-depth'.
+ - cleaned up to produce valid HTML 4.0 (transitional).
+ - support for cascading style sheets.
+ - New command to cycle through all agenda files, on C-,
+ - C-c [ can now also be used to change the sequence of agenda files.
+
+
+Version 3.19
+~~~~~~~~~~~~
+ - Bug fixes
+
+Version 3.18
+~~~~~~~~~~~~
+ - Export of calendar information in the standard iCalendar format.
+ - Some bug fixes.
+
+Version 3.17
+~~~~~~~~~~~~
+ - HTML export specifies character set depending on coding-system.
+
+Version 3.16
+~~~~~~~~~~~~
+ - In tables, directly after the field motion commands like TAB and RET,
+ typing a character will blank the field. Can be turned off with
+ variable `org-table-auto-blank-field'.
+ - Inactive timestamps with `C-c !'. These do not trigger the agenda
+ and are not linked to the calendar.
+ - Additional key bindings to allow Org-mode to function on a tty emacs.
+ - `C-c C-h' prefix key replaced by `C-c C-x', and `C-c C-x C-h' replaced
+ by `C-c C-x b' (b=Browser). This was necessary to recover the
+ standard meaning of C-h after a prefix key (show prefix bindings).
+
+Version 3.15
+~~~~~~~~~~~~
+ - QUOTE keyword at the beginning of an entry causes fixed-width export
+ of unmodified entry text. `C-c :' toggles this keyword.
+ - New face `org-special-keyword' which is used for COMMENT, QUOTE,
+ DEADLINE and SCHEDULED, and priority cookies. Default is only a weak
+ color, to reduce the amount of aggressive color in the buffer.
+
+Version 3.14
+~~~~~~~~~~~~
+ - Formulas for individual fields in table.
+ - Automatic recalculation in calculating tables.
+ - Named fields and columns in tables.
+ - Fixed bug with calling `org-archive' several times in a row.
+
+Version 3.13
+~~~~~~~~~~~~
+ - Efficiency improvements: Fewer table re-alignments needed.
+ - New special lines in tables, for defining names for individual cells.
+
+Version 3.12
+~~~~~~~~~~~~
+ - Tables can store formulas (one per column) and compute fields.
+ Not quite like a full spreadsheet, but very powerful.
+ - table.el keybinding is now `C-c ~'.
+ - Numeric argument to org-cycle does `show-subtree' above on level ARG.
+ - Small changes to keys in agenda buffer. Affected keys:
+ [w] weekly view; [d] daily view; [D] toggle diary inclusion.
+ - Bug fixes.
+
+Version 3.11
+~~~~~~~~~~~~
+ - Links inserted with C-c C-l are now by default enclosed in angle
+ brackets. See the new variable `org-link-format'.
+ - ">" terminates a link, this is a way to have several links in a line.
+ Both "<" and ">" are no longer allowed as characters in a link.
+ - Archiving of finished tasks.
+ - C-<up>/<down> bindings removed, to allow access to paragraph commands.
+ - Compatibility with CUA-mode (see variable `org-CUA-compatible').
+ - Compatibility problems with viper-mode fixed.
+ - Improved html export of tables.
+ - Various clean-up changes.
+
+Version 3.10
+~~~~~~~~~~~~
+ - Using `define-derived-mode' to derive `org-mode' from `outline-mode'.
+
+
+Version 3.09
+~~~~~~~~~~~~
+ - Time-of-day specifications in agenda are extracted and placed
+ into the prefix. Timed entries can be placed into a time grid for
+ day.
+
+Version 3.08
+~~~~~~~~~~~~
+ - "|" no longer allowed as part of a link, to allow links in tables.
+ - The prefix of items in the agenda buffer can be configured.
+ - Cleanup.
+
+Version 3.07
+~~~~~~~~~~~~
+ - Some folding inconsistencies removed.
+ - BBDB links to company-only entries.
+ - Bug fixes and global cleanup.
+
+Version 3.06
+~~~~~~~~~~~~
+ - M-S-RET inserts a new TODO heading.
+ - New startup option `content'.
+ - Better visual response when TODO items in agenda change status.
+ - Window positioning after visibility state changes optimized and made
+ configurable. See `org-cycle-hook' and `org-occur-hook'.
+
+Version 3.05
+~~~~~~~~~~~~
+ - Agenda entries from the diary are linked to the diary file, so
+ adding and editing diary entries can be done directly from the agenda.
+ - Many calendar/diary commands available directly from agenda.
+ - Field copying in tables with S-RET does increment.
+ - C-c C-x C-v extracts the visible part of the buffer for printing.
+ - Moving subtrees up and down preserves the whitespace at the tree end.
+
+Version 3.04
+~~~~~~~~~~~~
+ - Table editor optimized to need fewer realignments, and to keep
+ table shape when typing in fields.
+ - A new minor mode, orgtbl-mode, introduces the Org-mode table editor
+ into arbitrary major modes.
+ - Fixed bug with realignment in XEmacs.
+ - Startup options can be set with special #+STARTUP line.
+ - Heading following a match in org-occur can be suppressed.
+
+Version 3.03
+~~~~~~~~~~~~
+ - Copyright transfer to the FSF.
+ - Effect of C-u and C-u C-u in org-timeline swapped.
+ - Timeline now always contains today, and `.' jumps to it.
+ - Table editor:
+ - cut and paste of rectangular regions in tables
+ - command to convert org-mode table to table.el table and back
+ - command to treat several cells like a paragraph and fill it
+ - command to convert a buffer region to a table
+ - import/export tables as tab-separated files (exchange with Excel)
+ - Agenda:
+ - Sorting mechanism for agenda items rewritten from scratch.
+ - Sorting fully configurable.
+ - Entries specifying a time are sorted together.
+ - Completion also covers option keywords after `#-'.
+ - Bug fixes.
+
+Version 3.01
+~~~~~~~~~~~~
+ - New reference card, thanks to Philip Rooke for creating it.
+ - Single file agenda renamed to "Timeline". It no longer shows
+ warnings about upcoming deadlines/overdue scheduled items.
+ That functionality is now limited to the (multifile) agenda.
+ - When reading a date, the calendar can be manipulated with keys.
+ - Link support for RMAIL and Wanderlust (from planner.el, untested).
+ - Minor bug fixes and documentation improvements.
+
+Version 3.00
+~~~~~~~~~~~~
+ - Multifile Agenda shows current entries from many different files.
+ - TeXInfo documentation (thanks to Christian Egli for the conversion).
+ - Additional applications for TODO keywords, see documentation.
+ Different files may have different TODO keywords etc.
+ - Priorities for TODO items.
+ - The browser mode used by `org-remember-handler' is improved.
+ - Images get inlined in HTML export (thanks to Carsten Wimmer).
+ - File links can contain line numbers, like [file:/usr/etc/config:255]
+ - Minor bug fixes.
+
+
+Version 2.10
+~~~~~~~~~~~~
+ - TODO entries can have additional states besides TODO and DONE.
+ See new variable `org-todo-keywords'.
+ - TODO keywords can be interpreted as categories. See variable
+ `org-todo-interpretation'.
+ - M-TAB completion on TODO keywords, TeX symbols, and normal words.
+ - All keywords (like TODO, DEADLINE etc) are configurable.
+ - Cursor positioning optimized after pro/demotion and TODO cycling.
+ - Emphasizing in HTML works now for *bold*, /italic/ and _underline_.
+ - New commands to kill, copy and yank entire subtrees. Yanking
+ modifies the level of the tree before insertion.
+ - New command `org-goto' (C-c C-j) to quickly move to other locations
+ in the buffer without affecting outline visibility.
+ - Hooks for John Wiegley's remember.el.
+ - `org-read-date' pops up calendar for date selection with the mouse.
+ See variable `org-popup-calendar-for-date-prompt'.
+
+Version 2.6
+~~~~~~~~~~~
+ - TODO items can be SCHEDULED to a certain date.
+ - Expired DEADLINEs are ignored if in an entry marked DONE.
+ - From the diary or time-sorted view (C-c C-r), C-c C-t can be used to
+ change the TODO state of an item remotely.
+ - Horizontal computations in table editor. See `org-table-eval-formula'.
+ - Fixed bug with summing tables (command `org-table-sum', `C-c +').
+ - Calendar window follows the timestamp when a timestamp is changed.
+ New variable `org-calendar-follow-timestamp-change'.
+ - Time-sorted view (`org-diary-view', C-c C-r) now uses the prefix
+ argument to force inclusion of unscheduled TODO items.
+ - New variable `org-confirm-shell-links' to turn of safety query.
+ - New variable `org-open-non-existing-files'.
+
+Version 2.4
+~~~~~~~~~~~
+ - A time-sorted view on all time stamps can be created with C-c C-r.
+ - Timestamps and Deadlines can be shown in the Emacs diary.
+ - Date ranges introduced.
+ - Time-string formats are no longer configurable.
+ - Vertical lines in tables can be made invisible with `C-c |'.
+ - New "link" type to execute shell commands, like "[shell:ls] *.org"
+ - Upon export, "myfile.org" becomes "myfile.html" or "myfile.txt",
+ instead of "myfile.org.html" or "myfile.org.txt".
+ - When the cursor is in the white space at the beginning of a line,
+ TAB removes the whitespace before indenting again.
+
+Version 2.0
+~~~~~~~~~~~
+ - Windows (NT/2000) support.
+ - Works with both Emacs and XEmacs.
+ - Fully automatic table editor.
+ - New link types into Gnus, VM and BBDB.
+ - Other link system changes
+ - Time stamps are treated as links to the calendar.
+ - Easy creation of links with global command `org-store-link'.
+ - Insertion of links with `C-c C-l' works differently now.
+ - Space characters allowed as part of a link.
+ - Options in `org-file-apps' extended. The command may now be
+ symbol 'emacs', or a lisp form.
+ Please re-read the manual section about links.
+ - Timestamp changes
+ - `org-deadline' now prompts for a date.
+ - A line can now contain several timestamps. Updating of a
+ timestamp only happens if the cursor is at the timestamp.
+ - Changed the time-stamp-format to ISO, to make sure it will
+ always work (non-English month names had caused problems
+ with `parse-time-string'.). Changing the time stamp format
+ is not recommended.
+ - Picture mode enhancements have been removed from org.el
+
+
+Version 1.4
+~~~~~~~~~~~
+ - Some option name changes, not backward compatible.
+ - ASCII exporter upgrade: Table of contents.
+ - HTML exporter upgrade: fixed-width regions, better
+ sub/superscripts, many TeX symbols supported.
+ - Calendar support.
+
+Version 1.3
+~~~~~~~~~~~
+ - HTML exporter upgrade, in particular table of contents
+
+
+
diff --git a/ORGWEBPAGE/tmp/faq.html b/ORGWEBPAGE/tmp/faq.html
new file mode 100644
index 0000000..014bfc8
--- /dev/null
+++ b/ORGWEBPAGE/tmp/faq.html
@@ -0,0 +1,663 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-mode Frequently Asked Questions</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2008/01/27 10:12:10"/>
+<meta name="author" content="Carsten Dominik"/>
+<link rel=stylesheet href="freeshell2.css" type="text/css">
+</head><body>
+<h1 class="title">Org-mode Frequently Asked Questions</h1>
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">1 General</a>
+<ul>
+<li><a href="#sec-2">1.1 Use features in other modes</a></li>
+<li><a href="#sec-3">1.2 Visibility cycling in Outline-mode and Outline-minor-mode</a></li>
+</ul>
+</li>
+<li><a href="#sec-4">2 Errors</a>
+<ul>
+<li><a href="#sec-5">2.1 <code>(wrong-type-argument keymapp nil)</code></a></li>
+<li><a href="#sec-6">2.2 CUA mode does not work with Org-mode</a></li>
+<li><a href="#sec-7">2.3 <code>winddmove.el</code> does not work with Org-mode.</a></li>
+</ul>
+</li>
+<li><a href="#sec-8">3 Setup and Structure</a>
+<ul>
+<li><a href="#sec-9">3.1 Org-mode as default mode</a></li>
+<li><a href="#sec-10">3.2 Get rid of extra stars in outline</a></li>
+<li><a href="#sec-11">3.3 Two windows on same Org-mode file</a></li>
+<li><a href="#sec-12">3.4 Insert empty lines before new headings and plain list items</a></li>
+<li><a href="#sec-13">3.5 Amount of context in sparse trees</a></li>
+<li><a href="#sec-14">3.6 Stacking calls to org-occur</a></li>
+</ul>
+</li>
+<li><a href="#sec-15">4 Hyperlinks</a>
+<ul>
+<li><a href="#sec-16">4.1 Confirmation for shell and elisp links</a></li>
+<li><a href="#sec-17">4.2 Use RET or TAB to follow a link</a></li>
+<li><a href="#sec-18">4.3 Clicking on a link without activating it</a></li>
+</ul>
+</li>
+<li><a href="#sec-19">5 Remember</a></li>
+<li><a href="#sec-20">6 Export</a>
+<ul>
+<li><a href="#sec-21">6.1 Make TODO entries items, not headlines in HTML export</a></li>
+<li><a href="#sec-22">6.2 Export only a subtree</a></li>
+<li><a href="#sec-23">6.3 How to import org-mode calendar data into Mac OSX ical</a></li>
+</ul>
+</li>
+<li><a href="#sec-24">7 Tables</a>
+<ul>
+<li><a href="#sec-25">7.1 #ERROR fields in tables</a></li>
+<li><a href="#sec-26">7.2 Unwanted new lines in table</a></li>
+<li><a href="#sec-27">7.3 Automatic detection of formulas</a></li>
+<li><a href="#sec-28">7.4 Change indentation of a table</a></li>
+<li><a href="#sec-29">7.5 Performance issues with table alignment</a></li>
+<li><a href="#sec-30">7.6 Performance issues with table calculation</a></li>
+<li><a href="#sec-31">7.7 Incrementing numbers</a></li>
+</ul>
+</li>
+<li><a href="#sec-32">8 Agenda</a>
+<ul>
+<li><a href="#sec-33">8.1 Include Org-mode agenda into Emacs diary</a></li>
+</ul>
+</li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-1">1 General</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-2">1.1 Use features in other modes</h3>
+
+<p><b>I would like to use editing features of org-mode in other modes, is this possible?</b>
+</p>
+<p>
+Not really. For tables there is <code>orgtbl-mode</code> which implements the
+table editor as a minor mode. For other features you need to switch to
+Org-mode temporarily, or prepare text in a different buffer.
+</p>
+
+</div>
+
+<div class="outline-3">
+<h3 id="sec-3">1.2 Visibility cycling in Outline-mode and Outline-minor-mode</h3>
+
+
+<p>
+<b>Can I get the visibility-cycling features in outline-mode and outline-minor-mode?</b>
+</p>
+<p>
+Yes, these functions are written in a way that they are independent of
+the outline setup. The following setup provides standard Org-mode
+functionality in outline-mode on <code>TAB</code> and <code>S-TAB</code>. For
+outline-minor-mode, we use <code>C-TAB</code> instead of <code>TAB</code>,
+because <code>TAB</code> usually has mode-specific tasks.
+</p>
+<p>
+<pre>
+(add-hook 'outline-minor-mode-hook
+ (lambda ()
+ (define-key outline-minor-mode-map [(control tab)] 'org-cycle)
+ (define-key outline-minor-mode-map [(shift tab)] 'org-global-cycle)))
+(add-hook 'outline-mode-hook
+ (lambda ()
+ (define-key outline-mode-map [(tab)] 'org-cycle)
+ (define-key outline-mode-map [(shift tab)] 'org-global-cycle)))
+</pre>
+</p>
+<p>
+Or check out <i>outline-magic.el</i>, which does this and also provides
+promotion and demotion functionality. <i>outline-magic.el</i> is
+available at <a href="http://www.astro.uva.nl/~dominik/Tools/OutlineMagic">Outline Magic</a>.
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-4">2 Errors</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-5">2.1 <code>(wrong-type-argument keymapp nil)</code></h3>
+
+<p><b>When I try to use Org-mode, I always get the error message @code{(wrong-type-argument keymapp nil)}</b>
+</p>
+<p>
+This is a conflict with an outdated version of the <i>allout.el</i>, see
+the <a href="http://staff.science.uva.nl/~dominik/Tools/org/org.html#Conflicts">Conflicts</a> section in the manual
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-6">2.2 CUA mode does not work with Org-mode</h3>
+
+
+<p>
+<b>Org-mode takes over the S-cursor keys. I also want to use CUA-mode, is there a way to fix this conflict?</b>
+</p>
+<p>
+Yes, see the <a href="http://staff.science.uva.nl/~dominik/Tools/org/org.html#Conflicts">Conflicts</a> section of the manual.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-7">2.3 <code>winddmove.el</code> does not work with Org-mode.</h3>
+
+
+<p>
+<b>Org-mode takes over the S-cursor keys. I also want to use windmove.el, is there a way to fix this conflict?</b>
+</p>
+<p>
+Yes, see the <a href="http://staff.science.uva.nl/~dominik/Tools/org/org.html#Conflicts">Conflicts</a> section of the manual.
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-8">3 Setup and Structure</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-9">3.1 Org-mode as default mode</h3>
+
+
+<p>
+<b>Org-mode seems to be a useful default mode for the various README files I have scattered through my directories</b>. <b>How do I turn it on for all README files?</b>
+</p>
+<p>
+Add the following to your .emacs file:
+</p>
+<p>
+<pre>
+ (add-to-list 'auto-mode-alist '("README$" . org-mode))
+</pre>
+</p>
+<p>
+You can even make it the default mode for any files with unspecified
+mode using
+</p>
+<p>
+<pre>
+ (setq default-major-mode 'org-mode)
+</pre>
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-10">3.2 Get rid of extra stars in outline</h3>
+
+
+<p>
+*All these stars are driving me mad, I just find the Emacs outlines
+unreadable. Can't you just put white space and a single star as a
+starter for headlines?*
+</p>
+<p>
+See the section <a href="http://staff.science.uva.nl/~dominik/Tools/org/org.html#Clean%20outline%20view">Clean outline view</a> in the manual.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-11">3.3 Two windows on same Org-mode file</h3>
+
+<p><b>I would like to have two windows on the same Org-mode file, but with different outline visibility. Is that possible?</b>
+</p>
+<p>
+You may use <i>indirect buffers</i> which do exactly this. See the
+documentation on the command <code>make-indirect-buffer</code>.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-12">3.4 Insert empty lines before new headings and plain list items</h3>
+
+
+<p>
+<b>I would like to have an empty line before each newly inserted headline, but not before each newly inserted plain-list item</b>.
+</p>
+<p>
+<pre>
+ (setq org-blank-before-new-entry
+ '((heading . t) (plain-list-item . nil))
+</pre>
+</p>
+
+</div>
+
+<div class="outline-3">
+<h3 id="sec-13">3.5 Amount of context in sparse trees</h3>
+
+
+<p>
+*Sparse tree show the headline hierarchy above each match, and also
+the headline following a match. I'd like to construct more compact
+trees, with less context.*
+</p>
+<p>
+Take a look at the variables <code>org-show-hierarchy-above</code> and
+<code>org-show-following-headline</code>.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-14">3.6 Stacking calls to org-occur</h3>
+
+
+<p>
+*Each call to org-occur starts again from OVERVIEW and exposes only
+the matches of the current call. I'd like to combine the effect of
+several calls*.
+</p>
+<p>
+You can construct a regular expression that matches all targets you
+want. Alternatively, use a <code>C-u</code> prefix with the second and any
+further calls to <code>org-occur</code> to keep the current visibility and
+highlighting in addition to the new ones.
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-15">4 Hyperlinks</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-16">4.1 Confirmation for shell and elisp links</h3>
+
+
+<p>
+*When I am executing shell/elisp links I always get a confirmation
+prompt and need to type "yes RET", that's 4 key presses! Can I get
+rid of this?*
+</p>
+<p>
+The confirmation is there to protect you from unwantingly execute
+potentially dangerous commands. For example, imagine a link
+<pre>
+[[shell:rm -rf ~/*][ Google Search]]
+</pre>
+</p>
+<p>
+In an Org-mode buffer, this command would look like <i>Google Search</i>,
+but really it would remove your home directory. If you wish, you can
+make it easier to respond to the query by setting
+</p>
+<p>
+<pre>
+ (setq org-confirm-shell-link-function 'y-or-n-p
+ org-confirm-elisp-link-function 'y-or-n-p).
+</pre>
+</p>
+<p>
+Then a single keypress will be enough to confirm those links. It is
+also possible to turn off this check entirely, but I strongly recommend
+against this. Be warned.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-17">4.2 Use RET or TAB to follow a link</h3>
+
+
+<p>
+<b>From other packages like Emacs-wiki, I am used to follow links with =RET= when the cursor is on the link. Is this also possible in org-mode?</b>
+</p>
+<p>
+Yes, and you may also use TAB.
+</p>
+<p>
+<pre>
+ (setq org-return-follows-link t)
+ (setq org-tab-follows-link t)
+</pre>
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-18">4.3 Clicking on a link without activating it</h3>
+
+
+<p>
+<b>Each time I click inside a link in order to set point to this location, Org-mode actually follows the link</b>
+</p>
+<p>
+Activating links with <code>mouse-1</code> is a new feature in Emacs 22, to make
+link behavior similar to other applications like web browsers. If you
+hold the mouse button down a bit longer, the cursor will be set
+without following the link. If you cannot get used to this behavior,
+you can (as in Emacs 21) use <code>mouse-2</code> to follow links and turn off
+link activation for <code>mouse-1</code> with
+</p>
+<p>
+<pre>
+ (setq org-mouse-1-follows-link nil)
+</pre>
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-19">5 Remember</h2>
+
+
+<p>
+<b>Can I automatically start the clock when opening a remember template?</b>
+</p>
+<p>
+Yes, this is possible. Use the following code and make sure that
+after executing it, `my-start-clock-if-needed' is in
+`remember-mode-hook' <i>after</i> `org-remember-apply-template'.
+</p>
+<p>
+<pre>
+ (add-hook 'remember-mode-hook 'my-start-clock-if-needed 'append)
+ (defun my-start-clock-if-needed ()
+ (save-excursion
+ (goto-char (point-min))
+ (when (re-search-forward " *CLOCK-IN *" nil t)
+ (replace-match "")
+ (org-clock-in))))
+</pre>
+</p>
+<p>
+Then, when a template contains the key string CLOCK-IN, the clock will
+be started. Starting with Org-mode version 5.20, the clock will
+automatically be stopped when storing the remember buffer.
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-20">6 Export</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-21">6.1 Make TODO entries items, not headlines in HTML export</h3>
+
+
+<p>
+*When I export my TODO list, every TODO item becomes a separate
+section. How do I enforce these items to be exported as an itemized
+list?*
+</p>
+<p>
+If you plan to use ASCII or HTML export, make sure things you want to
+be exported as item lists are level 4 at least, even if that does mean
+there is a level jump. For example:
+</p>
+<p>
+<pre>
+ * Todays top priorities
+ **** TODO write a letter to xyz
+ **** TODO Finish the paper
+ **** Pick up kids at the school
+</pre>
+</p>
+<p>
+Alternatively, if you need a specific value for the heading/item
+transition in a particular file, use the <code>#+OPTIONS</code> line to
+configure the H switch.
+</p>
+<p>
+<pre>
+ #+OPTIONS: H:2; ...
+</pre>
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-22">6.2 Export only a subtree</h3>
+
+
+<p>
+<b>I would like to export only a subtree of my file to HTML. How?</b>
+</p>
+<p>
+If you want to export a subtree, mark the subtree as region and then
+export. Marking can be done with <code>C-c @ C-x C-x</code>, for example.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-23">6.3 How to import org-mode calendar data into Mac OSX ical</h3>
+
+
+<p>
+<b>I would like my iCal program on Mac OSX to import the iCalendar file produced by Org-mode. How?</b>
+</p>
+<p>
+<i>This is for OSX 10.3, see below for 10.4:</i> When using iCal under
+Apple MacOS X, you can create a new calendar <i>OrgMode</i> (the default
+name for the calendar created by <code>C-c C-e c</code>, see the variables
+<code>org-icalendar-combined-name</code> and
+<code>org-combined-agenda-icalendar-file</code>). Then set Org-mode to overwrite
+the corresponding file <i>~/Library/Calendars/OrgMode.ics</i>. You may
+even use AppleScript to make iCal re-read the calendar files each time
+a new version of <i>OrgMode.ics</i> is produced. Here is the setup needed
+for this:
+</p>
+<p>
+<pre>
+ (setq org-combined-agenda-icalendar-file
+ "~/Library/Calendars/OrgMode.ics")
+ (add-hook 'org-after-save-iCalendar-file-hook
+ (lambda ()
+ (shell-command
+ "osascript -e 'tell application \"iCal\" to reload calendars'")))
+</pre>
+</p>
+
+<p>
+For Mac OS X 10.4, you need to write the ics file to
+<code>/Library/WebServer/Documents/</code> and then subscribe iCalendar to
+<code>http: //localhost/orgmode.ics</code>
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-24">7 Tables</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-25">7.1 #ERROR fields in tables</h3>
+
+
+<p>
+<b>One of my table columns has started to fill up with =#ERROR=. What is going on?</b>
+</p>
+<p>
+Org-mode tried to compute the column from other fields using a
+formula stored in the <code>#+TBLFM:</code> line just below the table, and
+the evaluation of the formula fails. Fix the fields used in the
+formula, or fix the formula, or remove it!
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-26">7.2 Unwanted new lines in table</h3>
+
+
+<p>
+*When I am in the last column of a table and just above a horizontal
+line in the table, pressing TAB creates a new table line before the
+horizontal line*. <b>How can I quickly move to the line below the horizontal line instead?</b>
+</p>
+<p>
+Press <code>down</code> (to get on the separator line) and then <code>TAB</code>.
+Or configure the variable
+</p>
+<p>
+<pre>
+ (setq org-table-tab-jumps-over-hlines t)
+</pre>
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-27">7.3 Automatic detection of formulas</h3>
+
+<p><b>I need to use fields in my table that start with "=", and each time I enter such a field, Org-mode thinks this is a formula</b>.
+</p>
+<p>
+With the setting
+</p>
+<p>
+<pre>
+ (setq org-table-formula-evaluate-inline nil)
+</pre>
+</p>
+<p>
+this will no longer happen. You can still use formulas using the
+commands <tt>C-c =</tt> and <tt>C-u C-c =</tt>
+</p>
+
+</div>
+
+<div class="outline-3">
+<h3 id="sec-28">7.4 Change indentation of a table</h3>
+
+<p><b>How can I change the indentation of an entire table without fixing every line by hand?</b>
+</p>
+<p>
+The indentation of a table is set by the first line. So just fix the
+indentation of the first line and realign with <code>TAB</code>.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-29">7.5 Performance issues with table alignment</h3>
+
+<p><b>I have a huge table in a file, and the automatic realign of tables is just taking too long. What can I do?</b>
+</p>
+<p>
+Either split the table into several by inserting an empty line every
+100 lines or so. Or turn off the automatic re-align with
+</p>
+<p>
+<pre>
+ (setq org-table-automatic-realign nil)
+</pre>
+</p>
+<p>
+After this the only way to realign a table is to press <code>C-c C-c</code>. It
+will no longer happen automatically, removing the corresponding delays
+during editing.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-30">7.6 Performance issues with table calculation</h3>
+
+<p><b>I have a complex table with lots of formulas, and recomputing the table takes rather long. What can I do?</b>
+</p>
+<p>
+Nothing, really. The spreadsheet in org is mostly done to make
+calculations possible, not so much to make them fast. Since Org-mode
+is firmly committed to the ASCII format, nothing is stopping you from
+editing the table by hand. Therefore, there is no internal
+representation of the data. Each time Org-mode starts a computation,
+it must scan the table for special lines, find the fields etc. This
+is slow. Furthermore, Calc is slow compared to hardware computations.
+To make this work with normal editing, recalculation is not happening
+automatically, or only for the current line, so that the long wait for
+a full table iteration only happens when you ask for it.
+</p>
+<p>
+So for really complex tables, moving to a "real" spreadsheet may still
+be the best option.
+</p>
+<p>
+That said, there are some ways to optimize things in Org-mode, and I
+have been thinking about moving a bit further down this line.
+However, for my applications this has so far not been an issue at all.
+If you have a good case,you could try to convince me.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-31">7.7 Incrementing numbers</h3>
+
+<p>*When I press <code>S-RET</code> in a table field to copy its value down, the
+content is not copied as is, but it is increased by one.
+Is that a bug or a feature*
+</p>
+<p>
+Well, it is <i>supposed</i> to be a feature, to make it easy to create a
+column with increasing numbers. If this gets into your way, turn it
+off with
+</p>
+<p>
+<pre>
+ (setq org-org-table-copy-increment nil)
+</pre>
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-32">8 Agenda</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-33">8.1 Include Org-mode agenda into Emacs diary</h3>
+
+<p><b>Is it possible to include entries from org-mode files into my emacs diary?</b>
+</p>
+<p>
+Since the org-mode agenda is much more powerful and can contain the
+diary, you should think twice before deciding to do this. If you
+insist, however, integrating Org-mode information into the diary is
+possible. You need to turn on <i>fancy diary display</i> by setting in
+.emacs:
+</p>
+<p>
+<pre>
+ (add-hook 'diary-display-hook 'fancy-diary-display)
+</pre>
+</p>
+<p>
+Then include the following line into your ~/diary file, in
+order to get the entries from all files listed in the variable
+<code>org-agenda-files</code>
+</p>
+<p>
+<pre>
+ &amp;%%(org-diary)
+</pre>
+You may also select specific files with
+</p>
+<p>
+<pre>
+ &amp;%%(org-diary) ~/path/to/some/org-file.org
+ &amp;%%(org-diary) ~/path/to/another/org-file.org
+</pre>
+</p>
+<p>
+If you now launch the calendar and press <tt>d</tt> to display a diary, the
+headlines of entries containing a timestamp, date range, schedule, or
+deadline referring to the selected date will be listed. Just like
+Org-mode's agenda view, the diary for <i>today</i> contains additional
+entries for overdue deadlines and scheduled items. See also the
+documentation of the <code>org-diary</code> function. Under XEmacs, it is
+not possible to jump back from the diary to the org, this works only in
+the agenda buffer.
+</p>
+
+</div>
+</div>
+<div id="postamble"><p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten.dominik@gmail.com">&lt;carsten.dominik@gmail.com&gt;</a>
+</p>
+<p class="date"> Date: 2008/01/27 10:12:10</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/tmp/freeshell2.css b/ORGWEBPAGE/tmp/freeshell2.css
new file mode 100644
index 0000000..832be93
--- /dev/null
+++ b/ORGWEBPAGE/tmp/freeshell2.css
@@ -0,0 +1,65 @@
+body {
+ font-family: helvetica, verdana, sans-serif;
+ font-family: verdana, sans-serif;
+ font-size: 11pt;
+ margin-top: 5%;
+ margin-bottom: 8%;
+ background: white; color: black;
+ margin-left: 3% !important; margin-right: 3% !important;
+}
+
+h1 {
+ font-size: 16pt;
+ color: #cc8c00;
+ padding-top: 1em;
+ border-bottom: 2px solid #aaa;
+}
+
+h2 {
+ font-size: 14pt;
+ padding-top: 1em;
+ border-bottom: 1px solid #ccc;
+}
+
+h3 {
+ font-size: 12pt;
+ padding-top: 0.5em;
+ border-bottom: 1px solid #eee;
+}
+
+.todo, .deadline { color: red; font-style: italic }
+.done { color: green; font-style: italic }
+.timestamp { color: grey }
+.timestamp-kwd { color: CadetBlue; }
+.tag { background-color:lightblue; font-weight:normal; }
+
+.target { background-color: lavender; }
+
+.menu {
+ color: #666;
+}
+
+.menu a:link {
+ color: #888;
+}
+.menu a:active {
+ color: #888;
+}
+.menu a:visited {
+ color: #888;
+}
+
+img { align: center; }
+
+pre {
+ padding: 5pt;
+ font-family: courier, monospace;
+ font-size: 10pt;
+}
+
+table { border-collapse: collapse; }
+
+td, th {
+ vertical-align: top;
+ border: 1pt solid #ADB9CC;
+}
diff --git a/ORGWEBPAGE/tmp/index.html b/ORGWEBPAGE/tmp/index.html
new file mode 100644
index 0000000..326f644
--- /dev/null
+++ b/ORGWEBPAGE/tmp/index.html
@@ -0,0 +1,419 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-Mode Homepage</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2008/01/27 22:14:32"/>
+<meta name="author" content="Carsten Dominik"/>
+<link rel=stylesheet href="freeshell2.css" type="text/css">
+</head><body>
+<h1 class="title">Org-Mode Homepage</h1>
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">Org - an Emacs Mode for Notes and Project Planning</a></li>
+<li><a href="#sec-2">Current Version (5.19a) and Compatibility</a></li>
+<li><a href="#sec-3">Downloads</a></li>
+<li><a href="#sec-4">Documentation</a>
+<ul>
+<li><a href="#sec-5">Manual and Reference card</a></li>
+</ul>
+</li>
+<li><a href="#sec-6">Links</a>
+<ul>
+<li><a href="#sec-7">Mailing list</a></li>
+<li><a href="#sec-8">Worg - user-driven knowledge-base about org-mode</a></li>
+<li><a href="#sec-9">Tutorials</a></li>
+<li><a href="#sec-10">Survey</a></li>
+<li><a href="#sec-11">Org-mode, GTD and other task management systems </a></li>
+<li><a href="#sec-12">Add-Ons</a></li>
+<li><a href="#sec-13">Translators</a></li>
+<li><a href="#sec-17">Alternative distributions</a></li>
+<li><a href="#sec-18">Contributing to Org-mode</a></li>
+<li><a href="#sec-19">Future Development</a></li>
+</ul>
+</li>
+<li><a href="#sec-20">Related Software</a></li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-1">Org - an Emacs Mode for Notes and Project Planning</h2>
+
+
+
+
+<BASE href="http://orgmode.org/index.html">
+
+<p>
+Org-mode is a mode for keeping notes, maintaining ToDo lists, and doing
+project planning with a fast and effective plain-text system.
+</p>
+<p>
+Org-mode develops organizational tasks around NOTES files that contain
+information about projects as plain text. Org-mode is implemented on
+top of outline-mode, which makes it possible to keep the content of
+large files well structured. Visibility cycling and structure editing
+help to work with the tree. Tables are easily created with a built-in
+table editor. Org-mode supports ToDo items, deadlines, time stamps,
+and scheduling. It dynamically compiles entries into an agenda.
+Plain text URL-like links connect to websites, emails, Usenet
+messages, BBDB entries, and any files related to the projects. For
+printing and sharing of notes, an Org-mode file can be exported as a
+structured ASCII file, HTML, and LaTeX.
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-2">Current Version (5.19a) and Compatibility</h2>
+
+
+<p>
+The current version is 5.19a. To see what has changed in recent
+releases, check this <a href="Changes.html">list of user-visible changes</a>. These descriptions
+are extensive, to avoid that people will be printing the manual after
+each incremental release. If you have an older version of the manual,
+just check the release notes and you will be up-to-date.
+</p>
+<p>
+This package works on Emacs 22, and (with minor restrictions) on Emacs
+21 and XEmacs 21 (where you must also use <i>noutline.el</i> shipped with
+Org-mode). The Emacs 22.1 release ships with Org-mode version 4.67c.
+The latest CVS emacs trunk usually contains a fairly recent version,
+but may lag a bit behind the website release.
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-3">Downloads</h2>
+
+
+<ul>
+<li>Distribution<br/>
+Download as <a href="org-5.19a.zip">zip file</a> or <a href="org-5.19a.tar.gz">gzipped tar archive</a>. These archives contain
+both the Lisp file org.el and the documentation in PDF and (TeX)Info
+formats. A shell script to simplify upgrading to the newest release
+has been posted <a href="http://www.philfam.co.uk/pete/GTD/org-mode/update-org.sh">here</a>.
+
+</li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-4">Documentation</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-5">Manual and Reference card</h3>
+
+<ul>
+<li>
+Read the documentation <a href="manual/index.html">online</a>. This is a version consisting of many
+small files, to save bandwidth. If you really need it, you can also
+have the entire manual in a <a href="org.html">single monolithic file</a>.
+</li>
+<li>
+Download the documentation in other formats: <a href="org.pdf">PDF</a>, <a href="org">Info</a>, or <a href="org.texi">TeXInfo</a>.
+</li>
+<li>
+Download the <a href="orgcard.pdf">Refcard</a> for org-mode, and Kyle Sherman hast created a
+<a href="orgcard.txt">text version</a> of the reference card
+</li>
+<li>
+There is also a <a href="http://hpcgi1.nifty.com/spen/index.cgi?OrgMode%2fManual">Japanese translation</a> of the manual (version 4.60),
+produced by Takeshi Okano.
+</li>
+<li>
+The <a href="faq.html">FAQ</a> is not very up-to-date, but may still answer some of your
+questions. Please have a look before posting to emacs-orgmode@gnu.org.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-6">Links</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-7">Mailing list</h3>
+
+
+<p>
+There is a mailing list for discussion about org-mode.
+</p>
+<ul>
+<li>
+Subscribe to it at <a href="http://lists.gnu.org/mailman/listinfo/emacs-orgmode">this webpage</a>.
+</li>
+<li>
+Directly <a href="mailto:emacs-orgmode@gnu.org">send mail to it</a>. If you are not subscribed, a moderator
+will look at the message before passing it through to the
+list. If that has happened once, future messages from your email
+address will get through immediately, even if you remain
+unsubscribed.
+</li>
+<li>
+Read the list on <a href="http://www.gmane.org">Gmane</a> through a <a href="http://news.gmane.org/gmane.emacs.orgmode">web interface</a> or with a
+<a href="news://news.gmane.org/gmane.emacs.orgmode">newsreader</a>.
+<li><form method="get" action="http://search.gmane.org/">
+<input type="text" name="query">
+<input type="hidden" name="group" value="gmane.emacs.orgmode">
+<input type="submit" value="Search gmane.emacs.orgmode">
+</form>
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-8">Worg - user-driven knowledge-base about org-mode</h3>
+
+
+<p>
+<a href="http://129.199.80.1/~guerry/worg/">Worg</a>, created by <a href="http://www.cognition.ens.fr/~guerry/">Bastien Guerry</a>, is a setup to allow users to jointly
+edit a number of Org-mode files containing documentation about
+Org-mode. This is something like a wiki. If you'd like to contribute
+your own setup, screenshots, tutorials etc, please go to <a href="http://129.199.80.1/~guerry/worg/">the Worg page</a>, and start from there.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-9">Tutorials</h3>
+
+
+<p>
+<a href="tutorials.html">Tutorials and screencasts</a> are listed on a separate page.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-10">Survey</h3>
+
+
+<p>
+In November 2007, Charles Cave organized a survey among Org-mode
+users. The answers given in this survey can be found <a href="survey.html">here</a>.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-11">Org-mode, GTD and other task management systems </h3>
+
+<p>Org-mode is flexible enough to implement many different ways of
+organizing your projects. A frequently discusses scheme is <a href="http://www.davidco.com/">David Allen's</a> strategy for <a href="http://en.wikipedia.org/wiki/GTD">Getting Things Done</a>. But it is clearly not
+the only way to us Org-mode for planning. Here are a couple of
+links related to this topic.
+</p>
+<ul>
+<li>
+<a href="http://johnwiegley.com">John Wiegley</a> has written an excellent document describing his
+way of using Org-mode as a <a href="http://johnwiegley.com/org.mode.day.planner.html">day planner</a>. See also some later
+messages for enhancements of his setup:
+<a href="http://article.gmane.org/gmane.emacs.orgmode/2963">emacs-orgmode-2962</a>, <a href="http://article.gmane.org/gmane.emacs.orgmode/3629">emacs-orgmode-3629</a>
+
+</li>
+<li>
+<a href="http://members.optusnet.com.au/charles57/Creative/">Charles Cave</a> has written an <a href="http://members.optusnet.com.au/~charles57/GTD/orgmode.html">article/tutorial</a> about the basic
+elements of GTD and how he implements them in Org-mode. There
+is also a <a href="http://129.199.80.1/~guerry/org-gtd.html">french translation</a> of this document.
+
+</li>
+<li>
+There have been several threads on emacs-orgmode@gnu.org related
+to GTD, the most important ones are:
+
+<ul>
+<li>
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/683">Another GTD question</a>, which contains a discussion about basic
+GTD aspects. It also contains this
+</li>
+<li>
+<a href="http://article.gmane.org/gmane.emacs.orgmode/715">Post by Carsten</a> summarizing several options for implementing
+GTD in org-mode.
+</li>
+<li>
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/523">GTD, Projects and Next Actions in org-mode</a> is a thread where
+several people describe their personal setup is
+</li>
+<li>
+The <a href="http://thread.gmane.org/gmane.emacs.orgmode/4915">SOMEDAY/MAYBE vs. low priorities</a> thread contains a
+discussion about priorities that is quite instructive.
+</li>
+<li>
+Here is a <a href="http://thread.gmane.org/gmane.emacs.orgmode/4832/focus%3D4854">very instructive post</a> by Pete Phillips explaining
+why David Allens book is where you should start to learn GTD,
+and that the Internet and Org-mode only come into the game
+later, when thinking about the implementation. And since
+doing GTD the right way will give you lots of free time, don't
+forget to listen to <a href="http://www.detox-jazz.co.uk/">Pete's music</a>!
+
+</li>
+</ul></li>
+<li>
+Also on the web you can find information about how people are
+setting up Org-mode to fit their habits. A few examples:
+
+<ul>
+<li>
+This <a href="http://www.brool.com/?p=82">blog post</a> shows a very simple and clear GTD setup.
+
+</li>
+</ul></li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-12">Add-Ons</h3>
+
+
+<ul>
+<li>
+<a href="http://www.cl.cam.ac.uk/~pz215/">Piotr Zielinski</a> wrote <a href="http://www.cl.cam.ac.uk/~pz215/files/org-mouse.el">org-mouse.el</a> which is now distributed with
+Org-mode. It implements great mouse support for many functions in
+org-mode.
+
+</li>
+<li>
+<a href="http://dto.freeshell.org/notebook/">David O'Toole</a> is the author of <a href="http://dto.freeshell.org/e/org-publish.el">org-publish.el</a>. While this is
+now part of the Org-mode distribution, you might find the newest
+bug fixes and developments at his <a href="http://dto.freeshell.org/notebook/OrgMode.html">Org-mode page</a>, along with
+several other projects like <i>org-blog.el</i> and
+<i>org-publish-escript.el</i>.
+
+</li>
+<li>
+<a href="http://www.cognition.ens.fr/~guerry/">Bastien Guerry</a> has been really prolific in writing interesting
+add-ons, all available at his <a href="http://www.cognition.ens.fr/~guerry/bastien-org-mode.html">org-mode page</a>:
+<ul>
+<li>
+a package for using Org-mode as the basis for blogging
+</li>
+<li>
+a LaTeX exporter that is now distributed together with
+org-mode
+</li>
+<li>
+a special table-of-contents buffer that simplifies navigation
+</li>
+<li>
+a registry to find locations that link a specific document.
+
+</li>
+</ul></li>
+<li>
+George C.F. Greve wrote <a href="http://www.emacswiki.org/emacs/org-mairix.el">org-mairix.el</a> to add links that trigger a
+mairix search.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-13">Translators</h3>
+
+
+<p>
+I know about the following attempts to translate from and to
+Org-mode files:
+</p>
+
+<div class="outline-4">
+<h4 id="sec-14">Org-mode to XXX</h4>
+
+
+<ul>
+<li>
+<a href="http://www.cognition.ens.fr/~guerry/u/org2rem.el">From Org-mode to remind</a> by <a href="http://www.cognition.ens.fr/~guerry/">Bastien Guerry</a>.
+
+</li>
+<li>
+<a href="org-export-freemind-0.1.0.tar.gz">From Org-mode to Freemind</a> by Marco Vezzoli.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4 id="sec-15">XXX to Org-mode</h4>
+
+
+<ul>
+<li>
+<a href="http://www.olafdietsche.de/palm/palm2orgmode.pl">From Palm TODO database to Orgmode</a>. This Translator was
+written by <a href="http://www.olafdietsche.de/">Olaf Dietsche</a>.
+
+</li>
+<li>
+From <a href="http://thread.gmane.org/gmane.emacs.orgmode/5073">Org to remind</a> by Detlef Steuer.
+
+</li>
+</ul></div>
+
+<div class="outline-4">
+<h4 id="sec-16">Bi-directional</h4>
+
+
+<p>
+Unfortunately nothing so far.
+</p>
+</div>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-17">Alternative distributions</h3>
+
+
+<ul>
+<li>
+Mark A. Hershberger has made some <a href="https://launchpad.net/~hexmode/+archive">Ubuntu packages</a> for org-mode.
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-18">Contributing to Org-mode</h3>
+
+
+<p>
+You can always contribute with ideas and bug reports on the mailing
+list. If you want to contribute a patch, code snippets, or a full
+add-on, this is very welcome too! However, I can only make it an
+official part of Org-mode if you have signed the papers with the
+Free Software Foundation. Org-mode is distributed as part of Emacs
+and must therefore adhere to strict rules about the copyright of
+all included material. If this is what you want to do, <a href="request-assign-future.txt">here</a> is the
+form that you have to fill in and send to the FSF. After you
+received the final copy with signatures, please scan it and send
+the scan to the maintainer.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-19">Future Development</h3>
+
+
+<p>
+Org-mode is still developing fast. The best way to stay up-to-date
+is to join the mailing list where the changes are developed and
+discusssed.
+</p>
+<p>
+Here is a loose <a href="todo.html">list of ideas</a> that are still to be processed
+somehow, when I get to it&hellip;
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-20">Related Software</h2>
+
+<p><a href="http://sachachua.com/wp/">Sacha Chua</a> about <a href="http://sachachua.com/wp/2007/12/26/emacs-choosing-between-org-and-planner/">Choosing between Planner and Org</a>.
+</p>
+</div>
+<div id="postamble"><p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten at orgmode dot org">&lt;carsten at orgmode dot org&gt;</a>
+</p>
+<p class="date"> Date: 2008/01/27 22:14:32</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/tmp/orgcard.txt b/ORGWEBPAGE/tmp/orgcard.txt
new file mode 100644
index 0000000..cc7aff3
--- /dev/null
+++ b/ORGWEBPAGE/tmp/orgcard.txt
@@ -0,0 +1,457 @@
+================================================================================
+Org-Mode Reference Card (for version 4.79)
+================================================================================
+
+================================================================================
+Getting Started
+================================================================================
+
+(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
+(define-key global-map "\C-cl" 'org-store-link) [1]
+(define-key global-map "\C-ca" 'org-agenda) [1]
+
+For the many customization options try M-x org-customize
+To read the on-line documentation try M-x org-info
+
+================================================================================
+Visibility Cycling
+================================================================================
+
+rotate current subtree between states TAB
+rotate entire buffer between states S-TAB
+show the whole file C-c C-a
+reveal context around point C-c C-r
+show subtree in indirect buffer, ded. frame C-c C-k
+
+================================================================================
+Motion
+================================================================================
+
+next/previous heading C-c C-n/p
+next/previous heading, same level C-c C-f/b
+backward to higher level heading C-c C-u
+jump to another place in document C-c C-j
+previous/next plain list item S-UP/DOWN [3]
+
+================================================================================
+Structure Editing
+================================================================================
+
+insert new heading/item at current level M-RET
+insert new TODO entry/checkbox item M-S-RET
+promote current heading up one level M-LEFT
+demote current heading down one level M-RIGHT
+promote current subtree up one level M-S-LEFT
+demote current subtree down one level M-S-RIGHT
+move subtree/list item up/down M-S-UP/DOWN
+kill subtree C-c C-x C-w
+copy subtree C-c C-x M-w
+yank subtree C-c C-x C-y
+narrow buffer to current subtree C-x n s
+
+================================================================================
+Archiving
+================================================================================
+
+toggle ARCHIVE tag C-c C-x C-a
+force cycling of an ARCHIVEd tree C-TAB
+move subtree to archive file C-c C-x C-s
+
+================================================================================
+Filtering and Sparse Trees
+================================================================================
+
+show sparse tree for all matches of a regexp C-c /
+view TODO's in sparse tree C-c C-v
+global TODO list in agenda mode C-c t [1]
+create sparse tree with all deadlines due C-c C-w
+time sorted view of current org file C-c a L
+
+================================================================================
+Tables
+================================================================================
+
+--------------------------------------------------------------------------------
+Creating a table
+--------------------------------------------------------------------------------
+
+just start typing, e.g. |Name|Phone|Age RET |- TAB
+convert region to table C-c |
+... separator at least 3 spaces C-3 C-c |
+
+--------------------------------------------------------------------------------
+Commands available inside tables
+--------------------------------------------------------------------------------
+
+The following commands work when the cursor is inside a table. Outside of
+tables, the same keys may have other functionality.
+
+--------------------------------------------------------------------------------
+Re-aligning and field motion
+--------------------------------------------------------------------------------
+
+re-align the table without moving the cursor C-c C-c
+re-align the table, move to next field TAB
+move to previous field S-TAB
+re-align the table, move to next row RET
+
+--------------------------------------------------------------------------------
+Row and column editing
+--------------------------------------------------------------------------------
+
+move the current column left M-LEFT/RIGHT
+kill the current column M-S-LEFT
+insert new column to left of cursor position M-S-RIGHT
+move the current row up/down M-UP/DOWN
+kill the current row or horizontal line M-S-UP
+insert new row above the current row M-S-DOWN
+insert hline below (C-u : above) current row C-c -
+sort lines in region C-c ^
+
+--------------------------------------------------------------------------------
+Regions
+--------------------------------------------------------------------------------
+
+cut rectangular region C-c C-x C-w
+copy rectangular region C-c C-x M-w
+paste rectangular region C-c C-x C-y
+fill paragraph across selected cells C-c C-q
+
+--------------------------------------------------------------------------------
+Miscellaneous
+--------------------------------------------------------------------------------
+
+to limit column width to N characters, use ...| <N> |...
+edit the current field in a separate window C-c `
+make current field fully visible C-u TAB
+export as tab-separated file M-x org-table-export
+import tab-separated file M-x org-table-import
+sum numbers in current column/rectangle C-c +
+
+--------------------------------------------------------------------------------
+Tables created with the table.el package
+--------------------------------------------------------------------------------
+
+insert a new table.el table C-c ~
+recognize existing table.el table C-c C-c
+convert table (Org-mode <-> table.el) C-c ~
+
+--------------------------------------------------------------------------------
+Spreadsheet
+--------------------------------------------------------------------------------
+
+Formulas typed in field are executed by TAB, RET and C-c C-c. = introduces a
+column formula, := a field formula.
+
+Example: Add Col1 and Col2 |=$1+$2 |
+... with printf format specification |=$1+$2;%.2f|
+... with constants from constants.el |=$1/$c/$cm |
+sum from 2nd to 3rd hline |:=vsum(@II..@III)|
+apply current column formula | = |
+set and eval column formula C-c =
+set and eval field formula C-u C-c =
+re-apply all stored equations to current line C-c *
+re-apply all stored equations to entire table C-u C-c *
+iterate table to stability C-u C-u C-c *
+rotate calculation mark through # * ! $ C-#
+show line, column, formula reference C-c ?
+toggle coordinate grid C-c }
+toggle formula debugger C-c {
+
+--------------------------------------------------------------------------------
+Formula Editor
+--------------------------------------------------------------------------------
+
+edit formulas in separate buffer C-c '
+exit and install new formulas C-c C-c
+exit, install, and apply new formulas C-u C-c C-c
+abort C-c C-q
+toggle reference style C-c C-r
+pretty-print Lisp formula TAB
+complete Lisp symbol M-TAB
+shift reference point S-cursor
+shift test line for column references M-up/down
+scroll the window showing the table M-S-up/down
+toggle table coordinate grid C-c }
+
+================================================================================
+Links
+================================================================================
+
+globally store link to the current location C-c l [1]
+insert a link (TAB completes stored links) C-c C-l
+insert file link with file name completion C-u C-c C-l
+edit (also hidden part of) link at point C-c C-l
+open file links in emacs C-c C-o
+... force open in emacs/other window C-u C-c C-o
+open link at point mouse-1/2
+... force open in emacs/other window mouse-3
+record a position in mark ring C-c %
+jump back to last followed link(s) C-c &
+find next link C-c C-x C-n
+find previous link C-c C-x C-p
+
+--------------------------------------------------------------------------------
+Internal Links
+--------------------------------------------------------------------------------
+
+<<My Target>> target
+<<<My Target>>> radio target [2]
+[[*this text]] find headline
+[[this text]] find target or text in buffer
+[[this text][description]] optional link text
+
+--------------------------------------------------------------------------------
+External Links
+--------------------------------------------------------------------------------
+
+file:/home/dominik/img/mars.jpg file, absolute
+file:papers/last.pdf file, relative
+file:projects.org::*that text find headline
+file:projects.org::find me find trgt/string
+http://www.astro.uva.nl/dominik on the web
+mailto:adent@galaxy.net Email address
+news:comp.emacs Usenet group
+bbdb:Richard Stallman BBDB person
+gnus:group GNUS group
+gnus:group#id GNUS message
+vm|wl|mhe|rmail:folder Mail folder
+vm|wl|mhe|rmail:folder#id Mail message
+info:emacs:Regexps Info file:node
+shell:ls *.org shell command
+elisp:(calendar) elisp form
+[[external link][description]] optional link text
+
+================================================================================
+Completion
+================================================================================
+
+In-buffer completion completes TODO keywords at headline start, TeX macros
+after `\', option keywords after `#-â', TAGS after `:', and dictionary words
+elsewhere.
+
+complete word at point M-TAB
+
+================================================================================
+TODO Items and Checkboxes
+================================================================================
+
+rotate the state of the current item C-c C-t
+select next/previous state S-LEFT/RIGHT
+select next/previous set C-S-LEFT/RIGHT
+view TODO items in a sparse tree C-c C-v
+view 3rd TODO keyword's sparse tree C-3 C-c C-v
+set the priority of the current item C-c , [ABC]
+remove priority cookie from current item C-c , SPC
+raise/lower priority of current item S-UP/DOWN [3]
+insert new checkbox item in plain list M-S-RET
+toggle checkbox(es) in region/entry/at point C-c C-x C-b
+toggle checkbox at point C-c C-c
+checkbox statistics cookies insert [/] or [%]
+update checkbox statistics (C-u : whole file) C-c #
+
+================================================================================
+Tags
+================================================================================
+
+set tags for current heading C-c C-c
+realign tags in all headings C-u C-c C-c
+create sparse tree with matching tags C-c \
+globally (agenda) match tags at cursor C-c C-o
+
+================================================================================
+Timestamps
+================================================================================
+
+prompt for date and insert timestamp C-c .
+like C-c . but insert date and time format C-u C-c .
+like C-c . but make stamp inactive C-c !
+insert DEADLINE timestamp C-c C-d
+insert SCHEDULED timestamp C-c C-s
+create sparse tree with all deadlines due C-c C-w
+the time between 2 dates in a time range C-c C-y
+change timestamp at cursor by ±1 day S-RIGHT/LEFT [3]
+change year/month/day at cursor by ±1 S-UP/DOWN [3]
+access the calendar for the current date C-c >
+insert timestamp matching date in calendar C-c <
+access agenda for current date C-c C-o
+select date while prompted mouse-1/RET
+toggle custom format display for dates/times C-c C-x C-t
+
+--------------------------------------------------------------------------------
+Clocking time
+--------------------------------------------------------------------------------
+
+start clock on current item C-c C-x C-i
+stop clock on current item C-c C-x C-o
+cancel current clock C-c C-x C-x
+display total subtree times C-c C-x C-d
+remove displayed times C-c C-c
+insert/update table with clock report C-c C-x C-r
+
+================================================================================
+LaTeX and cdlatex-mode
+================================================================================
+
+preview LaTeX fragment C-c C-x C-l
+expand abbreviation (cdlatex-mode) TAB
+insert/modify math symbol (cdlatex-mode) ` / '
+
+================================================================================
+Agenda Views
+================================================================================
+
+add/move current file to front of agenda C-c [
+remove current file from your agenda C-c ]
+cycle through agenda file list C-'
+compile agenda for the current week C-c a a [1]
+compile global TODO list C-c a t [1]
+compile TODO list for specific keyword C-c a T [1]
+match tags in agenda files C-c a m [1]
+match tags in TODO entries C-c a M [1]
+find stuck projects C-c a # [1]
+show timeline of current org file C-c a L [1]
+configure custom commands C-c a C [1]
+configure stuck projects C-c a ! [1]
+agenda for date at cursor C-c C-o
+
+To set categories, add lines like [2]:
+#+CATEGORY: MyCateg
+
+--------------------------------------------------------------------------------
+Commands available in an agenda buffer
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+View Org file
+--------------------------------------------------------------------------------
+
+show original location of item SPC/mouse-3
+show and recenter window L
+goto original location in other window TAB/mouse-2
+goto original location, delete other windows RET
+show subtree in indirect buffer, ded. frame b
+toggle follow-mode f
+
+--------------------------------------------------------------------------------
+Change display
+--------------------------------------------------------------------------------
+
+delete other windows o
+switch to daily / weekly view d / w
+toggle inclusion of diary entries D
+toggle time grid for daily schedule g
+toggle display of logbook entries l
+refresh agenda buffer with any changes r
+save all org-mode buffers s
+display the following org-agenda-ndays RIGHT
+display the previous org-agenda-ndays LEFT
+goto today .
+
+--------------------------------------------------------------------------------
+Remote editing
+--------------------------------------------------------------------------------
+
+digit argument 0-9
+change state of current TODO item t
+kill item and source C-k
+archive the subtree $
+show tags of current headline T
+set tags for current headline :
+toggle ARCHIVE tag a
+set priority of current item p
+raise/lower priority of current item S-UP/DOWN [3]
+display weighted priority of current item P
+schedule/set deadline for this item C-c C-s/d
+change timestamp to one day earlier/later S-LEFT/RIGHT [3]
+change timestamp to today >
+insert new entry into diary i
+start the clock on current item (clock-in) I
+stop the clock (clock-out) O
+cancel current clock X
+
+--------------------------------------------------------------------------------
+Misc
+--------------------------------------------------------------------------------
+
+Open link in current line C-c C-o
+
+--------------------------------------------------------------------------------
+Calendar commands
+--------------------------------------------------------------------------------
+
+find agenda cursor date in calendar c
+compute agenda for calendar cursor date c
+show phases of the moon M
+show sunrise/sunset times S
+show holidays H
+convert date to other calendars C
+
+--------------------------------------------------------------------------------
+Quit and Exit
+--------------------------------------------------------------------------------
+
+quit agenda, remove agenda buffer q
+exit agenda, remove all agenda buffers x
+
+================================================================================
+Calendar and Diary Integration
+================================================================================
+
+Include Emacs diary entries into Org-mode agenda with:
+(setq org-agenda-include-diary t)
+
+================================================================================
+Exporting and Publishing
+================================================================================
+
+Exporting creates files with extensions .txt and .html in the current
+directory. Publishing puts the resulting file into some other place.
+
+export/publish dispatcher C-c C-e
+export visible part only C-c C-e v
+insert template of export options C-c C-x t
+toggle fixed width for entry or region C-c :
+
+--------------------------------------------------------------------------------
+HTML formatting
+--------------------------------------------------------------------------------
+
+make words bold *bold*
+make words italic /italic/
+make words underlined _underlined_
+sub- and superscripts x^3, J_dust
+TeX-like macros \alpha, \to
+typeset lines in fixed width font start with :
+tables are exported as HTML tables start with |
+links become HTML links http:... etc
+include html tags @<b>...@</b>
+
+--------------------------------------------------------------------------------
+Comments: Text not being exported
+--------------------------------------------------------------------------------
+
+Text before the first headline is not considered part of the document and is
+therefore never exported. Lines starting with # are comments and are not
+exported. Subtrees whose header starts with COMMENT are never exported.
+
+toggle COMMENT keyword on entry C-c ;
+
+================================================================================
+Dynamic Blocks
+================================================================================
+
+update dynamic block at point C-c C-x C-u
+update all dynamic blocks C-u C-c C-x C-u
+
+================================================================================
+Notes
+================================================================================
+
+[1] This is only a suggestion for a binding of this command. Choose you own
+key as shown under INSTALLATION.
+
+[2] After changing a #+KEYWORD or <<<target>>> line, press C-c C-c with the
+cursor still in the line to update.
+
+[3] Keybinding affected by org-CUA-compatibility.
diff --git a/ORGWEBPAGE/tmp/qanda.html b/ORGWEBPAGE/tmp/qanda.html
new file mode 100644
index 0000000..7a61052
--- /dev/null
+++ b/ORGWEBPAGE/tmp/qanda.html
@@ -0,0 +1,449 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-mode Frequently Asked Questions</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2007/12/20 07:18:18"/>
+<meta name="author" content="Carsten Dominik"/>
+<link rel=stylesheet href="freeshell2.css" type="text/css">
+</head><body>
+<h1 class="title">Org-mode Frequently Asked Questions</h1>
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">1 General</a>
+<ul>
+<li><a href="#sec-2">1.1 Use features in other modes</a></li>
+<li><a href="#sec-3">1.2 Visibility cycling in Outline-mode and Outline-minor-mode</a></li>
+</ul>
+</li>
+<li><a href="#sec-4">2 Errors</a>
+<ul>
+<li><a href="#sec-5">2.1 <code>(wrong-type-argument keymapp nil)</code></a></li>
+<li><a href="#sec-6">2.2 CUA mode does not work with Org-mode</a></li>
+</ul>
+</li>
+<li><a href="#sec-7">3 Setup and Structure</a>
+<ul>
+<li><a href="#sec-8">3.1 Org-mode as default mode</a></li>
+<li><a href="#sec-9">3.2 Get rid of extra stars in outline</a></li>
+<li><a href="#sec-10">3.3 Two windows on same Org-mode file</a></li>
+</ul>
+</li>
+<li><a href="#sec-11">4 Hyperlinks</a>
+<ul>
+<li><a href="#sec-12">4.1 Broken links after Org-mode 4.20</a></li>
+<li><a href="#sec-13">4.2 Converting links to double-bracket format</a></li>
+<li><a href="#sec-14">4.3 Angular bracket links preference</a></li>
+<li><a href="#sec-15">4.4 Confirmation for shell and elips links</a></li>
+</ul>
+</li>
+<li><a href="#sec-16">5 Export</a>
+<ul>
+<li><a href="#sec-17">5.1 Make TODO entries items, not headlines in HTML export</a></li>
+<li><a href="#sec-18">5.2 Export only a subtree</a></li>
+</ul>
+</li>
+<li><a href="#sec-19">6 Tables</a>
+<ul>
+<li><a href="#sec-20">6.1 #ERROR fields in tables</a></li>
+<li><a href="#sec-21">6.2 Unwanted new lines in table</a></li>
+<li><a href="#sec-22">6.3 Change indentation of a table</a></li>
+</ul>
+</li>
+<li><a href="#sec-23">7 Agenda</a>
+<ul>
+<li><a href="#sec-24">7.1 Include Org-mode agenda into Emacs diary</a></li>
+</ul>
+</li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-1">1 General</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-2">1.1 Use features in other modes</h3>
+
+<p><b>I would like to use editing features of org-mode in other modes, is this possible?</b>
+</p>
+<p>
+Not really. For tables there is <code>orgtbl-mode</code> which implements the
+table editor as a minor mode. For other features you need to switch to
+Org-mode temporarily, or prepare text in a different buffer.
+</p>
+
+</div>
+
+<div class="outline-3">
+<h3 id="sec-3">1.2 Visibility cycling in Outline-mode and Outline-minor-mode</h3>
+
+
+<p>
+%Can I get the visibility-cycling features in outline-mode and
+outline-minor-mode?%
+</p>
+<p>
+Yes, these functions are written in a way that they are independent of
+the outline setup. The following setup provides standard Org-mode
+functionality in outline-mode on <code>TAB</code> and <code>S-TAB</code>. For
+outline-minor-mode, we use <code>C-TAB</code> instead of <code>TAB</code>,
+because <code>TAB</code> usually has mode-specific tasks.
+</p>
+<p>
+<pre>
+(add-hook 'outline-minor-mode-hook
+ (lambda ()
+ (define-key outline-minor-mode-map [(control tab)] 'org-cycle)
+ (define-key outline-minor-mode-map [(shift tab)] 'org-global-cycle)))
+(add-hook 'outline-mode-hook
+ (lambda ()
+ (define-key outline-mode-map [(tab)] 'org-cycle)
+ (define-key outline-mode-map [(shift tab)] 'org-global-cycle)))
+</pre>
+</p>
+<p>
+Or check out <i>outline-magic.el</i>, which does this and also provides
+promotion and demotion functionality. @file{outline-magic.el} is
+available at <a href="http://www.astro.uva.nl/~dominik/Tools/OutlineMagic">Outline Magic</a>.
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-4">2 Errors</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-5">2.1 <code>(wrong-type-argument keymapp nil)</code></h3>
+
+<p>When I try to use Org-mode, I always get the error message
+@code{(wrong-type-argument keymapp nil)} This is a conflict with an
+outdated version of the <i>allout.el</i>.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-6">2.2 CUA mode does not work with Org-mode</h3>
+
+
+<p>
+%Org-mode takes over the S-cursor keys. I also want to use CUA-mode,
+is there a way to fix this conflict?%
+</p>
+<p>
+Yes, see the <i>Conflicts</i> section of the manual.
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-7">3 Setup and Structure</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-8">3.1 Org-mode as default mode</h3>
+
+
+<p>
+%Org-mode seems to be a useful default mode for the various README
+files I have scattered through my directories%. %How do I turn it on
+for all README files?%
+</p>
+<p>
+Add the following to your .emacs file:
+</p>
+<p>
+<pre>
+ (add-to-list 'auto-mode-alist '("README$" . org-mode))
+</pre>
+</p>
+
+</div>
+
+<div class="outline-3">
+<h3 id="sec-9">3.2 Get rid of extra stars in outline</h3>
+
+
+<p>
+%All these stars are driving me mad, I just find the Emacs outlines
+unreadable. Can't you just put white space and a single star as a
+starter for headlines?%
+</p>
+<p>
+See the section <i>Clean outline view</i> in the manual.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-10">3.3 Two windows on same Org-mode file</h3>
+
+<p>%I would like to have two windows on the same Org-mode file, but with
+different outline visibility. Is that possible?%
+</p>
+<p>
+In GNU Emacs, you may use <i>indirect buffers</i> which do exactly this.
+See the documentation on the command <code>make-indirect-buffer</code>. In
+XEmacs, this is currently not possible because of the different outline
+implementation.
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-11">4 Hyperlinks</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-12">4.1 Broken links after Org-mode 4.20</h3>
+
+
+<p>
+%Some of my links stopped working after I upgraded to a version 4.20
+or later. Why is this, and how can I fix it?%
+</p>
+<p>
+These must be links in plain text, containing white space, such as
+</p>
+<p>
+<pre>
+ bbdb:Richard Stallman
+</pre>
+</p>
+<p>
+You need to protect these links by putting double brackets around
+them, like
+</p>
+<p>
+<pre>
+ [[bbdb:Richard Stallman][bbdb:Richard Stallman]]
+</pre>
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-13">4.2 Converting links to double-bracket format</h3>
+
+
+<p>
+%I see that Org-mode now creates links using the double bracket
+convention that hides the link part and the brackets, only showing the
+description part. How can I convert my old links to this new format?%
+</p>
+<p>
+Execute once in each Org-mode file: <code>M-x org-upgrade-old-links</code>
+This replaces angular brackets with the new link format.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-14">4.3 Angular bracket links preference</h3>
+
+
+<p>
+%I don't care if you find the new bracket links great, I am attached
+to the old style using angular brackets and no hiding of the link
+text. Please give them back to me, don't tell me it is not possible!%
+</p>
+<p>
+Would I let you down like that? If you must, you can do this
+</p>
+<p>
+<pre>
+ (setq org-link-style 'plain
+ org-link-format "&lt;%s&gt;")
+</pre>
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-15">4.4 Confirmation for shell and elips links</h3>
+
+<p>%When I am executing shell/elisp links I always get a confirmation
+prompt and need to type <code>yes RET</code>, that's 4 key presses! Can I get
+rid of this?%
+</p>
+<p>
+The confirmation is there to protect you from unwantingly execute
+potentially dangerous commands. For example, imagine a link
+<pre>
+[[shell:rm -rf ~/*][ Google Search]]
+</pre>
+</p>
+<p>
+In an Org-mode buffer, this command would look like <i>Google Search</i>,
+but really it would remove your home directory. If you wish, you can
+make it easier to respond to the query by setting
+<code>org-confirm-shell-link-function</code> and/or
+<code>org-confirm-elisp-link-function</code> to <code>y-or-n-p</code>. Then a single yc
+keypress will be enough to confirm those links. It is also possible
+to turn off this check entirely, but I do not recommend to do this.
+Be warned.
+</p>
+
+
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-16">5 Export</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-17">5.1 Make TODO entries items, not headlines in HTML export</h3>
+
+
+<p>
+%When I export my TODO list, every TODO item becomes a separate
+section. How do I enforce these items to be exported as an itemized
+list?%
+</p>
+<p>
+If you plan to use ASCII or HTML export, make sure things you want to
+be exported as item lists are level 4 at least, even if that does mean
+there is a level jump. For example:
+</p>
+<p>
+<pre>
+ * Todays top priorities
+ **** TODO write a letter to xyz
+ **** TODO Finish the paper
+ **** Pick up kids at the school
+</pre>
+</p>
+<p>
+Alternatively, if you need a specific value for the heading/item
+transition in a particular file, use the <code>#+OPTIONS</code> line to
+configure the H switch.
+</p>
+<p>
+<pre>
+ #+OPTIONS: H:2; ...
+</pre>
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-18">5.2 Export only a subtree</h3>
+
+
+<p>
+%I would like to export only a subtree of my file to HTML. How?%
+</p>
+<p>
+If you want to export a subtree, mark the subtree as region and then
+export. Marking can be done with <code>C-c @@ C-x C-x</code>, for example.
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-19">6 Tables</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-20">6.1 #ERROR fields in tables</h3>
+
+
+<p>
+%One of my table columns has started to fill up with <code>#ERROR</code>. What
+is going on?%
+</p>
+<p>
+Org-mode tried to compute the column from other fields using a
+formula stored in the <code>#+TBLFM:</code> line just below the table, and
+the evaluation of the formula fails. Fix the fields used in the
+formula, or fix the formula, or remove it!
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-21">6.2 Unwanted new lines in table</h3>
+
+
+<p>
+%When I am in the last column of a table and just above a horizontal
+line in the table, pressing TAB creates a new table line before the
+horizontal line%. %How can I quickly move to the line below the
+horizontal line instead?%
+</p>
+<p>
+Press <code>down</code> (to get on the separator line) and then <code>TAB</code>
+Or configure the variable <code>org-table-tab-jumps-over-hlines</code>.
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-22">6.3 Change indentation of a table</h3>
+
+<p>%How can I change the indentation of an entire table without fixing
+every line by hand?%
+</p>
+<p>
+The indentation of a table is set by the first line. So just fix the
+indentation of the first line and realign with <code>TAB</code>.
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-23">7 Agenda</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-24">7.1 Include Org-mode agenda into Emacs diary</h3>
+
+<p>%Is it possible to include entries from org-mode files into my emacs
+diary?%
+</p>
+<p>
+Since the org-mode agenda is much more powerful and can contain the
+diary, you should think twice
+before deciding to do this. Integrating Org-mode information into the
+diary is, however, possible. You need to turn on <i>fancy diary display</i> by setting in .emacs:
+</p>
+<p>
+<pre>
+ (add-hook 'diary-display-hook 'fancy-diary-display)
+</pre>
+</p>
+<p>
+Then include the following line into your ~/diary file, in
+order to get the entries from all files listed in the variable
+<code>org-agenda-files</code>
+</p>
+<p>
+<pre>
+ &amp;%%(org-diary)
+</pre>
+You may also select specific files with
+</p>
+<p>
+<pre>
+ &amp;%%(org-diary) ~/path/to/some/org-file.org
+ &amp;%%(org-diary) ~/path/to/another/org-file.org
+</pre>
+</p>
+<p>
+If you now launch the calendar and press d to display a diary, the
+headlines of entries containing a timestamp, date range, schedule, or
+deadline referring to the selected date will be listed. Just like
+Org-mode's agenda view, the diary for @emph{today} contains additional
+entries for overdue deadlines and scheduled items. See also the
+documentation of the @command{org-diary} function. Under XEmacs, it is
+not possible to jump back from the diary to the org, this works only in
+the agenda buffer.
+</p>
+
+</div>
+</div>
+<div id="postamble"><p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten.dominik@gmail.com">&lt;carsten.dominik@gmail.com&gt;</a>
+</p>
+<p class="date"> Date: 2007/12/20 07:18:18</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/tmp/request-assign-future.txt b/ORGWEBPAGE/tmp/request-assign-future.txt
new file mode 100644
index 0000000..8ee7747
--- /dev/null
+++ b/ORGWEBPAGE/tmp/request-assign-future.txt
@@ -0,0 +1,44 @@
+Please email the following information to assign@gnu.org, and we
+will send you the assignment form for your past and future changes.
+
+Please use your full legal name (in ASCII characters) as the subject
+line of the message.
+----------------------------------------------------------------------
+REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES
+
+[What is the name of the program or package you're contributing to?]
+
+ Org-mode, which is part of Emacs
+
+[Did you copy any files or text written by someone else in these changes?
+Even if that material is free software, we need to know about it.]
+
+
+[Do you have an employer who might have a basis to claim to own
+your changes? Do you attend a school which might make such a claim?]
+
+
+[For the copyright registration, what country are you a citizen of?]
+
+
+[What year were you born?]
+
+
+[Please write your email address here.]
+
+
+[Please write your postal address here.]
+
+
+
+
+
+[Which files have you changed so far, and which new files have you written
+so far?]
+
+
+
+
+
+
+
diff --git a/ORGWEBPAGE/tmp/survey.html b/ORGWEBPAGE/tmp/survey.html
new file mode 100644
index 0000000..6a48363
--- /dev/null
+++ b/ORGWEBPAGE/tmp/survey.html
@@ -0,0 +1,2169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-Mode Survey Results</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2008/01/27 22:26:27"/>
+<meta name="author" content="Charles Cave"/>
+<link rel=stylesheet href="freeshell2.css" type="text/css">
+</head><body>
+<h1 class="title">Org-Mode Survey Results</h1>
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">Survey introduction</a></li>
+<li><a href="#sec-2">1. Which operating system, version and Linux distribution?</a></li>
+<li><a href="#sec-3">2. Which Emacs are you using (GNU/Xemacs, etc) and which version? Paste the result of M-x version.</a></li>
+<li><a href="#sec-4">3. When did you first start using org-mode and how did you find out about it?</a></li>
+<li><a href="#sec-5">4. What are your main uses of org-mode?</a></li>
+<li><a href="#sec-6">5. New features and product maturity?</a></li>
+<li><a href="#sec-7">6. Additional tutorials, documentation and screencasts would you like?</a></li>
+<li><a href="#sec-8">7. Which features of org-mode do you use? (Spreadsheet, LaTeX, HTML, Remember, etc)</a></li>
+<li><a href="#sec-9">8. Your age</a></li>
+<li><a href="#sec-10">9. Which country do you live in?</a></li>
+<li><a href="#sec-11">10. Are there any other comments you would like to make about org-mode?</a></li>
+<li><a href="#sec-12">Appendix: Raw data for some questions:</a></li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-1">Survey introduction</h2>
+
+
+<p>
+A survey was conducted of org-mode users duing November 2007. An
+invitation was sent to the org-mode users list as well as announced on
+the <a href="http://orgmode.org">http://orgmode.org</a> web site. About 80 people resonded. This file
+contains a complete list of the answers, as the base of further
+discussion.
+</p>
+<p>
+Survey created and summarised by Charles Cave
+<a href="mailto:charlesweb@optusnet.com.au">mailto:charlesweb@optusnet.com.au</a>
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-2">1. Which operating system, version and Linux distribution?</h2>
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col><col align="left"></col>
+<thead>
+<tr><th>OS</th><th>N</th><th>bar</th></tr>
+</thead>
+<tbody>
+<tr><td>Windows</td><td>31</td><td>*******************************</td></tr>
+<tr><td>Linux</td><td>55</td><td>*******************************************************</td></tr>
+<tr><td>Mac OS X</td><td>12</td><td>************</td></tr>
+</tbody>
+</table>
+
+
+<p>
+The different Linux distributions:
+</p>
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col><col align="left"></col>
+<thead>
+<tr><th>Distribution</th><th>N</th><th>bar</th></tr>
+</thead>
+<tbody>
+<tr><td>Arch Linux</td><td>1</td><td>*</td></tr>
+<tr><td>Centos</td><td>1</td><td>*</td></tr>
+<tr><td>Debian</td><td>14</td><td>**************</td></tr>
+<tr><td>Fedora</td><td>7</td><td>*******</td></tr>
+<tr><td>FreeBSD</td><td>1</td><td>*</td></tr>
+<tr><td>Gentoo</td><td>7</td><td>*******</td></tr>
+<tr><td>Kununtu</td><td>1</td><td>*</td></tr>
+<tr><td>MagicLinux</td><td>1</td><td>*</td></tr>
+<tr><td>OpenBSD</td><td>1</td><td>*</td></tr>
+<tr><td>RedHat</td><td>2</td><td>**</td></tr>
+<tr><td>Solarus</td><td>2</td><td>**</td></tr>
+<tr><td>Suse</td><td>7</td><td>*******</td></tr>
+<tr><td>Ubuntu</td><td>9</td><td>*********</td></tr>
+<tr><td>Unspecified</td><td>2</td><td>**</td></tr>
+</tbody>
+</table>
+
+
+</div>
+
+<div class="outline-2">
+<h2 id="sec-3">2. Which Emacs are you using (GNU/Xemacs, etc) and which version? Paste the result of M-x version.</h2>
+
+
+<p>
+Summary:
+</p><table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col>
+<thead>
+<tr><th>Emacs/XEmacs</th><th>Number of answers</th></tr>
+</thead>
+<tbody>
+<tr><td>XEmacs</td><td>7</td></tr>
+<tr><td>Emacs total</td><td>73</td></tr>
+<tr><td>Emacs 21</td><td>4</td></tr>
+<tr><td>Emacs 22</td><td>47</td></tr>
+<tr><td>Emacs 23</td><td>18</td></tr>
+</tbody>
+</table>
+
+
+<p>
+The raw replies can be found <a href="#Raw--Emacs--versions">here</a>.
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-4">3. When did you first start using org-mode and how did you find out about it?</h2>
+
+
+<ul>
+<li>
+Org 5.04, Aug 2007 - Searching around the Web
+</li>
+<li>
+2007, December found about in in emacs wiki
+</li>
+<li>
+November 2006, found it while googling GTD tools
+</li>
+<li>
+moved from planner about 6 months ago
+</li>
+<li>
+2005, probably read about it on Sacha Chua's blog.
+</li>
+<li>
+August 2007? Heard of it a long time ago, maybe by following links
+from johnh's notebook mode. Finally switched from planner after a
+friend did the same.
+</li>
+<li>
+October 2007
+</li>
+<li>
+about the begining of 2007. Heard about it on the internet I guess.
+</li>
+<li>
+I found it by way of emacswiki.org. I was an avid user of outline
+mode, and found somebody's screencast (Scott Jaderholm's, I think)
+showing off org mode. I've been using it for probably about six
+months.
+</li>
+<li>
+Oct. 2007. I think I was looking for an alternative to planner.el.
+</li>
+<li>
+august 27, 2006. I found it while looking for an alternative to
+planner.
+</li>
+<li>
+Roughly 2005/6, through a friend.
+</li>
+<li>
+2007-Nov. Google.
+</li>
+<li>
+July 2007 after I saw the entry in Emacswiki
+</li>
+<li>
+april 2007
+</li>
+<li>
+2007-06 thrrough Sacha Chua's blog
+</li>
+<li>
+Oldest entry in my archive file is June 2005, but I think I was
+using org for a while before that. I don't remember when I heard
+about it.
+</li>
+<li>
+Around version 4.76, don't remember when. Found about it on the
+Emacs Wiki.
+</li>
+<li>
+10/2006 by chance looking for pim tools for Emacs
+</li>
+<li>
+One month ago, found a link on a web site
+</li>
+<li>
+11/2005
+</li>
+<li>
+02/2007 After getting annoyed with Muse-mode interaction with
+outline-mode, I googled and found org-mode and never went back.
+</li>
+<li>
+Using for about 2 years. Found org-mode after searching for a better
+version of outline-mode
+</li>
+<li>
+Sometime around Jan. 2005. Someone mentioned it on the 43folders.com
+message board (probably Jason F. McBrayer) and I decided I'd check
+it out.
+</li>
+<li>
+August 2007. I heard it about it on the planner mode mailing list.
+</li>
+<li>
+6-12 months ago!
+</li>
+<li>
+I read about org-mail from an email of a maillist &hellip; dnon't know
+which one
+</li>
+<li>
+A year ago because someone mentioned it in #emacs on freenode as a
+better planner-el solution
+</li>
+<li>
+2 months ago when I started using Emacs. I was also looking for a
+way to organize and found org-mode via blogs etc.
+</li>
+<li>
+3 month ago. I was looking forward some emacs "PIM".
+</li>
+<li>
+2007 September
+</li>
+<li>
+Can't remember; at least two years ago? I think I would have first
+heard about it from the Emacs Wiki.
+</li>
+<li>
+Around May 2007. I don't recall.
+</li>
+<li>
+No idea 6 months back probably; on the wiki site I think
+</li>
+<li>
+2007-08 First heard mention in a GTD mailing list, but realised it
+was going to be great after seeing screencast at
+<a href="http://jaderholm.com/screencasts.html">http://jaderholm.com/screencasts.html</a>
+</li>
+<li>
+2007
+</li>
+<li>
+almost 2 years emacs newsgroups
+</li>
+<li>
+2006-08 (version 4.50)
+</li>
+<li>
+approx. March 2006. I don't recall how I found out about it.
+</li>
+<li>
+I think I began using it in 2005. I found out about it on the
+planner list.
+</li>
+<li>
+it's been about a year, I can't remember how I found out about it,
+maybe on the #emacs channel IRC.
+</li>
+<li>
+2007-03 www.emacswiki.org
+</li>
+<li>
+1/2007 emacs NEWS
+</li>
+<li>
+In 2005, I found out about org-mode while googling for some kind of
+outliner software. My search must have hit upon a listserv post. My
+first try at using it was in June 2005, but I didn't like
+it. Carsten made many improvements and in December 2005, he emailed
+me to ask me what I thought. It thought it was pretty good, and I've
+been using it almost every day since.
+</li>
+<li>
+October 2006. Saw orgmode mentioned in comments on 43folders.com
+</li>
+<li>
+2007 july, emacs wiki
+</li>
+<li>
+Around September 2007. I first knew it from planner-mode mailing
+list. I used to use planner-mode.
+</li>
+<li>
+Oct 2007
+</li>
+<li>
+2007-09 NEWS in Gnu Emacs 22
+</li>
+<li>
+21 april 2006 (was the oldest .org file I could find on my
+system). Found out through&hellip; #emacs I think. dto was talking about
+it.
+</li>
+<li>
+I have a "org version 3.05" in my .emacs So it should be from spring
+2005 (March? May?) I read an article in the web, a blog I think. so
+I began using Emacs to use org (uh! :-)
+</li>
+<li>
+August 2007 Slashdot article on GTD Wired article on GTD Google
+search for GTD found org-mode tutorial.
+</li>
+<li>
+Sep 2005
+</li>
+<li>
+June 2007. At may I started learning Emacs for the first time, and
+together all its related modes. At #emacs at irc.freenode.org and at
+EmacsWiki it was mentioned org-mode.
+</li>
+<li>
+2007-04 I was into emacs learning and stumbled upon org-mode I don't
+remember where.
+</li>
+<li>
+2007 February, emacswiki.org and discussions on the planner.el
+mailing list
+</li>
+<li>
+Sometime before April 2006
+</li>
+<li>
+About 1 year ago.
+</li>
+<li>
+April 2006 (ca org-mode 4.25) Switching from Planner after numerous
+mentions of org on the planner mailing list.
+</li>
+<li>
+October 2006
+</li>
+<li>
+In june 2006. By reading the tutorial here:
+<a href="http://dto.freeshell.org/notebook/OrgTutorial.html">http://dto.freeshell.org/notebook/OrgTutorial.html</a>
+</li>
+<li>
+Aug 2005 After trying out Sacha's planning mode i knew it was close,
+but not quite right for me. Googling around I found org mode.
+</li>
+<li>
+Probably 2004, before it had texinfo documentation or even before
+the agenda view
+</li>
+<li>
+2007/10
+</li>
+<li>
+2007-01 I think I've read a blog about it or I've stumbled across it
+at emacswiki.org.
+</li>
+<li>
+I started to use org-mode a year ago. I found org-mode on the emacs
+wiki
+</li>
+<li>
+2007, September, read about it on the pages explaining how it was
+part of emacs-22
+</li>
+<li>
+November-December 2006, after googling for "emacs pim". Or,
+probably, there was an article (linux.com?).
+</li>
+<li>
+5/2006, after emacswiki or web tutorial
+</li>
+<li>
+at least as long as the newsgroup has been gmane, as I submitted it
+there. I must have found out on emacs wiki?
+</li>
+<li>
+~March 2007. I was using planner and I think I saw references to it
+there and checked it out.
+</li>
+<li>
+I subscribed to the list in 8/06. Maybe a month or two before that.
+</li>
+<li>
+2007-01-01
+</li>
+<li>
+2007/01, by a org-mode tutorial.
+</li>
+<li>
+I can't remember that. I used to use planner-mode. When someone
+mentioned org-mode on that mailing list, I decided to have a try.
+</li>
+<li>
+2006-03 &ndash; via your (Charles Cave) posting of 2006-03-10 to Getting Things Done
+yahoogroup.
+</li>
+<li>
+Around march 2006?
+</li>
+<li>
+Dunno. A while ago.
+</li>
+<li>
+2006 found out indirectly from the Planner mode or maybe Emacs Wiki
+</li>
+<li>
+2006/06 Emacs Wiki
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-5">4. What are your main uses of org-mode?</h2>
+
+
+<ul>
+<li>
+daily task planing, private and at work documenting know-hows,
+collecting informations (web searches etc.), contacts
+</li>
+<li>
+i plan to use it for GTD and (maybe) as replacement for LyX as
+general writing tool (via LaTeX export)
+</li>
+<li>
+Project planning, task management
+</li>
+<li>
+todo list / scheduler
+</li>
+<li>
+TODO list management
+</li>
+<li>
+Task list and note taking
+</li>
+<li>
+Todo-list administration - Time tracking - Creating outlines
+</li>
+<li>
+write lists to keep track of projects and infomation
+</li>
+<li>
+I mostly use it as an extended version of outline mode, as well as
+the agenda mode. Managing TODO lists and the like. I also really
+like the integration with remember mode.
+</li>
+<li>
+TODO list, calendar/appointment app, note-taking, "digital junk
+drawer" a la Yojimbo, minor mode for drafting documents,
+org-publish.el, org-blog.el
+</li>
+<li>
+Planning and taking notes (with remember mode.)
+</li>
+<li>
+TODO lists (GTD methodology) and diary
+</li>
+<li>
+Planning, project, time and task tracking.
+</li>
+<li>
+GTD system at home
+</li>
+<li>
+planning
+</li>
+<li>
+todo-lists
+</li>
+<li>
+Maintaining a GTD system for personal organization, tracking time
+for work reporting and billing.
+</li>
+<li>
+Organizing my tasks and plans at work. Trying to implement GTD with
+it.
+</li>
+<li>
+Reporting (org-outline/exporter!), GTD
+</li>
+<li>
+GTD, weekly planner
+</li>
+<li>
+Managing software development todo lists
+</li>
+<li>
+Agenda, todo tracking, lecture notes, blogging
+</li>
+<li>
+TODO list
+</li>
+<li>
+1) Maintaining my personal lists of projects and tasks 2)
+Maintaining a "wiki" of reference material (org-mode doc that links
+to external files and URLs) 3) Maintaining an archive of completed
+projects 4) Keeping track of my agenda 5) Outlining and
+brainstorming 6) Organizing journal entries
+</li>
+<li>
+Personal task lists.
+</li>
+<li>
+daily planning
+</li>
+<li>
+Organizing and managing projects
+</li>
+<li>
+gtd - project management - generating htmls - minutes, documentation
+</li>
+<li>
+notes, todo-lists, planner
+</li>
+<li>
+Agenda (GTD) Notes keeping Publishing tool
+</li>
+<li>
+Slowly it is becoming my desktop. I write, use it for email
+composition, technical documentation. Slowly getting into planning,
+agenda etc.
+</li>
+<li>
+Project planning and task tracking.
+</li>
+<li>
+keeping track of things to do.
+</li>
+<li>
+TODO and org-table
+</li>
+<li>
+Running my work and home todo lists and notes, but progressively
+more and more using it for everything.
+</li>
+<li>
+TODO list and meeting minutes
+</li>
+<li>
+Task/Todo List information list some local hacks for finance
+</li>
+<li>
+todo lists and knowledge base
+</li>
+<li>
+Task management (TODO lists) * Note taking * Export/Publish (e.g.,
+publish notes to website) * Personal web pages (via org-publish)
+</li>
+<li>
+I use orgtbl-mode most of the time in muse files, that's how I came
+into contact with org-mode. I use it for writing (software)
+documentation, (work related) project planning, and measuring the
+time I work on projects.
+</li>
+<li>
+planning my TODO list and more recently my agenda GTD style
+</li>
+<li>
+Timeplanning, Timekeeping, Todo/Reminder
+</li>
+<li>
+replacement for time management system (todos, project organisation,
+schedules) replacement for spreadsheet helper in LaTeX modes
+(orgtbl-mode)
+
+</li>
+<li>
+1.) Note taking: web links, links to lines of code I'm working on,
+bibtex entries. 2.) Brainstorming. When I'm trying to figure out how
+to do something, I often fire up org-mode, dump a bunch of random
+thoughts into it, and then organize it into something that makes
+sense. 3.) Experiment logging. I use table node to store pretty much
+all the results I've accumulated for my PhD thesis. 4.) TODO
+lists. I thought I'd use the GTD capabilities on org-mode but can't
+force myself to do it. But still, for little projects, I use the
+TODO lists.
+</li>
+<li>
+Action items Notes and lists Tables of passwords Publishing website
+</li>
+<li>
+maintain my thoughts, experimental results and agenda
+</li>
+<li>
+As a GTD tool to keep all aspects of my life organized.
+</li>
+<li>
+Lists GTD
+</li>
+<li>
+Just getting used to it. Try to organize primarily work stuff, maybe
+later will get into private things.
+</li>
+<li>
+note taking, managing todo's, keeping track of time spent on a
+project and making tables.
+</li>
+<li>
+Everything! :-) + keeping notes, + maintaining TODO lists +
+exploiting the Agenda facilities (wow!) + doing project planning +
+writing text and exporting in HTML + a 'database' for experiments
+data (I'm "implementing" it (wow, wow!)
+</li>
+<li>
+Task list/agenda/calendar some "filing" of data, storage of links to
+file system and web
+</li>
+<li>
+Note taking for courses
+</li>
+<li>
+Learn more about organizing tasks - Trying to substitute little
+papers with appointments - Publish works (thesis, articles, web
+pages, &hellip;) - Support a bit the process of writing an article
+(TODOs, deadlines, sections, &hellip;)
+</li>
+<li>
+documentation todo list management complete daily work organisation
+private and at work planing of schedules for church and sports
+créate customer visit protocols (html for colleagues) I have access
+to my org files via svn world-wide
+</li>
+<li>
+all aspects of GTD except calendar
+</li>
+<li>
+Outlining and Organising.
+</li>
+<li>
+Day to day planning. Constantly switching between gtd and John
+Wiegly's setup to find out what suits me best.
+</li>
+<li>
+Todo List management. Task Scheduling. Note taking. Blogging
+(Blorg). Simple Bug Tracking.
+</li>
+<li>
+Organizing my work.
+</li>
+<li>
+Managing all my projects and todo lists using GTD, and managing my
+diary/calendar. Basically, I use it to manage my life - home, work,
+social etc. Also use it for hierarchical editing of files etc, but
+that is secondary.
+</li>
+<li>
+day planner (in agenda view) - generation of hipsterPDA - easy
+folding documentation tool (write text docu, use folding to hide
+sections I'm not working on currently, and finally generate html or
+LaTeX
+</li>
+<li>
+GTD / Agenda
+</li>
+<li>
+I organize all my projects and appointments with org.
+</li>
+<li>
+Mainly todos/tasks planning and follow up
+</li>
+<li>
+I use it to keep track of articles I have to write for clients (I'm
+a journalist). I keep a page per client. I also use it to keep notes
+on personal stuff, such as sport activities, todo things around the
+house, garden and so on
+</li>
+<li>
+advanced todo list, reading diary, simple HTML authoring.
+</li>
+<li>
+Project management
+</li>
+<li>
+note taking, task management, document creation, webpage publishing
+</li>
+<li>
+task management, notes about work and home projects, regular
+journaling &ndash; the list of things is expanding as I spend more and
+more time in emacs/org.
+</li>
+<li>
+Project planning, scheduling. Information
+gathering. Wishlists. Outlines. Todo lists (checkboxes). Data
+munging (tables) Review planning (outline w/ links)
+</li>
+<li>
+For GTD and basic word processing
+</li>
+<li>
+Projects, Notes, Memorial days etc.
+</li>
+<li>
+single file for everything
+</li>
+<li>
+Amassing and sorting to-dos and reference information. (Recovering
+from mild brain injury in 2005 that affected ability to categorize
+and prioritize, need mechanical aids!)
+</li>
+<li>
+Handling notes. Displaying the calendar. Use the agenda view to
+display notes.
+</li>
+<li>
+Outlining and providing group TODO lists with explanations.
+</li>
+<li>
+To Do List and Project Tracking Writing articles for export to HTML
+</li>
+<li>
+Note taking, task management
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-6">5. New features and product maturity?</h2>
+
+
+<p>
+Original question:
+</p>
+<p>
+What new features (if any) would you like to see in org-mode or do you
+think the product has reached maturity?
+</p>
+<ul>
+<li>
+case sensitive search in tag completition - multilingual day name
+input product has reached maturity in my opinion
+</li>
+<li>
+nothing (for now)
+</li>
+<li>
+A way to make it more Gnome friendly would be nice. In the case that
+you don't have emacs started, you lose your ideas until you can note
+them down.
+</li>
+<li>
+I still haven't learnt enough to fully customize my environment.
+</li>
+<li>
+Nothing specific, but I love the current state of development.
+</li>
+<li>
+Syncing todos to other devices such as cellphones and palms, I know
+it would not be very easy to do but would be extremely useful
+</li>
+<li>
+No idea, sorry. I think it has enough features at present that seems
+a bit intimidating, really. (Minor quibble &ndash; I changed some of the
+keybindings. I prefer M-left/right to hide/show subtrees, rather
+than cycling with tab, and use # instead of * for outline
+levels. This is mostly habits from a "todo-mode" used on emacs
+in-house where I work.)
+</li>
+<li>
+I'm on the lookout for a cell phone that runs Emacs, but&hellip; I haven't
+found any mechanisms for remotely adding/editing timestamps,
+changing the state of TODO items, etc. Neither have I found a way to
+trigger reminder sounds, e-mails, phone calls, or IM messages. I'm
+not sure about the best way to approach "mobile org-mode"&hellip; A
+web-interface like Webjimbo? More robust import/export/sync to iCal
+or GData? If we can find a way to usefully sync org-mode with mobile
+devices, it'll be just about perfect.
+</li>
+<li>
+Current features are enough for me.
+</li>
+<li>
+It is certainly mature. However I would also like to be able to use
+it as a wiki and general-purpose document authoring/publishing
+tool. In an ideal (and possibly unrealistic) world I would love to
+see unification with muse-mode. To what extent is this possible?
+</li>
+<li>
+I am still too new to it to comment on this.
+</li>
+<li>
+It's quite mature and I surely don't master it. What I'd like to see
+is easier manipulation of the agenda export.
+</li>
+<li>
+Compatibility with other wiki syntax (importer or exporter)
+</li>
+<li>
+too soon to know
+</li>
+<li>
+Basically mature; I'd like to see refinement within the current
+feature set.
+</li>
+<li>
+You can always add new features! I would like to see an easy way to
+tell how old my entries are. I would like to be able to derive a
+task order based on importance and age (for tasks that don't have a
+deadline but must be completed eventually). Also I would like to see
+it integrated with other tools. I think a MindMap converter (for
+FreeMind) would be cool - although it probably could be an external
+script.
+</li>
+<li>
+Export to WordprocessingML would be perfect. Currently I export to
+HTML and read the reports into Word, saving them as *.doc. But you
+loose some features and details doing this.
+</li>
+<li>
+Integration out-of-the-box with remote calendar systems like Google
+Calendar
+</li>
+<li>
+Close to maturity. Some new features would be nice, but not terribly
+important: Keeping root to leaf tree structure when archiving part
+of a subtree. Simple dependent todos (i.e. dependent todo moves into
+"NEXT" state when previous todo is marked "DONE"). Exporting entries
+in HTML in monospaced font by default (i.e. without specially
+marking individual entries). Auto-sorting of entries within a single
+parent node (e.g. when a node is marked "DONE", move it lower in the
+parent's list of todos). Integration with project management
+software.
+</li>
+<li>
+Some kind of resolution to the line wrapping issue with headlines.
+</li>
+<li>
+Simpler ways of doing things (perhaps with mouse commands)
+</li>
+<li>
+I'd say it's pretty close to maturity. I haven't used most of the
+more recently-added advanced features.
+</li>
+<li>
+I'd like easier customization of "workflow" steps that would make it
+easier to update states and record notes related to state changes
+(and skip these notes when the state transitions are obvious in
+nature).
+</li>
+<li>
+No immediate demands. I do not think the project has reached
+maturity.
+</li>
+<li>
+This product has reached maturity since long! In my point of view
+this is. Excellent work!
+</li>
+<li>
+depending tasks - integrated pdf-generation (especially for
+windows) - visualisation for tasks (like gantt) - a minor mode for
+contacts like vcard.el
+</li>
+<li>
+I think it reached maturity. It would be nice to have some minor
+things, like a posibility to insert todo's right inside your project
+source code and then have them added in agenda automatically.
+</li>
+<li>
+Instead of new features, I'd much prefer keeping XEmacs
+compatibility
+</li>
+<li>
+Wishlist - Adding arbitrary (user specified) relations between nodes
+with a specific relation name. for example, x &lt;part of&gt; y; where x
+and y are two nodes. - Making the above functionality work between
+files - making the above work between nodes published on a
+distributed server In the GNU project GNOWSYS, we do this, where it
+is a web application. We are now exploring how org mode can be used
+as a client to manage the data published in GNOWSYS. Out team would
+be more than willing to collaborate, but our team members are all
+Python hackers, and use Emacs only for coding
+</li>
+<li>
+I am having trouble keeping up with the many new features of the
+last few months!
+</li>
+<li>
+I think it is mature enough for me
+</li>
+<li>
+automatic reminders in Emacs as pop ups?
+</li>
+<li>
+I'm quite content as it is. I guess I could probably think of one or
+two things, but I wouldn't want to spoil its power/simplicity
+balance.
+</li>
+<li>
+ planing times for tasks and compare them to actuel used times (and
+also give out a warning if to many hours are planed for one day) -
+agenda export to latex - simple project management
+</li>
+<li>
+a gtd framework would be a killer feature!! more visual effects with
+overlays However, it's "déjà" a very good work. Thanks.
+</li>
+<li>
+very mature
+</li>
+<li>
+Nearing maturity, but then again, maybe I'm just out of ideas.
+</li>
+<li>
+I would like org-mode (or other parts of it like orgtbl) to become a
+minor mode so I can turn it on/off in other buffers (mainly
+muse). For example I would love to use todo list editing features in
+emails.
+</li>
+<li>
+I don't understant all the features yet :)
+</li>
+<li>
+export facilitie
+</li>
+<li>
+New features, in order of importance to me: 1.) A way to select a
+chunk of text in firefox and paste it into org-mode, along with a
+nicely formatted URL link. I would use this many times a day. MS
+OneNote does this well. 2.) A way to link to email in an IMAP
+folder. Preferably, this link would point directly to the email on
+the IMAP server. The link should look like all the other links, and
+you should be able to just drag it from, say, Thunderbird, into
+org-mode, although a Thunderbird keyboard shortcut would be nice. I
+would use this every day. 3.) More flexible outline prefixes. You
+should be able to make headlines of this type: I. asdlfk i. asdfj
+ii. asdlfkj II. &hellip; Or 1. Introduction 1.1 asdfkj 1.2
+asdfkl 2. Background &hellip; Emacs hyperbole:
+<a href="http://directory.fsf.org/project/hyperbole/">http://directory.fsf.org/project/hyperbole/</a> did this
+beautifully. 4.) Internal links search in a way consistent with
+emacs search (Ctrl-s). When you click on a link, it should go
+towards the end of the buffer for the next match. When there's
+nothing towards the end, it should wrap to the top. 5.) Fix the
+underline/bold/italic stuff (if that is a new feature) 6.) Better
+formatted html table export
+</li>
+<li>
+Better support for working with others.
+</li>
+<li>
+I would like to see different way to view or summarize ageda. Like
+progress, next possible todo
+</li>
+<li>
+I think org-mode is quite mature now except there may be still some
+bugs in it and some features may need more polish
+</li>
+<li>
+Too novice a user yet to comment
+</li>
+<li>
+can't tell yet.
+</li>
+<li>
+I like to be surprised more than wishing
+</li>
+<li>
+I'd like better integration with calendar mode of
+emacs. Specifically, when using the calendar, the command 'i d' to
+insert an appointment, the diary file is used. I'd like to set a
+headline in my orgmode buffer for that insert, for consistency with
+the calendar entries I make by hand while processing my inbox Also,
+navigation from agenda to org-file is easy. navigating back is
+harder.
+</li>
+<li>
+possibly nested numbered lists: 1. head 1 1.1 sub-head 1 1.2
+sub-head 2 Also lettered lists: a. point a b. point b but I'm
+already quite satisfied
+</li>
+<li>
+ implement all features of muse-mode. Ex: list of pages, backlinks,
+following links with Enter, &hellip; - consistent and clear syntax for
+formatting text, which doesn't require memorizing use cases or
+exceptions (ex: <b>a</b> isn't bold)
+</li>
+<li>
+syncing with my palm would be the greatest need. (syncing with
+outlook would do the job as outlook is snced with the palm)
+</li>
+<li>
+mostly small things like an isearch mode that only matches headlines
+(and doesn't auto expand), an allout-copy-exposed-to-buffer
+equivalent, hipster pda publishing
+</li>
+<li>
+I've too many ideas to write here. The only thing i can think of is
+not quite org related. A published bison or antlr grammar, so people
+can write org parsers/processors in other languages, and extend its
+integration into other systems.
+</li>
+<li>
+Org mode is fairly mature. Only the remaining inconsistencies should
+be straightened out.
+</li>
+<li>
+Hard to say, every so often I think of a feature that might be nice
+to have. I have a feeling that alternate views (like the agenda) to
+allow other ways of exploring your information would be handy, but I
+have no concrete ideas yet as to what they might be.
+</li>
+<li>
+Better exporting (for example better LaTeX export).
+</li>
+<li>
+The only thing I need is better integration with mh-e (I suspect it
+is already there - just need to find the time to sort it out). Other
+than that I am very content!
+</li>
+<li>
+ I always wanted to be able to schedule a task for a specific week
+(as oposed to a date) - I would like to improve the hipsterPDA
+generation (export the agenda view as nice LaTeX, improve the
+cal-tex output, etc)
+</li>
+<li>
+Org grows faster than I can learn all those nice features. One
+feature I'd love to see was that the HTML export created docs that
+could be outlined like in an org buffer. I guess that's possible
+with some CSS.
+</li>
+<li>
+Task dependency for project planing
+</li>
+<li>
+At the moment, I'm still on the learning curve. Org-mode has
+soooooooooo many features I have not even discovered yet. I almost
+daily open the manual pages to see I there is something I can use.
+</li>
+<li>
+Probably, customization of built-in agenda view. But I'd rather see
+org-mode streamlined and cleaned of unnecessary
+complications. Properties should be either integrated more tightly
+to replace tags/priorities/etc, or removed.
+</li>
+<li>
+Looking forward to some of the dependency ideas.
+</li>
+<li>
+Import tasks from .ics files, include .ics files in agenda,
+eventually include remote .ics files in agenda. Would like an
+updated blogging tool that takes advantage of recent developments.
+</li>
+<li>
+I'm working on integration with my email client and web browser --
+it's a slow process because I'm not a programmer, but I'm learning
+bits and pieces about bash shell scripts and grabbing what I can
+from experts already using org.
+</li>
+<li>
+I'd like a way to set project (outline item) dependencies and to
+easily list those projects in dependency order. I could do it now
+with properties, a dynamic block and some elisp. I'd use markup more
+if it were more reliable in the emacs buffer. It might be nice to
+have a mode where rigid outline style indenting is enforced while
+editing outlines and lists. Perhaps as a buffer option or subtree
+property. None of this is necessary or worth calling org-mode
+immature.
+</li>
+<li>
+Not new features. But perhaps splitting org.el into different
+modules: one for outlining, one for doc format (Wiki engine), one
+for GTD
+</li>
+<li>
+block quote text support. like wiki {{{ This is quote text }}}
+Currently only putting ':' at beginning of text or heading.
+</li>
+<li>
+I hope a better archive mechanism using C-c C-x C-c, which could
+keep the structure in my org file.
+</li>
+<li>
+Seems mature; new features always interesting but can add a layer of
+too-many-choices distraction. (See prioritizing problems above ;) )
+</li>
+<li>
+New summary type {%} for progress status. Real comment syntax.
+</li>
+<li>
+I use only a fraction of its features.
+</li>
+<li>
+Mature
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-7">6. Additional tutorials, documentation and screencasts would you like?</h2>
+
+
+<p>
+Original question:
+Which topics or "how-to" guides would you like to see in the
+documentation or as a tutorial or screencast?
+</p>
+<ul>
+<li>
+none. documentation is excellent
+</li>
+<li>
+how to prepare/export/print GTD file to A7(index cards hPDA (hipster
+PDA) forms
+</li>
+<li>
+Everything should be a screencast for new users.
+</li>
+<li>
+I'd love to see more examples (with code) of how people use org,
+especially for implementing GTD.
+</li>
+<li>
+More detailed information about blogging would be great, especially
+motivation for using org.
+</li>
+<li>
+The manual and refcard usually have me covered. An in-depth
+screencast on table/calc might be nice.
+</li>
+<li>
+More stuff about methodology to use it.
+</li>
+<li>
+Screencasts are most helpful to me. I would like to see material on
+publishing and blogging in particular
+</li>
+<li>
+Project lifecycle. Timesheet reports.
+</li>
+<li>
+Exporting to other formats and customizing that
+</li>
+<li>
+lot of screencast showing new features of org (such as one already
+done)
+</li>
+<li>
+The documentation is actually rather good as it is, haven't found
+anything lacking yet.
+</li>
+<li>
+Integration with remember
+</li>
+<li>
+Integrating org-mode with pine/alpine mailer.
+</li>
+<li>
+Not sure who you want to target. Advanced users are your bread and
+butter and probably are OK. Beginners should get some screencasts
+that describe a common problem and just focuses an how org mode can
+help them. A good example is something like when someone's todo list
+gets too long and complex and they want to split it, but maintain
+connections between items on various lists, or perhaps view a
+chronological list of all items in one location. Org mode is the
+only program I know of the handles this kind of complexity
+gracefully.
+</li>
+<li>
+In depth explanation of using the agenda to its fullest
+</li>
+<li>
+I'd love to see one on setting up column views. A tutorial on
+publishing files would be great. And one about creating custom
+agenda views.
+</li>
+<li>
+Changing the keybindings to make specific state transitions easier
+to enter
+</li>
+<li>
+don't know as of yet &hellip;
+</li>
+<li>
+using the spreadsheet with merged cells, calculation for rows and
+columns - showing the true meaning of the properties stuff - over
+all there should be examples - i really dislike the manual form
+orgmode.org because it is technical oriented not for the simple
+user - more howtos for gtd -&gt; learning from each other
+</li>
+<li>
+Different usages of org-mode. From GTD to other ways &hellip;
+</li>
+<li>
+I find the manual well written and sufficient.
+</li>
+<li>
+Use of drawers and properties.
+</li>
+<li>
+HOw to organize multiple projects; auto-archival.
+</li>
+<li>
+org spreadsheet
+</li>
+<li>
+Since Org-mode is (to me) a collection of "orthogonal" features, but
+doesn't much impose structure, I'd be interested in seeing how
+others organise their data and "bring it to life" with the Org-mode
+features.
+</li>
+<li>
+none
+</li>
+<li>
+more documentation for org's lisp functions (in fact more examples
+with org's lisp funtions!!)
+</li>
+<li>
+remember mode integration
+</li>
+<li>
+I prefer the documentation and experimentation. Need drives my
+learning.
+</li>
+<li>
+I don't have any preferences.
+</li>
+<li>
+Can't think of any
+</li>
+<li>
+I think a new user would benefit from a screencast showing basic
+hierarchy creation and navigation
+</li>
+<li>
+Remember Practical uses of properties
+</li>
+<li>
+I would like to see more people to share their ways of using org
+model
+</li>
+<li>
+The documentation is already very good and it seems the manual is
+never out of sync from the latest org-mode version. I found the
+mailing list is the best source of "how-to" as people's individual
+situations are so much different.
+</li>
+<li>
+more of org for gtd
+</li>
+<li>
+how to deal with the calendar and insert dates quickly - two-way
+backends for groupware-like behavior - calender functionality for
+scheduled events (receive popups or emails or sms or the like) -
+probably more but it's too early to say
+</li>
+<li>
+drawers + table calculations
+</li>
+<li>
+Using org-mode as a calendar/planner. Perhaps a best practice around
+where date- and time-stamps belong (in the headline? in a SCHEDULED:
+property? DEADLINE: property?) Also, it would be helpful to be shown
+the best practices around Categories (since they show up so
+prominently in the agenda) I wanted them to be like David Allen's
+"Contexts", but that's hard for me to manage.
+</li>
+<li>
+All the variables that you must configure to be able to write and
+export an article successfully and without unexpected results - How
+to move from {muse,kwiki,reST,planner,&hellip;} to org-mode: how to adapt
+the syntax, &hellip;
+</li>
+<li>
+examples of how to columns view
+</li>
+<li>
+real examples of different ways of using org-mode
+</li>
+<li>
+Scope projects? integrate Org into a software development
+process/project? Handle &lt;not at computer&gt; org interactions?
+</li>
+<li>
+Daily use of agenda
+</li>
+<li>
+I'm still not familiar with the more advanced features of org-mode,
+so I'm keen to see these areas explored in tutorials and guides.
+</li>
+<li>
+The spreadsheet.
+</li>
+<li>
+None that I would be interested in, although I accept that new users
+would benefit from them.
+</li>
+<li>
+I think column-view is a great feature. Bastiens tutorial is good,
+but I'm thinking a tutorial focused more on the use case as opposed
+to the config option might be better. If I find time :-)
+</li>
+<li>
+I don't know if it's just me, but currently I make no use of
+tags. So any how-to or screencasts of how to use categories and tags
+together in a senseful way would be nice. Most usages of tags I've
+seen so far where tags like :phonecall: or :appoitment:, but when I
+have a TODO "Call Jim" or "Meet Jim" those are superluous&hellip;
+</li>
+<li>
+I would welcome such how-to's and offer to help. The drawback of
+screencasts is they take a long time, and there is no way a viewer
+can tell it will be usefull to sit it all out. A guide giving
+examples (and using short screencasts, if necessary) gives the
+reader an overview, he/she can skip sections and browse to a
+chapter/paragraph deemed usefull. I would like to learn howto tweak
+my custom built todo-lists so that some of the statuses show up in
+the agenda, and others don't. Example WRITE should be on the agenda,
+but INVOICE not really. But the intermediate VERIFY should.
+</li>
+<li>
+More on GTD. Agenda customization.
+</li>
+<li>
+More on column mode and new uses of properties.
+</li>
+<li>
+I know there are books and howtos about lisp, but it would be great
+to see some smaller howtos that are specific to org applications,
+and code samples.
+</li>
+<li>
+The remember mode stuff scares me. I need to take some time learn
+it. I also know agenda can do a lot more than I do with it. I'd like
+to see screen shots of of column mode to drool over since I'm not
+running emacs 22 yet.
+</li>
+<li>
+can't thing of any
+</li>
+<li>
+Spreadsheet examples.
+</li>
+<li>
+how-to setup a gtd style system is always my favorite.
+</li>
+<li>
+Some experienced users' detailed explication of pros and cons of the
+newer TMTOWTDI (There's More Than One Way To Do It) choices like
+archiving methods, task states, etc. leading to &ndash; you
+guessed it &ndash; prioritizing problems
+</li>
+<li>
+Building complex agenda views.
+</li>
+<li>
+Dunno.
+</li>
+<li>
+Setting up a publishing/blog environment
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-8">7. Which features of org-mode do you use? (Spreadsheet, LaTeX, HTML, Remember, etc)</h2>
+
+
+<ul>
+<li>
+Document Structure, Tables, Spreadsheet, Hyperlinks, TODO items,
+Tags, Properties and Columns, Dates and Times, (Custom) Agenda Views
+</li>
+<li>
+LaTeX, Remember
+</li>
+<li>
+Use the agenda/tags views heavily. Tables, but not really
+spreadsheets.
+</li>
+<li>
+Rememeber
+</li>
+<li>
+remember, agenda views.
+</li>
+<li>
+I'm sure I will use everything at some point. I've finally started
+using remember recently, about to start using HTML for blogging I
+think, and can imaging using LaTeX to print index cards even.
+</li>
+<li>
+Todo-list, agenda - remember
+</li>
+<li>
+Remember, agenda, I learned to use the tags / priorities, but they
+don't seem to fit my style of use.
+</li>
+<li>
+Publish to HTML and LaTeX (although I'd prefer ConTeXt), dynamic
+blocks, orgstruct minor mode, and hyperlinks. I'm not sure if they
+count as a "feature", but I use deadlines, scheduling, and repeated
+tasks <b>a lot</b>.
+</li>
+<li>
+remember, clock summary.
+</li>
+<li>
+TODO keywords, tags, timestamps (inc. deadlines/scheduling),
+priorities, export to HTML/ics, tables, archiving, remember, custom
+agenda commands
+</li>
+<li>
+Still exploring.. starting out with fundamentals as described in
+John Weigly's excellent write-up.
+</li>
+<li>
+HTML, Remember
+</li>
+<li>
+Basic planning, some html export, Wannt to use more features of org
+but lack of time
+</li>
+<li>
+Remember, html
+</li>
+<li>
+Much use of Remember, agenda, agenda todo lists. Some use of HTML
+and LaTeX. A little use of spreadsheet.
+</li>
+<li>
+Starting to use spreadsheets and tables. I use the [/] feature to
+keep track of task counts a lot. I like the "radio" links too. Don't
+use the others much.
+</li>
+<li>
+Export2HTML, Remember, Agenda
+</li>
+<li>
+Remember, LaTex, ical export, Agenda and Diary integration
+</li>
+<li>
+HTML. My usage is pretty basic.
+</li>
+<li>
+LaTeX, HTML, Agenda, diary integration, Todo, outlining like crazy
+</li>
+<li>
+Spreadsheet (for tables)
+</li>
+<li>
+I use Remember, HTML, agenda views, hyperlinks, time-tracking,
+timestamps, and tags. I occasionally use tables, and plan on using
+the PROPERTIES drawer in the future. I don't currently use any
+advanced table formulas or column view, but I'm glad they're there.
+</li>
+<li>
+Remember, basic task lists, and mostly the Agenda views.
+</li>
+<li>
+LaTex, HTML, Remember, Cal, diary
+</li>
+<li>
+all
+</li>
+<li>
+agenda - html - spreadsheet
+</li>
+<li>
+Spreadsheet, remember, time logger and outlines.
+</li>
+<li>
+Document structure + hyperlinks, agenda + remember, exporting and
+publishing
+</li>
+<li>
+writing documents, LaTeX, HTML.
+</li>
+<li>
+Remember; tables.
+</li>
+<li>
+Remember, and the todo features.
+</li>
+<li>
+simple to do listing
+</li>
+<li>
+A lot: Outlines, Tables, Spreadsheets, TODOs, Links, Tags,
+Timestamps, Clocking Time. A little: Agenda views, Properties and
+Columns Not at all: LaTeX, HTML, Remember I plan to increase my
+usage of all the above, apart from LaTeX, which I'll probably never
+use.
+</li>
+<li>
+Remember
+</li>
+<li>
+Remember, Latex, spreadsheet (with calc)
+</li>
+<li>
+just to basic features
+</li>
+<li>
+ * TODO's, including ** Scheduling ** Deadlines ** Archiving (both
+tag and function) * Remember * LaTeX * export/HTML * Tables *
+org-publish * Agendas
+</li>
+<li>
+spreadsheet, HTML
+</li>
+<li>
+remember, agenda, priority
+</li>
+<li>
+Remember
+</li>
+<li>
+all
+</li>
+<li>
+Basic outlining with tons of links of most types allowed. * Tables *
+HTML export * TODO's
+</li>
+<li>
+Tables, HTML, Remember
+</li>
+<li>
+table, agenda, remember
+</li>
+<li>
+Probably the question is bettered asked with "which features of
+org-mode do you not use?" :-) It seems I have almost used everything
+except properties and drawers. Although I did not go into depth of
+many of them, like I never used a formula in the built in org-mode
+table.
+</li>
+<li>
+tags, todos, links, timestamps
+</li>
+<li>
+remember, agenda
+</li>
+<li>
+tables, HTML, ToDo stuff/agenda, column mode, clock features,
+categories
+</li>
+<li>
+Agenda, time tracking, HTML, latex, spreadsheet
+agenda export to ics (iCalendar) file TODO proper- ty drawers
+</li>
+<li>
+headings, tags, links, drawers &amp; properties, table (&amp; occasionally
+spreadsheet), remember, todo's
+</li>
+<li>
+outlining - basic spreadsheet - org-export-as-latex - HTML -
+org-publish - marking TODO/DONE (or equivalents) - agenda
+</li>
+<li>
+Remember HTML
+</li>
+<li>
+HTML, Remember, custom agenda views, tags matches, custom keyword
+states, diary integration, recurring tasks, scheduling and
+deadlines, org-nnml, hyperlinks, categories
+</li>
+<li>
+Agenda, Remember, Tags, Ascii Export, Tables, Outlining
+</li>
+<li>
+Spreadsheet
+</li>
+<li>
+sometimes Spreadsheet remember extensively LaTeX/Html export
+</li>
+<li>
+Remember, Blorg, org-publish, Tables, Lists, Checkboxes, TODO
+sequences.
+</li>
+<li>
+LaTeX, html, remember, spreadsheet
+</li>
+<li>
+Tags, Remember, Diary integration, Logging, sometimes spreadsheet
+usage.
+</li>
+<li>
+folding, TODOs, Agenda view, HTML generation, column-view
+</li>
+<li>
+Spreadsheet, HTML, Remember, fast selection of TODO keywords, links
+to everywhere, extended timestamps and intervals
+</li>
+<li>
+Spreadsheet, HTML
+</li>
+<li>
+I use remember very often. I have not really touched the
+spreadsheet, don't need to. I use the deadline feature all the time
+and the [/] todo list type. I have experimented with export to html,
+in order to transport stuff to a very smart smart phone (iphone) but
+that requires more tweaking on my side.
+</li>
+<li>
+todo and logging state changes, tags, priorities, hyperlinks,
+remember, timestamps, agenda, export to HTML.
+</li>
+<li>
+Folding, spreadsheet, column mode, properties, schedule/agenda,
+org-remember, html export, todo, tags
+</li>
+<li>
+I use everything except radio stuff and dynamic blocks, and I think
+I will use those soon. Don't use XOXO export either, I guess.
+</li>
+<li>
+remember, tables, tasks, tags, archiving, calendar, html export, and
+I'm learning a bit about LaTeX.
+</li>
+<li>
+In no particular order: tables, plain list folding, checkboxes and
+checkbox counting [/], multiple todo sequences, tags, properties,
+inactive dates, elisp formulas, html export, text export, in-buffer
+markups (*/_), subtree in indirect buffer, links
+</li>
+<li>
+latex, html, remember
+</li>
+<li>
+spreadsheet, remember, agenda, outline, property, column view
+</li>
+<li>
+remember, archive, appointment, diary, timeclock
+</li>
+<li>
+Remember for fast to-do adds; use tables occasionally but mostly use
+dedicated spreadsheet s/w for such functions. Hope to learn LaTeX at
+some point.
+</li>
+<li>
+Agenda views Table editing Properties drawers HTML export LaTeX
+export
+</li>
+<li>
+HTML. Remember. Tables.
+</li>
+<li>
+Mainly time stamps, agendas and HTML export
+</li>
+<li>
+LaTeX, Spreadsheet, Remember
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-9">8. Your age</h2>
+
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col><col align="left"></col>
+<thead>
+<tr><th>Age range</th><th>N</th><th>bar</th></tr>
+</thead>
+<tbody>
+<tr><td>16 - 20</td><td>0</td><td></td></tr>
+<tr><td>21 - 25</td><td>5</td><td>*****</td></tr>
+<tr><td>26 - 30</td><td>15</td><td>***************</td></tr>
+<tr><td>31 - 35</td><td>21</td><td>*********************</td></tr>
+<tr><td>36 - 40</td><td>11</td><td>***********</td></tr>
+<tr><td>41 - 45</td><td>13</td><td>*************</td></tr>
+<tr><td>46 - 50</td><td>3</td><td>***</td></tr>
+<tr><td>51 - 55</td><td>3</td><td>***</td></tr>
+<tr><td>56 - 60</td><td>0</td><td></td></tr>
+</tbody>
+</table>
+
+
+</div>
+
+<div class="outline-2">
+<h2 id="sec-10">9. Which country do you live in?</h2>
+
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="right"></col><col align="left"></col>
+<thead>
+<tr><th>Country</th><th>N</th><th>bar</th></tr>
+</thead>
+<tbody>
+<tr><td>Australia</td><td>3</td><td>***</td></tr>
+<tr><td>Canada</td><td>2</td><td>**</td></tr>
+<tr><td>China</td><td>2</td><td>**</td></tr>
+<tr><td>Croatia</td><td>2</td><td>*</td></tr>
+<tr><td>France</td><td>5</td><td>*****</td></tr>
+<tr><td>Germany</td><td>17</td><td>*****************</td></tr>
+<tr><td>Hungary</td><td>1</td><td>*</td></tr>
+<tr><td>Iceland</td><td>1</td><td>*</td></tr>
+<tr><td>India</td><td>4</td><td>****</td></tr>
+<tr><td>Italy</td><td>2</td><td>**</td></tr>
+<tr><td>Netherlands</td><td>3</td><td>***</td></tr>
+<tr><td>New Zealand</td><td>1</td><td>*</td></tr>
+<tr><td>Norway</td><td>1</td><td>*</td></tr>
+<tr><td>Pakistan</td><td>1</td><td>*</td></tr>
+<tr><td>Romania</td><td>1</td><td>*</td></tr>
+<tr><td>Russia</td><td>1</td><td>*</td></tr>
+<tr><td>Scotland</td><td>1</td><td>*</td></tr>
+<tr><td>Slovenia</td><td>1</td><td>*</td></tr>
+<tr><td>Spain</td><td>1</td><td>*</td></tr>
+<tr><td>Sweden</td><td>1</td><td>*</td></tr>
+<tr><td>Switzerland</td><td>1</td><td>*</td></tr>
+<tr><td>UK</td><td>7</td><td>*******</td></tr>
+<tr><td>USA</td><td>23</td><td>***********************</td></tr>
+</tbody>
+</table>
+
+
+</div>
+
+<div class="outline-2">
+<h2 id="sec-11">10. Are there any other comments you would like to make about org-mode?</h2>
+
+
+<ul>
+<li>
+Thanks for this great software, I've waited for years for such a
+tool. I've wrote some tools around org in Perl, hopefully I'll find
+some time to contribute. Thanx a lot
+</li>
+<li>
+Great tool to stay even longer in emacs OS :-)
+</li>
+<li>
+Thanks!
+</li>
+<li>
+Great App, Great Support, Great Community
+</li>
+<li>
+org-mode is all-the-way cool.
+</li>
+<li>
+With the possible exception of Emacs itself, org-mode is my very
+favorite bit of software. It has inspired me to learn LISP, so I'm
+looking forward to contributing in the near future.
+</li>
+<li>
+It's fantastic and the maintainership and community are both second
+to none!
+</li>
+<li>
+Later. :)
+</li>
+<li>
+Great mode and very useful. Thanks a lot for your effort and time!
+</li>
+<li>
+Great Work ! Felicitation to its author
+</li>
+<li>
+It's indispensable for my current work and lifestyle.
+</li>
+<li>
+It is a great package, thanks for making it available and keeping
+it alive!
+</li>
+<li>
+Thanks for the org-mode. I just love it! Do all my personal and job
+planning with it!
+</li>
+<li>
+Great tool, thanks thanks thanks :)
+</li>
+<li>
+It's fantastic &ndash; thanks for the great tool. I'm getting older and
+it's the only way I can "remember" everything. It's not just a great
+todo list manager, but I use it to document almost everything about
+my job (e.g. my original intentions about a
+project/implementation). I can bury a TODO right down in the place
+where I have most of the surrounding documentation.
+</li>
+<li>
+I cannot overstate how valuable this mode is. It single handedly has
+the potential to make laypeople aware of Emacs. Thanks so much for
+working on it!
+</li>
+<li>
+Love it. Love it. Love it. Carsten is awesome.
+</li>
+<li>
+It's changing very fast, and I'm worried that my muscle memory will
+start to fight against the changes. Still, it's good to see an Emacs
+package with such active interest and support.
+</li>
+<li>
+I'm a happy user. Thanks to Carten and all contributors
+</li>
+<li>
+great guys on the mailinglist, great spirit, excellent product :-)
+</li>
+<li>
+Carsten, many thanks for this great piece of software! Keep it
+simple and usuable - not everybody follows the power user discussion
+in gmane
+</li>
+<li>
+Keep up the great work! :)
+</li>
+<li>
+Thanks to Carsten and to people on emacs-orgmode !!
+</li>
+<li>
+Been a user of GNU Emacs for the last 18years, never seen such a
+fascinating major mode. I like this kind of apps since I work in
+knowledge organization, and would like to contribute in some
+way. Our lab gnowledge.org would like to develop a java applet that
+provides org mode kind of editing. The buffer thus produced will be
+converted into html when the page is being served in the
+background. This will encourage the community to do structured
+documentation. Our lab is now engaged in developing
+beta.selfplatform.eu, where in we would like to provide this
+feature. Do you think, orgmode developers would like to help us or
+contribute in this endeavor. Orgmode can be very useful for
+furthering semantic computing.
+</li>
+<li>
+It is a great product. I does not need to grow. It might risk
+feature creep.
+</li>
+<li>
+Excellent package
+</li>
+<li>
+Thank you, Carsten!
+</li>
+<li>
+Has increased my productivity a lot!
+</li>
+<li>
+Really a great thank to the author "Carsten Dominik", "chapeau" as
+they say in France!!!!
+</li>
+<li>
+Org-mode was relatively immature when I started using it, and I have
+kept with it for 2 simple reasons: 1. The maintainer (Carsten) is
+friendly, fast, accurate, and thorough 2. It works &ndash; it does what
+it claims to do, and does it well
+</li>
+<li>
+Org mode keeps me organized, it's outstanding!
+</li>
+<li>
+hmmh, org-mode is the first thing I start in the morning and the
+last I close in the evening, I guess this tells it all.
+</li>
+<li>
+Org mode has been an incredibly useful tool that is fun to use. I
+think a main reason for its utility is that basic use requires
+little thought. When I'm using it for brainstorming, it's almost
+like I'm not aware that I'm using any program &ndash; I'm just
+thinking. Any changes to org-mode should preserve this
+simplicity. Thanks a ton to Carsten and all the others who have
+contributed to this great project!
+</li>
+<li>
+Thank you Carsten!
+</li>
+<li>
+Maybe we should consider a separate package or maintainer for
+xemacs&hellip;.
+</li>
+<li>
+Thanks, thanks and thanks.
+</li>
+<li>
+Good stuff. thanks
+</li>
+<li>
+It's Fun. ASCII is usually the only interface I can get used to,
+because it's so fast.
+</li>
+<li>
+org-mode makes me look organised (though a bit quirky). That's
+enough reason to use it.
+</li>
+<li>
+Amazing!!!!!!!!!!!!!!!! :-)
+</li>
+<li>
+Even if org-mode stands right where it is, it has been enormously
+helpful. Thank you very, very much.
+</li>
+<li>
+Well done
+</li>
+<li>
+Yes: org-mode progresses very well and improves with each version
+</li>
+<li>
+for me its the greatest found treasure since I "dicovered" Emacs.
+</li>
+<li>
+Great work! Wish I had time to contribute more.
+</li>
+<li>
+Keep up the good work :)
+</li>
+<li>
+It's a great software project and community. Thanks again to
+everyone involved!
+</li>
+<li>
+Excellent piece of software!
+</li>
+<li>
+I'm very very happy with it.
+</li>
+<li>
+org-mode is fantastic :-)
+</li>
+<li>
+The best feature of Org are its two maintainers Carsten and Bastien
+and its helpful community.
+</li>
+<li>
+Great mode for emacs. I wish I was using it more
+</li>
+<li>
+It is great tool. Uncluttered. Thanks to Carsten et al.
+</li>
+<li>
+Rock on!
+</li>
+<li>
+favorite piece of software I use.
+</li>
+<li>
+I'm continually amazed by what org can do, and also by how intuitive
+it is. It's not at all unusual that I find myself thinking that it
+would be great if org/emacs did "x", trying what seems to me to be
+the way that it would do "x" if it could, and discovering that it
+functions just as I expect. And when it doesn't, there are ways to
+figure it out. (And Carsten is a great developer who shines at
+hearing what his users are doing, responding to expressed needs, and
+even being clear if/when he decides not to do what someone would
+like him to do. Other heavy users and scripters are great as well.
+</li>
+<li>
+I started using Org-mode as an outliner. It is the best outliner
+I've used an much more. The community is valuable but Carsten's
+skill and judgment has made org-mode what it is.
+</li>
+<li>
+It's a killer tool that I could not live without.
+</li>
+<li>
+org-mode is great, I hope it can keep clean text file when adding
+functions.
+</li>
+<li>
+I forced myself to learn emacs after 25+ years in the vi camp in
+order to use org-mode. Loving it. Carsten's enthusiasm and support
+are a joy, and the mailing list is always refreshing.
+</li>
+<li>
+I plan to run a website where users could share Org files and edit
+them together. I plan to write a better exporter (and more formats!)
+I think the Org syntax is mature enough to get more programs
+interacting with it outside Emacs. Org is <b>great</b> :)
+</li>
+<li>
+It's wonderful. Thanks!
+</li>
+<li>
+org-mode is a fantastic program, supported by a lively helpful email
+list. Carsten is very responsive to feature requests and helping.
+
+
+</li>
+</ul>
+<p>-end-
+</p>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-12">Appendix: Raw data for some questions:</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-13"><span class="target">Raw Emacs versions</span> </h3>
+
+<p>Here are the detailed responses, for reference.
+</p>
+<p>
+<pre>
+GNU Emacs 22.1.1 (powerpc-unknown-linux-gnu, GTK+ Version 2.10.13) of 2007-07-08 on malo, modified by Debian 2. GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+21.3.1 and 22.1.1
+22.0.96.1 on Windows CVS from the unicode2 branch on Linux
+Emacs 22.1 GNU Emacs 22.1.1 (i686-pc-linux-gnu, GTK+ Version 2.10.11) of 2007-09-16 on zen
+Emacs 22.1. Where I happen to be sitting, M-x version says: GNU Emacs 22.1.1 (sparc-sun-solaris2.8, X toolkit) of 2007-06-15 on sa
+Emacs 23
+Emacs from CVS GNU Emacs 23.0.60.1 (i486-pc-linux-gnu, GTK+ Version 2.12.0) of 2007-10-31 on samarium
+Emacs22
+GNU 22.0.98.1
+GNU Emacs 21.3.1
+GNU Emacs 22.0.50.1 (i386-mingw-nt5.1.2600) of 2006-03-21 on YAMALOK
+GNU Emacs 22.0.91.1
+GNU Emacs 22.0.95.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-03-02 on pacem, modified by Debian
+GNU Emacs 22.0.96.1 (i386-mingw-nt5.1.2600) of 2007-03-24 on NEUTRINO
+GNU Emacs 22.0.990.1 (i386-mingw-nt5.1.2600) of 2007-05-23 on LENNART-69DE564 (patched)
+GNU Emacs 22.1
+GNU Emacs 22.1
+GNU Emacs 22.1.1
+GNU Emacs 22.1.1
+GNU Emacs 22.1.1
+GNU Emacs 22.1.1 (i386-apple-darwin9, Carbon Version 1.6.0)
+GNU Emacs 22.1.1 (i386-apple-darwin9.0.0, X toolkit) of 2007-11-05 on selenium. dmg
+GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02 on RELEASE
+GNU Emacs 22.1.1 (i486-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-07-22 on nautilus, modified by Debian"
+GNU Emacs 22.1.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-08-22 on raven, modified by Debian
+GNU Emacs 22.1.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-11-03 on pacem, modified by Debian
+GNU Emacs 22.1.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-11-03 on pacem, modified by Debian - Gnu Emacs 22.1 windows version
+GNU Emacs 22.1.1 (i586-suse-linux-gnu, GTK+ Version 2.12.0) of 2007-11-06 on balada
+GNU Emacs 22.1.1 (i686-pc-linux-gnu) of 2007-09-27
+GNU Emacs 22.1.1 (i686-pc-linux-gnu, GTK+ Version 2.10.4)
+GNU Emacs 22.1.1 (i686-pc-linux-gnu, GTK+ Version 2.10.6) of 2007-09-14, in an Eterm
+GNU Emacs 22.1.1 (powerpc-apple-darwin7.9.0, Carbon Version 1.6.0) of 2007-07-22 on applecore.inf.ed.ac.uk - Aquamacs Distribution 1.
+GNU Emacs 22.1.1 (powerpc-apple-darwin8.10.0, Carbon Version 1.6.0) of 2007-10-04 on malibu.local
+GNU Emacs 22.1.1 (x86_64-pc-linux-gnu, GTK+ Version 2.12.0) of 2007-11-06 on king, modified by Ubuntu
+GNU Emacs 22.1.2 (i386-unknown-openbsd4.1, X toolkit) of 2007-06-10 on lucien.my.domain
+GNU Emacs 22.1.50.1
+GNU Emacs 22.1.50.1 (i386-apple-darwin8.10.1, Carbon Version 1.6.0) of 2007-10-02 on plume.sr.unh.edu - Aquamacs Distribution 1.2a
+GNU Emacs 22.1.50.1 (i386-mingw-nt5.1.2600) of 2007-07-07 on NEUTRINO
+GNU Emacs 22.1.50.1 (i686-pc-linux-gnu, X toolkit) of 2007-06-18 on ...
+GNU Emacs 23.0.0.1 (i386-mingw-nt5.1.2600) of 2007-07-10 on BREP
+GNU Emacs 23.0.0.1 (i386-mingw-nt5.1.2600) of 2007-08-18 on TPAD
+GNU Emacs 23.0.0.1 (i686-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-03-18
+GNU Emacs 23.0.0.1 (i686-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2007-08-13 on cera" (emacs-unicode2), Emacs 22.1 under Windows.
+GNU Emacs 23.0.50.1 (i386-mingw-nt5.1.2600) of 2007-11-13 (via CVS, compiled with GnuWin32 native tools rather than cygwin)
+GNU Emacs 23.0.50.1 (i486-pc-linux-gnu, GTK+ Version 2.12.1) of 2007-11-11 on elegiac, modified by Debian
+GNU Emacs 23.0.50.1 (i486-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-10-14 on elegiac, modified by Debian"
+GNU Emacs 23.0.50.1 (i686-pc-linux-gnu, GTK+ Version 2.12.1) of 2007-11-15 on baldur
+GNU Emacs 23.0.60.1
+GNU Emacs 23.0.60.1 (i486-pc-linux-gnu, GTK+ Version 2.12.0) of 2007-10-31 on samarium
+GNU Emacs 23.0.60.1 (i686-pc-linux-gnu, GTK+ Version 2.10.14) of 2007-10-29
+GNU Emacs 23.0.60.1 (i686-suse-linux-gnu, GTK+ Version 2.12.0)
+GNU Emacs 23.0.60.1 (i686-suse-linux-gnu, GTK+ Version 2.12.0)
+GNU Emacs 23.0.60.1 (x86_64-unknown-linux-gnu, GTK+ Version 2.12.1)
+GNU Emacs CVS (~23.0.50.1)
+GNU Emacs CVS 20071101
+GNU Emacs CVS 23.0.0
+GNU Emacs On Windows XP: GNU Emacs 22.0.990.1 (i386-mingw-nt5.1.2600) of 2007-05-23 on LENNART-69DE564 (patched) On Linux: GNU Emacs 22.1.50.1 (armv5tel-unknown-linux-gnu) of 2007-06-22 on homehub
+GNU Emacs and Carbon Emacs, both 22.1
+GNU. On Debian: GNU Emacs 23.0.50.1 (x86_64-pc-linux-gnu, GTK+ Version 2.12.1) of 2007-11-11 on elegiac, modified by Debian The other isn't available right now.
+Gnu Emacs 22.1.1 and 21.4 (patch 20) "Double Solitaire" XEmacs Lucid
+Gnu Emacs v22.1.50.1
+Gnu/Emacs GNU Emacs 23.0.60.1 (x86_64-unknown-linux-gnu, GTK+ Version 2.12.0) of 2007-11-11
+Carbon Emacs, an OS X distro of GNU Emacs 22.1.50
+XEmacs 21.4 (patch 19) "Constant Variable" [Lucid] (i486-linux-gnu, Mule) of Fri Nov 3 2006 on penell
+XEmacs 21.4 (patch 20) "Double Solitaire" [Lucid] (i486-linux-gnu) of Fri Oct 19 2007 on penell
+XEmacs 21.4 (patch 20) "Double Solitaire" [Lucid] (i686-pc-cygwin, Mule) of Fri Dec 15 2006 on vzell-de
+XEmacs 21.4 (patch 20) \"Double Solitaire\" [Lucid] (i686-pc-cygwin, Mule) of Fri Dec 15 2006 on vzell-d
+XEmacs 21.4.20 (distributed with Cygwin)
+XEmacs 21.5 (beta28) "fuki" [Lucid] (i686-pc-linux, Mule) of Wed Jun 13 2007 on n2
+XEmacs Lucid 21.4 (patch 19) "Constant Variable" - on Windows, Similar on linux (not at machine)
+Emacs
+Emacs 21.4.1 emacs 21.?.? (at work, I'm not certain)
+GNU
+GNU 22.1.1
+GNU emacs
+GNU emacs 22.1.50.1 (snapshot)
+GNU emacs GNU Emacs 22.0.97.1 (i686-pc-linux-gnu, GTK+ Version 2.4.13)
+</pre>
+</p>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-14"><span class="target">Raw ages</span> </h3>
+
+
+<p>
+<pre>
+22 Sun, 11/25/07 6:38 PM
+22 Thu, 11/15/07 11:55 PM
+24 Fri, 11/16/07 4:15 AM
+25 Sun, 11/18/07 10:05 PM
+25 Sun, 11/25/07 12:04 PM
+
+26 Mon, 11/19/07 10:29 AM
+26 Sat, 11/24/07 4:38 AM
+26 Thu, 11/15/07 2:45 PM
+26 Thu, 11/15/07 7:22 PM
+27 Fri, 11/16/07 9:20 AM
+27 Wed, 11/28/07 3:20 AM
+28 Sun, 12/2/07 5:32 AM
+28 Thu, 11/15/07 10:06 PM
+28 Thu, 11/15/07 12:04 PM
+28 Thu, 11/15/07 12:17 PM
+29 Mon, 11/19/07 8:06 PM
+29 Thu, 11/15/07 11:27 AM
+30 Fri, 11/16/07 3:26 AM
+30 Thu, 11/15/07 10:07 PM
+30 Thu, 11/15/07 3:01 PM
+
+31 Fri, 11/16/07 2:30 AM
+31 Sun, 11/18/07 3:14 PM
+31 yrs. Fri, 11/23/07 7:04 PM
+32 Fri, 11/23/07 10:11 PM
+32 Thu, 11/15/07 12:02 PM
+33 Fri, 11/16/07 12:54 PM
+33 Sat, 11/17/07 4:41 AM
+33 Sat, 11/24/07 2:28 AM
+33 Thu, 11/15/07 11:23 AM
+33 Thu, 11/15/07 11:34 PM
+33 Thu, 11/15/07 12:27 PM
+33 Wed, 11/21/07 11:57 PM
+34 Fri, 11/16/07 1:24 AM
+34 Mon, 11/19/07 7:31 PM
+34 Thu, 11/22/07 6:59 AM
+35 Fri, 11/16/07 3:23 AM
+35 Fri, 11/16/07 7:53 AM
+35 Mon, 11/19/07 10:03 AM
+35 Sun, 12/9/07 2:40 AM
+35 Thu, 11/22/07 6:47 PM
+35 Tue, 11/27/07 11:04 AM
+
+36 Fri, 11/16/07 3:19 AM
+37 Fri, 11/16/07 12:11 PM
+37 Fri, 11/16/07 12:36 AM
+37 Fri, 11/23/07 1:13 AM
+37 Thu, 11/15/07 9:09 PM
+37 Thu, 11/22/07 3:39 AM
+37 Tue, 11/20/07 10:55 PM
+38 Sun, 12/23/07 1:43 AM
+39 Sun, 11/18/07 9:52 PM
+39 Thu, 11/15/07 4:53 PM
+40 Thu, 11/15/07 6:00 PM
+
+41 Fri, 11/16/07 7:36 AM
+41 Sat, 11/17/07 9:27 AM
+42 Fri, 11/23/07 7:58 AM
+42 Mon, 11/19/07 9:18 AM
+42 Sat, 11/17/07 2:31 AM
+42 Sat, 11/17/07 4:32 AM
+42 Thu, 11/15/07 11:45 PM
+42 Thu, 11/15/07 8:23 PM
+43 Mon, 12/10/07 12:58 AM
+45 Fri, 11/16/07 3:21 AM
+45 Fri, 11/16/07 4:40 AM
+45 Fri, 11/16/07 4:40 AM
+45 Sun, 11/18/07 7:39 PM
+
+46 Fri, 11/16/07 4:18 AM
+47 Thu, 11/15/07 8:42 PM
+49 Thu, 11/15/07 11:15 AM
+</pre>
+</p>
+<p>
+52 Mon, 11/19/07 12:40 AM
+54 Thu, 11/15/07 11:38 AM
+54 Thu, 11/15/07 12:27 PM
+</p>
+</div>
+</div>
+<div id="postamble"><p class="author"> Author: Charles Cave
+<a href="mailto:charles.cave@gmail.com">&lt;charles.cave@gmail.com&gt;</a>
+</p>
+<p class="date"> Date: 2008/01/27 22:26:27</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/tmp/todo.html b/ORGWEBPAGE/tmp/todo.html
new file mode 100644
index 0000000..a311c90
--- /dev/null
+++ b/ORGWEBPAGE/tmp/todo.html
@@ -0,0 +1,1209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>The Org-mode TODO list</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2007/12/20 07:18:18"/>
+<meta name="author" content="Carsten Dominik"/>
+<link rel=stylesheet href="freeshell2.css" type="text/css">
+</head><body>
+<h1 class="title">The Org-mode TODO list</h1>
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">1 Introduction</a>
+<ul>
+<li><a href="#sec-2">1.1 Nomenclature</a></li>
+</ul>
+</li>
+<li><a href="#sec-3">2 Tasks</a>
+<ul>
+<li><a href="#sec-4">2.1 Structure</a></li>
+<li><a href="#sec-5">2.2 Agenda issues</a></li>
+<li><a href="#sec-6">2.3 Links</a></li>
+<li><a href="#sec-7">2.4 Fast update for external editing</a></li>
+<li><a href="#sec-8">2.5 Tables</a></li>
+<li><a href="#sec-9">2.6 Properties and Column View</a></li>
+<li><a href="#sec-10">2.7 Compatibility issues</a></li>
+<li><a href="#sec-11">2.8 Exporting</a></li>
+<li><a href="#sec-12">2.9 Miscellaneous Stuff</a></li>
+</ul>
+</li>
+<li><a href="#sec-13">3 Archive</a>
+<ul>
+<li><a href="#sec-14">3.1 Archived Tasks</a></li>
+</ul>
+</li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-1">1 Introduction</h2>
+
+
+<p>
+This is a loose collection of ideas and TODO items for the future
+development of Org-mode. These ideas come from various sources,
+mostly from emacs-orgmode@gnu.org, from direct emails to me, or from
+my own day-dreaming. I don't always mention the source of an idea,
+out of laziness. However, when I implement a good idea, I try to
+mention the origin of this idea in the <i>Acknowledgments</i> section of
+the manual - let me know if I forgot to give <i>you</i> credit for
+something.
+</p>
+
+<div class="outline-3">
+<h3 id="sec-2">1.1 Nomenclature</h3>
+
+<p>On this page, I am using TODO keywords in the following way:
+</p><table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<col align="left"></col><col align="left"></col>
+<thead>
+<tr><th><b>Keyword</b></th><th>Intention</th></tr>
+</thead>
+<tbody>
+<tr><td><b>TODO</b></td><td>A development that is going to happen, once I have time or once I figure out how to do it.</td></tr>
+<tr><td><b>IDEA</b></td><td>A new idea, I have not yet decided what if anything I will do about it.</td></tr>
+<tr><td><b>WISH</b></td><td>A wish, probably voiced by someone on emacs-orgmode@gnu.org. This is less than a new idea, more a change in existing behavior.</td></tr>
+<tr><td><b>QUESTION</b></td><td>A question someone asked, that needs some thinking before it can be answered</td></tr>
+<tr><td><b>DECLINED</b></td><td>I have decided not to implement this feature, but I am keeping it in the list so that people can see it, complain, or still try to convince me.</td></tr>
+<tr><td><b>INCONSISTENCY</b></td><td>Some behavior in Org-mode that is not as clean and consistent as I would like it to be.</td></tr>
+<tr><td><b>BUG</b></td><td>This needs to be fixed, as soon as possible.</td></tr>
+<tr><td><b>DONE</b></td><td>Well, done is done.</td></tr>
+<tr><td><i>NEW</i></td><td>This is a tag, indicating recently added entries</td></tr>
+<tr><td></td><td>&lt;50&gt;</td></tr>
+</tbody>
+</table>
+
+
+
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-3">2 Tasks</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-4">2.1 Structure</h3>
+
+<ul>
+<li><span class="todo">TODO</span> Definition lists, like in Muse<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Get rid of all the \r instances, which were used only for XEmacs.<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">IDEA</span> Should we allow #+TODO as an alias for #+SEQ<sub>TODO</sub>?<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> proper visibility cycling for items<br/>
+Make them not hide the text after the final list item.
+This is not trivial, we cannot usenormal outline stuff,
+needs a separate implementaiton.
+</li>
+</ul>
+<ul>
+<li><span class="todo">IDEA</span> allow different colors for different TODO keywords/tags.<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Use an indirect buffer for org-goto.<br/>
+Is there a problem with the overriding map?
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">WISH</span> Inline TODO entries<br/>
+A way to put a TODO entry without starting a new section.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Speedbar support for agenda.<br/>
+
+</li>
+</ul>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-5">2.2 Agenda issues</h3>
+
+<ul>
+<li><span class="todo">QUESTION</span> COLUMN View<br/>
+is this safe, or could things be messed up with this?
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Make S-right and S-left change TODO keywords<br/>
+Right now they change the time stamps. This could be
+M-left/right, but this could also cause inconsistencies, because
+when on a time stamp, the same keys do exactly this.
+</li>
+</ul>
+<ul>
+<li><span class="todo">WISH</span> Make more modes changeable from the agenda<br/>
+These could be made available for toggling, just like
+follow-mode. Examples:
+<ul>
+<li>
+org-agenda-todo-list-sublevels
+</li>
+<li>
+org-tags-match-list-sublevels
+</li>
+<li>
+org-agenda-todo-ignore-scheduled
+</li>
+</ul></li>
+</ul>
+<ul>
+<li><span class="todo">IDEA</span> Sort TODO entries according to type?<br/>
+This would apply for the list collection, not in the day entries.
+However, I could also have a TODO keyword criterion that could be
+used in the day entries, as one of the minor criteria.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Allow separators in the Tag-sorted agenda view<br/>
+This feature is not going to come, because block agendas can
+achieve the same thing.
+
+
+</li>
+</ul>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-6">2.3 Links</h3>
+
+<ul>
+<li><span class="todo">WISH</span> When editing links, give access to stored links.<br/>
+Not sure why this is needed.
+Idea from William Henney.
+</li>
+</ul>
+<ul>
+<li><span class="todo">WISH</span> Variable of standard links for completion with C-c C-l<br/>
+Or something like that, to make standard links fast.
+</li>
+</ul>
+<ul>
+<li><span class="todo">WISH</span> Make brackets in links possible<br/>
+Would require a display property also for the label part of
+links.
+</li>
+</ul>
+<ul>
+<li><span class="todo">IDEA</span> Find all links to a specific file<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">IDEA</span> Make info HTML links work for links to Info files<br/>
+Info links of course only work inside Emacs. However, many info
+documents are on the web, so the HTML exporter could try to be
+smart and convert an Info link into the corresponding link on the
+web. For example, we could use the GNU software site then
+Name.HTML. Here is the link to be used:
+<a href="http://www.gnu.org/software/emacs/manual/html_node/">http://www.gnu.org/software/emacs/manual/html_node/</a> Another
+question is, is this URL going to be stable so that it makes sense
+to actually put this into org.el?
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">IDEA</span> Make news HTML links work, using Google.<br/>
+I can use Google groups with a message id to find a USENET message,
+even if the original link points to gnus.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Remove irretrievable links from <i>published</i> HTML output<br/>
+This is on David's table, and he will hopefully integrate a
+mechanism for this into org-publish.el. The discussion about this
+was started by <a href="http://thread.gmane.org/gmane.emacs.orgmode/281">Austin Frank</a>
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Agenda collections, based on #+COLLECTION lines.<br/>
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/139">Tim Callaghan</a> started the discussion on this one.
+Declined because this would depend on local variables and the
+agenda commands are global. Also, this can actually be done by
+specifying the file list in a custom agenda command.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Make CamelCase words link to corresponding org-mode files.<br/>
+Files in the same directory. Or some other way to easy do that.
+Would be useful for publishing projects. This would be an
+incompatible change, but I don't think anyone is using CamelCase
+anyway?
+This is marked declined, because link abbreviations now provide an
+easy way to make links to other files.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Document the character protection in links<br/>
+I don't think this is really covered anywhere.
+Maybe we also should protect characters in the visible part, to
+make sure thing will never be on two lines&hellip;?
+</li>
+</ul>
+<ul>
+<li><span class="todo">WISH</span> Radio targets across files<br/>
+I guess each org file could write a .orgtargets.filename file, if
+it has any radio targets.
+
+
+</li>
+</ul>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-7">2.4 <span class="todo">DECLINED</span> Fast update for external editing</h3>
+
+<p>Could I use a dynamic block for this?
+</p>
+
+</div>
+
+<div class="outline-3">
+<h3 id="sec-8">2.5 Tables</h3>
+
+<ul>
+<li><span class="todo">WISH</span> Row formulas<br/>
+@4=&hellip;..
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Write a tutorial<br/>
+Demonstrate running averages.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">WISH</span> Make a variable that current line should be recomputed always<br/>
+in each table, skipping headers of course.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Allow a table to locally change the unit system<br/>
+This is for using constants.el.
+Well, it is now possible to do this for the file, is this enough???
+</li>
+</ul>
+<ul>
+<li><span class="todo">QUESTION</span> Does inserting hlines change references correctly?<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">WISH</span> Interactive way to get a converted table?<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">BUG</span> When computing in a narrowed column, this may go wrong.<br/>
+Computing changes fields and does not yet see correctly if the column
+width has changed, in the case of a narrowed column.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Alternative for the implementation of orgtbl-minor-mode:<br/>
+I could use post-command-hook to set the variable orgtbl-mode.
+I will not do this now and only consider it if problems show up.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Table info lines are not necessarily comments in orgtbl-mode<br/>
+Should I generalize this? No, because the table itself will not be
+in the correct syntax for whatever mode.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> S-cursor motion to select part of a table, with proper highlighting.<br/>
+Similar to CUA
+
+
+</li>
+</ul>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-9">2.6 Properties and Column View</h3>
+
+<ul>
+<li><span class="todo">TODO</span> Mouse support for selecting values<br/>
+This could/should be part of org-mouse.el.
+<ul>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> tags
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> todo
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> priority
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> allowed values
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> deadline
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> scheduled.
+</li>
+</ul></li>
+</ul>
+<ul>
+<li><span class="todo">BUG</span> We have no clear view on what to do with properties upon export.<br/>
+
+
+</li>
+</ul>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-10">2.7 Compatibility issues</h3>
+
+<ul>
+<li>Emacs 21 compatibility<br/>
+This is being phased out. Almost everything works under Emacs 21,
+but in the future I will make little effort to support it.
+<ul>
+<li><span class="todo">DECLINED</span> Column view does not yet work for Emacs 21s.<br/>
+Declined, because I don't know how to do this. Too many
+problems.
+</li>
+</ul>
+</li>
+</ul>
+<ul>
+<li>XEmacs compatibility<br/>
+<ul>
+<li><span class="todo">QUESTION</span> Is there an issue with the coding system of HTML exported files?<br/>
+In the code I used to have a comment saying that
+<pre>
+ (and (fboundp 'coding-system-get)
+ (boundp 'buffer-file-coding-system)
+ buffer-file-coding-system))
+</pre>
+always returns nil, implicating that setting the coding system for
+the export buffer would not work correctly. however, I have never
+followed up on this and never had a bug report - so I am wondering
+if there is an issue at all.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Column view does not yet work for XEmacs.<br/>
+Declined, because I don't know how to do this. Too many
+problems.
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Rewrite the `format' function<br/>
+To make narrowing work under XEmacs, I would need to write a
+version of <i>format</i> that does transport text properties, or I
+would have to rework narrowing entirely. Unlikely that this will
+happen, mainly because it is working in Emacs and so does not
+bother me personally so much. Anyway, I don't know if people are
+actually using narrowing very much at all.
+
+
+</li>
+</ul>
+</li>
+</ul>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-11">2.8 Exporting</h3>
+
+<ul>
+<li><span class="todo">IDEA</span> Convert links to footnotes for ASCII export.<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Store LaTeX code as HTML comments<br/>
+Declined because I don't really see the need for this.
+</li>
+</ul>
+<ul>
+<li><span class="todo">IDEA</span> Microformats<br/>
+Nic Ferrier has been pushing this agenda for a long time, for
+example with <a href="http://thread.gmane.org/gmane.emacs.orgmode/140/">this email</a>. I am not deep enough into the semantic
+web that I could do this myself. Maybe we can do this by
+modifying the html exporter step-by-step?
+</li>
+</ul>
+<ul>
+<li><span class="todo">INCONSISTENCY</span> Find a better place for formatting checkboxes<br/>
+Right now this is being done as part of `org-html-expand', which
+does not seem logically correct.
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Can I make the exporter more efficient?<br/>
+The line-by-line processing may not be the fastest way to do
+this. It certainly uses more resources. Right now the exporters
+do work though, so it is unlikely that I am going to change this.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> CSV import/export of tables?<br/>
+I remember this coming up several times, for example in emails
+from <a href="http://thread.gmane.org/gmane.emacs.orgmode/156">Niels Giesen</a> and <a href="http://thread.gmane.org/gmane.emacs.orgmode/139">Tim Callaghan</a>. Org-mode does have
+Tab-separated export of tables, so right now I don't really see
+the benefit of adding CSV export. Are there applications that do
+not understand tab-separated files, but do understand
+comma-separated ones?
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> In HTML export, make links from the time stamps<br/>
+Time stamps have their own class now which allows to highlight
+them etc. But I was wondering if something more useful could be
+done with them, like a link to some kind of calendar&hellip;
+
+
+
+</li>
+</ul>
+</div>
+
+<div class="outline-3">
+<h3 id="sec-12">2.9 Miscellaneous Stuff</h3>
+
+<ul>
+<li><span class="todo">TODO</span> reinstating a repeated item: keyword for logging.<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">BUG</span> Comments cannot be filled<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">IDEA</span> New uses for C-c C-c<br/>
+<ul>
+<li>
+Compute time interval on time range
+</li>
+<li>
+Update CLOCK interval
+</li>
+</ul></li>
+</ul>
+<ul>
+<li><span class="todo">QUESTION</span> Fix more beginning-of-line commands<br/>
+Org-mode re-binds C-a to make this command go to the beginning of
+a visible line. There are other keys which might invoke C-a.
+Should these keys be changed as well? one could use
+`substitute-key-definition' on the global map to find them all.
+</li>
+</ul>
+<ul>
+<li><span class="todo">QUESTION</span> Inlining of images in Org-mode files<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Fixup outline-magic.el, so that it can be used.<br/>
+</li>
+</ul>
+<ul>
+<li><span class="todo">TODO</span> Use the new argument of bibtex-url<br/>
+Roland Winkler was kind enough to implement a new argument to the
+`bibtex-url' command that allows me to retrieve the corresponding
+URL, whether it is taken from a URL field or constructed in some
+clever way. Currently I am not using this, because too many
+people use an old Emacs version which does not have this.
+however, eventually I will implement this.
+</li>
+</ul>
+<ul>
+<li><span class="todo">WISH</span> Get people to write articles about how to do GTD with Org-mode.<br/>
+There is now one by Charles Cave, read it <a href="http://members.optusnet.com.au/~charles57/GTD/orgmode.html">here</a>
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">IDEA</span> Tree statistics<br/>
+A key that can be applied to a tree, showing statistics:
+<ul>
+<li>
+how many headlines
+</li>
+<li>
+how many TODO
+</li>
+<li>
+how many DONE
+</li>
+<li>
+Checkboxes
+</li>
+<li>
+etc&hellip;.
+
+</li>
+</ul></li>
+</ul>
+<ul>
+<li><span class="todo">QUESTION</span> Do we need a 43 folders implementation?<br/>
+That could easily be done in an org-mode file. But then, maybe
+this should really be a paper thing.
+
+</li>
+</ul>
+<ul>
+<li>Priorities<br/>
+Here is some information about priorities, which is not yet
+documented.
+<ul>
+<li> Priorities<br/>
+<pre> TODO entries: 1 or 1,2,...
+ DEADLINE is 10-ddays, i.e. it is 10 on the due day
+ i.e. it goes above top todo stuff 7 days
+ before due
+ SCHEDULED is 5-ddays, i.e. it is 5 on the due date
+ i.e. it goes above top todo on the due day
+ TIMESTAMP is 0 i.e. always at bottom
+ but as a deadline it is 100
+ but if scheduled it is 99
+ TIMERANGE is 0 i.e. always at bottom
+ DIARY is 0 i.e. always at bottom
+
+ Priority * 1000
+
+</pre>
+</li>
+</ul>
+</li>
+</ul>
+<ul>
+<li><span class="todo">INCONSISTENCY</span>: items don't grow/shrink due to promotion.<br/>
+In plain lists, multiple demote/promote commands executed directly
+after each other don't change the scope of the command - the
+initially selected text continues to be selected. This is
+inconsistent with the behavior of outline sections, were the subtree
+for promotion/demotion is newly defined after each command. Which
+convention is better? Should this be consistent between trees and
+plain lists?
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">INCONSISTENCY</span>: M-TAB does not work on plain lists. Why???<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">QUESTION</span> grep on directory does not yet work.<br/>
+I am actually not sure, I might have addressed this already, but
+my memory is failing me. Needs some checking.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> HAVE a TIME 3:55 line collecting CLOCK results<br/>
+The CLOCK lines could be there in addition, or could even be
+removed, so that only one line is kept.
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Think about Piotr's idea of treating TODO like a TAG.<br/>
+The answer is probably NO because the simple part of TODO must
+still be there and I like the keyword at the beginning of the line,
+just like a checkbox. Of course you can make a TODO tag yourself
+at any time.
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Inlining of external files<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Should TAB on TODO keyword rotate its state?<br/>
+Problem: If the keyword disappears, it will suddenly start to fold&hellip;.
+So my feeling right now is that the answer should be NO.
+
+<p>
+No, because S-left/right does this already pretty well
+</p>
+</li>
+</ul>
+<ul>
+<li><span class="todo">DECLINED</span> Create a DONE counter in the mode line<br/>
+That counter shows what faction of entries has been marked DONE. I
+am not yet sure how useful such a thing would be, because of the
+huge number of entries that can be in a file, and the different
+weight of such entries.
+Declined because we do now have counters for checkboxes, and the
+feeling is that this is not so useful for TODOs.
+
+
+</li>
+</ul>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-13">3 Archive</h2>
+
+
+<div class="outline-3">
+<h3 id="sec-14">3.1 Archived Tasks</h3>
+
+
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:15</span>) Commands to move through an item list<br/>
+next item, previous item. What should happen at the boundaries of
+the current list?
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) Force relative links, would this be useful?<br/>
+
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) Fix empty search string.<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) STARTUP options for logging<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) Make a variable for Pete, to have SCHEDULED at point<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) Fix ASCII export of narrowed columns<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) org-file-apps should allow regular expressions<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) fix problem with w32- versus mswindows-&hellip;.<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Document that font-lock-mode is needed<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Add keyboard access and menu commands for org-project.el<br/>
+C-c C-x C-p or something like that.
+In the menu, it goes under export, or even its own group.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Document those new keys in orgcard.tex<br/>
+C-c C-x C-p or something like that.
+In the menu, it goes under export, or even its own group.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Remove SCHEDULED keyword when marking it done.<br/>
+in particular when adding a CLOSED timestamp.
+Only problem is that when unclosing it, it should be scheduled
+again
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Don't show tasks already scheduled for the future, only stuff which<br/>
+is not yet scheduled.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Put title and tags in separate classes<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Option to leave out TAGS from export<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Option to leave out Timestamps from export<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Checkable items like Frank Ruell's proposal<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Classify Keywords and time stamps<br/>
+&lt;span class="keyword"&gt;SCHEDULED: &lt;/span&gt;&lt;span
+class="timestamp"&gt;timestamp goes here&lt;/span&gt;&lt;br&gt;
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Change default for include-all-todo to nil<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Specify TAGS in a special line instead of collecting them dynamically<br/>
+The could help to avoid typos and could be faster for very large files.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Some much faster interface for setting tags.<br/>
+Basically, use single keys to add/remove tags from the list. Also
+for this the idea to define tags in a special line would be good,
+in order to have a way to define the shortcuts.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Remove date stamps from headline if they are not needed.<br/>
+Bug report from Scott.
+
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) : Maybe s-up/down should change priorities only in headlines<br/>
+Right now this works wherever the cursor is. If this is changed,
+should S-up or S-down do something else?
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:21</span>) Need a command to remove tabulators from a line.<br/>
+Use this in ASCII export, to make sure we get the indentation
+right.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:24</span>) Improve tab in org-cycle:<br/>
+<ul>
+<li>
+there is a bug when the setting is 'white: It requires a
+non-empty white line!
+</li>
+<li>
+There should be another setting to have tab be the tabulator in
+the white space at the beginning of the line.
+</li>
+<li>
+Finally, when TAB closes an entry, maybe it should go beck to the
+beginning of the entry??? On the other hand, it is good to be
+able to go back to the old place with just another tab.
+
+</li>
+</ul></li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 11:48</span>) Include TAGS into sorting.<br/>
+But what strategy should be used when there are several tags?
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:15</span>) Archiving an entry in current buffer goes to end of file<br/>
+Should go to end of subtree.
+This is done now, and I also control the amount of empty lines
+created by the archiving process in general.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:16</span>) Narrowing agenda to current files does not work as advertized.<br/>
+C-c a 1 t should make the TODO list for the current file, but does
+not.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:17</span>) Radio TAGS for the fast tag interface.<br/>
+Make lists of tags that are mutually exclusive. So when I turn on
+@HOME, @WORK would be turned off automagically. A good syntax for
+defining these groups in the #+TAGS line would be:
+<pre>
+ #+TAGS: [@WORK(w) @HOME(h) @CLUB(c)] Laptop(l) PC(p) Car(r)
+</pre>
+This could indicate that @WORK, @HOME, @CLUB are mutually exclusive.
+
+<p>
+If I do this, I will also need a syntax for the global alist to
+indicate the same thing.
+</p>
+<p>
+It seems to me that with such grouping of tags, sorting would be
+useful as it would improve the overview over the current tags. I
+might even be able to support mutually exclusive tags with
+fontification in the interface. Or arrange things such that the
+mutually exclusive ones are all in the same row or column, to
+optimize the visual feedback.
+</p>
+<p>
+For the internal format, I think best would be something like
+</p>
+<p>
+<pre>
+ '( (:startgroup) ("@work") ("@home") ("@club") (:endgroup)
+ ("Laptop") ("PC") ("Car"))
+</pre>
+This setup makes sure that assoc and rassoc still do work as
+expected.
+</p>
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:17</span>) Should tags be sorted in a certain way?<br/>
+Right now, you can either set the tag sequence yourself through
+the completion interface. If you use the fast tag selection
+interface, the tag sequence depends on the order in which tags are
+selected and deselected. maybe a specific roder would be useful
+for example the same order as the one given in the configuration?
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:17</span>) Remove narrowing cookies for export<br/>
+Exported tables should not show narrowing cookies. In fact, if a
+table line does contain nothing but narrowing cookies, the entire
+line should be removed.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-11 Sun 07:32</span>) Track working times similar to time-clock.el<br/>
+This was proposed by David O'Toole in an
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/387">email to emacs-orgmode@gnu.org</a>. He wants to be able to know the
+times when he worked at a particular project. Some reporting
+possibility would be needed to make this useful. Maybe sparse
+trees with broken-down working times?
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-15 Thu 13:35</span>) Make org-store-link do better in image-mode buffers<br/>
+Just link to the file.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-15 Thu 13:35</span>) Use a ported version of noutline.el<br/>
+Programming the old outline-mode is really a nightmare - the new
+outline mode that uses invisibility properties instead of
+selective display works really much much better. There is now
+an <a href="http://thread.gmane.org/gmane.emacs.orgmode/214/focus=218">experimental port</a> by Greg Chernov, so when I find time I will
+try if this works well. If yes, this port should become part of
+XEmacs. Once that happens, I could remove a large amount of
+ballast from org.el
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-15 Thu 13:35</span>) Verify links during export<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:11</span>) Allow counting checkboxes<br/>
+Then some statistics should be displayed. One idea is for
+checkboxes, to use a special box [%] which will be updated with
+percent of done. I could have an alternative [/] that will be
+updated with something like [19/25] to show progress, and when the
+two numbers are equal, I could highlight then in DONE face, just
+like [100%]. All smaller numbers could be highlighted even in
+TODO face if I wanted. Hmmm, I am beginning to like this.
+
+<p>
+Then: how to update this? Each time a checkbox is added or
+toggled, go up and update all the counts, right up to something
+which is not an item, or up to the previous header line.
+</p>
+<p>
+Maybe I should also make an option for turning this on, to avoid
+slowdown. I guess for long lists this could be slow.
+</p>
+<p>
+Also would need a command for global update.
+</p>
+<p>
+An maybe plain list and checkboxes should get their own chapter?
+In Structure they seem to be a bit hidden&hellip;..
+</p>
+<p>
+Also a menu sublist&hellip;
+</p>
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:11</span>) Allow stacking calls to org-occur<br/>
+This was a proposal from Piotr. It is now possible, the second
+and subsequent calls to org-occur need a prefix argument to keep
+the previous highlights.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Create a hook to be run after an agenda buffer has been finalized.<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Include TAGS into sorting.<br/>
+But what strategy should be used when there are several tags?
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Fixup tag display in agenda buffer.<br/>
+The tabs mess up everything. Either remove the tabs, or realign
+the tags to some useful column.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Blocks in agenda:<br/>
+Make a single agenda buffer that contains several sets of items,
+like the TODO list, a tags list, and a day view. Not a bad idea.
+This was <a href="http://thread.gmane.org/gmane.emacs.orgmode/167/focus=168">Piotr's idea</a>.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Make org-store-link do the right thing in dired-mode<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-11-02 Thu 10:24</span>) Control over windows being used for agenda and related buffers &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span><br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-01-24 Wed 12:59</span>) Extend access to table fields<br/>
+Find a general way to get any rectangular region into a calc
+vector
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-01-24 Wed 12:59</span>) Allow links to remote images to be inlined.<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-01-24 Wed 12:59</span>) M-TAB on an already complete tag should add the ":"<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-01-24 Wed 13:07</span>) Need a command to do show hierarchy after isearch.<br/>
+Maybe automatically, using isearch-mode-end-hook. But this does
+not seem to work, because to is called before the overlays are
+re-installed. I can create a new hook, isearch-exit-hook, run in
+`isearch-exit'.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-18 Sun 07:16</span>) hook for users to do their own agenda lists<br/>
+New function dumping headline into the agenda buffer, based on regexp
+and callback, to allow general stuff. For the special tags, we can
+search for one and check for the others using the callback.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-18 Sun 07:37</span>) Make C-c C-l also work on a plain link, converting it into bracket.<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-18 Sun 07:37</span>) GNUS <i>&lt;gnus:mail.general#123&gt;</i> stuff should be "Email from:&hellip;"<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-18 Sun 07:38</span>) Email/message context: What format?<br/>
+I can think of two good formats for this:
+<pre>
+ Email from John Smith (if I an the receiver)
+ Email to John Smith (if I am the author)
+</pre>
+or
+<pre>
+ John Smith on: Some subject (this is the current Org-mode default.)
+</pre>
+The first format requires better parsing of the messages (to get
+both author and receiver names), and also
+some way to detect if I am the author of this email or not.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-21 Wed 12:04</span>) Allow internal links to match inside <b>other</b> link<br/>
+Only the link itself that actually triggered the search.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-21 Wed 12:07</span>) Allow fully protected HTML code that will be exported as is<br/>
+Currently, <&hellip;> works only for simple tags, and I think we
+should have something better. Idea: Text between &lt;protecthtml&gt;
+and &lt;/protecthtml&gt;, mark it with a text property and then exclude
+each match in the run preparing the export.
+I guess I could require these at the beginning of the line, like
+
+
+
+<p>
+or something like that&hellip;&hellip;.
+</p>
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-03-13 Tue 05:19</span>) Make it possible to set TOC levels independently of headline levels<br/>
+The easiest way to do this would obviously be to allow a number
+setting for the tco switch, not only a simple t/nil switch. This
+can be nice for webpages: One could have only top-level or level
+1 and 2 in the toc at the beginning of the page, and then still a
+more complex structure below.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-03-13 Tue 05:20</span>) Filling is not done in a compatible way.<br/>
+The current setup used the Emacs variables and machine to get the
+filling of plain lists and everything lese right. XEmacs uses the
+filladapt package, which has different ways to do the same
+things. org.el should be smart about this and setup filling under
+XEmacs correctly.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-06-06 Wed 17:44</span>) Repeating Schedules?<br/>
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/149">Dieter Grollman</a> requested this feature, but for now I have decided
+not to do anything about it. I don't see a good way to implement
+this, and I believe that cyclic diary entries are good enough for
+such tasks.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-06-14 Thu 13:16</span>) improve item indentation when promoting and demoting<br/>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-06-14 Thu 13:17</span>) The TODO buffer lists possible TODO keywords<br/>
+These are taken from the current buffer, so when multiple buffers
+are involved, this list may not be correct&hellip;..
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-06-14 Thu 13:20</span>) Conflict between bold emphasis and headlines<br/>
+At the beginning of a line, Org-mode does not know if <b>bold</b> is a
+headline or an emphasis. This will not be easy to fix. The way
+to do ii is to require a space after the star in headlines. This
+requires to change outline-regexp, outline-level, the many many
+times when outline regexp is used in the program, and also the
+countless times when I am simply matching th stars directly.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span> C-c - for cycling bullet types.<br/>
+ARCHIVED: <span class="timestamp">2007-07-02 Mon</span>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span> improve what TAB does with new item<br/>
+ARCHIVED: <span class="timestamp">2007-07-02 Mon</span>
+same or additional indentation????
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span> Make it easier to do monthly agendas, and agendas for ranges<br/>
+ARCHIVED: <span class="timestamp">2007-07-02 Mon</span>
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span> Introduce a LOCATION keyword<br/>
+ARCHIVED: <span class="timestamp">2007-07-02 Mon</span>
+similar to DEADLINE and SCHEDULED
+Idea from Bastien
+This could be done now using properties, I don't think we need a
+special thing for this anymore.
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span> Times/date not always removed in agenda lines<br/>
+ARCHIVED: <span class="timestamp">2007-07-02 Mon</span>
+Even when org-agenda-remove-times-when-in-prefix is set, there
+seem to be cases where this does not work. I forgot what the
+example was - does anyone remember?
+
+</li>
+</ul>
+<ul>
+<li><span class="done">DONE</span> Links are still highlighted in fixed-width environments.<br/>
+ARCHIVED: <span class="timestamp">2007-07-02 Mon</span>
+This ties in with the problem that there is no way to have
+protected HTML code in the file.
+
+
+</li>
+</ul>
+</div>
+</div>
+<div id="postamble"><p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten.dominik@gmail.com">&lt;carsten.dominik@gmail.com&gt;</a>
+</p>
+<p class="date"> Date: 2007/12/20 07:18:18</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/tmp/tutorials.html b/ORGWEBPAGE/tmp/tutorials.html
new file mode 100644
index 0000000..171647c
--- /dev/null
+++ b/ORGWEBPAGE/tmp/tutorials.html
@@ -0,0 +1,317 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-Mode Tutorials, Blogposts, and Screenscasts</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2008/01/20 09:24:39"/>
+<meta name="author" content="Carsten Dominik"/>
+<link rel=stylesheet href="freeshell2.css" type="text/css">
+</head><body>
+<h1 class="title">Org-Mode Tutorials, Blogposts, and Screenscasts</h1>
+
+<p>
+This page lists tutorials, screencasts, and extensive blog posts about
+<a href="http://orgmode.org">Org-mode</a>
+</p>
+
+
+<BASE href="http://orgmode.org/tutorials.html">
+
+
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">General Introductions to Org-mode</a></li>
+<li><a href="#sec-2">Special features</a>
+<ul>
+<li><a href="#sec-3">Sparse Trees</a></li>
+<li><a href="#sec-4">Tables</a></li>
+<li><a href="#sec-5">The Spreadsheet: Org-mode and Calc</a></li>
+<li><a href="#sec-6">Hyperlinks</a></li>
+<li><a href="#sec-7">Using TODO states</a></li>
+<li><a href="#sec-8">Using TAGS&nbsp;&nbsp;&nbsp;<span class="tag"> NEW</span></a></li>
+<li><a href="#sec-9">Complex searches for Tags, TODO keywords and Properties</a></li>
+<li><a href="#sec-10">Timestamps, Appointments etc</a></li>
+<li><a href="#sec-11">The Clock Table&nbsp;&nbsp;&nbsp;<span class="tag"> NEW</span></a></li>
+<li><a href="#sec-12">Using Remember Templates&nbsp;&nbsp;&nbsp;<span class="tag"> NEW</span></a></li>
+<li><a href="#sec-13">Properties and Column View</a></li>
+<li><a href="#sec-14">Custom Agenda Commands</a></li>
+<li><a href="#sec-15">Embedded LaTeX</a></li>
+<li><a href="#sec-16">HTML export</a></li>
+<li><a href="#sec-17">LaTeX export</a></li>
+<li><a href="#sec-18">Publishing</a></li>
+<li><a href="#sec-19">Using orgtbl-mode in LaTeX</a></li>
+</ul>
+</li>
+<li><a href="#sec-20">Special tasks</a>
+<ul>
+<li><a href="#sec-21">Natural Project Planning&nbsp;&nbsp;&nbsp;<span class="tag"> NEW</span></a></li>
+</ul>
+</li>
+<li><a href="#sec-22">Personal Setup</a>
+<ul>
+<li><a href="#sec-23">Extensive documents</a></li>
+<li><a href="#sec-24">Short descriptions</a></li>
+</ul>
+</li>
+<li><a href="#sec-25">Org-related pages by Tutorial authors</a></li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-1">General Introductions to Org-mode</h2>
+
+
+<ul>
+<li>
+<a href="http://dto.freeshell.org/notebook/OrgTutorial.html">The OrgMode tutorial</a> by <a href="http://dto.freeshell.org/notebook/">David O'Toole</a>, covering the basics of TODO
+lists and the agenda. It has been translated into <a href="http://www.cognition.ens.fr/~guerry/orgtutorialfr.html">French</a>,
+<a href="http://hpcgi1.nifty.com/spen/index.cgi?OrgMode%2fOrgTutorial">Japanese</a>, <a href="http://hokmen.chan.googlepages.com/OrgTutorial.en-cn.html">Chinese</a>, and <a href="http://jmjeong.com/index.php?display=Emacs/OrgMode">Korean</a>.
+
+</li>
+<li>
+<a href="http://jaderholm.com/screencasts.html">A 25 minute screencast</a> by <a href="http://jaderholm.com">Scott Jaderholm</a>, demonstrating the basic
+features of Org-mode.
+
+</li>
+<li>
+<a href="http://sachachua.com/wp/2008/01/18/outlining-your-notes-with-org/">Outlining Your Notes with Org</a> by <a href="http://sachachua.com/wp/">Sacha Chua</a> covers outlining,
+searching and internal links.
+</li>
+<li>
+<a href="http://www.linuxjournal.com/article/9116">Getting Organized with Emacs Org-mode</a> by <a href="http://www.geocities.com/abhijeet_chawan/">Abhijeet Chavan</a>, and
+article originally published in the <a href="http://www.linuxjournal.com/">Linux Journal</a>.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-2">Special features</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-3">Sparse Trees</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-4">Tables</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-5">The Spreadsheet: Org-mode and Calc</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-6">Hyperlinks</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-7">Using TODO states</h3>
+
+<p><i>Your chance for everlasting fame on the Org-mode homepage</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-8">Using TAGS &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span></h3>
+
+<ul>
+<li>
+<a href="http://sachachua.com/wp/2008/01/04/tagging-in-org-plus-bonus-code-for-timeclocks-and-tags/">Tagging in Org</a> by <a href="http://sachachua.com/wp/">Sacha Chua</a>.
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-9">Complex searches for Tags, TODO keywords and Properties</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-10">Timestamps, Appointments etc</h3>
+
+<ul>
+<li>
+<a href="http://members.optusnet.com.au/~charles57/GTD/org_dates/">Using Dates and Times in Emacs Org-mode</a> by <a href="http://members.optusnet.com.au/charles57/Creative/">Charles Cave</a>.
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-11">The Clock Table &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span></h3>
+
+<ul>
+<li>
+<a href="http://sachachua.com/wp/2007/12/30/clocking-time-with-emacs-org/">Clocking time with Emacs Org</a> by <a href="http://sachachua.com/wp/">Sacha Chua</a> .
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-12">Using Remember Templates &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span></h3>
+
+<ul>
+<li>
+<a href="http://sachachua.com/wp/2007/10/05/remembering-to-org-and-planner/">Remembering to Org and Planner</a> by <a href="http://sachachua.com/wp/">Sacha Chua</a>.
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-13">Properties and Column View</h3>
+
+<ul>
+<li>
+<a href="http://www.cognition.ens.fr/~guerry/org-column-view-tutorial.html">Emacs Org's Column View</a> by <a href="http://www.cognition.ens.fr/~guerry/">Bastien Guerry</a>, with an accompanying
+<a href="http://www.cognition.ens.fr/~guerry/org-column-screencast.html">screencast</a>.
+</li>
+<li>
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/5107/focus%3D5134">What's the use of Column View?</a> by Christian Egli is ashort
+tutorial about Column View that was sent to <a href="http://news.gmane.org/gmane.emacs.orgmode">emacs-orgmode@gnu.org</a>.
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-14">Custom Agenda Commands</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-15">Embedded LaTeX</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-16">HTML export</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-17">LaTeX export</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-18">Publishing</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-19">Using orgtbl-mode in LaTeX</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-20">Special tasks</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-21">Natural Project Planning &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span></h3>
+
+<ul>
+<li>
+<a href="http://members.optusnet.com.au/charles57/Creative/">Charles Cave</a> about using Org-mode to implement <a href="http://members.optusnet.com.au/~charles57/GTD/Natural_Project_Planning.html">Natural Project Planning</a> according to David Allen.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-22">Personal Setup</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-23">Extensive documents</h3>
+
+
+<ul>
+<li>
+<a href="http://johnwiegley.com/org.mode.day.planner.html">Using Org-mode as a day planner</a> by <a href="http://johnwiegley.com">John Wiegley</a>.
+
+</li>
+<li>
+<a href="http://members.optusnet.com.au/~charles57/GTD/orgmode.html">Using Emacs org-mode for GTD</a> by <a href="http://members.optusnet.com.au/charles57/Creative/">Charles Cave</a>.
+
+</li>
+<li>
+<a href="http://sachachua.com/wp/">Sacha Chua</a> about <a href="http://sachachua.com/wp/2007/12/22/a-day-in-a-life-with-org/">A day in a life with Org</a> and about the basics of
+<a href="http://sachachua.com/wp/2007/12/28/emacs-getting-things-done-with-org-basic/">Getting Things Done with Org</a>
+
+</li>
+<li>
+<i>Your chance for everlasting fame</i>
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-24">Short descriptions</h3>
+
+
+<ul>
+<li>
+David O'Toole explains his setup in <a href="http://thread.gmane.org/gmane.emacs.orgmode/4832">this post</a>.
+
+</li>
+<li>
+This <a href="http://www.brool.com/?p=82">blog post</a> shows a very simple and clear GTD setup.
+
+</li>
+<li>
+<i>Your chance for everlasting fame</i>
+
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-25">Org-related pages by Tutorial authors</h2>
+
+
+<p>
+Here are the pages of a number of people that write for or about
+Org-mode
+</p>
+<ul>
+<li>
+<a href="http://johnwiegley.com">John Wiegley</a>
+
+</li>
+<li>
+<a href="http://members.optusnet.com.au/charles57/Creative/">Charles Cave</a>
+
+</li>
+<li>
+<a href="http://sachachua.com/wp/">Sacha Chua</a>
+
+</li>
+<li>
+<a href="http://www.cognition.ens.fr/~guerry/">Bastien Guerry</a>
+</li>
+</ul>
+</div>
+<div id="postamble"><p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten at orgmode dot org">&lt;carsten at orgmode dot org&gt;</a>
+</p>
+<p class="date"> Date: 2008/01/20 09:24:39</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/todo.html b/ORGWEBPAGE/todo.html
new file mode 100644
index 0000000..a939785
--- /dev/null
+++ b/ORGWEBPAGE/todo.html
@@ -0,0 +1,920 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>The Org-mode TODO list</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2007/07/10 10:35:08"/>
+<meta name="author" content="Carsten Dominik"/>
+<link rel=stylesheet href="freeshell2.css" type="text/css"> <style type="text/css"> .tag { color: red; font-weight:bold}</style>
+</head><body>
+<h1 class="title">The Org-mode TODO list</h1>
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">1 Introduction</a>
+<ul>
+<li><a href="#sec-2">1.1 Nomenclature</a></li>
+</ul>
+</li>
+<li><a href="#sec-3">2 Tasks</a>
+<ul>
+<li><a href="#sec-4">2.1 Structure</a></li>
+<li><a href="#sec-5">2.2 Agenda issues</a></li>
+<li><a href="#sec-6">2.3 Links</a></li>
+<li><a href="#sec-7">2.4 Fast update for external editing</a></li>
+<li><a href="#sec-8">2.5 Tables</a></li>
+<li><a href="#sec-9">2.6 Properties and Column View</a></li>
+<li><a href="#sec-10">2.7 Compatibility issues</a></li>
+<li><a href="#sec-11">2.8 Exporting</a></li>
+<li><a href="#sec-12">2.9 Miscellaneous Stuff</a></li>
+</ul>
+</li>
+<li><a href="#sec-13">3 Archive</a>
+<ul>
+<li><a href="#sec-14">3.1 Archived Tasks</a></li>
+</ul>
+</li>
+</ul>
+
+<h2 id="sec-1">1 Introduction</h2>
+
+
+<p>
+This is a loose collection of ideas and TODO items for the future
+development of Org-mode. These ideas come from various sources,
+mostly from emacs-orgmode@gnu.org, from direct emails to me, or from
+my own day-dreaming. I don't always mention the source of an idea,
+out of laziness. However, when I implement a good idea, I try to
+mention the origin of this idea in the <i>Acknowledgments</i> section of
+the manual - let me know if I forgot to give <i>you</i> credit for
+something.
+</p>
+
+<h3 id="sec-2">1.1 Nomenclature</h3>
+
+<p>On this page, I am using TODO keywords in the following way:
+</p><table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<COL align="left"></COL><COL align="left"></COL>
+<thead>
+<tr><th><b>Keyword</b></th><th>Intention</th></tr>
+</thead>
+<tbody>
+<tr><td><b>TODO</b></td><td>A development that is going to happen, once I have time or once I figure out how to do it.</td></tr>
+<tr><td><b>IDEA</b></td><td>A new idea, I have not yet decided what if anything I will do about it.</td></tr>
+<tr><td><b>WISH</b></td><td>A wish, probably voiced by someone on emacs-orgmode@gnu.org. This is less than a new idea, more a change in existing behavior.</td></tr>
+<tr><td><b>QUESTION</b></td><td>A question someone asked, that needs some thinking before it can be answered</td></tr>
+<tr><td><b>DECLINED</b></td><td>I have decided not to implement this feature, but I am keeping it in the list so that people can see it, complain, or still try to convince me.</td></tr>
+<tr><td><b>INCONSISTENCY</b></td><td>Some behavior in Org-mode that is not as clean and consistent as I would like it to be.</td></tr>
+<tr><td><b>BUG</b></td><td>This needs to be fixed, as soon as possible.</td></tr>
+<tr><td><b>DONE</b></td><td>Well, done is done.</td></tr>
+<tr><td><i>NEW</i></td><td>This is a tag, indicating recently added entries</td></tr>
+</tbody>
+</table>
+
+
+
+
+<h2 id="sec-3">2 Tasks</h2>
+
+
+<h3 id="sec-4">2.1 Structure</h3>
+
+<ul>
+<li><span class="todo">TODO</span> Definition lists, like in Muse<br/>
+</li>
+<li><span class="todo">TODO</span> Get rid of all the \r instances, which were used only for XEmacs.<br/>
+</li>
+<li><span class="todo">IDEA</span> Should we allow #+TODO as an alias for #+SEQ<sub>TODO</sub>?<br/>
+</li>
+<li><span class="todo">TODO</span> proper visibility cycling for items<br/>
+Make them not hide the text after the final list item.
+This is not trivial, we cannot usenormal outline stuff,
+needs a separate implementaiton.
+</li>
+<li><span class="todo">IDEA</span> allow different colors for different TODO keywords/tags.<br/>
+</li>
+<li><span class="todo">TODO</span> Use an indirect buffer for org-goto.<br/>
+Is there a problem with the overriding map?
+
+</li>
+<li><span class="todo">WISH</span> Inline TODO entries<br/>
+A way to put a TODO entry without starting a new section.
+</li>
+</ul>
+
+<h3 id="sec-5">2.2 Agenda issues</h3>
+
+<ul>
+<li><span class="todo">QUESTION</span> COLUMN View<br/>
+is this safe, or could things be messed up with this?
+</li>
+<li><span class="todo">TODO</span> Make S-right and S-left change TODO keywords<br/>
+Right now they change the time stamps. This could be
+M-left/right, but this could also cause inconsistencies, because
+when on a time stamp, the same keys do exactly this.
+</li>
+<li><span class="todo">WISH</span> Make more modes changeable from the agenda<br/>
+These could be made available for toggling, just like
+follow-mode. Examples:
+<ul>
+<li>
+org-agenda-todo-list-sublevels
+</li>
+<li>
+org-tags-match-list-sublevels
+</li>
+<li>
+org-agenda-todo-ignore-scheduled
+</li>
+</ul></li>
+<li><span class="todo">IDEA</span> Sort TODO entries according to type?<br/>
+This would apply for the list collection, not in the day entries.
+However, I could also have a TODO keyword criterion that could be
+used in the day entries, as one of the minor criteria.
+
+</li>
+<li><span class="todo">DECLINED</span> Allow separators in the Tag-sorted agenda view<br/>
+This feature is not going to come, because block agendas can
+achieve the same thing.
+</li>
+</ul>
+
+<h3 id="sec-6">2.3 Links</h3>
+
+<ul>
+<li><span class="todo">WISH</span> When editing links, give access to stored links.<br/>
+Not sure why this is needed.
+Idea from William Henney.
+</li>
+<li><span class="todo">WISH</span> Variable of standard links for completion with C-c C-l<br/>
+Or something like that, to make standard links fast.
+</li>
+<li><span class="todo">WISH</span> Make brackets in links possible<br/>
+Would require a display property also for the label part of
+links.
+</li>
+<li><span class="todo">IDEA</span> Find all links to a specific file<br/>
+</li>
+<li><span class="todo">IDEA</span> Make info HTML links work for links to Info files<br/>
+Info links of course only work inside Emacs. However, many info
+documents are on the web, so the HTML exporter could try to be
+smart and convert an Info link into the corresponding link on the
+web. For example, we could use the GNU software site then
+Name.HTML. Here is the link to be used:
+<a href="http://www.gnu.org/software/emacs/manual/html_node/">http://www.gnu.org/software/emacs/manual/html_node/</a> Another
+question is, is this URL going to be stable so that it makes sense
+to actually put this into org.el?
+
+</li>
+<li><span class="todo">IDEA</span> Make news HTML links work, using Google.<br/>
+I can use Google groups with a message id to find a USENET message,
+even if the original link points to gnus.
+
+</li>
+<li><span class="todo">TODO</span> Remove irretrievable links from <i>published</i> HTML output<br/>
+This is on David's table, and he will hopefully integrate a
+mechanism for this into org-publish.el. The discussion about this
+was started by <a href="http://thread.gmane.org/gmane.emacs.orgmode/281">Austin Frank</a>
+
+</li>
+<li><span class="todo">DECLINED</span> Agenda collections, based on #+COLLECTION lines.<br/>
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/139">Tim Callaghan</a> started the discussion on this one.
+Declined because this would depend on local variables and the
+agenda commands are global. Also, this can actually be done by
+specifying the file list in a custom agenda command.
+
+</li>
+<li><span class="todo">DECLINED</span> Make CamelCase words link to corresponding org-mode files.<br/>
+Files in the same directory. Or some other way to easy do that.
+Would be useful for publishing projects. This would be an
+incompatible change, but I don't think anyone is using CamelCase
+anyway?
+This is marked declined, because link abbreviations now provide an
+easy way to make links to other files.
+
+</li>
+<li><span class="todo">TODO</span> Document the character protection in links<br/>
+I don't think this is really covered anywhere.
+Maybe we also should protect characters in the visible part, to
+make sure thing will never be on two lines...?
+</li>
+<li><span class="todo">WISH</span> Radio targets across files<br/>
+I guess each org file could write a .orgtargets.filename file, if
+it has any radio targets.
+</li>
+</ul>
+
+<h3 id="sec-7">2.4 <span class="todo">DECLINED</span> Fast update for external editing</h3>
+
+<p>Could I use a dynamic block for this?
+</p>
+
+<h3 id="sec-8">2.5 Tables</h3>
+
+<ul>
+<li><span class="todo">WISH</span> Row formulas<br/>
+@4=.....
+</li>
+<li><span class="todo">TODO</span> Write a tutorial<br/>
+Demonstrate running averages.
+
+</li>
+<li><span class="todo">WISH</span> Make a variable that current line should be recomputed always<br/>
+in each table, skipping headers of course.
+
+</li>
+<li><span class="todo">TODO</span> Allow a table to locally change the unit system<br/>
+This is for using constants.el.
+Well, it is now possible to do this for the file, is this enough???
+</li>
+<li><span class="todo">QUESTION</span> Does inserting hlines change references correctly?<br/>
+</li>
+<li><span class="todo">WISH</span> Interactive way to get a converted table?<br/>
+</li>
+<li><span class="todo">BUG</span> When computing in a narrowed column, this may go wrong.<br/>
+Computing changes fields and does not yet see correctly if the column
+width has changed, in the case of a narrowed column.
+
+</li>
+<li><span class="todo">DECLINED</span> Alternative for the implementation of orgtbl-minor-mode:<br/>
+I could use post-command-hook to set the variable orgtbl-mode.
+I will not do this now and only consider it if problems show up.
+
+</li>
+<li><span class="todo">DECLINED</span> Table info lines are not necessarily comments in orgtbl-mode<br/>
+Should I generalize this? No, because the table itself will not be
+in the correct syntax for whatever mode.
+
+</li>
+<li><span class="todo">DECLINED</span> S-cursor motion to select part of a table, with proper highlighting.<br/>
+Similar to CUA
+
+</li>
+</ul>
+
+<h3 id="sec-9">2.6 Properties and Column View</h3>
+
+<ul>
+<li><span class="todo">TODO</span> Mouse support for selecting values<br/>
+This could/should be part of org-mouse.el.
+<ul>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> tags
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> todo
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> priority
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> allowed values
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> deadline
+</li>
+<li>
+<b>[<span style="visibility:hidden;">X</span>]</b> scheduled.
+</li>
+</ul></li>
+<li><span class="todo">BUG</span> We have no clear view on what to do with properties upon export.<br/>
+
+</li>
+</ul>
+
+<h3 id="sec-10">2.7 Compatibility issues</h3>
+
+<ul>
+<li>Emacs 21 compatibility<br/>
+This is being phased out. Almost everything works under Emacs 21,
+but in the future I wwill make little effort to support it.
+<ul>
+<li><span class="todo">DECLINED</span> Column view does not yet work for Emacs 21s.<br/>
+Declined, because I don't know how to do this. Too many
+problems.
+</li>
+</ul>
+</li>
+<li>XEmacs compatibility<br/>
+<ul>
+<li><span class="todo">QUESTION</span> Is there an issue with the coding system of HTML exported files?<br/>
+In the code I used to have a comment saying that
+<pre>
+ (and (fboundp 'coding-system-get)
+ (boundp 'buffer-file-coding-system)
+ buffer-file-coding-system))
+</pre>
+always returns nil, implicating that setting the coding system for
+the export buffer would not work correctly. however, I have never
+followed up on this and never had a bug report - so I am wondering
+if there is an issue at all.
+
+</li>
+<li><span class="todo">DECLINED</span> Column view does not yet work for XEmacs.<br/>
+Declined, because I don't know how to do this. Too many
+problems.
+</li>
+<li><span class="todo">DECLINED</span> Rewrite the `format' function<br/>
+To make narrowing work under XEmacs, I would need to write a
+version of <i>format</i> that does transport text properties, or I
+would have to rework narrowing entirely. Unlikely that this will
+happen, mainly because it is working in Emacs and so does not
+bother me personally so much. Anyway, I don't know if people are
+actually using narrowing very much at all.
+
+
+</li>
+</ul>
+</li>
+</ul>
+
+<h3 id="sec-11">2.8 Exporting</h3>
+
+<ul>
+<li><span class="todo">IDEA</span> Convert links to footnotes for ASCII export.<br/>
+</li>
+<li><span class="todo">DECLINED</span> Store LaTeX code as HTML comments<br/>
+Declined because I don't really see the need for this.
+</li>
+<li><span class="todo">IDEA</span> Microformats<br/>
+Nic Ferrier has been pushing this agenda for a long time, for
+example with <a href="http://thread.gmane.org/gmane.emacs.orgmode/140/">this email</a>. I am not deep enough into the semantic
+web that I could do this myself. Maybe we can do this by
+modifying the html exporter step-by-step?
+</li>
+<li><span class="todo">INCONSISTENCY</span> Find a better place for formatting checkboxes<br/>
+Right now this is being done as part of `org-html-expand', which
+does not seem logically correct.
+</li>
+<li><span class="todo">DECLINED</span> Can I make the exporter more efficient?<br/>
+The line-by-line processing may not be the fastest way to do
+this. It certainly uses more resources. Right now the exporters
+do work though, so it is unlikely that I am going to change this.
+
+</li>
+<li><span class="todo">DECLINED</span> CSV import/export of tables?<br/>
+I remember this coming up several times, for example in emails
+from <a href="http://thread.gmane.org/gmane.emacs.orgmode/156">Niels Giesen</a> and <a href="http://thread.gmane.org/gmane.emacs.orgmode/139">Tim Callaghan</a>. Org-mode does have
+Tab-separated export of tables, so right now I don't really see
+the benefit of adding CSV export. Are there applications that do
+not understand tab-separated files, but do understand
+comma-separated ones?
+
+</li>
+<li><span class="todo">DECLINED</span> In HTML export, make links from the time stamps<br/>
+Time stamps have their own class now which allows to highlight
+them etc. But I was wondering if something more useful could be
+done with them, like a link to some kind of calendar...
+
+
+
+</li>
+</ul>
+
+<h3 id="sec-12">2.9 Miscellaneous Stuff</h3>
+
+<ul>
+<li><span class="todo">TODO</span> reinstating a repeated item: keyword for logging.<br/>
+</li>
+<li><span class="todo">BUG</span> Comments cannot be filled<br/>
+</li>
+<li><span class="todo">DECLINED</span> HAVE a TIME 3:55 line collecting CLOCK results<br/>
+The CLOCK lines could be there in addition, or could even be
+removed, so that only one line is kept.
+</li>
+<li><span class="todo">IDEA</span> New uses for C-c C-c<br/>
+<ul>
+<li>
+Compute time interval on time range
+</li>
+<li>
+Update CLOCK interval
+</li>
+</ul></li>
+<li><span class="todo">QUESTION</span> Fix more beginning-of-line commands<br/>
+Org-mode re-binds C-a to make this command go to the beginning of
+a visible line. There are other keys which might invoke C-a.
+Should these keys be changed as well? one could use
+`substitute-key-definition' on the global map to find them all.
+</li>
+<li><span class="todo">QUESTION</span> Inlining of images in Org-mode files<br/>
+</li>
+<li><span class="todo">TODO</span> Fixup outline-magic.el, so that it can be used.<br/>
+</li>
+<li><span class="todo">TODO</span> Use the new argument of bibtex-url<br/>
+Roland Winkler was kind enough to implement a new argument to the
+`bibtex-url' command that allows me to retrieve the corresponding
+URL, whether it is taken from a URL field or constructed in some
+clever way. Currently I am not using this, because too many
+people use an old Emacs version which does not have this.
+however, eventually I will implement this.
+</li>
+<li><span class="todo">WISH</span> Get people to write articles about how to do GTD with Org-mode.<br/>
+There is now one by Charles Cave, read it <a href="http://members.optusnet.com.au/~charles57/GTD/orgmode.html">here</a>
+
+</li>
+<li><span class="todo">IDEA</span> Tree statistics<br/>
+A key that can be applied to a tree, showing statistics:
+<ul>
+<li>
+how many headlines
+</li>
+<li>
+how many TODO
+</li>
+<li>
+how many DONE
+</li>
+<li>
+Checkboxes
+</li>
+<li>
+etc....
+
+</li>
+</ul></li>
+<li><span class="todo">QUESTION</span> Do we need a 43 folders implementation?<br/>
+That could easily be done in an org-mode file. But then, maybe
+this should really be a paper thing.
+
+</li>
+<li>Priorities<br/>
+Here is some information about priorities, which is not yet
+documented.
+<ul>
+<li> Priorities<br/>
+<pre> TODO entries: 1 or 1,2,...
+ DEADLINE is 10-ddays, i.e. it is 10 on the due day
+ i.e. it goes above top todo stuff 7 days
+ before due
+ SCHEDULED is 5-ddays, i.e. it is 5 on the due date
+ i.e. it goes above top todo on the due day
+ TIMESTAMP is 0 i.e. always at bottom
+ but as a deadline it is 100
+ but if scheduled it is 99
+ TIMERANGE is 0 i.e. always at bottom
+ DIARY is 0 i.e. always at bottom
+
+ Priority * 1000
+
+</pre>
+</li>
+</ul>
+</li>
+<li><span class="todo">INCONSISTENCY</span>: items don't grow/shrink due to promotion.<br/>
+In plain lists, multiple demote/promote commands executed directly
+after each other don't change the scope of the command - the
+initially selected text continues to be selected. This is
+inconsistent with the behavior of outline sections, were the subtree
+for promotion/demotion is newly defined after each command. Which
+convention is better? Should this be consistent between trees and
+plain lists?
+
+</li>
+<li><span class="todo">INCONSISTENCY</span>: M-TAB does not work on plain lists. Why???<br/>
+
+</li>
+<li><span class="todo">QUESTION</span> grep on directory does not yet work.<br/>
+I am actually not sure, I might have addressed this already, but
+my memory is failing me. Needs some checking.
+
+</li>
+<li><span class="todo">DECLINED</span> Think about Piotr's idea of treating TODO like a TAG.<br/>
+The answer is probably NO because the simple part of TODO must
+still be there and I like the keyword at the beginning of the line,
+just like a checkbox. Of course you can make a TODO tag yourself
+at any time.
+
+</li>
+<li><span class="todo">DECLINED</span> Inlining of external files<br/>
+
+</li>
+<li><span class="todo">DECLINED</span> Should TAB on TODO keyword rotate its state?<br/>
+Problem: If the keyword disappears, it will suddenly start to fold....
+So my feeling right now is that the answer should be NO.
+
+<p>
+No, because S-left/right does this already pretty well
+</p>
+</li>
+<li><span class="todo">DECLINED</span> Create a DONE counter in the mode line<br/>
+That counter shows what faction of entries has been marked DONE. I
+am not yet sure how useful such a thing would be, because of the
+huge number of entries that can be in a file, and the different
+weight of such entries.
+Declined because we do now have counters for checkboxes, and the
+feeling is that this is not so useful for TODOs.
+
+</li>
+</ul>
+
+<h2 id="sec-13">3 Archive</h2>
+
+
+<h3 id="sec-14">3.1 Archived Tasks</h3>
+
+
+<ul>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:15</span>) Commands to move through an item list<br/>
+next item, previous item. What should happen at the boundaries of
+the current list?
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) Force relative links, would this be useful?<br/>
+
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) Fix empty search string.<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) STARTUP options for logging<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) Make a variable for Pete, to have SCHEDULED at point<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) Fix ASCII export of narrowed columns<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) org-file-apps should allow regular expressions<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:16</span>) fix problem with w32- versus mswindows-....<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Document that font-lock-mode is needed<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Add keyboard access and menu commands for org-project.el<br/>
+C-c C-x C-p or something like that.
+In the menu, it goes under export, or even its own group.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Document those new keys in orgcard.tex<br/>
+C-c C-x C-p or something like that.
+In the menu, it goes under export, or even its own group.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Remove SCHEDULED keyword when marking it done.<br/>
+in particular when adding a CLOSED timestamp.
+Only problem is that when unclosing it, it should be scheduled
+again
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Don't show tasks already scheduled for the future, only stuff which<br/>
+is not yet scheduled.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Put title and tags in separate classes<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Option to leave out TAGS from export<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Option to leave out Timestamps from export<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Checkable items like Frank Ruell's proposal<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Classify Keywords and time stamps<br/>
+&lt;span class="keyword"&gt;SCHEDULED: &lt;/span&gt;&lt;span
+class="timestamp"&gt;timestamp goes here&lt;/span&gt;&lt;br&gt;
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Change default for include-all-todo to nil<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Specify TAGS in a special line instead of collecting them dynamically<br/>
+The could help to avoid typos and could be faster for very large files.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Some much faster interface for setting tags.<br/>
+Basically, use single keys to add/remove tags from the list. Also
+for this the idea to define tags in a special line would be good,
+in order to have a way to define the shortcuts.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) Remove date stamps from headline if they are not needed.<br/>
+Bug report from Scott.
+
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:17</span>) : Maybe s-up/down should change priorities only in headlines<br/>
+Right now this works wherever the cursor is. If this is changed,
+should S-up or S-down do something else?
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:21</span>) Need a command to remove tabulators from a line.<br/>
+Use this in ASCII export, to make sure we get the indentation
+right.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 09:24</span>) Improve tab in org-cycle:<br/>
+<ul>
+<li>
+there is a bug when the setting is 'white: It requires a
+non-empty white line!
+</li>
+<li>
+There should be another setting to have tab be the tabulator in
+the white space at the beginning of the line.
+</li>
+<li>
+Finally, when TAB closes an entry, maybe it should go beck to the
+beginning of the entry??? On the other hand, it is good to be
+able to go back to the old place with just another tab.
+
+</li>
+</ul></li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-01 Thu 11:48</span>) Include TAGS into sorting.<br/>
+But what strategy should be used when there are several tags?
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:15</span>) Archiving an entry in current buffer goes to end of file<br/>
+Should go to end of subtree.
+This is done now, and I also control the amount of empty lines
+created by the archiving process in general.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:16</span>) Narrowing agenda to current files does not work as advertized.<br/>
+C-c a 1 t should make the TODO list for the current file, but does
+not.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:17</span>) Radio TAGS for the fast tag interface.<br/>
+Make lists of tags that are mutually exclusive. So when I turn on
+@HOME, @WORK would be turned off automagically. A good syntax for
+defining these groups in the #+TAGS line would be:
+<pre>
+ #+TAGS: [@WORK(w) @HOME(h) @CLUB(c)] Laptop(l) PC(p) Car(r)
+</pre>
+This could indicate that @WORK, @HOME, @CLUB are mutually exclusive.
+
+<p>
+If I do this, I will also need a syntax for the global alist to
+indicate the same thing.
+</p>
+<p>
+It seems to me that with such grouping of tags, sorting would be
+useful as it would improve the overview over the current tags. I
+might even be able to support mutually exclusive tags with
+fontification in the interface. Or arrange things such that the
+mutually exclusive ones are all in the same row or column, to
+optimize the visual feedback.
+</p>
+<p>
+For the internal format, I think best would be something like
+</p>
+<p>
+<pre>
+ '( (:startgroup) ("@work") ("@home") ("@club") (:endgroup)
+ ("Laptop") ("PC") ("Car"))
+</pre>
+This setup makes sure that assoc and rassoc still do work as
+expected.
+</p>
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:17</span>) Should tags be sorted in a certain way?<br/>
+Right now, you can either set the tag sequence yourself through
+the completion interface. If you use the fast tag selection
+interface, the tag sequence depends on the order in which tags are
+selected and deselected. maybe a specific roder would be useful
+for example the same order as the one given in the configuration?
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-06 Tue 10:17</span>) Remove narrowing cookies for export<br/>
+Exported tables should not show narrowing cookies. In fact, if a
+table line does contain nothing but narrowing cookies, the entire
+line should be removed.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-11 Sun 07:32</span>) Track working times similar to time-clock.el<br/>
+This was proposed by David O'Toole in an
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/387">email to emacs-orgmode@gnu.org</a>. He wants to be able to know the
+times when he worked at a particular project. Some reporting
+possibility would be needed to make this useful. Maybe sparse
+trees with broken-down working times?
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-15 Thu 13:35</span>) Make org-store-link do better in image-mode buffers<br/>
+Just link to the file.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-15 Thu 13:35</span>) Use a ported version of noutline.el<br/>
+Programming the old outline-mode is really a nightmare - the new
+outline mode that uses invisibility properties instead of
+selective display works really much much better. There is now
+an <a href="http://thread.gmane.org/gmane.emacs.orgmode/214/focus=218">experimental port</a> by Greg Chernov, so when I find time I will
+try if this works well. If yes, this port should become part of
+XEmacs. Once that happens, I could remove a large amount of
+ballast from org.el
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-06-15 Thu 13:35</span>) Verify links during export<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:11</span>) Allow counting checkboxes<br/>
+Then some statistics should be displayed. One idea is for
+checkboxes, to use a special box [%] which will be updated with
+percent of done. I could have an alternative [/] that will be
+updated with something like [19/25] to show progress, and when the
+two numbers are equal, I could highlight then in DONE face, just
+like [100%]. All smaller numbers could be highlighted even in
+TODO face if I wanted. Hmmm, I am beginning to like this.
+
+<p>
+Then: how to update this? Each time a checkbox is added or
+toggled, go up and update all the counts, right up to something
+which is not an item, or up to the previous header line.
+</p>
+<p>
+Maybe I should also make an option for turning this on, to avoid
+slowdown. I guess for long lists this could be slow.
+</p>
+<p>
+Also would need a command for global update.
+</p>
+<p>
+An maybe plain list and checkboxes should get their own chapter?
+In Structure they seem to be a bit hidden.....
+</p>
+<p>
+Also a menu sublist...
+</p>
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:11</span>) Allow stacking calls to org-occur<br/>
+This was a proposal from Piotr. It is now possible, the second
+and subsequent calls to org-occur need a prefix argument to keep
+the previous highlights.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Create a hook to be run after an agenda buffer has been finalized.<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Include TAGS into sorting.<br/>
+But what strategy should be used when there are several tags?
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Fixup tag display in agenda buffer.<br/>
+The tabs mess up everything. Either remove the tabs, or realign
+the tags to some useful column.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Blocks in agenda:<br/>
+Make a single agenda buffer that contains several sets of items,
+like the TODO list, a tags list, and a day view. Not a bad idea.
+This was <a href="http://thread.gmane.org/gmane.emacs.orgmode/167/focus=168">Piotr's idea</a>.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-09-25 Mon 16:12</span>) Make org-store-link do the right thing in dired-mode<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2006-11-02 Thu 10:24</span>) Control over windows being used for agenda and related buffers &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span><br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-01-24 Wed 12:59</span>) Extend access to table fields<br/>
+Find a general way to get any rectangular region into a calc
+vector
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-01-24 Wed 12:59</span>) Allow links to remote images to be inlined.<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-01-24 Wed 12:59</span>) M-TAB on an already complete tag should add the ":"<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-01-24 Wed 13:07</span>) Need a command to do show hierarchy after isearch.<br/>
+Maybe automatically, using isearch-mode-end-hook. But this does
+not seem to work, because to is called before the overlays are
+re-installed. I can create a new hook, isearch-exit-hook, run in
+`isearch-exit'.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-18 Sun 07:16</span>) hook for users to do their own agenda lists<br/>
+New function dumping headline into the agenda buffer, based on regexp
+and callback, to allow general stuff. For the special tags, we can
+search for one and check for the others using the callback.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-18 Sun 07:37</span>) Make C-c C-l also work on a plain link, converting it into bracket.<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-18 Sun 07:37</span>) GNUS <i>&lt;gnus:mail.general#123&gt;</i> stuff should be "Email from:..."<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-18 Sun 07:38</span>) Email/message context: What format?<br/>
+I can think of two good formats for this:
+<pre>
+ Email from John Smith (if I an the receiver)
+ Email to John Smith (if I am the author)
+</pre>
+or
+<pre>
+ John Smith on: Some subject (this is the current Org-mode default.)
+</pre>
+The first format requires better parsing of the messages (to get
+both author and receiver names), and also
+some way to detect if I am the author of this email or not.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-21 Wed 12:04</span>) Allow internal links to match inside <b>other</b> link<br/>
+Only the link itself that actually triggered the search.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-02-21 Wed 12:07</span>) Allow fully protected HTML code that will be exported as is<br/>
+Currently, <...> works only for simple tags, and I think we
+should have something better. Idea: Text between &lt;protecthtml&gt;
+and &lt;/protecthtml&gt;, mark it with a text property and then exclude
+each match in the run preparing the export.
+I guess I could require these at the beginning of the line, like
+
+
+
+<p>
+or something like that.......
+</p>
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-03-13 Tue 05:19</span>) Make it possible to set TOC levels independently of headline levels<br/>
+The easiest way to do this would obviously be to allow a number
+setting for the tco switch, not only a simple t/nil switch. This
+can be nice for webpages: One could have only top-level or level
+1 and 2 in the toc at the beginning of the page, and then still a
+more complex structure below.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-03-13 Tue 05:20</span>) Filling is not done in a compatible way.<br/>
+The current setup used the Emacs variables and machine to get the
+filling of plain lists and everything lese right. XEmacs uses the
+filladapt package, which has different ways to do the same
+things. org.el should be smart about this and setup filling under
+XEmacs correctly.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-06-06 Wed 17:44</span>) Repeating Schedules?<br/>
+<a href="http://thread.gmane.org/gmane.emacs.orgmode/149">Dieter Grollman</a> requested this feature, but for now I have decided
+not to do anything about it. I don't see a good way to implement
+this, and I believe that cyclic diary entries are good enough for
+such tasks.
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-06-14 Thu 13:16</span>) improve item indentation when promoting and demoting<br/>
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-06-14 Thu 13:17</span>) The TODO buffer lists possible TODO keywords<br/>
+These are taken from the current buffer, so when multiple buffers
+are involved, this list may not be correct.....
+
+</li>
+<li><span class="done">DONE</span>( <span class="timestamp">2007-06-14 Thu 13:20</span>) Conflict between bold emphasis and headlines<br/>
+At the beginning of a line, Org-mode does not know if <b>bold</b> is a
+headline or an emphasis. This will not be easy to fix. The way
+to do ii is to require a space after the star in headlines. This
+requires to change outline-regexp, outline-level, the many many
+times when outline regexp is used in the program, and also the
+countless times when I am simply matching th stars directly.
+
+</li>
+<li><span class="done">DONE</span> C-c - for cycling bullet types.<br/>
+<span class="timestamp-kwd">ARCHIVED: </span> <span class="timestamp">2007-07-02 Mon</span><br/>
+
+</li>
+<li><span class="done">DONE</span> improve what TAB does with new item<br/>
+<span class="timestamp-kwd">ARCHIVED: </span> <span class="timestamp">2007-07-02 Mon</span><br/>
+same or additional indentation????
+
+</li>
+<li><span class="done">DONE</span> Make it easier to do monthly agendas, and agendas for ranges<br/>
+<span class="timestamp-kwd">ARCHIVED: </span> <span class="timestamp">2007-07-02 Mon</span><br/>
+
+</li>
+<li><span class="done">DONE</span> Introduce a LOCATION keyword<br/>
+<span class="timestamp-kwd">ARCHIVED: </span> <span class="timestamp">2007-07-02 Mon</span><br/>
+similar to DEADLINE and SCHEDULED
+Idea from Bastien
+This could be done now using properties, I don't think we need a
+special thing for this anymore.
+
+</li>
+<li><span class="done">DONE</span> Times/date not always removed in agenda lines<br/>
+<span class="timestamp-kwd">ARCHIVED: </span> <span class="timestamp">2007-07-02 Mon</span><br/>
+Even when org-agenda-remove-times-when-in-prefix is set, there
+seem to be cases where this does not work. I forgot what the
+example was - does anyone remember?
+
+</li>
+<li><span class="done">DONE</span> Links are still highlighted in fixed-width environments.<br/>
+<span class="timestamp-kwd">ARCHIVED: </span> <span class="timestamp">2007-07-02 Mon</span><br/>
+This ties in with the problem that there is no way to have
+protected HTML code in the file.
+
+</li>
+</ul>
+<p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten.dominik@gmail.com">&lt;carsten.dominik@gmail.com&gt;</a>
+</p>
+<p class="date"> Date: 2007/07/10 10:35:08</p>
+</body>
+</html>
diff --git a/ORGWEBPAGE/todo.org b/ORGWEBPAGE/todo.org
new file mode 100644
index 0000000..f2bee19
--- /dev/null
+++ b/ORGWEBPAGE/todo.org
@@ -0,0 +1,649 @@
+ -*- mode:org -*-
+
+#+STARTUP: align
+#+TYP_TODO: TODO IDEA WISH QUESTION DECLINED INCONSISTENCY BUG DONE
+#+TAGS: NEW(n)
+#+OPTIONS: H:2 num:t toc:t \n:nil @:t ::t |:t ^:t *:t TeX:t
+#+ARCHIVE: ::** Archived Tasks
+#+EMAIL: carsten.dominik@gmail.com
+#+TITLE: The Org-mode TODO list
+
+* Introduction
+
+This is a loose collection of ideas and TODO items for the future
+development of Org-mode. These ideas come from various sources,
+mostly from emacs-orgmode@gnu.org, from direct emails to me, or from
+my own day-dreaming. I don't always mention the source of an idea,
+out of laziness. However, when I implement a good idea, I try to
+mention the origin of this idea in the /Acknowledgments/ section of
+the manual - let me know if I forgot to give /you/ credit for
+something.
+
+** Nomenclature
+ On this page, I am using TODO keywords in the following way:
+ |-----------------+----------------------------------------------------|
+ | *Keyword* | Intention |
+ |-----------------+----------------------------------------------------|
+ | *TODO* | A development that is going to happen, once I have time or once I figure out how to do it. |
+ | *IDEA* | A new idea, I have not yet decided what if anything I will do about it. |
+ | *WISH* | A wish, probably voiced by someone on emacs-orgmode@gnu.org. This is less than a new idea, more a change in existing behavior. |
+ | *QUESTION* | A question someone asked, that needs some thinking before it can be answered |
+ | *DECLINED* | I have decided not to implement this feature, but I am keeping it in the list so that people can see it, complain, or still try to convince me. |
+ | *INCONSISTENCY* | Some behavior in Org-mode that is not as clean and consistent as I would like it to be. |
+ | *BUG* | This needs to be fixed, as soon as possible. |
+ | *DONE* | Well, done is done. |
+ | /NEW/ | This is a tag, indicating recently added entries |
+ | | <50> |
+ |-----------------+----------------------------------------------------|
+
+
+* Tasks
+
+** Structure
+*** TODO Definition lists, like in Muse
+*** TODO Get rid of all the \r instances, which were used only for XEmacs.
+*** IDEA Should we allow #+TODO as an alias for #+SEQ_TODO?
+*** TODO proper visibility cycling for items
+ Make them not hide the text after the final list item.
+ This is not trivial, we cannot usenormal outline stuff,
+ needs a separate implementaiton.
+*** IDEA allow different colors for different TODO keywords/tags.
+*** TODO Use an indirect buffer for org-goto.
+ Is there a problem with the overriding map?
+
+*** WISH Inline TODO entries
+ A way to put a TODO entry without starting a new section.
+
+*** TODO Speedbar support for agenda.
+
+** Agenda issues
+*** QUESTION COLUMN View
+ is this safe, or could things be messed up with this?
+*** TODO Make S-right and S-left change TODO keywords
+ Right now they change the time stamps. This could be
+ M-left/right, but this could also cause inconsistencies, because
+ when on a time stamp, the same keys do exactly this.
+*** WISH Make more modes changeable from the agenda
+ These could be made available for toggling, just like
+ follow-mode. Examples:
+ - org-agenda-todo-list-sublevels
+ - org-tags-match-list-sublevels
+ - org-agenda-todo-ignore-scheduled
+*** IDEA Sort TODO entries according to type?
+ This would apply for the list collection, not in the day entries.
+ However, I could also have a TODO keyword criterion that could be
+ used in the day entries, as one of the minor criteria.
+
+*** DECLINED Allow separators in the Tag-sorted agenda view
+ This feature is not going to come, because block agendas can
+ achieve the same thing.
+
+
+** Links
+*** WISH When editing links, give access to stored links.
+ Not sure why this is needed.
+ Idea from William Henney.
+*** WISH Variable of standard links for completion with C-c C-l
+ Or something like that, to make standard links fast.
+*** WISH Make brackets in links possible
+ Would require a display property also for the label part of
+ links.
+*** IDEA Find all links to a specific file
+*** IDEA Make info HTML links work for links to Info files
+ Info links of course only work inside Emacs. However, many info
+ documents are on the web, so the HTML exporter could try to be
+ smart and convert an Info link into the corresponding link on the
+ web. For example, we could use the GNU software site then
+ Name.HTML. Here is the link to be used:
+ http://www.gnu.org/software/emacs/manual/html_node/ Another
+ question is, is this URL going to be stable so that it makes sense
+ to actually put this into org.el?
+
+*** IDEA Make news HTML links work, using Google.
+ I can use Google groups with a message id to find a USENET message,
+ even if the original link points to gnus.
+
+*** TODO Remove irretrievable links from /published/ HTML output
+ This is on David's table, and he will hopefully integrate a
+ mechanism for this into org-publish.el. The discussion about this
+ was started by [[http://thread.gmane.org/gmane.emacs.orgmode/281][Austin Frank]]
+
+*** DECLINED Agenda collections, based on #+COLLECTION lines.
+ [[http://thread.gmane.org/gmane.emacs.orgmode/139][Tim Callaghan]] started the discussion on this one.
+ Declined because this would depend on local variables and the
+ agenda commands are global. Also, this can actually be done by
+ specifying the file list in a custom agenda command.
+
+*** DECLINED Make CamelCase words link to corresponding org-mode files.
+ Files in the same directory. Or some other way to easy do that.
+ Would be useful for publishing projects. This would be an
+ incompatible change, but I don't think anyone is using CamelCase
+ anyway?
+ This is marked declined, because link abbreviations now provide an
+ easy way to make links to other files.
+
+*** TODO Document the character protection in links
+ I don't think this is really covered anywhere.
+ Maybe we also should protect characters in the visible part, to
+ make sure thing will never be on two lines...?
+*** WISH Radio targets across files
+ I guess each org file could write a .orgtargets.filename file, if
+ it has any radio targets.
+
+
+** DECLINED Fast update for external editing
+ Could I use a dynamic block for this?
+
+
+** Tables
+*** WISH Row formulas
+ @4=.....
+*** TODO Write a tutorial
+ Demonstrate running averages.
+
+*** WISH Make a variable that current line should be recomputed always
+ in each table, skipping headers of course.
+
+*** TODO Allow a table to locally change the unit system
+ This is for using constants.el.
+ Well, it is now possible to do this for the file, is this enough???
+*** QUESTION Does inserting hlines change references correctly?
+*** WISH Interactive way to get a converted table?
+*** BUG When computing in a narrowed column, this may go wrong.
+ Computing changes fields and does not yet see correctly if the column
+ width has changed, in the case of a narrowed column.
+
+*** DECLINED Alternative for the implementation of orgtbl-minor-mode:
+ I could use post-command-hook to set the variable orgtbl-mode.
+ I will not do this now and only consider it if problems show up.
+
+*** DECLINED Table info lines are not necessarily comments in orgtbl-mode
+ Should I generalize this? No, because the table itself will not be
+ in the correct syntax for whatever mode.
+
+*** DECLINED S-cursor motion to select part of a table, with proper highlighting.
+ Similar to CUA
+
+
+** Properties and Column View
+*** TODO Mouse support for selecting values
+ This could/should be part of org-mouse.el.
+ - [ ] tags
+ - [ ] todo
+ - [ ] priority
+ - [ ] allowed values
+ - [ ] deadline
+ - [ ] scheduled.
+*** BUG We have no clear view on what to do with properties upon export.
+
+
+** Compatibility issues
+*** Emacs 21 compatibility
+ This is being phased out. Almost everything works under Emacs 21,
+ but in the future I will make little effort to support it.
+**** DECLINED Column view does not yet work for Emacs 21s.
+ Declined, because I don't know how to do this. Too many
+ problems.
+*** XEmacs compatibility
+**** QUESTION Is there an issue with the coding system of HTML exported files?
+ In the code I used to have a comment saying that
+ : (and (fboundp 'coding-system-get)
+ : (boundp 'buffer-file-coding-system)
+ : buffer-file-coding-system))
+ always returns nil, implicating that setting the coding system for
+ the export buffer would not work correctly. however, I have never
+ followed up on this and never had a bug report - so I am wondering
+ if there is an issue at all.
+
+**** DECLINED Column view does not yet work for XEmacs.
+ Declined, because I don't know how to do this. Too many
+ problems.
+**** DECLINED Rewrite the `format' function
+ To make narrowing work under XEmacs, I would need to write a
+ version of /format/ that does transport text properties, or I
+ would have to rework narrowing entirely. Unlikely that this will
+ happen, mainly because it is working in Emacs and so does not
+ bother me personally so much. Anyway, I don't know if people are
+ actually using narrowing very much at all.
+
+
+** Exporting
+*** IDEA Convert links to footnotes for ASCII export.
+*** DECLINED Store LaTeX code as HTML comments
+ Declined because I don't really see the need for this.
+*** IDEA Microformats
+ Nic Ferrier has been pushing this agenda for a long time, for
+ example with [[http://thread.gmane.org/gmane.emacs.orgmode/140/][this email]]. I am not deep enough into the semantic
+ web that I could do this myself. Maybe we can do this by
+ modifying the html exporter step-by-step?
+*** INCONSISTENCY Find a better place for formatting checkboxes
+ Right now this is being done as part of `org-html-expand', which
+ does not seem logically correct.
+*** DECLINED Can I make the exporter more efficient?
+ The line-by-line processing may not be the fastest way to do
+ this. It certainly uses more resources. Right now the exporters
+ do work though, so it is unlikely that I am going to change this.
+
+*** DECLINED CSV import/export of tables?
+ I remember this coming up several times, for example in emails
+ from [[http://thread.gmane.org/gmane.emacs.orgmode/156][Niels Giesen]] and [[http://thread.gmane.org/gmane.emacs.orgmode/139][Tim Callaghan]]. Org-mode does have
+ Tab-separated export of tables, so right now I don't really see
+ the benefit of adding CSV export. Are there applications that do
+ not understand tab-separated files, but do understand
+ comma-separated ones?
+
+*** DECLINED In HTML export, make links from the time stamps
+ Time stamps have their own class now which allows to highlight
+ them etc. But I was wondering if something more useful could be
+ done with them, like a link to some kind of calendar...
+
+
+
+** Miscellaneous Stuff
+*** TODO reinstating a repeated item: keyword for logging.
+*** BUG Comments cannot be filled
+*** IDEA New uses for C-c C-c
+ - Compute time interval on time range
+ - Update CLOCK interval
+*** QUESTION Fix more beginning-of-line commands
+ Org-mode re-binds C-a to make this command go to the beginning of
+ a visible line. There are other keys which might invoke C-a.
+ Should these keys be changed as well? one could use
+ `substitute-key-definition' on the global map to find them all.
+*** QUESTION Inlining of images in Org-mode files
+*** TODO Fixup outline-magic.el, so that it can be used.
+*** TODO Use the new argument of bibtex-url
+ Roland Winkler was kind enough to implement a new argument to the
+ `bibtex-url' command that allows me to retrieve the corresponding
+ URL, whether it is taken from a URL field or constructed in some
+ clever way. Currently I am not using this, because too many
+ people use an old Emacs version which does not have this.
+ however, eventually I will implement this.
+*** WISH Get people to write articles about how to do GTD with Org-mode.
+ There is now one by Charles Cave, read it [[http://members.optusnet.com.au/~charles57/GTD/orgmode.html][here]]
+
+*** IDEA Tree statistics
+ A key that can be applied to a tree, showing statistics:
+ - how many headlines
+ - how many TODO
+ - how many DONE
+ - Checkboxes
+ - etc....
+
+*** QUESTION Do we need a 43 folders implementation?
+ That could easily be done in an org-mode file. But then, maybe
+ this should really be a paper thing.
+
+*** Priorities
+ Here is some information about priorities, which is not yet
+ documented.
+**** QUOTE Priorities
+ TODO entries: 1 or 1,2,...
+ DEADLINE is 10-ddays, i.e. it is 10 on the due day
+ i.e. it goes above top todo stuff 7 days
+ before due
+ SCHEDULED is 5-ddays, i.e. it is 5 on the due date
+ i.e. it goes above top todo on the due day
+ TIMESTAMP is 0 i.e. always at bottom
+ but as a deadline it is 100
+ but if scheduled it is 99
+ TIMERANGE is 0 i.e. always at bottom
+ DIARY is 0 i.e. always at bottom
+
+ Priority * 1000
+
+*** INCONSISTENCY: items don't grow/shrink due to promotion.
+ In plain lists, multiple demote/promote commands executed directly
+ after each other don't change the scope of the command - the
+ initially selected text continues to be selected. This is
+ inconsistent with the behavior of outline sections, were the subtree
+ for promotion/demotion is newly defined after each command. Which
+ convention is better? Should this be consistent between trees and
+ plain lists?
+
+*** INCONSISTENCY: M-TAB does not work on plain lists. Why???
+
+*** QUESTION grep on directory does not yet work.
+ I am actually not sure, I might have addressed this already, but
+ my memory is failing me. Needs some checking.
+
+*** DECLINED HAVE a TIME 3:55 line collecting CLOCK results
+ The CLOCK lines could be there in addition, or could even be
+ removed, so that only one line is kept.
+*** DECLINED Think about Piotr's idea of treating TODO like a TAG.
+ The answer is probably NO because the simple part of TODO must
+ still be there and I like the keyword at the beginning of the line,
+ just like a checkbox. Of course you can make a TODO tag yourself
+ at any time.
+
+*** DECLINED Inlining of external files
+
+*** DECLINED Should TAB on TODO keyword rotate its state?
+ Problem: If the keyword disappears, it will suddenly start to fold....
+ So my feeling right now is that the answer should be NO.
+
+ No, because S-left/right does this already pretty well
+
+*** DECLINED Create a DONE counter in the mode line
+ That counter shows what faction of entries has been marked DONE. I
+ am not yet sure how useful such a thing would be, because of the
+ huge number of entries that can be in a file, and the different
+ weight of such entries.
+ Declined because we do now have counters for checkboxes, and the
+ feeling is that this is not so useful for TODOs.
+
+
+* Archive
+** Archived Tasks
+
+*** DONE(<2006-06-01 Thu 09:15>) Commands to move through an item list
+ next item, previous item. What should happen at the boundaries of
+ the current list?
+
+*** DONE(<2006-06-01 Thu 09:16>) Force relative links, would this be useful?
+
+
+*** DONE(<2006-06-01 Thu 09:16>) Fix empty search string.
+
+*** DONE(<2006-06-01 Thu 09:16>) STARTUP options for logging
+
+*** DONE(<2006-06-01 Thu 09:16>) Make a variable for Pete, to have SCHEDULED at point
+
+*** DONE(<2006-06-01 Thu 09:16>) Fix ASCII export of narrowed columns
+
+*** DONE(<2006-06-01 Thu 09:16>) org-file-apps should allow regular expressions
+
+*** DONE(<2006-06-01 Thu 09:16>) fix problem with w32- versus mswindows-....
+
+*** DONE(<2006-06-01 Thu 09:17>) Document that font-lock-mode is needed
+
+*** DONE(<2006-06-01 Thu 09:17>) Add keyboard access and menu commands for org-project.el
+ C-c C-x C-p or something like that.
+ In the menu, it goes under export, or even its own group.
+
+*** DONE(<2006-06-01 Thu 09:17>) Document those new keys in orgcard.tex
+ C-c C-x C-p or something like that.
+ In the menu, it goes under export, or even its own group.
+
+*** DONE(<2006-06-01 Thu 09:17>) Remove SCHEDULED keyword when marking it done.
+ in particular when adding a CLOSED timestamp.
+ Only problem is that when unclosing it, it should be scheduled
+ again
+
+*** DONE(<2006-06-01 Thu 09:17>) Don't show tasks already scheduled for the future, only stuff which
+ is not yet scheduled.
+
+*** DONE(<2006-06-01 Thu 09:17>) Put title and tags in separate classes
+
+*** DONE(<2006-06-01 Thu 09:17>) Option to leave out TAGS from export
+
+*** DONE(<2006-06-01 Thu 09:17>) Option to leave out Timestamps from export
+
+*** DONE(<2006-06-01 Thu 09:17>) Checkable items like Frank Ruell's proposal
+
+*** DONE(<2006-06-01 Thu 09:17>) Classify Keywords and time stamps
+ <span class="keyword">SCHEDULED: </span><span
+ class="timestamp">timestamp goes here</span><br>
+
+*** DONE(<2006-06-01 Thu 09:17>) Change default for include-all-todo to nil
+
+*** DONE(<2006-06-01 Thu 09:17>) Specify TAGS in a special line instead of collecting them dynamically
+ The could help to avoid typos and could be faster for very large files.
+
+*** DONE(<2006-06-01 Thu 09:17>) Some much faster interface for setting tags.
+ Basically, use single keys to add/remove tags from the list. Also
+ for this the idea to define tags in a special line would be good,
+ in order to have a way to define the shortcuts.
+
+*** DONE(<2006-06-01 Thu 09:17>) Remove date stamps from headline if they are not needed.
+ Bug report from Scott.
+
+
+*** DONE(<2006-06-01 Thu 09:17>) : Maybe s-up/down should change priorities only in headlines
+ Right now this works wherever the cursor is. If this is changed,
+ should S-up or S-down do something else?
+
+*** DONE(<2006-06-01 Thu 09:21>) Need a command to remove tabulators from a line.
+ Use this in ASCII export, to make sure we get the indentation
+ right.
+
+*** DONE(<2006-06-01 Thu 09:24>) Improve tab in org-cycle:
+ - there is a bug when the setting is 'white: It requires a
+ non-empty white line!
+ - There should be another setting to have tab be the tabulator in
+ the white space at the beginning of the line.
+ - Finally, when TAB closes an entry, maybe it should go beck to the
+ beginning of the entry??? On the other hand, it is good to be
+ able to go back to the old place with just another tab.
+
+*** DONE(<2006-06-01 Thu 11:48>) Include TAGS into sorting.
+ But what strategy should be used when there are several tags?
+
+*** DONE(<2006-06-06 Tue 10:15>) Archiving an entry in current buffer goes to end of file
+ Should go to end of subtree.
+ This is done now, and I also control the amount of empty lines
+ created by the archiving process in general.
+
+*** DONE(<2006-06-06 Tue 10:16>) Narrowing agenda to current files does not work as advertized.
+ C-c a 1 t should make the TODO list for the current file, but does
+ not.
+
+*** DONE(<2006-06-06 Tue 10:17>) Radio TAGS for the fast tag interface.
+ Make lists of tags that are mutually exclusive. So when I turn on
+ @HOME, @WORK would be turned off automagically. A good syntax for
+ defining these groups in the #+TAGS line would be:
+ : #+TAGS: [@WORK(w) @HOME(h) @CLUB(c)] Laptop(l) PC(p) Car(r)
+ This could indicate that @WORK, @HOME, @CLUB are mutually exclusive.
+
+ If I do this, I will also need a syntax for the global alist to
+ indicate the same thing.
+
+ It seems to me that with such grouping of tags, sorting would be
+ useful as it would improve the overview over the current tags. I
+ might even be able to support mutually exclusive tags with
+ fontification in the interface. Or arrange things such that the
+ mutually exclusive ones are all in the same row or column, to
+ optimize the visual feedback.
+
+ For the internal format, I think best would be something like
+
+ : '( (:startgroup) ("@work") ("@home") ("@club") (:endgroup)
+ : ("Laptop") ("PC") ("Car"))
+ This setup makes sure that assoc and rassoc still do work as
+ expected.
+
+*** DONE(<2006-06-06 Tue 10:17>) Should tags be sorted in a certain way?
+ Right now, you can either set the tag sequence yourself through
+ the completion interface. If you use the fast tag selection
+ interface, the tag sequence depends on the order in which tags are
+ selected and deselected. maybe a specific roder would be useful
+ for example the same order as the one given in the configuration?
+
+*** DONE(<2006-06-06 Tue 10:17>) Remove narrowing cookies for export
+ Exported tables should not show narrowing cookies. In fact, if a
+ table line does contain nothing but narrowing cookies, the entire
+ line should be removed.
+
+*** DONE(<2006-06-11 Sun 07:32>) Track working times similar to time-clock.el
+ This was proposed by David O'Toole in an
+ [[http://thread.gmane.org/gmane.emacs.orgmode/387][email to emacs-orgmode@gnu.org]]. He wants to be able to know the
+ times when he worked at a particular project. Some reporting
+ possibility would be needed to make this useful. Maybe sparse
+ trees with broken-down working times?
+
+*** DONE(<2006-06-15 Thu 13:35>) Make org-store-link do better in image-mode buffers
+ Just link to the file.
+
+*** DONE(<2006-06-15 Thu 13:35>) Use a ported version of noutline.el
+ Programming the old outline-mode is really a nightmare - the new
+ outline mode that uses invisibility properties instead of
+ selective display works really much much better. There is now
+ an [[http://thread.gmane.org/gmane.emacs.orgmode/214/focus=218][experimental port]] by Greg Chernov, so when I find time I will
+ try if this works well. If yes, this port should become part of
+ XEmacs. Once that happens, I could remove a large amount of
+ ballast from org.el
+
+*** DONE(<2006-06-15 Thu 13:35>) Verify links during export
+
+*** DONE(<2006-09-25 Mon 16:11>) Allow counting checkboxes
+ Then some statistics should be displayed. One idea is for
+ checkboxes, to use a special box [%] which will be updated with
+ percent of done. I could have an alternative [/] that will be
+ updated with something like [19/25] to show progress, and when the
+ two numbers are equal, I could highlight then in DONE face, just
+ like [100%]. All smaller numbers could be highlighted even in
+ TODO face if I wanted. Hmmm, I am beginning to like this.
+
+ Then: how to update this? Each time a checkbox is added or
+ toggled, go up and update all the counts, right up to something
+ which is not an item, or up to the previous header line.
+
+ Maybe I should also make an option for turning this on, to avoid
+ slowdown. I guess for long lists this could be slow.
+
+ Also would need a command for global update.
+
+ An maybe plain list and checkboxes should get their own chapter?
+ In Structure they seem to be a bit hidden.....
+
+ Also a menu sublist...
+
+*** DONE(<2006-09-25 Mon 16:11>) Allow stacking calls to org-occur
+ This was a proposal from Piotr. It is now possible, the second
+ and subsequent calls to org-occur need a prefix argument to keep
+ the previous highlights.
+
+*** DONE(<2006-09-25 Mon 16:12>) Create a hook to be run after an agenda buffer has been finalized.
+
+*** DONE(<2006-09-25 Mon 16:12>) Include TAGS into sorting.
+ But what strategy should be used when there are several tags?
+
+*** DONE(<2006-09-25 Mon 16:12>) Fixup tag display in agenda buffer.
+ The tabs mess up everything. Either remove the tabs, or realign
+ the tags to some useful column.
+
+*** DONE(<2006-09-25 Mon 16:12>) Blocks in agenda:
+ Make a single agenda buffer that contains several sets of items,
+ like the TODO list, a tags list, and a day view. Not a bad idea.
+ This was [[http://thread.gmane.org/gmane.emacs.orgmode/167/focus=168][Piotr's idea]].
+
+*** DONE(<2006-09-25 Mon 16:12>) Make org-store-link do the right thing in dired-mode
+
+*** DONE([2006-11-02 Thu 10:24]) Control over windows being used for agenda and related buffers :NEW:
+
+*** DONE([2007-01-24 Wed 12:59]) Extend access to table fields
+ Find a general way to get any rectangular region into a calc
+ vector
+
+*** DONE([2007-01-24 Wed 12:59]) Allow links to remote images to be inlined.
+
+*** DONE([2007-01-24 Wed 12:59]) M-TAB on an already complete tag should add the ":"
+
+*** DONE([2007-01-24 Wed 13:07]) Need a command to do show hierarchy after isearch.
+ Maybe automatically, using isearch-mode-end-hook. But this does
+ not seem to work, because to is called before the overlays are
+ re-installed. I can create a new hook, isearch-exit-hook, run in
+ `isearch-exit'.
+
+*** DONE([2007-02-18 Sun 07:16]) hook for users to do their own agenda lists
+ New function dumping headline into the agenda buffer, based on regexp
+ and callback, to allow general stuff. For the special tags, we can
+ search for one and check for the others using the callback.
+
+*** DONE([2007-02-18 Sun 07:37]) Make C-c C-l also work on a plain link, converting it into bracket.
+
+*** DONE([2007-02-18 Sun 07:37]) GNUS gnus:mail.general#123 stuff should be "Email from:..."
+
+*** DONE([2007-02-18 Sun 07:38]) Email/message context: What format?
+ I can think of two good formats for this:
+ : Email from John Smith (if I an the receiver)
+ : Email to John Smith (if I am the author)
+ or
+ : John Smith on: Some subject (this is the current Org-mode default.)
+ The first format requires better parsing of the messages (to get
+ both author and receiver names), and also
+ some way to detect if I am the author of this email or not.
+
+*** DONE([2007-02-21 Wed 12:04]) Allow internal links to match inside *other* link
+ Only the link itself that actually triggered the search.
+
+*** DONE([2007-02-21 Wed 12:07]) Allow fully protected HTML code that will be exported as is
+ Currently, @<...> works only for simple tags, and I think we
+ should have something better. Idea: Text between <protecthtml>
+ and </protecthtml>, mark it with a text property and then exclude
+ each match in the run preparing the export.
+ I guess I could require these at the beginning of the line, like
+
+#+PROTECT
+
+#+ENDPROECT
+
+ or something like that.......
+
+*** DONE([2007-03-13 Tue 05:19]) Make it possible to set TOC levels independently of headline levels
+ The easiest way to do this would obviously be to allow a number
+ setting for the tco switch, not only a simple t/nil switch. This
+ can be nice for webpages: One could have only top-level or level
+ 1 and 2 in the toc at the beginning of the page, and then still a
+ more complex structure below.
+
+*** DONE([2007-03-13 Tue 05:20]) Filling is not done in a compatible way.
+ The current setup used the Emacs variables and machine to get the
+ filling of plain lists and everything lese right. XEmacs uses the
+ filladapt package, which has different ways to do the same
+ things. org.el should be smart about this and setup filling under
+ XEmacs correctly.
+
+*** DONE([2007-06-06 Wed 17:44]) Repeating Schedules?
+ [[http://thread.gmane.org/gmane.emacs.orgmode/149][Dieter Grollman]] requested this feature, but for now I have decided
+ not to do anything about it. I don't see a good way to implement
+ this, and I believe that cyclic diary entries are good enough for
+ such tasks.
+
+*** DONE([2007-06-14 Thu 13:16]) improve item indentation when promoting and demoting
+
+*** DONE([2007-06-14 Thu 13:17]) The TODO buffer lists possible TODO keywords
+ These are taken from the current buffer, so when multiple buffers
+ are involved, this list may not be correct.....
+
+*** DONE([2007-06-14 Thu 13:20]) Conflict between bold emphasis and headlines
+ At the beginning of a line, Org-mode does not know if *bold* is a
+ headline or an emphasis. This will not be easy to fix. The way
+ to do ii is to require a space after the star in headlines. This
+ requires to change outline-regexp, outline-level, the many many
+ times when outline regexp is used in the program, and also the
+ countless times when I am simply matching th stars directly.
+
+*** DONE C-c - for cycling bullet types.
+ ARCHIVED: <2007-07-02 Mon>
+
+*** DONE improve what TAB does with new item
+ ARCHIVED: <2007-07-02 Mon>
+ same or additional indentation????
+
+*** DONE Make it easier to do monthly agendas, and agendas for ranges
+ ARCHIVED: <2007-07-02 Mon>
+
+*** DONE Introduce a LOCATION keyword
+ ARCHIVED: <2007-07-02 Mon>
+ similar to DEADLINE and SCHEDULED
+ Idea from Bastien
+ This could be done now using properties, I don't think we need a
+ special thing for this anymore.
+
+*** DONE Times/date not always removed in agenda lines
+ ARCHIVED: <2007-07-02 Mon>
+ Even when org-agenda-remove-times-when-in-prefix is set, there
+ seem to be cases where this does not work. I forgot what the
+ example was - does anyone remember?
+
+*** DONE Links are still highlighted in fixed-width environments.
+ ARCHIVED: <2007-07-02 Mon>
+ This ties in with the problem that there is no way to have
+ protected HTML code in the file.
+
+* COMMENT HTML style specifications
+
+# Local Variables:
+# org-export-html-style: "<link rel=stylesheet href=\"freeshell2.css\" type=\"text/css\"> <style type=\"text/css\"> .tag { color: red; font-weight:bold}</style>"
+# End:
diff --git a/ORGWEBPAGE/tutorials.html b/ORGWEBPAGE/tutorials.html
new file mode 100644
index 0000000..b15c67e
--- /dev/null
+++ b/ORGWEBPAGE/tutorials.html
@@ -0,0 +1,340 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>Org-Mode Tutorials, Blogposts, and Screenscasts</title>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2008/01/20 09:11:36"/>
+<meta name="author" content="Carsten Dominik"/>
+<style type="text/css">
+ html {
+ font-family: Times, serif;
+ font-size: 12pt;
+ }
+ .title { text-align: center; }
+ .todo { color: red; }
+ .done { color: green; }
+ .timestamp { color: grey }
+ .timestamp-kwd { color: CadetBlue }
+ .tag { background-color:lightblue; font-weight:normal }
+ .target { background-color: lavender; }
+ pre {
+ border: 1pt solid #AEBDCC;
+ background-color: #F3F5F7;
+ padding: 5pt;
+ font-family: courier, monospace;
+ }
+ table { border-collapse: collapse; }
+ td, th {
+ vertical-align: top;
+ <!--border: 1pt solid #ADB9CC;-->
+ }
+</style>
+</head><body>
+<h1 class="title">Org-Mode Tutorials, Blogposts, and Screenscasts</h1>
+
+<p>
+This page lists tutorials, screencasts, and extensive blog posts about
+<a href="http://orgmode.org">Org-mode</a>
+</p>
+
+
+<BASE href="http://orgmode.org/tutorials.html">
+
+
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<ul>
+<li><a href="#sec-1">General Introductions to Org-mode</a></li>
+<li><a href="#sec-2">Special features</a>
+<ul>
+<li><a href="#sec-3">Sparse Trees</a></li>
+<li><a href="#sec-4">Tables</a></li>
+<li><a href="#sec-5">The Spreadsheet: Org-mode and Calc</a></li>
+<li><a href="#sec-6">Hyperlinks</a></li>
+<li><a href="#sec-7">Using TODO states</a></li>
+<li><a href="#sec-8">Using TAGS&nbsp;&nbsp;&nbsp;<span class="tag"> NEW</span></a></li>
+<li><a href="#sec-9">Complex searches for Tags, TODO keywords and Properties</a></li>
+<li><a href="#sec-10">Timestamps, Appointments etc</a></li>
+<li><a href="#sec-11">The Clock Table&nbsp;&nbsp;&nbsp;<span class="tag"> NEW</span></a></li>
+<li><a href="#sec-12">Using Remember Templates&nbsp;&nbsp;&nbsp;<span class="tag"> NEW</span></a></li>
+<li><a href="#sec-13">Properties and Column View</a></li>
+<li><a href="#sec-14">Custom Agenda Commands</a></li>
+<li><a href="#sec-15">Embedded LaTeX</a></li>
+<li><a href="#sec-16">HTML export</a></li>
+<li><a href="#sec-17">LaTeX export</a></li>
+<li><a href="#sec-18">Publishing</a></li>
+<li><a href="#sec-19">Using orgtbl-mode in LaTeX</a></li>
+</ul>
+</li>
+<li><a href="#sec-20">Special tasks</a>
+<ul>
+<li><a href="#sec-21">Natural Project Planning&nbsp;&nbsp;&nbsp;<span class="tag"> NEW</span></a></li>
+</ul>
+</li>
+<li><a href="#sec-22">Personal Setup</a>
+<ul>
+<li><a href="#sec-23">Extensive documents</a></li>
+<li><a href="#sec-24">Short descriptions</a></li>
+</ul>
+</li>
+<li><a href="#sec-25">Org-related pages by Tutorial authors</a></li>
+</ul>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-1">General Introductions to Org-mode</h2>
+
+
+<ul>
+<li>
+<a href="http://dto.freeshell.org/notebook/OrgTutorial.html">The OrgMode tutorial</a> by <a href="http://dto.freeshell.org/notebook/">David O'Toole</a>, covering the basics of TODO
+lists and the agenda. It has been translated into <a href="http://www.cognition.ens.fr/~guerry/orgtutorialfr.html">French</a>,
+<a href="http://hpcgi1.nifty.com/spen/index.cgi?OrgMode%2fOrgTutorial">Japanese</a>, <a href="http://hokmen.chan.googlepages.com/OrgTutorial.en-cn.html">Chinese</a>, and <a href="http://jmjeong.com/index.php?display=Emacs/OrgMode">Korean</a>.
+
+</li>
+<li>
+<a href="http://jaderholm.com/screencasts.html">A 25 minute screencast</a> by <a href="http://jaderholm.com">Scott Jaderholm</a>, demonstrating the basic
+features of Org-mode.
+
+</li>
+<li>
+<a href="http://sachachua.com/wp/2008/01/18/outlining-your-notes-with-org/">Outlining Your Notes with Org</a> by <a href="http://sachachua.com/wp/">Sacha Chua</a> covers outlining,
+searching and internal links.
+</li>
+<li>
+<a href="http://www.linuxjournal.com/article/9116">Getting Organized with Emacs Org-mode</a> by <a href="http://www.geocities.com/abhijeet_chawan/">Abhijeet Chavan</a>, and
+article originally published in the <a href="http://www.linuxjournal.com/">Linux Journal</a>.
+
+</li>
+</ul></div>
+
+<div class="outline-2">
+<h2 id="sec-2">Special features</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-3">Sparse Trees</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-4">Tables</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-5">The Spreadsheet: Org-mode and Calc</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-6">Hyperlinks</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-7">Using TODO states</h3>
+
+<p><i>Your chance for everlasting fame on the Org-mode homepage</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-8">Using TAGS &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span></h3>
+
+<ul>
+<li>
+<a href="http://sachachua.com/wp/">Sacha Chua</a> about <a href="http://sachachua.com/wp/2008/01/04/tagging-in-org-plus-bonus-code-for-timeclocks-and-tags/">Tagging in Org</a>.
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-9">Complex searches for Tags, TODO keywords and Properties</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-10">Timestamps, Appointments etc</h3>
+
+<ul>
+<li>
+<a href="http://members.optusnet.com.au/~charles57/GTD/org_dates/">Using Dates and Times in Emacs Org-mode</a> by Charles Cave.
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-11">The Clock Table &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span></h3>
+
+<ul>
+<li>
+<a href="http://sachachua.com/wp/">Sacha Chua</a> about <a href="http://sachachua.com/wp/2007/12/30/clocking-time-with-emacs-org/">Clocking time with Emacs Org</a>.
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-12">Using Remember Templates &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span></h3>
+
+<ul>
+<li>
+<a href="http://sachachua.com/wp/">Sacha Chua</a> about <a href="http://sachachua.com/wp/2007/10/05/remembering-to-org-and-planner/">Remembering to Org and Planner</a>.
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-13">Properties and Column View</h3>
+
+<ul>
+<li>
+<a href="http://www.cognition.ens.fr/~guerry/">Bastien Guerry</a> has a <a href="http://www.cognition.ens.fr/~guerry/org-column-view-tutorial.html">tutorial about column view</a> and
+demonstrates column view live in this <a href="http://www.cognition.ens.fr/~guerry/org-column-screencast.html">screencast</a>.
+</li>
+<li>
+Christian Egli has created a <a href="http://thread.gmane.org/gmane.emacs.orgmode/5107/focus%3D5134">mini-tutorial for using column view</a>
+and posted it to <a href="http://news.gmane.org/gmane.emacs.orgmode">emacs-orgmode@gnu.org</a>
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-14">Custom Agenda Commands</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-15">Embedded LaTeX</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-16">HTML export</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-17">LaTeX export</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-18">Publishing</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p></div>
+
+<div class="outline-3">
+<h3 id="sec-19">Using orgtbl-mode in LaTeX</h3>
+
+<p><i>Your chance for everlasting fame</i>
+</p>
+</div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-20">Special tasks</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-21">Natural Project Planning &nbsp;&nbsp;&nbsp;<span class="tag">NEW</span></h3>
+
+<ul>
+<li>
+<a href="http://members.optusnet.com.au/charles57/Creative/">Charles Cave</a> about using Org-mode to implement <a href="http://members.optusnet.com.au/~charles57/GTD/Natural_Project_Planning.html">Natural Project Planning</a> according to David Allen.
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-22">Personal Setup</h2>
+
+
+
+<div class="outline-3">
+<h3 id="sec-23">Extensive documents</h3>
+
+
+<ul>
+<li>
+<a href="http://johnwiegley.com">John Wiegley</a> about <a href="http://johnwiegley.com/org.mode.day.planner.html">using Org-mode as a day planner</a>.
+
+</li>
+<li>
+<a href="http://members.optusnet.com.au/charles57/Creative/">Charles Cave</a> about <a href="http://members.optusnet.com.au/~charles57/GTD/orgmode.html">GTD and Org-mode</a>.
+
+</li>
+<li>
+<a href="http://sachachua.com/wp/">Sacha Chua</a> about <a href="http://sachachua.com/wp/2007/12/22/a-day-in-a-life-with-org/">a day in a life with Org</a> and about the basics of
+<a href="http://sachachua.com/wp/2007/12/28/emacs-getting-things-done-with-org-basic/">Getting Things Done with Org</a>
+
+</li>
+<li>
+<i>Your chance for everlasting fame</i>
+
+</li>
+</ul></div>
+
+<div class="outline-3">
+<h3 id="sec-24">Short descriptions</h3>
+
+
+<ul>
+<li>
+David O'Toole explains his setup in <a href="http://thread.gmane.org/gmane.emacs.orgmode/4832">this post</a>.
+
+</li>
+<li>
+This <a href="http://www.brool.com/?p=82">blog post</a> shows a very simple and clear GTD setup.
+
+</li>
+<li>
+<i>Your chance for everlasting fame</i>
+
+
+</li>
+</ul></div>
+</div>
+
+<div class="outline-2">
+<h2 id="sec-25">Org-related pages by Tutorial authors</h2>
+
+
+<p>
+Here are the pages of a number of people that write for or about
+Org-mode
+</p>
+<ul>
+<li>
+<a href="http://johnwiegley.com">John Wiegley</a>
+
+</li>
+<li>
+<a href="http://members.optusnet.com.au/charles57/Creative/">Charles Cave</a>
+
+</li>
+<li>
+<a href="http://sachachua.com/wp/">Sacha Chua</a>
+
+</li>
+<li>
+<a href="http://www.cognition.ens.fr/~guerry/">Bastien Guerry</a>
+</li>
+</ul>
+</div>
+<div id="postamble"><p class="author"> Author: Carsten Dominik
+<a href="mailto:carsten at orgmode dot org">&lt;carsten at orgmode dot org&gt;</a>
+</p>
+<p class="date"> Date: 2008/01/20 09:11:36</p>
+</div></body>
+</html>
diff --git a/ORGWEBPAGE/tutorials.org b/ORGWEBPAGE/tutorials.org
new file mode 100644
index 0000000..f9f446b
--- /dev/null
+++ b/ORGWEBPAGE/tutorials.org
@@ -0,0 +1,105 @@
+
+#+TITLE: Org-Mode Tutorials, Blogposts, and Screenscasts
+#+LANGUAGE: en
+#+EMAIL: carsten at orgmode dot org
+#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:t *:t TeX:t tags:t skip:nil
+
+This page lists tutorials, screencasts, and extensive blog posts about
+[[http://orgmode.org][Org-mode]]
+
+#+HTML: <BASE href="http://orgmode.org/tutorials.html">
+
+* General Introductions to Org-mode
+
+ - [[http://dto.freeshell.org/notebook/OrgTutorial.html][The OrgMode tutorial]] by [[http://dto.freeshell.org/notebook/][David O'Toole]], covering the basics of TODO
+ lists and the agenda. It has been translated into [[http://www.cognition.ens.fr/~guerry/orgtutorialfr.html][French]],
+ [[http://hpcgi1.nifty.com/spen/index.cgi?OrgMode%2fOrgTutorial][Japanese]], [[http://hokmen.chan.googlepages.com/OrgTutorial.en-cn.html][Chinese]], and [[http://jmjeong.com/index.php?display=Emacs/OrgMode][Korean]].
+
+ - [[http://jaderholm.com/screencasts.html][A 25 minute screencast]] by [[http://jaderholm.com][Scott Jaderholm]], demonstrating the basic
+ features of Org-mode.
+
+ - [[http://sachachua.com/wp/2008/01/18/outlining-your-notes-with-org/][Outlining Your Notes with Org]] by [[http://sachachua.com/wp/][Sacha Chua]] covers outlining,
+ searching and internal links.
+ - [[http://www.linuxjournal.com/article/9116][Getting Organized with Emacs Org-mode]] by [[http://www.geocities.com/abhijeet_chawan/][Abhijeet Chavan]], and
+ article originally published in the [[http://www.linuxjournal.com/][Linux Journal]].
+
+* Special features
+
+** Sparse Trees
+ /Your chance for everlasting fame/
+** Tables
+ /Your chance for everlasting fame/
+** The Spreadsheet: Org-mode and Calc
+ /Your chance for everlasting fame/
+** Hyperlinks
+ /Your chance for everlasting fame/
+** Using TODO states
+ /Your chance for everlasting fame on the Org-mode homepage/
+** Using TAGS :NEW:
+ - [[http://sachachua.com/wp/2008/01/04/tagging-in-org-plus-bonus-code-for-timeclocks-and-tags/][Tagging in Org]] by [[http://sachachua.com/wp/][Sacha Chua]].
+** Complex searches for Tags, TODO keywords and Properties
+ /Your chance for everlasting fame/
+** Timestamps, Appointments etc
+ - [[http://members.optusnet.com.au/~charles57/GTD/org_dates/][Using Dates and Times in Emacs Org-mode]] by [[http://members.optusnet.com.au/charles57/Creative/][Charles Cave]].
+** The Clock Table :NEW:
+ - [[http://sachachua.com/wp/2007/12/30/clocking-time-with-emacs-org/][Clocking time with Emacs Org]] by [[http://sachachua.com/wp/][Sacha Chua]] .
+** Using Remember Templates :NEW:
+ - [[http://sachachua.com/wp/2007/10/05/remembering-to-org-and-planner/][Remembering to Org and Planner]] by [[http://sachachua.com/wp/][Sacha Chua]].
+** Properties and Column View
+ - [[http://www.cognition.ens.fr/~guerry/org-column-view-tutorial.html][Emacs Org's Column View]] by [[http://www.cognition.ens.fr/~guerry/][Bastien Guerry]], with an accompanying
+ [[http://www.cognition.ens.fr/~guerry/org-column-screencast.html][screencast]].
+ - [[http://thread.gmane.org/gmane.emacs.orgmode/5107/focus%3D5134][What's the use of Column View?]] by Christian Egli is ashort
+ tutorial about Column View that was sent to [[http://news.gmane.org/gmane.emacs.orgmode][emacs-orgmode@gnu.org]].
+** Custom Agenda Commands
+ /Your chance for everlasting fame/
+** Embedded LaTeX
+ /Your chance for everlasting fame/
+** HTML export
+ /Your chance for everlasting fame/
+** LaTeX export
+ /Your chance for everlasting fame/
+** Publishing
+ /Your chance for everlasting fame/
+** Using orgtbl-mode in LaTeX
+ /Your chance for everlasting fame/
+
+* Special tasks
+
+** Natural Project Planning :NEW:
+ - [[http://members.optusnet.com.au/charles57/Creative/][Charles Cave]] about using Org-mode to implement [[http://members.optusnet.com.au/~charles57/GTD/Natural_Project_Planning.html][Natural Project
+ Planning]] according to David Allen.
+
+* Personal Setup
+
+** Extensive documents
+
+ - [[http://johnwiegley.com/org.mode.day.planner.html][Using Org-mode as a day planner]] by [[http://johnwiegley.com][John Wiegley]].
+
+ - [[http://members.optusnet.com.au/~charles57/GTD/orgmode.html][Using Emacs org-mode for GTD]] by [[http://members.optusnet.com.au/charles57/Creative/][Charles Cave]].
+
+ - [[http://sachachua.com/wp/][Sacha Chua]] about [[http://sachachua.com/wp/2007/12/22/a-day-in-a-life-with-org/][A day in a life with Org]] and about the basics of
+ [[http://sachachua.com/wp/2007/12/28/emacs-getting-things-done-with-org-basic/][Getting Things Done with Org]]
+
+ - /Your chance for everlasting fame/
+
+** Short descriptions
+
+ - David O'Toole explains his setup in [[http://thread.gmane.org/gmane.emacs.orgmode/4832][this post]].
+
+ - This [[http://www.brool.com/?p=82][blog post]] shows a very simple and clear GTD setup.
+
+ - /Your chance for everlasting fame/
+
+
+* Org-related pages by Tutorial authors
+
+ Here are the pages of a number of people that write for or about
+ Org-mode
+
+ - [[http://johnwiegley.com][John Wiegley]]
+
+ - [[http://members.optusnet.com.au/charles57/Creative/][Charles Cave]]
+
+ - [[http://sachachua.com/wp/][Sacha Chua]]
+
+ - [[http://www.cognition.ens.fr/~guerry/][Bastien Guerry]]
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..eff4239
--- /dev/null
+++ b/TODO
@@ -0,0 +1,206 @@
+ -*- mode:org -*-
+
+
+Ideas for time estimates:
+
+ {22} 22 minutes
+ {2:} 2 hours
+ {2:30} 2 hours, 30 minutes
+
+Maybe make a new keyword APPT for appointment, meaning that this is
+something I need to attend, as opposed to something which is on that
+day and not necessarily something where we need to be present. Not
+sure about this.
+
+Should we add this hierarchically? Should parents value be the summed
+values of children? I guess not. No. Estimated times should be
+atomic, belonging to the detailed entry. If people give estimated
+times to parents, their fault.
+
+| | | | | |
+|---+---+---+---+---|
+| | | | | |
+
+
+make special completion for refile path, similar to file completion.
+
+Make variables for case-fold-search, there is a request in the survey
+
+">" does not work well in column view, when currently there is no
+width defined.
+
+Make cycling put text properties over current state.
+Use thee when moving subtrees, to restore them all to the right
+state.
+
+C-RET, add empty line just like before the current entry.
+
+Make sure the remember stuff insertion works correctly, find a way to
+specify empty leading lines.
+
+Last synch with FSF changes: <2008-01-03 Thu>
+
+Fix special character replacement: not in protected regions, and
+require them not to be part of a long chain of strings and dots.
+
+Write CLOCK like this: CLOCK [2007-11-12 Mon 12:30-13:44]
+This needs a lot of changing, of course. Clock table and lots more.
+
+Make org-entry-put handle all special properties. Use interactive
+interfaces only for interactive calls.
+
+Split into files:
+- org.el
+- org-tables.el
+ entry points: align. Hmm, mybe we should just leave it like it is.
+- org-agenda.el
+- org-export.el
+- org-cdlatex.el
+
+Also, all the link types could be in separate files:
+Still, org would automatically require these.
+I guess it would make some sense to take these out.
+- org-bbdb.el
+- org-mh.el
+ etc etc
+
+How to set tags in remember buffer?
+
+integrate org-iswitchb.el
+
+Free up C-c C-v, and use this for other stuff?
+
+document org-agenda-start-day and maybe other dynamical scope variables.
+
+Should I move the remember template stuff to remember.el itself?
+Would be good, but is unlikely to happen.
+
+Make org-set-property set the property for all entries in the region.
+What other commands?
+
+Map region with commands, general mechanism????
+
+M-q in a line starting with a *bold* string fails. Fuck this wrapping
+and paragraph code, it is a desaster
+
+- Agenda view of tags search make the levels of the headline visible
+ through leading dots. The TODO view doesn't. Maybe the to views
+ should behave the same on this?
+
+- Modifying the TODO state of an entry while in the agenda tags-todo
+ view will make the leading dots disappear.
+
+Make ASCII export remove some of the emph markers. Maybe replace
+verbatim with single quotes or so.
+
+ASCII export: move links into footnotes
+
+Implement cycling by having a text property on headlines, instead
+of doing all this work to figure things out dynamically????????????
+
+Write some command that does:
+- gets all the external stuff from David an Bastien
+- Changes the version number so that they are consistent
+- Have a contrib directory?????
+
+Implement Johns auto-archive.
+
+Have C-c C-e 0 l and C-c C-e 0 h do the region (Bastien)
+
+Remove time grid lines that have an apointment on that time.
+Don't show "-----" if something is going on during that time,
+this is an indication of being occupied.
+
+Implement block viewing in the agenda, to show how long enties take on
+a true time grid.
+
+End date for a repeating thing?
+
+Should we have thinks like <example> ... </example>
+like muse does? This is much easier than what we have......
+
+#+BEGIN_example
+#+END_example
+
+Completely remove cpltxt from store link and use desc instead.
+
+Implement most internal links as add-ons. Either in external files,
+or internally. Anyway, make sure most of them are active.
+
+Bug with columns when there is an invisible link early in the
+headline. See properties.org.
+
+hooks in the properties stuff.
+
+org-after-insert-property-drawer-hook.
+
+Function to convert outline to plain and back (Scott Jaderholm)
+
+MEW support??? (this is yet another emacs mailer)
+
+Make org-fill-paragraph respect \\.
+
+How can I update a calculating property without relying on the column
+view format? That would require specifying the format in an
+additional place, possibly in a data field? This is what I had
+first. Maybe it was only partially a good idea????
+The problem is that in order to have a column computing, we need to
+have a view! So this is not good!
+
+Options:
+ - use the format!
+ - have an extra property, like XYZ_OPERATOR.
+ Then do the operation in the sub tree of the entry that has the
+ operator property. Quite nice, this one, but may contradict
+ the format. It is not goot to have this multiple times. So maybe
+ strictly limit this to those that are in a format.
+
+ + when updating, find the format and then apply to subtree.
+ + When updating absolutely everything, find all the formats, get
+ all the operators, apply to the corresponding subtrees.
+
+ + allow very general operations:
+
+ {to-number,to-string,add}
+
+ Or simply {add}
+
+ Take old value, new value, and add or do whatever is necessary.
+
+ This is another exploit.
+
+ Three functions.
+
+ - Allow the operator in a value after all
+
+search-subtree command/function
+
+Should the default for org-archive-mark-done be nil?
+
+hook after agenda-show, but careful with all the other functions
+that use that function. Maybe take the functionality tp a separate
+function.
+
+Make something search [-].
+
+
+The fast interfaces
+
+
+- org-goto, jumps to an entry in the current buffer
+- org-refile, uses the completion interface to file something away
+- org-refile with prefix arg allows to jump to a refile location
+- remember can use refile, goto, and automatic location search
+
+This is very much confuing:
+
+refile standard can go to any refile location, in different files
+we can also us the refile interface to find a headline in the
+current buffer.
+
+This needs to be made more consistent.
+
+#+TYP_TODO: TODO BUG INCONSISTENCY IDEA WISH QUESTION DONE
+#+OPTIONS: H:1 num:nil toc:t \n:nil @:t ::t |:t ^:t *:t TeX:t
+#+EMAIL: carsten.dominik@gmail.com
+
diff --git a/UTILITIES/fake_change_log.pl b/UTILITIES/fake_change_log.pl
new file mode 100755
index 0000000..6ed3bc2
--- /dev/null
+++ b/UTILITIES/fake_change_log.pl
@@ -0,0 +1,72 @@
+#!/usr/bin/perl
+
+$file1 = shift;
+$file2 = shift;
+
+open file1,"<$file1" or die;
+while (<file1>) {
+ if (m/^\s*\((defun|defsubst|defmacro|defcustom|defgroup|defface|defvar|defconst)\s+([-a-zA-Z0-9]+)/) {
+ if ($1 eq "defun") {
+ $fun1{$2}++;
+ } elsif ($1 eq "defsubst") {
+ $subst1{$2}++;
+ } elsif ($1 eq "defmacro") {
+ $macro1{$2}++;
+ } elsif ($1 eq "defgroup") {
+ $group1{$2}++;
+ } elsif ($1 eq "defcustom") {
+ $custom1{$2}++;
+ } elsif ($1 eq "defface") {
+ $face1{$2}++;
+ } elsif ($1 eq "defvar") {
+ $var1{$2}++;
+ } elsif ($1 eq "defconst") {
+ $const1{$2}++;
+ }
+ }
+}
+close file1;
+
+open file2,"<$file2" or die;
+while (<file2>) {
+ if (m/^\s*\((defun|defsubst|defmacro|defcustom|defgroup|defface|defvar|defconst)\s+([-a-zA-Z0-9]+)/) {
+ if ($1 eq "defun") {
+ $fun2{$2}++;
+ } elsif ($1 eq "defsubst") {
+ $subst2{$2}++;
+ } elsif ($1 eq "defmacro") {
+ $macro2{$2}++;
+ } elsif ($1 eq "defgroup") {
+ $group2{$2}++;
+ } elsif ($1 eq "defcustom") {
+ $custom2{$2}++;
+ } elsif ($1 eq "defface") {
+ $face2{$2}++;
+ } elsif ($1 eq "defvar") {
+ $var2{$2}++;
+ } elsif ($1 eq "defconst") {
+ $const2{$2}++;
+ }
+ }
+}
+close file2;
+
+foreach $type ("fun","subst","macro","group","custom","face","var","const") {
+ $cmd1 = '%n1 = %' . $type . "1;";
+ $cmd2 = '%n2 = %' . $type . "2;";
+ eval $cmd1;
+ eval $cmd2;
+
+ print "$type added:\n";
+ foreach (keys %n2) {
+ unless (defined $n1{$_}) {
+ print " $_\n";
+ }
+ }
+ print "$type removed:\n";
+ foreach (keys %n1) {
+ unless (defined $n2{$_}) {
+ print " $_\n";
+ }
+ }
+}
diff --git a/org.el b/org.el
index 83f24b3..6de4a2a 100644
--- a/org.el
+++ b/org.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 5.19a
+;; Version: 5.20
;;
;; This file is part of GNU Emacs.
;;
@@ -84,7 +84,7 @@
;;; Version
-(defconst org-version "5.19a"
+(defconst org-version "5.20"
"The version number of the file org.el.")
(defun org-version ()
(interactive)
@@ -103,7 +103,7 @@
`(and (boundp (quote ,var)) ,var))
(defmacro org-unmodified (&rest body)
- "Execute body without changing buffer-modified-p."
+ "Execute body without changing `buffer-modified-p'."
`(set-buffer-modified-p
(prog1 (buffer-modified-p) ,@body)))
@@ -322,8 +322,9 @@ An entry can be toggled between QUOTE and normal with
:type 'string)
(defconst org-repeat-re
- (concat "\\(?:\\<\\(?:" org-scheduled-string "\\|" org-deadline-string "\\)"
- " +<[0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9] [^>\n]*\\)\\(\\+[0-9]+[dwmy]\\)")
+; (concat "\\(?:\\<\\(?:" org-scheduled-string "\\|" org-deadline-string "\\)"
+; " +<[0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9] [^>\n]*\\)\\(\\+[0-9]+[dwmy]\\)")
+ "<[0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9] [^>\n]*\\(\\+[0-9]+[dwmy]\\)"
"Regular expression for specifying repeated events.
After a match, group 1 contains the repeat expression.")
@@ -454,7 +455,7 @@ of the buffer."
"Where should `org-cycle' emulate TAB.
nil Never
white Only in completely white lines
-whitestart Only at the beginning of lines, before the first non-white char.
+whitestart Only at the beginning of lines, before the first non-white char
t Everywhere except in headlines
exc-hl-bol Everywhere except at the start of a headline
If TAB is used in a place where it does not emulate TAB, the current subtree
@@ -569,6 +570,11 @@ See also the QUOTE keyword."
:group 'org-edit-structure
:type 'boolean)
+(defcustom org-goto-auto-isearch t
+ "Non-nil means, typing characters in org-goto starts incremental search."
+ :group 'org-edit-structure
+ :type 'boolean)
+
(defgroup org-sparse-trees nil
"Options concerning sparse trees in Org-mode."
:tag "Org Sparse Trees"
@@ -733,7 +739,7 @@ This variable is obsolete and has no effect anymore, instead add ot remove
:group 'org-archive
:type 'boolean)
-(defcustom org-archive-save-context-info '(time file category todo itags)
+(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 looses information given by
context, like inherited tags, the category, and possibly also the TODO
@@ -746,6 +752,8 @@ itags The local tags, in the headline of the subtree.
ltags 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
@@ -758,6 +766,7 @@ information."
(const :tag "TODO state" todo)
(const :tag "TODO state" priority)
(const :tag "Inherited tags" itags)
+ (const :tag "Outline path" olpath)
(const :tag "Local tags" ltags)))
(defgroup org-imenu-and-speedbar nil
@@ -1046,7 +1055,7 @@ See the manual for examples."
(defcustom org-descriptive-links t
"Non-nil means, hide link part and only show description of bracket links.
-Bracket links are like [[link][descritpion]]. This variable sets the initial
+Bracket links are like [[link][descritpion]]. This variable sets the initial
state in new org-mode buffers. The setting can then be toggled on a
per-buffer basis from the Org->Hyperlinks menu."
:group 'org-link
@@ -1056,10 +1065,10 @@ per-buffer basis from the Org->Hyperlinks menu."
"How the path name in file links should be stored.
Valid values are:
-relative relative to the current directory, i.e. the directory of the file
+relative Relative to the current directory, i.e. the directory of the file
into which the link is being inserted.
-absolute absolute path, if possible with ~ for home directory.
-noabbrev absolute path, no abbreviation of home directory.
+absolute Absolute path, if possible with ~ for home directory.
+noabbrev Absolute path, no abbreviation of home directory.
adaptive Use relative path for files in the current directory and sub-
directories of it. For other files, use an absolute path."
:group 'org-link
@@ -1411,13 +1420,36 @@ When this variable is nil, `C-c C-c' give you the prompts, and
:group 'org-remember
:type 'boolean)
-(defcustom org-remember-use-refile-when-interactive t
- "Non-nil means, use refile to file a remember note.
-This is only used when the the interactive mode for selecting a filing
+(defcustom org-remember-interactive-interface 'refile
+ "The interface to be used for interactive filing of remember notes.
+This is only used when the interactive mode for selecting a filing
location is used (see the variable `org-remember-store-without-prompt').
-When nil, the `org-goto' interface is used."
+Allowed vaues are:
+outline The interface shows an outline of the relevant file
+ and the correct heading is found by moving through
+ the outline or by searching with incremental search.
+outline-path-completion Headlines in the current buffer are offered via
+ completion.
+refile Use the refile interface, and offer headlines,
+ possibly from different buffers."
:group 'org-remember
- :type 'boolean)
+ :type '(choice
+ (const :tag "Refile" refile)
+ (const :tag "Outline" outline)
+ (const :tag "Outline-path-completion" outline-path-completion)))
+
+(defcustom org-goto-interface 'outline
+ "The default interface to be used for `org-goto'.
+Allowed vaues are:
+outline The interface shows an outline of the relevant file
+ and the correct heading is found by moving through
+ the outline or by searching with incremental search.
+outline-path-completion Headlines in the current buffer are offered via
+ completion."
+ :group 'org-remember ; FIXME: different group for org-goto and org-refile
+ :type '(choice
+ (const :tag "Outline" outline)
+ (const :tag "Outline-path-completion" outline-path-completion)))
(defcustom org-remember-default-headline ""
"The headline that should be the default location in the notes file.
@@ -1526,10 +1558,10 @@ This is list of cons cells. Each cell contains:
heading in the current buffer.
- A specification of how to find candidate refile targets. This may be
any of
- - a cons cell (:tag . \"TAG\") to identify refile targes by a tag.
+ - a cons cell (:tag . \"TAG\") to identify refile targets by a tag.
This tag has to be present in all target headlines, inheritance will
not be considered.
- - a cons cell (:todo . \"KEYWORD\" to identify refile targets by
+ - a cons cell (:todo . \"KEYWORD\") to identify refile targets by
todo keyword.
- a cons cell (:regexp . \"REGEXP\") with a regular expression matching
headlines that are refiling targets.
@@ -2452,7 +2484,7 @@ deadlines are always turned off when the item is DONE."
:type 'boolean)
(defcustom org-agenda-skip-timestamp-if-done nil
- "Non-nil means don't don't select item by timestamp or -range if it is DONE."
+ "Non-nil means don't select item by timestamp or -range if it is DONE."
:group 'org-agenda-skip
:type 'boolean)
@@ -2827,7 +2859,7 @@ to occupy a fixed space in the agenda display."
(defcustom org-agenda-scheduled-leaders '("Scheduled: " "Sched.%2dx: ")
"Text preceeding scheduled items in the agenda view.
-THis is a list with two strings. The first applies when the item is
+This is a list with two strings. The first applies when the item is
scheduled on the current day. The second applies when it has been scheduled
previously, it may contain a %d to capture how many days ago the item was
scheduled."
@@ -3304,7 +3336,7 @@ In the given sequence, these characters will be used for level 1, 2, ..."
(defcustom org-export-ascii-bullets '(?* ?+ ?-)
"Bullet characters for headlines converted to lists in ASCII export.
-The first character is is used for the first lest level generated in this
+The first character is used for the first lest level generated in this
way, and so on. If there are more levels than characters given here,
the list will be repeated.
Note that plain lists will keep the same bullets as the have in the
@@ -4031,8 +4063,8 @@ list of attributes, like (:foreground \"blue\" :weight bold :underline t)."
(0.5 . org-upcoming-deadline)
(0.0 . default))
"Faces for showing deadlines in the agenda.
-This is a list of cons cells. The cdr of each cess is a face to be used,
-and it can also just be a like like '(:foreground \"yellow\").
+This is a list of cons cells. The cdr of each cell is a face to be used,
+and it can also just be like '(:foreground \"yellow\").
Each car is a fraction of the head-warning time that must have passed for
this the face in the cdr to be used for display. The numbers must be
given in descending order. The head-warning time is normally taken
@@ -4170,7 +4202,7 @@ If it is less than 8, the level-1 face gets re-used for level N+1 etc."
(defvar mh-show-folder-buffer)
(defvar mh-index-folder)
(defvar mh-searcher)
-(declare-function org-export-latex-cleaned-string "org-export-latex" (&optional commentsp))
+(declare-function org-export-latex-cleaned-string "org-export-latex" ())
(declare-function parse-time-string "parse-time" (string))
(declare-function remember "remember" (&optional initial))
(declare-function remember-buffer-desc "remember" ())
@@ -5832,19 +5864,22 @@ Optional argument N means, put the headline into the Nth line of the window."
(substitute-key-definition cmd cmd map global-map)))
(suppress-keymap map)
(org-defkey map "\C-m" 'org-goto-ret)
+ (org-defkey map [(return)] 'org-goto-ret)
(org-defkey map [(left)] 'org-goto-left)
(org-defkey map [(right)] 'org-goto-right)
- (org-defkey map [(?q)] 'org-goto-quit)
(org-defkey map [(control ?g)] 'org-goto-quit)
(org-defkey map "\C-i" 'org-cycle)
(org-defkey map [(tab)] 'org-cycle)
(org-defkey map [(down)] 'outline-next-visible-heading)
(org-defkey map [(up)] 'outline-previous-visible-heading)
- (org-defkey map "n" 'outline-next-visible-heading)
- (org-defkey map "p" 'outline-previous-visible-heading)
- (org-defkey map "f" 'outline-forward-same-level)
- (org-defkey map "b" 'outline-backward-same-level)
- (org-defkey map "u" 'outline-up-heading)
+ (if org-goto-auto-isearch
+ (define-key-after map [t] 'org-goto-local-auto-isearch)
+ (org-defkey map "q" 'org-goto-quit)
+ (org-defkey map "n" 'outline-next-visible-heading)
+ (org-defkey map "p" 'outline-previous-visible-heading)
+ (org-defkey map "f" 'outline-forward-same-level)
+ (org-defkey map "b" 'outline-backward-same-level)
+ (org-defkey map "u" 'outline-up-heading))
(org-defkey map "/" 'org-occur)
(org-defkey map "\C-c\C-n" 'outline-next-visible-heading)
(org-defkey map "\C-c\C-p" 'outline-previous-visible-heading)
@@ -5854,14 +5889,13 @@ Optional argument N means, put the headline into the Nth line of the window."
map))
(defconst org-goto-help
-"Browse copy of buffer to find location or copy text.
+"Browse buffer copy, to find location or copy text. Just type for auto-isearch.
RET=jump to location [Q]uit and return to previous location
-\[Up]/[Down]=next/prev headline TAB=cycle visibility [/] org-occur"
-)
+\[Up]/[Down]=next/prev headline TAB=cycle visibility [/] org-occur")
(defvar org-goto-start-pos) ; dynamically scoped parameter
-(defun org-goto ()
+(defun org-goto (&optional alternative-interface)
"Look up a different location in the current file, keeping current visibility.
When you want look-up or go to a different location in a document, the
@@ -5876,10 +5910,20 @@ When pressing RET or `Q', the command returns to the original buffer in
which the visibility is still unchanged. After RET is will also jump to
the location selected in the indirect buffer and expose the
the headline hierarchy above."
- (interactive)
- (let* ((org-goto-start-pos (point))
+ (interactive "P")
+ (let* ((org-refile-targets '((nil . (:maxlevel . 10))))
+ (org-refile-use-outline-path t)
+ (interface
+ (if (not alternative-interface)
+ org-goto-interface
+ (if (eq org-goto-interface 'outline)
+ 'outline-path-completion
+ 'outline)))
+ (org-goto-start-pos (point))
(selected-point
- (car (org-get-location (current-buffer) org-goto-help))))
+ (if (eq interface 'outline)
+ (car (org-get-location (current-buffer) org-goto-help))
+ (nth 3 (org-refile-get-location "Goto: ")))))
(if selected-point
(progn
(org-mark-ring-push org-goto-start-pos)
@@ -5895,7 +5939,11 @@ the headline hierarchy above."
"Let the user select a location in the Org-mode buffer BUF.
This function uses a recursive edit. It returns the selected position
or nil."
- (let (org-goto-selected-point org-goto-exit-command)
+ (let ((isearch-mode-map org-goto-local-auto-isearch-map)
+ (isearch-hide-immediately nil)
+ (isearch-search-fun-function
+ (lambda () 'org-goto-local-search-forward-headings))
+ (org-goto-selected-point org-goto-exit-command))
(save-excursion
(save-window-excursion
(delete-other-windows)
@@ -5924,21 +5972,35 @@ or nil."
(goto-char (point-min)))
(org-beginning-of-line)
(message "Select location and press RET")
- ;; now we make sure that during selection, ony very few keys work
- ;; and that it is impossible to switch to another window.
-; (let ((gm (current-global-map))
-; (overriding-local-map org-goto-map))
-; (unwind-protect
-; (progn
-; (use-global-map org-goto-map)
-; (recursive-edit))
-; (use-global-map gm)))
(use-local-map org-goto-map)
(recursive-edit)
))
(kill-buffer "*org-goto*")
(cons org-goto-selected-point org-goto-exit-command)))
+(defvar org-goto-local-auto-isearch-map (make-sparse-keymap))
+(set-keymap-parent org-goto-local-auto-isearch-map isearch-mode-map)
+(define-key org-goto-local-auto-isearch-map "\C-i" 'isearch-other-control-char)
+(define-key org-goto-local-auto-isearch-map "\C-m" 'isearch-other-control-char)
+
+(defun org-goto-local-search-forward-headings (string bound noerror)
+ "Search and make sure that anu matches are in headlines."
+ (catch 'return
+ (while (search-forward string bound noerror)
+ (when (let ((context (mapcar 'car (save-match-data (org-context)))))
+ (and (member :headline context)
+ (not (member :tags context))))
+ (throw 'return (point))))))
+
+(defun org-goto-local-auto-isearch ()
+ "Start isearch."
+ (interactive)
+ (goto-char (point-min))
+ (let ((keys (this-command-keys)))
+ (when (eq (lookup-key isearch-mode-map keys) 'isearch-printing-char)
+ (isearch-mode t)
+ (isearch-process-search-char (string-to-char keys)))))
+
(defun org-goto-ret (&optional arg)
"Finish `org-goto' by going to the new location."
(interactive "P")
@@ -7204,7 +7266,7 @@ so this really moves item trees."
(let ((kill-whole-line t))
(kill-line (- ne-ins ne-beg)) (point)))
(insert (make-string (- ne-ins ne-beg) ?\n)))
-
+
(org-maybe-renumber-ordered-list))
(goto-char pos)
(error "Cannot move this item further up"))))
@@ -7527,7 +7589,7 @@ C-c C-c Set tags / toggle checkbox"
"Unconditionally turn on `orgstruct-mode', and force org-mode indentations.
In addition to setting orgstruct-mode, this also exports all indentation and
autofilling variables from org-mode into the buffer. Note that turning
-off orgstruct-mode will *not* remove these additonal settings."
+off orgstruct-mode will *not* remove these additional settings."
(orgstruct-mode 1)
(let (var val)
(mapc
@@ -7692,6 +7754,7 @@ this heading."
;; 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)))
@@ -7864,7 +7927,7 @@ When TAG is non-nil, don't move trees, but mark them with the ARCHIVE tag."
(progn
(setq re1 (concat "^" (regexp-quote
(make-string
- (1+ (- (match-end 0) (match-beginning 0)))
+ (1+ (- (match-end 0) (match-beginning 0) 1))
?*))
" "))
(move-marker begm (point))
@@ -11658,9 +11721,9 @@ TeXInfo are:
%s for the original field value. For example, to wrap
everything in @kbd{}, you could use :fmt \"@kbd{%s}\".
This may also be a property list with column numbers and
- formats. for example :fmt (2 \"@kbd{%s}\" 4 \"@code{%s}\").
+ formats. For example :fmt (2 \"@kbd{%s}\" 4 \"@code{%s}\").
-:cf \"f1 f2..\" The column fractions for the table. Bye default these
+:cf \"f1 f2..\" The column fractions for the table. By default these
are computed automatically from the width of the columns
under org-mode.
@@ -13039,8 +13102,8 @@ use sequences."
(mh-show-buffer-message-number))))
(defun org-mhe-get-header (header)
- "Return a header of the message in folder mode. This will create a
-show buffer for the corresponding message. If you have a more clever
+ "Return a header of the message in folder mode. This will create a
+show buffer for the corresponding message. If you have a more clever
idea..."
(let* ((folder (org-mhe-get-message-folder))
(num (org-mhe-get-message-num))
@@ -13194,7 +13257,9 @@ If the file does not exist, an error is thrown."
(while (string-match "['\"]%s['\"]" cmd)
(setq cmd (replace-match "%s" t t cmd)))
(while (string-match "%s" cmd)
- (setq cmd (replace-match (shell-quote-argument file) t t cmd)))
+ (setq cmd (replace-match
+ (save-match-data (shell-quote-argument file))
+ t t cmd)))
(save-window-excursion
(start-process-shell-command cmd nil cmd)))
((or (stringp cmd)
@@ -13312,8 +13377,6 @@ RET at beg-of-buf -> Append to file as level 2 headline
"Initialize *remember* buffer with template, invoke `org-mode'.
This function should be placed into `remember-mode-hook' and in fact requires
to be run from that hook to function properly."
- (unless (fboundp 'remember-finalize)
- (defalias 'remember-finalize 'remember-buffer))
(if org-remember-templates
(let* ((entry (org-select-remember-template use-char))
(tpl (car entry))
@@ -13413,14 +13476,14 @@ to be run from that hook to function properly."
;; Turn on org-mode in the remember buffer, set local variables
(org-mode)
- (org-set-local 'org-finish-function 'remember-finalize)
+ (org-set-local 'org-finish-function 'org-remember-finalize)
(if (and file (string-match "\\S-" file) (not (file-directory-p file)))
(org-set-local 'org-default-notes-file file))
(if (and headline (stringp headline) (string-match "\\S-" headline))
(org-set-local 'org-remember-default-headline headline))
;; Interactive template entries
(goto-char (point-min))
- (while (re-search-forward "%^\\({\\([^}]*\\)}\\)?\\([guUtT]\\)?" nil t)
+ (while (re-search-forward "%^\\({\\([^}]*\\)}\\)?\\([gGuUtT]\\)?" nil t)
(setq char (if (match-end 3) (match-string 3))
prompt (if (match-end 2) (match-string 2)))
(goto-char (match-beginning 0))
@@ -13469,7 +13532,7 @@ to be run from that hook to function properly."
(replace-match "")
(and (re-search-forward "^[^#\n]" nil t) (backward-char 1))))
(org-mode)
- (org-set-local 'org-finish-function 'remember-finalize))
+ (org-set-local 'org-finish-function 'org-remember-finalize))
(when (save-excursion
(goto-char (point-min))
(re-search-forward "%!" nil t))
@@ -13484,6 +13547,18 @@ from that hook."
(when org-finish-function
(funcall org-finish-function)))
+(defun org-remember-finalize ()
+ "Finalize the remember process."
+ (unless (fboundp 'remember-finalize)
+ (defalias 'remember-finalize 'remember-buffer))
+ (when (and org-clock-marker
+ (equal (marker-buffer org-clock-marker) (current-buffer)))
+ ;; FIXME: test this, this is w/o notetaking!
+ (let (org-log-done) (org-clock-out)))
+ (when buffer-file-name
+ (save-buffer)
+ (setq buffer-file-name nil))
+ (remember-finalize))
;;;###autoload
(defun org-remember (&optional goto org-force-remember-template-char)
@@ -13599,10 +13674,12 @@ See also the variable `org-reverse-note-order'."
org-remember-store-without-prompt))
(file (cond
(fastp org-default-notes-file)
- ((and org-remember-use-refile-when-interactive
+ ((and (eq org-remember-interactive-interface 'refile)
org-refile-targets)
org-default-notes-file)
- (t (org-get-org-file))))
+ ((not (and (equal current-prefix-arg '(16))
+ org-remember-previous-location))
+ (org-get-org-file))))
(heading org-remember-default-headline)
(visiting (and file (org-find-base-buffer-visiting file)))
(org-startup-folded nil)
@@ -13645,7 +13722,7 @@ See also the variable `org-reverse-note-order'."
(erase-buffer)
(insert txt)
(goto-char (point-min))
- (when (and org-remember-use-refile-when-interactive
+ (when (and (eq org-remember-interactive-interface 'refile)
(not fastp))
(org-refile nil (or visiting (find-file-noselect file)))
(throw 'quit t))
@@ -13676,13 +13753,22 @@ See also the variable `org-reverse-note-order'."
(insert "* " heading "\n")
(setq org-goto-start-pos (point-at-bol 0)))))
- ;; Ask the User for a location
- (if fastp
- (setq spos org-goto-start-pos
- exitcmd 'return)
- (setq spos (org-get-location (current-buffer) org-remember-help)
+ ;; Ask the User for a location, using the appropriate interface
+ (cond
+ (fastp (setq spos org-goto-start-pos
+ exitcmd 'return))
+ ((eq org-remember-interactive-interface 'outline)
+ (setq spos (org-get-location (current-buffer)
+ org-remember-help)
exitcmd (cdr spos)
spos (car spos)))
+ ((eq org-remember-interactive-interface 'outline-path-completion)
+ (let ((org-refile-targets '((nil . (:maxlevel . 10))))
+ (org-refile-use-outline-path t))
+ (setq spos (org-refile-get-location "Heading: ")
+ exitcmd 'return
+ spos (nth 3 spos))))
+ (t (error "this should not hapen")))
(if (not spos) (throw 'quit nil)) ; return nil to show we did
; not handle this note
(goto-char spos)
@@ -13744,7 +13830,7 @@ See also the variable `org-reverse-note-order'."
(when remember-save-after-remembering
(save-buffer)
(if (not visiting) (kill-buffer (current-buffer)))))))))
-
+
t) ;; return t to indicate that we took care of this note.
(defun org-get-org-file ()
@@ -13779,7 +13865,7 @@ See also the variable `org-reverse-note-order'."
(defun org-get-refile-targets (&optional default-buffer)
"Produce a table with refile targets."
(let ((entries (or org-refile-targets '((nil . (:level . 1)))))
- org-agenda-new-buffers targets txt re files f desc descre)
+ targets txt re files f desc descre)
(with-current-buffer (or default-buffer (current-buffer))
(while (setq entry (pop entries))
(setq files (car entry) desc (cdr entry))
@@ -13844,10 +13930,10 @@ See also the variable `org-reverse-note-order'."
"/")))
(push (list txt f re (point)) targets))
(goto-char (point-at-eol))))))))
- (org-release-buffers org-agenda-new-buffers)
(nreverse targets))))
-
+
(defun org-get-outline-path ()
+ "Return the outline path to the current entry, as a list."
(let (rtn)
(save-excursion
(while (org-up-heading-safe)
@@ -13858,7 +13944,7 @@ See also the variable `org-reverse-note-order'."
(defvar org-refile-history nil
"History for refiling operations.")
-(defun org-refile (&optional reversed-or-update default-buffer)
+(defun org-refile (&optional goto default-buffer)
"Move the entry at point to another heading.
The list of target headings is compiled using the information in
`org-refile-targets', which see. This list is created upon first use, and
@@ -13867,60 +13953,83 @@ FIXME: Can we find a better way of updating?
At the target location, the entry is filed as a subitem of the target heading.
Depending on `org-reverse-note-order', the new subitem will either be the
-first of the last subitem. A single C-u prefix will toggle the value of this
-variable for the duration of the command."
+first of the last subitem.
+
+With prefix are GOTO, the command will only visit the target location,
+not actually move anything.
+With a double prefix `C-c C-c', go to the location where the last refiling
+operation has put the subtree.
+
+With a double prefix argument, the command can be used to jump to any
+heading in the current buffer."
(interactive "P")
- (if (equal reversed-or-update '(16))
- (progn
- (setq org-refile-target-table (org-get-refile-targets default-buffer))
- (message "Refile targets updated (%d targets)"
- (length org-refile-target-table)))
- (when (or (not org-refile-target-table)
- (assq nil org-refile-targets))
- (setq org-refile-target-table (org-get-refile-targets default-buffer)))
- (unless org-refile-target-table
- (error "No refile targets"))
- (let* ((cbuf (current-buffer))
- (filename (buffer-file-name (buffer-base-buffer cbuf)))
- (fname (and filename (file-truename filename)))
- (tbl (mapcar
- (lambda (x)
- (if (not (equal fname (file-truename (nth 1 x))))
- (cons (concat (car x) " (" (file-name-nondirectory
- (nth 1 x)) ")")
- (cdr x))
- x))
- org-refile-target-table))
- (completion-ignore-case t)
- pos it nbuf file re level reversed)
- (when (setq it (completing-read "Refile to: " tbl
- nil t nil 'org-refile-history))
- (setq it (assoc it tbl)
- file (nth 1 it)
- re (nth 2 it))
- (org-copy-special)
- (save-excursion
- (set-buffer (setq nbuf (or (find-buffer-visiting file)
- (find-file-noselect file))))
- (setq reversed (org-notes-order-reversed-p))
- (if (equal reversed-or-update '(16)) (setq reversed (not reversed)))
+ (let* ((cbuf (current-buffer))
+ (filename (buffer-file-name (buffer-base-buffer cbuf)))
+ (fname (and filename (file-truename filename)))
+ pos it nbuf file re level reversed)
+ (if (equal goto '(16))
+ (org-refile-goto-last-stored)
+ (when (setq it (org-refile-get-location
+ (if goto "Goto: " "Refile to: ") default-buffer))
+ (setq file (nth 1 it)
+ re (nth 2 it)
+ pos (nth 3 it))
+ (setq nbuf (or (find-buffer-visiting file)
+ (find-file-noselect file)))
+ (if goto
+ (progn
+ (switch-to-buffer nbuf)
+ (goto-char pos)
+ (org-show-context 'org-goto))
+ (org-copy-special)
(save-excursion
- (save-restriction
- (widen)
- (goto-char (point-min))
- (unless (re-search-forward re nil t)
- (error "Cannot find target location - try again with `C-u' prefix."))
- (goto-char (match-beginning 0))
- (looking-at outline-regexp)
- (setq level (org-get-legal-level (funcall outline-level) 1))
- (goto-char (or (save-excursion
- (if reversed
- (outline-next-heading)
- (outline-get-next-sibling)))
- (point-max)))
- (org-paste-subtree level))))
- (org-cut-special)
- (message "Entry refiled to \"%s\"" (car it))))))
+ (set-buffer (setq nbuf (or (find-buffer-visiting file)
+ (find-file-noselect file))))
+ (setq reversed (org-notes-order-reversed-p))
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char pos)
+ (looking-at outline-regexp)
+ (setq level (org-get-legal-level (funcall outline-level) 1))
+ (goto-char (or (save-excursion
+ (if reversed
+ (outline-next-heading)
+ (outline-get-next-sibling)))
+ (point-max)))
+ (bookmark-set "org-refile-last-stored")
+ (org-paste-subtree level))))
+ (org-cut-special)
+ (message "Entry refiled to \"%s\"" (car it)))))))
+
+(defun org-refile-goto-last-stored ()
+ "Go to the location where the last refile was stored."
+ (interactive)
+ (bookmark-jump "org-refile-last-stored")
+ (message "This is the location of the last refile"))
+
+(defun org-refile-get-location (&optional prompt default-buffer)
+ "Prompt the user for a refile location, using PROMPT."
+ (let ((org-refile-targets org-refile-targets)
+ (org-refile-use-outline-path org-refile-use-outline-path))
+ (setq org-refile-target-table (org-get-refile-targets default-buffer)))
+ (unless org-refile-target-table
+ (error "No refile targets"))
+ (let* ((cbuf (current-buffer))
+ (filename (buffer-file-name (buffer-base-buffer cbuf)))
+ (fname (and filename (file-truename filename)))
+ (tbl (mapcar
+ (lambda (x)
+ (if (not (equal fname (file-truename (nth 1 x))))
+ (cons (concat (car x) " (" (file-name-nondirectory
+ (nth 1 x)) ")")
+ (cdr x))
+ x))
+ org-refile-target-table))
+ (completion-ignore-case t)
+ pos it nbuf file re level reversed)
+ (assoc (completing-read prompt tbl nil t nil 'org-refile-history)
+ tbl)))
;;;; Dynamic blocks
@@ -14524,17 +14633,19 @@ This function should be run in the `org-after-todo-state-change-hook'."
(org-back-to-heading t)
(org-add-planning-info nil nil 'closed)
(setq re (concat "\\(" org-scheduled-time-regexp "\\)\\|\\("
- org-deadline-time-regexp "\\)"))
+ org-deadline-time-regexp "\\)\\|\\("
+ org-ts-regexp "\\)"))
(while (re-search-forward
re (save-excursion (outline-next-heading) (point)) t)
- (setq type (if (match-end 1) org-scheduled-string org-deadline-string)
- ts (match-string (if (match-end 2) 2 4)))
+ (setq type (if (match-end 1) org-scheduled-string
+ (if (match-end 3) org-deadline-string "Plain:"))
+ ts (match-string (if (match-end 2) 2 (if (match-end 4) 4 0))))
(when (string-match "\\([-+]?[0-9]+\\)\\([dwmy]\\)" ts)
(setq n (string-to-number (match-string 1 ts))
what (match-string 2 ts))
(if (equal what "w") (setq n (* n 7) what "d"))
- (org-timestamp-change n (cdr (assoc what whata))))
- (setq msg (concat msg type org-last-changed-timestamp " ")))
+ (org-timestamp-change n (cdr (assoc what whata)))
+ (setq msg (concat msg type org-last-changed-timestamp " "))))
(setq org-log-post-message msg)
(message "%s" msg))))
@@ -15103,14 +15214,18 @@ also TODO lines."
"Return the list of all tags in all agenda buffer/files."
(save-excursion
(org-uniquify
- (apply 'append
- (mapcar
- (lambda (file)
- (set-buffer (find-file-noselect file))
- (org-get-buffer-tags))
- (if (and files (car files))
- files
- (org-agenda-files)))))))
+ (delq nil
+ (apply 'append
+ (mapcar
+ (lambda (file)
+ (set-buffer (find-file-noselect file))
+ (append (org-get-buffer-tags)
+ (mapcar (lambda (x) (if (stringp (car-safe x))
+ (list (car-safe x)) nil))
+ org-tag-alist)))
+ (if (and files (car files))
+ files
+ (org-agenda-files))))))))
(defun org-make-tags-matcher (match)
"Create the TAGS//TODO matcher form for the selection string MATCH."
@@ -15724,7 +15839,7 @@ If WHICH is nil or `all', get all properties. If WHICH is
(org-with-point-at pom
(let ((clockstr (substring org-clock-string 0 -1))
(excluded '("TODO" "TAGS" "ALLTAGS" "PRIORITY"))
- beg end range props sum-props key value string)
+ beg end range props sum-props key value string clocksum)
(save-excursion
(when (condition-case nil (org-back-to-heading t) (error nil))
(setq beg (point))
@@ -15775,7 +15890,7 @@ If WHICH is nil or `all', get all properties. If WHICH is
(unless (member key excluded)
(push (cons key (or value "")) props)))))
(if clocksum
- (push (cons "CLOCKSUM"
+ (push (cons "CLOCKSUM"
(org-column-number-to-string (/ (float clocksum) 60.)
'add_times))
props))
@@ -16173,6 +16288,7 @@ This is the compiled version of the format.")
(org-defkey org-columns-map "v" 'org-columns-show-value)
(org-defkey org-columns-map "q" 'org-columns-quit)
(org-defkey org-columns-map "r" 'org-columns-redo)
+(org-defkey org-columns-map "g" 'org-columns-redo)
(org-defkey org-columns-map [left] 'backward-char)
(org-defkey org-columns-map "\M-b" 'backward-char)
(org-defkey org-columns-map "a" 'org-columns-edit-allowed)
@@ -16456,7 +16572,8 @@ Where possible, use the standard interface for changing this line."
(org-columns-eval eval))
(org-columns-display-here))))
(move-to-column col)
- (if (nth 3 (assoc key org-columns-current-fmt-compiled))
+ (if (and (org-mode-p)
+ (nth 3 (assoc key org-columns-current-fmt-compiled)))
(org-columns-update key))))
(defun org-edit-headline () ; FIXME: this is not columns specific
@@ -16555,7 +16672,8 @@ Where possible, use the standard interface for changing this line."
(org-columns-eval '(org-entry-put pom key nval)))
(org-columns-display-here)))
(move-to-column col)
- (if (nth 3 (assoc key org-columns-current-fmt-compiled))
+ (if (and (org-mode-p)
+ (nth 3 (assoc key org-columns-current-fmt-compiled)))
(org-columns-update key))))
(defun org-verify-version (task)
@@ -17500,8 +17618,8 @@ user."
"Check string S for special relative date string.
TODAY and DEFAULT are internal times, for today and for a default.
Return shift list (N what def-flag)
-WHAT is \"d\", \"w\", \"m\", or \"y\" for day. week, month, year.
-N is the number if WHATs to shift
+WHAT is \"d\", \"w\", \"m\", or \"y\" for day, week, month, year.
+N is the number of WHATs to shift.
DEF-FLAG is t when a double ++ or -- indicates shift relative to
the DEFAULT date rather than TODAY."
(when (string-match
@@ -17823,7 +17941,7 @@ days in order to avoid rounding problems."
(defun org-time-string-to-time (s)
(apply 'encode-time (org-parse-time-string s)))
-(defun org-time-string-to-absolute (s &optional daynr)
+(defun org-time-string-to-absolute (s &optional daynr prefer)
"Convert a time stamp to an absolute day number.
If there is a specifyer for a cyclic time stamp, get the closest date to
DAYNR."
@@ -17834,7 +17952,8 @@ DAYNR."
(+ daynr 1000)))
((and daynr (string-match "\\+[0-9]+[dwmy]" s))
(org-closest-date s (if (and (boundp 'daynr) (integerp daynr)) daynr
- (time-to-days (current-time))) (match-string 0 s)))
+ (time-to-days (current-time))) (match-string 0 s)
+ prefer))
(t (time-to-days (apply 'encode-time (org-parse-time-string s))))))
(defun org-time-from-absolute (d)
@@ -17897,8 +18016,10 @@ This uses the icalendar.el library."
(delete-file tmpfile)
rtn))
-(defun org-closest-date (start current change)
- "Find the date closest to CURRENT that is consistent with START and CHANGE."
+(defun org-closest-date (start current change prefer)
+ "Find the date closest to CURRENT that is consistent with START and CHANGE.
+When PREFER is `past' return a date that is either CURRENT or past.
+When PREFER is `future', return a date that is either CURRENT or future."
;; Make the proper lists from the dates
(catch 'exit
(let ((a1 '(("d" . day) ("w" . week) ("m" . month) ("y" . year)))
@@ -17953,8 +18074,14 @@ This uses the icalendar.el library."
(setq n2 (calendar-absolute-from-gregorian (list m2 d y2))))))
(if org-agenda-repeating-timestamp-show-all
- (if (> (abs (- cday n1)) (abs (- cday n2))) n2 n1)
- (if (= cday n1) n1 n2)))))
+ (cond
+ ((eq prefer 'past) n1)
+ ((eq prefer 'future) (if (= cday n1) n1 n2))
+ (t (if (> (abs (- cday n1)) (abs (- cday n2))) n2 n1)))
+ (cond
+ ((eq prefer 'past) n1)
+ ((eq prefer 'future) (if (= cday n1) n1 n2))
+ (t (if (= cday n1) n1 n2)))))))
(defun org-date-to-gregorian (date)
"Turn any specification of DATE into a gregorian date for the calendar."
@@ -18687,20 +18814,141 @@ the returned times will be formatted strings."
(defun org-dblock-write:clocktable (params)
"Write the standard clocktable."
- (let ((hlchars '((1 . "*") (2 . "/")))
- (emph nil)
- (ins (make-marker))
- (total-time nil)
- ipos time h m p level hlc hdl maxlevel
- ts te cc block beg end pos scope tbl tostring multifile)
- (setq scope (plist-get params :scope)
- tostring (plist-get params :tostring)
- multifile (plist-get params :multifile)
- maxlevel (or (plist-get params :maxlevel) 3)
- emph (plist-get params :emphasize)
- ts (plist-get params :tstart)
- te (plist-get params :tend)
- block (plist-get params :block))
+ (catch 'exit
+ (let* ((hlchars '((1 . "*") (2 . "/")))
+ (ins (make-marker))
+ (total-time nil)
+ (scope (plist-get params :scope))
+ (tostring (plist-get params :tostring))
+ (multifile (plist-get params :multifile))
+ (header (plist-get params :header))
+ (maxlevel (or (plist-get params :maxlevel) 3))
+ (step (plist-get params :step))
+ (emph (plist-get params :emphasize))
+ (ts (plist-get params :tstart))
+ (te (plist-get params :tend))
+ (block (plist-get params :block))
+ ipos time h m p level hlc hdl
+ cc beg end pos tbl)
+ (when step
+ (org-clocktable-steps params)
+ (throw 'exit nil))
+ (when block
+ (setq cc (org-clock-special-range block nil t)
+ ts (car cc) te (cdr cc)))
+ (if ts (setq ts (time-to-seconds
+ (apply 'encode-time (org-parse-time-string ts)))))
+ (if te (setq te (time-to-seconds
+ (apply 'encode-time (org-parse-time-string te)))))
+ (move-marker ins (point))
+ (setq ipos (point))
+
+ ;; Get the right scope
+ (setq pos (point))
+ (save-restriction
+ (cond
+ ((not scope))
+ ((eq scope 'file) (widen))
+ ((eq scope 'subtree) (org-narrow-to-subtree))
+ ((eq scope 'tree)
+ (while (org-up-heading-safe))
+ (org-narrow-to-subtree))
+ ((and (symbolp scope) (string-match "^tree\\([0-9]+\\)$"
+ (symbol-name scope)))
+ (setq level (string-to-number (match-string 1 (symbol-name scope))))
+ (catch 'exit
+ (while (org-up-heading-safe)
+ (looking-at outline-regexp)
+ (if (<= (org-reduced-level (funcall outline-level)) level)
+ (throw 'exit nil))))
+ (org-narrow-to-subtree))
+ ((or (listp scope) (eq scope 'agenda))
+ (let* ((files (if (listp scope) scope (org-agenda-files)))
+ (scope 'agenda)
+ (p1 (copy-sequence params))
+ file)
+ (plist-put p1 :tostring t)
+ (plist-put p1 :multifile t)
+ (plist-put p1 :scope 'file)
+ (org-prepare-agenda-buffers files)
+ (while (setq file (pop files))
+ (with-current-buffer (find-buffer-visiting file)
+ (push (org-clocktable-add-file
+ file (org-dblock-write:clocktable p1)) tbl)
+ (setq total-time (+ (or total-time 0)
+ org-clock-file-total-minutes)))))))
+ (goto-char pos)
+
+ (unless (eq scope 'agenda)
+ (org-clock-sum ts te)
+ (goto-char (point-min))
+ (while (setq p (next-single-property-change (point) :org-clock-minutes))
+ (goto-char p)
+ (when (setq time (get-text-property p :org-clock-minutes))
+ (save-excursion
+ (beginning-of-line 1)
+ (when (and (looking-at (org-re "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[[:alnum:]_@:]+:\\)?[ \t]*$"))
+ (setq level (org-reduced-level
+ (- (match-end 1) (match-beginning 1))))
+ (<= level maxlevel))
+ (setq hlc (if emph (or (cdr (assoc level hlchars)) "") "")
+ hdl (match-string 2)
+ h (/ time 60)
+ m (- time (* 60 h)))
+ (if (and (not multifile) (= level 1)) (push "|-" tbl))
+ (push (concat
+ "| " (int-to-string level) "|" hlc hdl hlc " |"
+ (make-string (1- level) ?|)
+ hlc (format "%d:%02d" h m) hlc
+ " |") tbl))))))
+ (setq tbl (nreverse tbl))
+ (if tostring
+ (if tbl (mapconcat 'identity tbl "\n") nil)
+ (goto-char ins)
+ (insert-before-markers
+ (or header
+ (concat
+ "Clock summary at ["
+ (substring
+ (format-time-string (cdr org-time-stamp-formats))
+ 1 -1)
+ "]."
+ (if block
+ (format " Considered range is /%s/." block)
+ "")
+ "\n\n"))
+ (if (eq scope 'agenda) "|File" "")
+ "|L|Headline|Time|\n")
+ (setq total-time (or total-time org-clock-file-total-minutes)
+ h (/ total-time 60)
+ m (- total-time (* 60 h)))
+ (insert-before-markers
+ "|-\n|"
+ (if (eq scope 'agenda) "|" "")
+ "|"
+ "*Total time*| "
+ (format "*%d:%02d*" h m)
+ "|\n|-\n")
+ (setq tbl (delq nil tbl))
+ (if (and (stringp (car tbl)) (> (length (car tbl)) 1)
+ (equal (substring (car tbl) 0 2) "|-"))
+ (pop tbl))
+ (insert-before-markers (mapconcat
+ 'identity (delq nil tbl)
+ (if (eq scope 'agenda) "\n|-\n" "\n")))
+ (backward-delete-char 1)
+ (goto-char ipos)
+ (skip-chars-forward "^|")
+ (org-table-align))))))
+
+(defun org-clocktable-steps (params)
+ (let* ((p1 (copy-sequence params))
+ (ts (plist-get p1 :tstart))
+ (te (plist-get p1 :tend))
+ (step0 (plist-get p1 :step))
+ (step (cdr (assoc step0 '((day . 86400) (week . 604800)))))
+ (block (plist-get p1 :block))
+ cc)
(when block
(setq cc (org-clock-special-range block nil t)
ts (car cc) te (cdr cc)))
@@ -18708,104 +18956,23 @@ the returned times will be formatted strings."
(apply 'encode-time (org-parse-time-string ts)))))
(if te (setq te (time-to-seconds
(apply 'encode-time (org-parse-time-string te)))))
- (move-marker ins (point))
- (setq ipos (point))
+ (plist-put p1 :header "")
+ (plist-put p1 :step nil)
+ (plist-put p1 :block nil)
+ (while (< ts te)
+ (or (bolp) (insert "\n"))
+ (plist-put p1 :tstart (format-time-string
+ (car org-time-stamp-formats)
+ (seconds-to-time ts)))
+ (plist-put p1 :tend (format-time-string
+ (car org-time-stamp-formats)
+ (seconds-to-time (setq ts (+ ts step)))))
+ (insert "\n" (if (eq step0 'day) "Daily report: " "Weekly report starting on: ")
+ (plist-get p1 :tstart) "\n")
+ (org-dblock-write:clocktable p1)
+ (re-search-forward "#\\+END:")
+ (end-of-line 0))))
- ;; Get the right scope
- (setq pos (point))
- (save-restriction
- (cond
- ((not scope))
- ((eq scope 'file) (widen))
- ((eq scope 'subtree) (org-narrow-to-subtree))
- ((eq scope 'tree)
- (while (org-up-heading-safe))
- (org-narrow-to-subtree))
- ((and (symbolp scope) (string-match "^tree\\([0-9]+\\)$"
- (symbol-name scope)))
- (setq level (string-to-number (match-string 1 (symbol-name scope))))
- (catch 'exit
- (while (org-up-heading-safe)
- (looking-at outline-regexp)
- (if (<= (org-reduced-level (funcall outline-level)) level)
- (throw 'exit nil))))
- (org-narrow-to-subtree))
- ((or (listp scope) (eq scope 'agenda))
- (let* ((files (if (listp scope) scope (org-agenda-files)))
- (scope 'agenda)
- (p1 (copy-sequence params))
- file)
- (plist-put p1 :tostring t)
- (plist-put p1 :multifile t)
- (plist-put p1 :scope 'file)
- (org-prepare-agenda-buffers files)
- (while (setq file (pop files))
- (with-current-buffer (find-buffer-visiting file)
- (push (org-clocktable-add-file
- file (org-dblock-write:clocktable p1)) tbl)
- (setq total-time (+ (or total-time 0)
- org-clock-file-total-minutes)))))))
- (goto-char pos)
-
- (unless (eq scope 'agenda)
- (org-clock-sum ts te)
- (goto-char (point-min))
- (while (setq p (next-single-property-change (point) :org-clock-minutes))
- (goto-char p)
- (when (setq time (get-text-property p :org-clock-minutes))
- (save-excursion
- (beginning-of-line 1)
- (when (and (looking-at (org-re "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[[:alnum:]_@:]+:\\)?[ \t]*$"))
- (setq level (org-reduced-level
- (- (match-end 1) (match-beginning 1))))
- (<= level maxlevel))
- (setq hlc (if emph (or (cdr (assoc level hlchars)) "") "")
- hdl (match-string 2)
- h (/ time 60)
- m (- time (* 60 h)))
- (if (and (not multifile) (= level 1)) (push "|-" tbl))
- (push (concat
- "| " (int-to-string level) "|" hlc hdl hlc " |"
- (make-string (1- level) ?|)
- hlc (format "%d:%02d" h m) hlc
- " |") tbl))))))
- (setq tbl (nreverse tbl))
- (if tostring
- (if tbl (mapconcat 'identity tbl "\n") nil)
- (goto-char ins)
- (insert-before-markers
- "Clock summary at ["
- (substring
- (format-time-string (cdr org-time-stamp-formats))
- 1 -1)
- "]."
- (if block
- (format " Considered range is /%s/." block)
- "")
- "\n\n"
- (if (eq scope 'agenda) "|File" "")
- "|L|Headline|Time|\n")
- (setq total-time (or total-time org-clock-file-total-minutes)
- h (/ total-time 60)
- m (- total-time (* 60 h)))
- (insert-before-markers
- "|-\n|"
- (if (eq scope 'agenda) "|" "")
- "|"
- "*Total time*| "
- (format "*%d:%02d*" h m)
- "|\n|-\n")
- (setq tbl (delq nil tbl))
- (if (and (stringp (car tbl)) (> (length (car tbl)) 1)
- (equal (substring (car tbl) 0 2) "|-"))
- (pop tbl))
- (insert-before-markers (mapconcat
- 'identity (delq nil tbl)
- (if (eq scope 'agenda) "\n|-\n" "\n")))
- (backward-delete-char 1)
- (goto-char ipos)
- (skip-chars-forward "^|")
- (org-table-align)))))
(defun org-clocktable-add-file (file table)
(if table
@@ -19470,7 +19637,7 @@ L Timeline for current buffer # List stuck projects (!=configure)
((and (> (length selstring) 0) (eq c ?\d))
(delete-window)
(org-agenda-get-restriction-and-command prefix-descriptions))
-
+
((equal c ?q) (error "Abort"))
(t (error "Invalid key %c" c))))))))
@@ -19517,7 +19684,7 @@ L Timeline for current buffer # List stuck projects (!=configure)
"Run an agenda command in batch mode and send the result to STDOUT.
If CMD-KEY is a string of length 1, it is used as a key in
`org-agenda-custom-commands' and triggers this command. If it is a
-longer string is is used as a tags/todo match string.
+longer string it is used as a tags/todo match string.
Paramters are alternating variable names and values that will be bound
before running the agenda command."
(let (pars)
@@ -19542,7 +19709,7 @@ before running the agenda command."
"Run an agenda command in batch mode and send the result to STDOUT.
If CMD-KEY is a string of length 1, it is used as a key in
`org-agenda-custom-commands' and triggers this command. If it is a
-longer string is is used as a tags/todo match string.
+longer string it is used as a tags/todo match string.
Paramters are alternating variable names and values that will be bound
before running the agenda command.
@@ -19599,7 +19766,7 @@ agenda-day The day in the agenda where this is listed"
(defun org-fix-agenda-info (props)
"Make sure all properties on an agenda item have a canonical form,
-so the the export commands caneasily use it."
+so the export commands can easily use it."
(let (tmp re)
(when (setq tmp (plist-get props 'tags))
(setq props (plist-put props 'tags (mapconcat 'identity tmp ":"))))
@@ -19950,7 +20117,9 @@ Optional argument FILE means, use this file instead of the current."
(org-agenda-columns))
(when org-agenda-fontify-priorities
(org-fontify-priorities))
- (run-hooks 'org-finalize-agenda-hook))))
+ (run-hooks 'org-finalize-agenda-hook)
+ (setq org-agenda-type (get-text-property (point) 'org-agenda-type))
+ )))
(defun org-fontify-priorities ()
"Make highest priority lines bold, and lowest italic."
@@ -20187,14 +20356,16 @@ dates."
(org-finalize-agenda)
(setq buffer-read-only t)))
-(defun org-get-all-dates (beg end &optional no-ranges force-today inactive empty)
+(defun org-get-all-dates (beg end &optional no-ranges force-today inactive empty pre-re)
"Return a list of all relevant day numbers from BEG to END buffer positions.
If NO-RANGES is non-nil, include only the start and end dates of a range,
not every single day in the range. If FORCE-TODAY is non-nil, make
sure that TODAY is included in the list. If INACTIVE is non-nil, also
inactive time stamps (those in square brackets) are included.
When EMPTY is non-nil, also include days without any entries."
- (let ((re (if inactive org-ts-regexp-both org-ts-regexp))
+ (let ((re (concat
+ (if pre-re pre-re "")
+ (if inactive org-ts-regexp-both org-ts-regexp)))
dates dates1 date day day1 day2 ts1 ts2)
(if force-today
(setq dates (list (time-to-days (current-time)))))
@@ -21158,7 +21329,7 @@ the documentation of `org-diary'."
(org-agenda-skip)
(setq s (match-string 1)
pos (1- (match-beginning 1))
- d2 (org-time-string-to-absolute (match-string 1) d1)
+ d2 (org-time-string-to-absolute (match-string 1) d1 'past)
diff (- d2 d1)
wdays (org-get-wdays s)
dfrac (/ (* 1.0 (- wdays diff)) wdays)
@@ -21240,7 +21411,10 @@ FRACTION is what fraction of the head-warning time has passed."
(org-agenda-skip)
(setq s (match-string 1)
pos (1- (match-beginning 1))
- d2 (org-time-string-to-absolute (match-string 1) d1)
+ d2 (org-time-string-to-absolute (match-string 1) d1 'past)
+;;; is this right?
+;;; do we need to do this for deadleine too????
+;;; d2 (org-time-string-to-absolute (match-string 1) (if todayp nil d1))
diff (- d2 d1))
(setq pastschedp (and todayp (< diff 0)))
;; When to show a scheduled item in the calendar:
@@ -26694,7 +26868,7 @@ Also updates the keyword regular expressions."
(message "Org-mode restarted to refresh keyword and special line setup"))
(defun org-kill-note-or-show-branches ()
- "If this is a Note buffer, abort storing the note. Else call `show-branches'."
+ "If this is a Note buffer, abort storing the note. Else call `show-branches'."
(interactive)
(if (not org-finish-function)
(call-interactively 'show-branches)
@@ -27170,6 +27344,28 @@ really on, so that the block visually is on the match."
(mapcar (lambda (x) (or (get-file-buffer x) (find-file-noselect x))) files)
regexp)))
+(if (boundp 'occur-mode-find-occurrence-hook)
+ ;; Emacs 23
+ (add-hook 'occur-mode-find-occurrence-hook
+ (lambda ()
+ (when (org-mode-p)
+ (org-reveal))))
+ ;; Emacs 22
+ (defadvice occur-mode-goto-occurrence
+ (after org-occur-reveal activate)
+ (and (org-mode-p) (org-reveal)))
+ (defadvice occur-mode-goto-occurrence-other-window
+ (after org-occur-reveal activate)
+ (and (org-mode-p) (org-reveal)))
+ (defadvice occur-mode-display-occurrence
+ (after org-occur-reveal activate)
+ (when (org-mode-p)
+ (let ((pos (occur-mode-find-occurrence)))
+ (with-current-buffer (marker-buffer pos)
+ (save-excursion
+ (goto-char pos)
+ (org-reveal)))))))
+
(defun org-uniquify (list)
"Remove duplicate elements from LIST."
(let (res)
@@ -27393,7 +27589,12 @@ not an indirect buffer"
;; `adaptive-fill-regexp' never matches. Then install our own matcher.
(org-set-local 'adaptive-fill-regexp "\000")
(org-set-local 'adaptive-fill-function
- 'org-adaptive-fill-function))
+ 'org-adaptive-fill-function)
+ (org-set-local
+ 'align-mode-rules-list
+ '((org-in-buffer-settings
+ (regexp . "^#\\+[A-Z_]+:\\(\\s-*\\)\\S-+")
+ (modes . '(org-mode))))))
(defun org-fill-paragraph (&optional justify)
"Re-align a table, pass through to fill-paragraph if no table."
@@ -27835,6 +28036,15 @@ Still experimental, may disappear in the future."
;; make tree, check each match with the callback
(org-occur "CLOSED: +\\[\\(.*?\\)\\]" nil callback)))
+
+
+;(let ((org-refile-targets org-refile-targets)
+; (org-refile-use-outline-path org-refile-use-outline-path))
+; (when (equal just-goto '(16))
+; (setq org-refile-targets '((nil . (:maxlevel . 10))))
+; (setq org-refile-use-outline-path t))
+; (setq org-refile-target-table (org-get-refile-targets default-buffer)))
+
;;;; Finish up
(provide 'org)
diff --git a/org.texi b/org.texi
index 3583009..ff376e5 100644
--- a/org.texi
+++ b/org.texi
@@ -3,7 +3,7 @@
@setfilename ../../info/org
@settitle Org Mode Manual
-@set VERSION 5.19
+@set VERSION 5.20
@set DATE January 2008
@dircategory Emacs
@@ -1252,7 +1252,7 @@ Org-mode comes with a fast and intuitive table editor. Spreadsheet-like
calculations are supported in connection with the Emacs @file{calc}
package
@ifinfo
-(@pxref{Calc,,,calc,Gnu Emacs Calculator Manual}).
+(@pxref{Top,Calc,,calc,Gnu Emacs Calculator Manual}).
@end ifinfo
@ifnotinfo
(see the Emacs Calculator manual for more information about the Emacs
@@ -3409,7 +3409,7 @@ application of properties, imagine keeping track of one's music CD's,
where properties could be things such as the album artist, date of
release, number of tracks, and so on.
-Properties can be conveiently edited and viewed in column view
+Properties can be conveniently edited and viewed in column view
(@pxref{Column view}).
Properties are like tags, but with a value. For example, in a file
@@ -3739,6 +3739,12 @@ the entire tree, starting from the entry that contains the @code{:COLUMNS:}
property. If none is found, the format is taken from the @code{#+COLUMNS}
line or from the variable @code{org-columns-default-format}, and column
view is established for the current entry and its subtree.
+@kindex r
+@item r
+Recreate the column view, to included hanges happening in the buffer.
+@kindex g
+@item g
+Same as @kbd{r}.
@kindex q
@item q
Exit column view.
@@ -4270,8 +4276,8 @@ the scheduling date from the entry.
@subsection Repeated Tasks
Some tasks need to be repeated again and again. Org-mode helps to
-organize such tasks using a so-called repeater in a DEADLINE or
-SCHEDULED time stamp. In the following example
+organize such tasks using a so-called repeater in a DEADLINE, SCHEDULED,
+or plain time stamp. In the following example
@example
** TODO Pay the rent
DEADLINE: <2005-10-01 Sat +1m>
@@ -4284,7 +4290,7 @@ Deadlines and scheduled items produce entries in the agenda when they
are over-due, so it is important to be able to mark such an entry as
completed once you have done so. When you mark a DEADLINE or a SCHEDULE
with the todo keyword DONE, it will no longer produce entries in the
-agenda. The problem with this is, however, that then also the
+agenda. The problem with this is, however, that then also the
@emph{next} instance of the repeated entry will not be active. Org-mode
deals with this in the following way: When you try to mark such an entry
DONE (using @kbd{C-c C-t}), it will shift the base date of the repeating
@@ -4393,6 +4399,7 @@ new table. The @samp{BEGIN} line can specify options:
@r{@code{thismonth}, @code{lastmonth}, @code{thisyear}, or @code{lastyear}}.
:tstart @r{A time string specifying when to start considering times}
:tend @r{A time string specifying when to stop considering times}
+:step @r{@code{week} or @code{day}, to split the table into chunks}
@end example
So to get a clock summary of the current level 1 tree, for the current
day, you could write
@@ -4466,7 +4473,9 @@ suggestion.}. @code{org-remember} basically just calls @code{remember},
but it makes a few things easier: If there is an active region, it will
automatically copy the region into the remember buffer. It also allows
to jump to the buffer and location where remember notes are being
-stored: Just call @code{org-remember} with a prefix argument.
+stored: Just call @code{org-remember} with a prefix argument. If you
+use two prefix arguments, Org-mode jumps to the location where the last
+remember note was stored.
@node Remember templates, Storing notes, Setting up remember, Remember
@section Remember templates
@@ -4633,13 +4642,16 @@ Refile the entry at point. This command offers possible locations for
refiling the entry and lets you select one with completion. The item is
filed below the target heading as a subitem. Depending on
@code{org-reverse-note-order}, it will be either the first of last
-subitem, and you can toggle the value of this variable for the duration
-of the command by using a @kbd{C-u} prefix.@* By default, all level 1
-headlines in the current buffer are considered to be targets, but you
-can have more complex definitions across a number of files. See the
-variable @code{org-refile-targets} for details. The list of targets is
-compiled upon first use, you can update it by using a double prefix
-argument (@kbd{C-u C-u}) to this command.
+subitem.@* By default, all level 1 headlines in the current buffer are
+considered to be targets, but you can have more complex definitions
+across a number of files. See the variable @code{org-refile-targets}
+for details.
+@kindex C-u C-c C-w
+@item C-u C-c C-w
+Use the refile interface to jump to a heading.
+@kindex C-u C-u C-c C-w
+@item C- C-u C-c C-w
+Jump to the location where @code{org-refile} last moved a tree to.
@end table
@node Agenda views, Embedded LaTeX, Remember, Top
@@ -5281,8 +5293,8 @@ month and year views are slow to create, the do not become the default.
@item D
Toggle the inclusion of diary entries. See @ref{Weekly/Daily agenda}.
@c
-@kindex g
-@item g
+@kindex G
+@item G
Toggle the time grid on and off. See also the variables
@code{org-agenda-use-time-grid} and @code{org-agenda-time-grid}.
@c
@@ -5293,6 +5305,9 @@ after modification of the time stamps of items with S-@key{left} and
S-@key{right}. When the buffer is the global todo list, a prefix
argument is interpreted to create a selective list for a specific TODO
keyword.
+@kindex g
+@item g
+Same as @kbd{r}.
@c
@kindex s
@kindex C-x C-s
diff --git a/orgcard.tex b/orgcard.tex
index f0651fa..5abc74b 100644
--- a/orgcard.tex
+++ b/orgcard.tex
@@ -1,5 +1,5 @@
% Reference Card for Org Mode
-\def\orgversionnumber{5.19}
+\def\orgversionnumber{5.20}
\def\versionyear{2008} % latest update
\def\year{2008} % latest copyright year
@@ -635,9 +635,9 @@ after ``{\tt :}'', and dictionary words elsewhere.
\key{delete other windows}{o}
\key{switch to day/week/month/year view}{d w m y}
\key{toggle inclusion of diary entries}{D}
-\key{toggle time grid for daily schedule}{g}
+\key{toggle time grid for daily schedule}{G}
\key{toggle display of logbook entries}{l}
-\key{refresh agenda buffer with any changes}{r}
+\key{refresh agenda buffer with any changes}{r / g}
\key{save all org-mode buffers}{s}
\key{display the following \kbd{org-agenda-ndays}}{RIGHT}
\key{display the previous \kbd{org-agenda-ndays}}{LEFT}
diff --git a/orgcard.txt b/orgcard.txt
new file mode 100644
index 0000000..cc7aff3
--- /dev/null
+++ b/orgcard.txt
@@ -0,0 +1,457 @@
+================================================================================
+Org-Mode Reference Card (for version 4.79)
+================================================================================
+
+================================================================================
+Getting Started
+================================================================================
+
+(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
+(define-key global-map "\C-cl" 'org-store-link) [1]
+(define-key global-map "\C-ca" 'org-agenda) [1]
+
+For the many customization options try M-x org-customize
+To read the on-line documentation try M-x org-info
+
+================================================================================
+Visibility Cycling
+================================================================================
+
+rotate current subtree between states TAB
+rotate entire buffer between states S-TAB
+show the whole file C-c C-a
+reveal context around point C-c C-r
+show subtree in indirect buffer, ded. frame C-c C-k
+
+================================================================================
+Motion
+================================================================================
+
+next/previous heading C-c C-n/p
+next/previous heading, same level C-c C-f/b
+backward to higher level heading C-c C-u
+jump to another place in document C-c C-j
+previous/next plain list item S-UP/DOWN [3]
+
+================================================================================
+Structure Editing
+================================================================================
+
+insert new heading/item at current level M-RET
+insert new TODO entry/checkbox item M-S-RET
+promote current heading up one level M-LEFT
+demote current heading down one level M-RIGHT
+promote current subtree up one level M-S-LEFT
+demote current subtree down one level M-S-RIGHT
+move subtree/list item up/down M-S-UP/DOWN
+kill subtree C-c C-x C-w
+copy subtree C-c C-x M-w
+yank subtree C-c C-x C-y
+narrow buffer to current subtree C-x n s
+
+================================================================================
+Archiving
+================================================================================
+
+toggle ARCHIVE tag C-c C-x C-a
+force cycling of an ARCHIVEd tree C-TAB
+move subtree to archive file C-c C-x C-s
+
+================================================================================
+Filtering and Sparse Trees
+================================================================================
+
+show sparse tree for all matches of a regexp C-c /
+view TODO's in sparse tree C-c C-v
+global TODO list in agenda mode C-c t [1]
+create sparse tree with all deadlines due C-c C-w
+time sorted view of current org file C-c a L
+
+================================================================================
+Tables
+================================================================================
+
+--------------------------------------------------------------------------------
+Creating a table
+--------------------------------------------------------------------------------
+
+just start typing, e.g. |Name|Phone|Age RET |- TAB
+convert region to table C-c |
+... separator at least 3 spaces C-3 C-c |
+
+--------------------------------------------------------------------------------
+Commands available inside tables
+--------------------------------------------------------------------------------
+
+The following commands work when the cursor is inside a table. Outside of
+tables, the same keys may have other functionality.
+
+--------------------------------------------------------------------------------
+Re-aligning and field motion
+--------------------------------------------------------------------------------
+
+re-align the table without moving the cursor C-c C-c
+re-align the table, move to next field TAB
+move to previous field S-TAB
+re-align the table, move to next row RET
+
+--------------------------------------------------------------------------------
+Row and column editing
+--------------------------------------------------------------------------------
+
+move the current column left M-LEFT/RIGHT
+kill the current column M-S-LEFT
+insert new column to left of cursor position M-S-RIGHT
+move the current row up/down M-UP/DOWN
+kill the current row or horizontal line M-S-UP
+insert new row above the current row M-S-DOWN
+insert hline below (C-u : above) current row C-c -
+sort lines in region C-c ^
+
+--------------------------------------------------------------------------------
+Regions
+--------------------------------------------------------------------------------
+
+cut rectangular region C-c C-x C-w
+copy rectangular region C-c C-x M-w
+paste rectangular region C-c C-x C-y
+fill paragraph across selected cells C-c C-q
+
+--------------------------------------------------------------------------------
+Miscellaneous
+--------------------------------------------------------------------------------
+
+to limit column width to N characters, use ...| <N> |...
+edit the current field in a separate window C-c `
+make current field fully visible C-u TAB
+export as tab-separated file M-x org-table-export
+import tab-separated file M-x org-table-import
+sum numbers in current column/rectangle C-c +
+
+--------------------------------------------------------------------------------
+Tables created with the table.el package
+--------------------------------------------------------------------------------
+
+insert a new table.el table C-c ~
+recognize existing table.el table C-c C-c
+convert table (Org-mode <-> table.el) C-c ~
+
+--------------------------------------------------------------------------------
+Spreadsheet
+--------------------------------------------------------------------------------
+
+Formulas typed in field are executed by TAB, RET and C-c C-c. = introduces a
+column formula, := a field formula.
+
+Example: Add Col1 and Col2 |=$1+$2 |
+... with printf format specification |=$1+$2;%.2f|
+... with constants from constants.el |=$1/$c/$cm |
+sum from 2nd to 3rd hline |:=vsum(@II..@III)|
+apply current column formula | = |
+set and eval column formula C-c =
+set and eval field formula C-u C-c =
+re-apply all stored equations to current line C-c *
+re-apply all stored equations to entire table C-u C-c *
+iterate table to stability C-u C-u C-c *
+rotate calculation mark through # * ! $ C-#
+show line, column, formula reference C-c ?
+toggle coordinate grid C-c }
+toggle formula debugger C-c {
+
+--------------------------------------------------------------------------------
+Formula Editor
+--------------------------------------------------------------------------------
+
+edit formulas in separate buffer C-c '
+exit and install new formulas C-c C-c
+exit, install, and apply new formulas C-u C-c C-c
+abort C-c C-q
+toggle reference style C-c C-r
+pretty-print Lisp formula TAB
+complete Lisp symbol M-TAB
+shift reference point S-cursor
+shift test line for column references M-up/down
+scroll the window showing the table M-S-up/down
+toggle table coordinate grid C-c }
+
+================================================================================
+Links
+================================================================================
+
+globally store link to the current location C-c l [1]
+insert a link (TAB completes stored links) C-c C-l
+insert file link with file name completion C-u C-c C-l
+edit (also hidden part of) link at point C-c C-l
+open file links in emacs C-c C-o
+... force open in emacs/other window C-u C-c C-o
+open link at point mouse-1/2
+... force open in emacs/other window mouse-3
+record a position in mark ring C-c %
+jump back to last followed link(s) C-c &
+find next link C-c C-x C-n
+find previous link C-c C-x C-p
+
+--------------------------------------------------------------------------------
+Internal Links
+--------------------------------------------------------------------------------
+
+<<My Target>> target
+<<<My Target>>> radio target [2]
+[[*this text]] find headline
+[[this text]] find target or text in buffer
+[[this text][description]] optional link text
+
+--------------------------------------------------------------------------------
+External Links
+--------------------------------------------------------------------------------
+
+file:/home/dominik/img/mars.jpg file, absolute
+file:papers/last.pdf file, relative
+file:projects.org::*that text find headline
+file:projects.org::find me find trgt/string
+http://www.astro.uva.nl/dominik on the web
+mailto:adent@galaxy.net Email address
+news:comp.emacs Usenet group
+bbdb:Richard Stallman BBDB person
+gnus:group GNUS group
+gnus:group#id GNUS message
+vm|wl|mhe|rmail:folder Mail folder
+vm|wl|mhe|rmail:folder#id Mail message
+info:emacs:Regexps Info file:node
+shell:ls *.org shell command
+elisp:(calendar) elisp form
+[[external link][description]] optional link text
+
+================================================================================
+Completion
+================================================================================
+
+In-buffer completion completes TODO keywords at headline start, TeX macros
+after `\', option keywords after `#-â', TAGS after `:', and dictionary words
+elsewhere.
+
+complete word at point M-TAB
+
+================================================================================
+TODO Items and Checkboxes
+================================================================================
+
+rotate the state of the current item C-c C-t
+select next/previous state S-LEFT/RIGHT
+select next/previous set C-S-LEFT/RIGHT
+view TODO items in a sparse tree C-c C-v
+view 3rd TODO keyword's sparse tree C-3 C-c C-v
+set the priority of the current item C-c , [ABC]
+remove priority cookie from current item C-c , SPC
+raise/lower priority of current item S-UP/DOWN [3]
+insert new checkbox item in plain list M-S-RET
+toggle checkbox(es) in region/entry/at point C-c C-x C-b
+toggle checkbox at point C-c C-c
+checkbox statistics cookies insert [/] or [%]
+update checkbox statistics (C-u : whole file) C-c #
+
+================================================================================
+Tags
+================================================================================
+
+set tags for current heading C-c C-c
+realign tags in all headings C-u C-c C-c
+create sparse tree with matching tags C-c \
+globally (agenda) match tags at cursor C-c C-o
+
+================================================================================
+Timestamps
+================================================================================
+
+prompt for date and insert timestamp C-c .
+like C-c . but insert date and time format C-u C-c .
+like C-c . but make stamp inactive C-c !
+insert DEADLINE timestamp C-c C-d
+insert SCHEDULED timestamp C-c C-s
+create sparse tree with all deadlines due C-c C-w
+the time between 2 dates in a time range C-c C-y
+change timestamp at cursor by ±1 day S-RIGHT/LEFT [3]
+change year/month/day at cursor by ±1 S-UP/DOWN [3]
+access the calendar for the current date C-c >
+insert timestamp matching date in calendar C-c <
+access agenda for current date C-c C-o
+select date while prompted mouse-1/RET
+toggle custom format display for dates/times C-c C-x C-t
+
+--------------------------------------------------------------------------------
+Clocking time
+--------------------------------------------------------------------------------
+
+start clock on current item C-c C-x C-i
+stop clock on current item C-c C-x C-o
+cancel current clock C-c C-x C-x
+display total subtree times C-c C-x C-d
+remove displayed times C-c C-c
+insert/update table with clock report C-c C-x C-r
+
+================================================================================
+LaTeX and cdlatex-mode
+================================================================================
+
+preview LaTeX fragment C-c C-x C-l
+expand abbreviation (cdlatex-mode) TAB
+insert/modify math symbol (cdlatex-mode) ` / '
+
+================================================================================
+Agenda Views
+================================================================================
+
+add/move current file to front of agenda C-c [
+remove current file from your agenda C-c ]
+cycle through agenda file list C-'
+compile agenda for the current week C-c a a [1]
+compile global TODO list C-c a t [1]
+compile TODO list for specific keyword C-c a T [1]
+match tags in agenda files C-c a m [1]
+match tags in TODO entries C-c a M [1]
+find stuck projects C-c a # [1]
+show timeline of current org file C-c a L [1]
+configure custom commands C-c a C [1]
+configure stuck projects C-c a ! [1]
+agenda for date at cursor C-c C-o
+
+To set categories, add lines like [2]:
+#+CATEGORY: MyCateg
+
+--------------------------------------------------------------------------------
+Commands available in an agenda buffer
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+View Org file
+--------------------------------------------------------------------------------
+
+show original location of item SPC/mouse-3
+show and recenter window L
+goto original location in other window TAB/mouse-2
+goto original location, delete other windows RET
+show subtree in indirect buffer, ded. frame b
+toggle follow-mode f
+
+--------------------------------------------------------------------------------
+Change display
+--------------------------------------------------------------------------------
+
+delete other windows o
+switch to daily / weekly view d / w
+toggle inclusion of diary entries D
+toggle time grid for daily schedule g
+toggle display of logbook entries l
+refresh agenda buffer with any changes r
+save all org-mode buffers s
+display the following org-agenda-ndays RIGHT
+display the previous org-agenda-ndays LEFT
+goto today .
+
+--------------------------------------------------------------------------------
+Remote editing
+--------------------------------------------------------------------------------
+
+digit argument 0-9
+change state of current TODO item t
+kill item and source C-k
+archive the subtree $
+show tags of current headline T
+set tags for current headline :
+toggle ARCHIVE tag a
+set priority of current item p
+raise/lower priority of current item S-UP/DOWN [3]
+display weighted priority of current item P
+schedule/set deadline for this item C-c C-s/d
+change timestamp to one day earlier/later S-LEFT/RIGHT [3]
+change timestamp to today >
+insert new entry into diary i
+start the clock on current item (clock-in) I
+stop the clock (clock-out) O
+cancel current clock X
+
+--------------------------------------------------------------------------------
+Misc
+--------------------------------------------------------------------------------
+
+Open link in current line C-c C-o
+
+--------------------------------------------------------------------------------
+Calendar commands
+--------------------------------------------------------------------------------
+
+find agenda cursor date in calendar c
+compute agenda for calendar cursor date c
+show phases of the moon M
+show sunrise/sunset times S
+show holidays H
+convert date to other calendars C
+
+--------------------------------------------------------------------------------
+Quit and Exit
+--------------------------------------------------------------------------------
+
+quit agenda, remove agenda buffer q
+exit agenda, remove all agenda buffers x
+
+================================================================================
+Calendar and Diary Integration
+================================================================================
+
+Include Emacs diary entries into Org-mode agenda with:
+(setq org-agenda-include-diary t)
+
+================================================================================
+Exporting and Publishing
+================================================================================
+
+Exporting creates files with extensions .txt and .html in the current
+directory. Publishing puts the resulting file into some other place.
+
+export/publish dispatcher C-c C-e
+export visible part only C-c C-e v
+insert template of export options C-c C-x t
+toggle fixed width for entry or region C-c :
+
+--------------------------------------------------------------------------------
+HTML formatting
+--------------------------------------------------------------------------------
+
+make words bold *bold*
+make words italic /italic/
+make words underlined _underlined_
+sub- and superscripts x^3, J_dust
+TeX-like macros \alpha, \to
+typeset lines in fixed width font start with :
+tables are exported as HTML tables start with |
+links become HTML links http:... etc
+include html tags @<b>...@</b>
+
+--------------------------------------------------------------------------------
+Comments: Text not being exported
+--------------------------------------------------------------------------------
+
+Text before the first headline is not considered part of the document and is
+therefore never exported. Lines starting with # are comments and are not
+exported. Subtrees whose header starts with COMMENT are never exported.
+
+toggle COMMENT keyword on entry C-c ;
+
+================================================================================
+Dynamic Blocks
+================================================================================
+
+update dynamic block at point C-c C-x C-u
+update all dynamic blocks C-u C-c C-x C-u
+
+================================================================================
+Notes
+================================================================================
+
+[1] This is only a suggestion for a binding of this command. Choose you own
+key as shown under INSTALLATION.
+
+[2] After changing a #+KEYWORD or <<<target>>> line, press C-c C-c with the
+cursor still in the line to update.
+
+[3] Keybinding affected by org-CUA-compatibility.
diff --git a/texinfo.tex b/texinfo.tex
new file mode 100644
index 0000000..555a077
--- /dev/null
+++ b/texinfo.tex
@@ -0,0 +1,6688 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2003-02-03.16}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+%
+% This texinfo.tex file 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 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex file 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 this texinfo.tex file; see the file COPYING. If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% In other words, you are welcome to use, share and improve this program.
+% You are forbidden to forbid anyone else to use, share and improve
+% what you give them. Help stamp out software-hoarding!
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
+% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org),
+% and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+%
+% The texinfo.tex in any given Texinfo distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's outer \+ definition in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some parts of plain tex whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar = `\.
+\chardef\equalChar = `\=
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar = `\;
+\chardef\spaceChar = `\ %
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% True if #1 is the empty string, i.e., called like `\ifempty{}'.
+%
+\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}%
+\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}%
+
+% Hyphenation fixes.
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+\hyphenation{white-space}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines\maxdimen
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \escapechar = `\\ % use backslash in output files.
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingxxx.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 2\baselineskip
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \normalturnoffactive
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg#1{%
+ \let\next = #1%
+ \begingroup
+ \obeylines
+ \futurelet\temp\parseargx
+}
+
+% If the next token is an obeyed space (from an @example environment or
+% the like), remove it and recurse. Otherwise, we're done.
+\def\parseargx{%
+ % \obeyedspace is defined far below, after the definition of \sepspaces.
+ \ifx\obeyedspace\temp
+ \expandafter\parseargdiscardspace
+ \else
+ \expandafter\parseargline
+ \fi
+}
+
+% Remove a single space (as the delimiter token to the macro call).
+{\obeyspaces %
+ \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ %
+ % First remove any @c comment, then any @comment.
+ % Result of each macro is put in \toks0.
+ \argremovec #1\c\relax %
+ \expandafter\argremovecomment \the\toks0 \comment\relax %
+ %
+ % Call the caller's macro, saved as \next in \parsearg.
+ \expandafter\next\expandafter{\the\toks0}%
+ }%
+}
+
+% Since all \c{,omment} does is throw away the argument, we can let TeX
+% do that for us. The \relax here is matched by the \relax in the call
+% in \parseargline; it could be more or less anything, its purpose is
+% just to delimit the argument to the \c.
+\def\argremovec#1\c#2\relax{\toks0 = {#1}}
+\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
+
+% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+% @end itemize @c foo
+% will have two active spaces as part of the argument with the
+% `itemize'. Here we remove all active spaces from #1, and assign the
+% result to \toks0.
+%
+% This loses if there are any *other* active characters besides spaces
+% in the argument -- _ ^ +, for example -- since they get expanded.
+% Fortunately, Texinfo does not define any such commands. (If it ever
+% does, the catcode of the characters in questionwill have to be changed
+% here.) But this means we cannot call \removeactivespaces as part of
+% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
+% that \parsearg gets might well have any character at all in it.
+%
+\def\removeactivespaces#1{%
+ \begingroup
+ \ignoreactivespaces
+ \edef\temp{#1}%
+ \global\toks0 = \expandafter{\temp}%
+ \endgroup
+}
+
+% Change the active space to expand to nothing.
+%
+\begingroup
+ \obeyspaces
+ \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
+\endgroup
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment; press RETURN to continue}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo is the same as @foo, for now.
+\newhelp\EMsimple{Press RETURN to continue.}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+% @end foo executes the definition of \Efoo.
+%
+\def\end{\parsearg\endxxx}
+\def\endxxx #1{%
+ \removeactivespaces{#1}%
+ \edef\endthing{\the\toks0}%
+ %
+ \expandafter\ifx\csname E\endthing\endcsname\relax
+ \expandafter\ifx\csname \endthing\endcsname\relax
+ % There's no \foo, i.e., no ``environment'' foo.
+ \errhelp = \EMsimple
+ \errmessage{Undefined command `@end \endthing'}%
+ \else
+ \unmatchedenderror\endthing
+ \fi
+ \else
+ % Everything's ok; the right environment has been started.
+ \csname E\endthing\endcsname
+ \fi
+}
+
+% There is an environment #1, but it hasn't been started. Give an error.
+%
+\def\unmatchedenderror#1{%
+ \errhelp = \EMsimple
+ \errmessage{This `@end #1' doesn't have a matching `@#1'}%
+}
+
+% Define the control sequence \E#1 to give an unmatched @end error.
+%
+\def\defineunmatchedend#1{%
+ \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
+}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux file.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\def\group{\begingroup
+ \ifnum\catcode13=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ %
+ % The \vtop we start below produces a box with normal height and large
+ % depth; thus, TeX puts \baselineskip glue before it, and (when the
+ % next line of text is done) \lineskip glue after it. (See p.82 of
+ % the TeXbook.) Thus, space below is not quite equal to space
+ % above. But it's pretty close.
+ \def\Egroup{%
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \copy\groupbox
+ \endgroup % End the \group.
+ }%
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % We have to put a strut on the last line in case the @group is in
+ % the midst of an example, rather than completely enclosing it.
+ % Otherwise, the interline space between the last line of the group
+ % and the first line afterwards is too small. But we can't put the
+ % strut in \Egroup, since there it would be on a line by itself.
+ % Hence this just inserts a strut at the beginning of each line.
+ \everypar = {\strut}%
+ %
+ % Since we have a strut on every line, we don't need any of TeX's
+ % normal interline spacing.
+ \offinterlineskip
+ %
+ % OK, but now we have to do something about blank
+ % lines in the input in @example-like environments, which normally
+ % just turn into \lisppar, which will insert no space now that we've
+ % turned off the interline space. Simplest is to make them be an
+ % empty paragraph.
+ \ifx\par\lisppar
+ \edef\par{\leavevmode \par}%
+ %
+ % Reset ^^M's definition to new definition of \par.
+ \obeylines
+ \fi
+ %
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break
+
+\let\br = \par
+
+% @dots{} output an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+ \leavevmode
+ \hbox to 1.5em{%
+ \hskip 0pt plus 0.25fil minus 0.25fil
+ .\hss.\hss.%
+ \hskip 0pt plus 0.5fil minus 0.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \leavevmode
+ \hbox to 2em{%
+ \hskip 0pt plus 0.25fil minus 0.25fil
+ .\hss.\hss.\hss.%
+ \hskip 0pt plus 0.5fil minus 0.5fil
+ }%
+ \spacefactor=3000
+}
+
+
+% @page forces the start of a new page
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+% Allow normal characters that we make active in the argument (a file name).
+\def\include{\begingroup
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \parsearg\includezzz}
+% Restore active chars for included file.
+\def\includezzz#1{\endgroup\begingroup
+ % Read the included file in a group so nested @include's work.
+ \def\thisfile{#1}%
+ \let\value=\expandablevalue
+ \input\thisfile
+\endgroup}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\def\center{\parsearg\docenter}
+\def\docenter#1{{%
+ \ifhmode \hfil\break \fi
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{\hfil \ignorespaces#1\unskip \hfil}%
+ \ifhmode \break \fi
+}}
+
+% @sp n outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% We cannot implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\def\paragraphindent{\parsearg\doparagraphindent}
+\def\doparagraphindent#1{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\def\exampleindent{\parsearg\doexampleindent}
+\def\doexampleindent#1{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+% We don't use $'s directly in the definition of \math because we need
+% to set catcodes according to plain TeX first, to allow for subscripts,
+% superscripts, special math chars, etc.
+%
+\let\implicitmath = $%$ font-lock fix
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ within @math be active (mathcode "8000), and distinguish by seeing
+% if the current family is \slfam, which is what @var uses.
+%
+{\catcode\underChar = \active
+\gdef\mathunderscore{%
+ \catcode\underChar=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+}}
+%
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathcode`\_="8000 \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ \implicitmath\finishmath}
+\def\finishmath#1{#1\implicitmath\Etex}
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an
+% argument to a command which set the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{\implicitmath\ptexbullet\implicitmath}
+\def\minus{\implicitmath-\implicitmath}
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \iflinks
+ \readauxfile
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ % Just to be on the safe side, close the input stream before the \input.
+ \openin 1 texinfo.cnf
+ \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
+ \closein1
+ \temp
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+\ifx\pdfoutput\undefined
+ \pdffalse
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\else
+ \pdftrue
+ \pdfoutput = 1
+ \input pdfcolor
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}%
+ \def\imageheight{#3}%
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifx\empty\imagewidth\else width \imagewidth \fi
+ \ifx\empty\imageheight\else height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.pdf%
+ \else
+ {#1.pdf}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
+ \def\pdfmkpgn#1{#1}
+ \let\linkcolor = \Blue % was Cyan, but that seems light?
+ \def\endlink{\Black\pdfendlink}
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ \def\pdfmakeoutlines{{%
+ \openin 1 \jobname.toc
+ \ifeof 1\else\begingroup
+ \closein 1
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ \def\chapentry ##1##2##3{}
+ \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
+ \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
+ \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
+ \let\appendixentry = \chapentry
+ \let\unnumbchapentry = \chapentry
+ \let\unnumbsecentry = \secentry
+ \let\unnumbsubsecentry = \subsecentry
+ \let\unnumbsubsubsecentry = \subsubsecentry
+ \input \jobname.toc
+ \def\chapentry ##1##2##3{%
+ \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
+ \def\secentry ##1##2##3##4{%
+ \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
+ \def\subsecentry ##1##2##3##4##5{%
+ \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
+ \def\subsubsecentry ##1##2##3##4##5##6{%
+ \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
+ \let\appendixentry = \chapentry
+ \let\unnumbchapentry = \chapentry
+ \let\unnumbsecentry = \secentry
+ \let\unnumbsubsecentry = \subsecentry
+ \let\unnumbsubsubsecentry = \subsubsecentry
+ %
+ % Make special characters normal for writing to the pdf file.
+ %
+ \indexnofonts
+ \let\tt=\relax
+ \turnoffactive
+ \input \jobname.toc
+ \endgroup\fi
+ }}
+ \def\makelinks #1,{%
+ \def\params{#1}\def\E{END}%
+ \ifx\params\E
+ \let\nextmakelinks=\relax
+ \else
+ \let\nextmakelinks=\makelinks
+ \ifnum\lnkcount>0,\fi
+ \picknum{#1}%
+ \startlink attr{/Border [0 0 0]}
+ goto name{\pdfmkpgn{\the\pgn}}%
+ \linkcolor #1%
+ \advance\lnkcount by 1%
+ \endlink
+ \fi
+ \nextmakelinks
+ }
+ \def\picknum#1{\expandafter\pn#1}
+ \def\pn#1{%
+ \def\p{#1}%
+ \ifx\p\lbrace
+ \let\nextpn=\ppn
+ \else
+ \let\nextpn=\ppnn
+ \def\first{#1}
+ \fi
+ \nextpn
+ }
+ \def\ppn#1{\pgn=#1\gobble}
+ \def\ppnn{\pgn=\first}
+ \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ \def\pdfurl#1{%
+ \begingroup
+ \normalturnoffactive\def\@{@}%
+ \let\value=\expandablevalue
+ \leavevmode\Red
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ % #1
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+% Font-change commands.
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this one.
+\def\ttsl{\tenttsl}
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+\newcount\mainmagstep
+\ifx\bigger\relax
+ % not really supported.
+ \mainmagstep=\magstep1
+ \setfont\textrm\rmshape{12}{1000}
+ \setfont\texttt\ttshape{12}{1000}
+\else
+ \mainmagstep=\magstephalf
+ \setfont\textrm\rmshape{10}{\mainmagstep}
+ \setfont\texttt\ttshape{10}{\mainmagstep}
+\fi
+% Instead of cmb10, you may want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10
+% (in Bob's opinion).
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+\setfont\deftt\ttshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page:
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{\magstep1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam
+% \tenbf}, for example. By redefining \tenbf, we obviate the need to
+% redefine \bf itself.
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \smallerfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish we used A4 paper on this side of the Atlantic.
+%
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+\let\cite=\smartslanted
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\frenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ }
+\catcode`@=\other
+
+\def\t#1{%
+ {\tt \rawbackslash \frenchspacing #1}%
+ \null
+}
+\let\ttfont=\t
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \frenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in \code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active
+ \catcode`\_=\active
+ %
+ \global\def\code{\begingroup
+ \catcode`\-=\active \let-\codedash
+ \catcode`\_=\active \let_\codeunder
+ \codex
+ }
+ %
+ % If we end up with any active - characters when handling the index,
+ % just treat them as a normal -.
+ \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
+\def\kbdinputstylexxx#1{%
+ \def\arg{#1}%
+ \ifx\arg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\arg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\arg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle `\arg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @url, @env, @command quotes seem unnecessary, so use \code.
+\let\url=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym downcases the argument and prints in smallcaps.
+\def\acronym#1{{\smallcaps \lowercase{#1}}}
+
+% @pounds{} is a sterling sign.
+\def\pounds{{\it\$}}
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\def\shorttitlepage{\parsearg\shorttitlepagezzz}
+\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+ \let\subtitlerm=\tenrm
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}%
+ %
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ %
+ % Now you can print the title using @title.
+ \def\title{\parsearg\titlezzz}%
+ \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Now you can put text using @subtitle.
+ \def\subtitle{\parsearg\subtitlezzz}%
+ \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+ %
+ % @author should come last, but may come many times.
+ \def\author{\parsearg\authorzzz}%
+ \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+ {\authorfont \leftline{##1}}}%
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \oldpage
+ \let\page = \oldpage
+ \hbox{}}%
+% \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -\baselineskip
+ \global\advance\vsize by -\baselineskip
+}
+
+\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+%
+}% unbind the catcode of @.
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+ \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+ \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemfont{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. (Unfortunately
+ % we can't prevent a possible page break at the following
+ % \baselineskip glue.) However, if what follows is an environment
+ % such as @example, there will be no \parskip glue; then
+ % the negative vskip we just would cause the example and the item to
+ % crash together. So we use this bizarre value of 10001 as a signal
+ % to \aboveenvbreak to insert \parskip glue after all.
+ % (Possibly there are other commands that could be followed by
+ % @example which need the same treatment, but not section titles; or
+ % maybe section titles are the only special case and they should be
+ % penalty 10001...)
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+% Contains a kludge to get @end[description] to work.
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+% @table, @ftable, @vtable.
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1 \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1 \endtabley
+\def\Eftable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1 \endtabley
+\def\Evtable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Necessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\afterenvbreak\endgroup}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+ \begingroup % ended by the @end itemize
+ \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\exdentamount=\itemindent
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\afterenvbreak\endgroup}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ \begingroup % ended by the @end enumerate
+ %
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{In hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+%
+% For those who want to use more than one line's worth of words in
+% the preamble, break the line within one argument and it
+% will parse correctly, i.e.,
+%
+% @multitable {Column 1 template} {Column 2 template} {Column 3
+% template}
+% Not:
+% @multitable {Column 1 template} {Column 2 template}
+% {Column 3 template}
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multitable or @end multitable do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the part of the @columnfraction before the decimal point, which
+% is presumably either 0 or the empty string (but we don't check, we
+% just throw it away). #2 is the decimal part, which we use as the
+% percent of \hsize for this column.
+\def\pickupwholefraction#1.#2 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% @multitable ... @end multitable definitions:
+%
+\def\multitable{\parsearg\dotable}
+\def\dotable#1{\bgroup
+ \vskip\parskip
+ \let\item=\crcrwithfootnotes
+ % A \tab used to include \hskip1sp. But then the space in a template
+ % line is not enough. That is bad. So let's go back to just & until
+ % we encounter the problem it was intended to solve again. --karl,
+ % nathan@acm.org, 20apr99.
+ \let\tab=&%
+ \let\startfootins=\startsavedfootnote
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ \def\Emultitable{%
+ \global\setpercentfalse
+ \crcrwithfootnotes\crcr
+ \egroup\egroup
+ }%
+ %
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % \everycr will reset column counter, \colcount, at the end of
+ % each line. Every column entry will cause \colcount to advance by one.
+ % The table preamble
+ % looks at the current \colcount to find the correct column width.
+ \everycr{\noalign{%
+ %
+ % \filbreak%% keeps underfull box messages off when table breaks over pages.
+ % Maybe so, but it also creates really weird page breaks when the table
+ % breaks over pages. Wouldn't \vfil be better? Wait until the problem
+ % manifests itself, so it can be fixed for real --karl.
+ \global\colcount=0\relax}}%
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup&\global\advance\colcount by 1\relax
+ \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively marking
+ % characters.
+ \noindent\ignorespaces##\unskip\multistrut}\cr
+}
+
+\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+% If so, do nothing. If not, give it an appropriate dimension based on
+% current baselineskip.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+%% strut to put in table in case some entry doesn't have descenders,
+%% to keep lines equally spaced
+\let\multistrut = \strut
+\else
+%% FIXME: what is \box0 supposed to be?
+\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+width0pt\relax} \fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+% In case a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is
+% finished. Otherwise, the insertion is lost, it never migrates to the
+% main vertical list. --kasal, 22jan03.
+%
+\newbox\savedfootnotes
+%
+% \dotable \let's \startfootins to this, so that \dofootnote will call
+% it instead of starting the insertion right away.
+\def\startsavedfootnote{%
+ \global\setbox\savedfootnotes = \vbox\bgroup
+ \unvbox\savedfootnotes
+}
+\def\crcrwithfootnotes{%
+ \crcr
+ \ifvoid\savedfootnotes \else
+ \noalign{\insert\footins{\box\savedfootnotes}}%
+ \fi
+}
+
+\message{conditionals,}
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+ \let\chapter=\relax
+ \let\unnumbered=\relax
+ \let\top=\relax
+ \let\unnumberedsec=\relax
+ \let\unnumberedsection=\relax
+ \let\unnumberedsubsec=\relax
+ \let\unnumberedsubsection=\relax
+ \let\unnumberedsubsubsec=\relax
+ \let\unnumberedsubsubsection=\relax
+ \let\section=\relax
+ \let\subsec=\relax
+ \let\subsubsec=\relax
+ \let\subsection=\relax
+ \let\subsubsection=\relax
+ \let\appendix=\relax
+ \let\appendixsec=\relax
+ \let\appendixsection=\relax
+ \let\appendixsubsec=\relax
+ \let\appendixsubsection=\relax
+ \let\appendixsubsubsec=\relax
+ \let\appendixsubsubsection=\relax
+ \let\contents=\relax
+ \let\smallbook=\relax
+ \let\titlepage=\relax
+}
+
+% Used in nested conditionals, where we have to parse the Texinfo source
+% and so want to turn off most commands, in case they are used
+% incorrectly.
+%
+% We use \empty instead of \relax for the @def... commands, so that \end
+% doesn't throw an error. For instance:
+% @ignore
+% @deffn ...
+% @end deffn
+% @end ignore
+%
+% The @end deffn is going to get expanded, because we're trying to allow
+% nested conditionals. But we don't want to expand the actual @deffn,
+% since it might be syntactically correct and intended to be ignored.
+% Since \end checks for \relax, using \empty does not cause an error.
+%
+\def\ignoremorecommands{%
+ \let\defcodeindex = \relax
+ \let\defcv = \empty
+ \let\defcvx = \empty
+ \let\Edefcv = \empty
+ \let\deffn = \empty
+ \let\deffnx = \empty
+ \let\Edeffn = \empty
+ \let\defindex = \relax
+ \let\defivar = \empty
+ \let\defivarx = \empty
+ \let\Edefivar = \empty
+ \let\defmac = \empty
+ \let\defmacx = \empty
+ \let\Edefmac = \empty
+ \let\defmethod = \empty
+ \let\defmethodx = \empty
+ \let\Edefmethod = \empty
+ \let\defop = \empty
+ \let\defopx = \empty
+ \let\Edefop = \empty
+ \let\defopt = \empty
+ \let\defoptx = \empty
+ \let\Edefopt = \empty
+ \let\defspec = \empty
+ \let\defspecx = \empty
+ \let\Edefspec = \empty
+ \let\deftp = \empty
+ \let\deftpx = \empty
+ \let\Edeftp = \empty
+ \let\deftypefn = \empty
+ \let\deftypefnx = \empty
+ \let\Edeftypefn = \empty
+ \let\deftypefun = \empty
+ \let\deftypefunx = \empty
+ \let\Edeftypefun = \empty
+ \let\deftypeivar = \empty
+ \let\deftypeivarx = \empty
+ \let\Edeftypeivar = \empty
+ \let\deftypemethod = \empty
+ \let\deftypemethodx = \empty
+ \let\Edeftypemethod = \empty
+ \let\deftypeop = \empty
+ \let\deftypeopx = \empty
+ \let\Edeftypeop = \empty
+ \let\deftypevar = \empty
+ \let\deftypevarx = \empty
+ \let\Edeftypevar = \empty
+ \let\deftypevr = \empty
+ \let\deftypevrx = \empty
+ \let\Edeftypevr = \empty
+ \let\defun = \empty
+ \let\defunx = \empty
+ \let\Edefun = \empty
+ \let\defvar = \empty
+ \let\defvarx = \empty
+ \let\Edefvar = \empty
+ \let\defvr = \empty
+ \let\defvrx = \empty
+ \let\Edefvr = \empty
+ \let\clear = \relax
+ \let\down = \relax
+ \let\evenfooting = \relax
+ \let\evenheading = \relax
+ \let\everyfooting = \relax
+ \let\everyheading = \relax
+ \let\headings = \relax
+ \let\include = \relax
+ \let\item = \relax
+ \let\lowersections = \relax
+ \let\oddfooting = \relax
+ \let\oddheading = \relax
+ \let\printindex = \relax
+ \let\pxref = \relax
+ \let\raisesections = \relax
+ \let\ref = \relax
+ \let\set = \relax
+ \let\setchapternewpage = \relax
+ \let\setchapterstyle = \relax
+ \let\settitle = \relax
+ \let\up = \relax
+ \let\verbatiminclude = \relax
+ \let\xref = \relax
+}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescriptionword{documentdescription}
+\def\documentdescription{\doignore{documentdescription}}
+\def\html{\doignore{html}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory = \comment
+
+% Ignore text until a line `@end #1'.
+%
+\def\doignore#1{\begingroup
+ % Don't complain about control sequences we have declared \outer.
+ \ignoresections
+ %
+ % Define a command to swallow text until we reach `@end #1'.
+ % This @ is a catcode 12 token (that is the normal catcode of @ in
+ % this texinfo.tex file). We change the catcode of @ below to match.
+ \long\def\doignoretext##1@end #1{\enddoignore}%
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \catcode\spaceChar = 10
+ %
+ % Ignore braces, too, so mismatched braces don't cause trouble.
+ \catcode`\{ = 9
+ \catcode`\} = 9
+ %
+ % We must not have @c interpreted as a control sequence.
+ \catcode`\@ = 12
+ %
+ \def\ignoreword{#1}%
+ \ifx\ignoreword\documentdescriptionword
+ % The c kludge breaks documentdescription, since
+ % `documentdescription' contains a `c'. Means not everything will
+ % be ignored inside @documentdescription, but oh well...
+ \else
+ % Make the letter c a comment character so that the rest of the line
+ % will be ignored. This way, the document can have (for example)
+ % @c @end ifinfo
+ % and the @end ifinfo will be properly ignored.
+ % (We've just changed @ to catcode 12.)
+ \catcode`\c = 14
+ \fi
+ %
+ % And now expand the command defined above.
+ \doignoretext
+}
+
+% What we do to finish off ignored text.
+%
+\def\enddoignore{\endgroup\ignorespaces}%
+
+\newif\ifwarnedobs\warnedobsfalse
+\def\obstexwarn{%
+ \ifwarnedobs\relax\else
+ % We need to warn folks that they may have trouble with TeX 3.0.
+ % This uses \immediate\write16 rather than \message to get newlines.
+ \immediate\write16{}
+ \immediate\write16{WARNING: for users of Unix TeX 3.0!}
+ \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
+ \immediate\write16{If you are running another version of TeX, relax.}
+ \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
+ \immediate\write16{ Then upgrade your TeX installation if you can.}
+ \immediate\write16{ (See ftp://ftp.gnu.org/non-gnu/TeX.README.)}
+ \immediate\write16{If you are stuck with version 3.0, run the}
+ \immediate\write16{ script ``tex3patch'' from the Texinfo distribution}
+ \immediate\write16{ to use a workaround.}
+ \immediate\write16{}
+ \global\warnedobstrue
+ \fi
+}
+
+% **In TeX 3.0, setting text in \nullfont hangs tex. For a
+% workaround (which requires the file ``dummy.tfm'' to be installed),
+% uncomment the following line:
+%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
+
+% Ignore text, except that we keep track of conditional commands for
+% purposes of nesting, up to an `@end #1' command.
+%
+\def\nestedignore#1{%
+ \obstexwarn
+ % We must actually expand the ignored text to look for the @end
+ % command, so that nested ignore constructs work. Thus, we put the
+ % text into a \vbox and then do nothing with the result. To minimize
+ % the chance of memory overflow, we follow the approach outlined on
+ % page 401 of the TeXbook.
+ %
+ \setbox0 = \vbox\bgroup
+ % Don't complain about control sequences we have declared \outer.
+ \ignoresections
+ %
+ % Define `@end #1' to end the box, which will in turn undefine the
+ % @end command again.
+ \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
+ %
+ % We are going to be parsing Texinfo commands. Most cause no
+ % trouble when they are used incorrectly, but some commands do
+ % complicated argument parsing or otherwise get confused, so we
+ % undefine them.
+ %
+ % We can't do anything about stray @-signs, unfortunately;
+ % they'll produce `undefined control sequence' errors.
+ \ignoremorecommands
+ %
+ % Set the current font to be \nullfont, a TeX primitive, and define
+ % all the font commands to also use \nullfont. We don't use
+ % dummy.tfm, as suggested in the TeXbook, because some sites
+ % might not have that installed. Therefore, math mode will still
+ % produce output, but that should be an extremely small amount of
+ % stuff compared to the main input.
+ %
+ \nullfont
+ \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
+ \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
+ \let\tensf=\nullfont
+ % Similarly for index fonts.
+ \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
+ \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
+ \let\smallsf=\nullfont
+ % Similarly for smallexample fonts.
+ \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
+ \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
+ \let\smallersf=\nullfont
+ %
+ % Don't complain when characters are missing from the fonts.
+ \tracinglostchars = 0
+ %
+ % Don't bother to do space factor calculations.
+ \frenchspacing
+ %
+ % Don't report underfull hboxes.
+ \hbadness = 10000
+ %
+ % Do minimal line-breaking.
+ \pretolerance = 10000
+ %
+ % Do not execute instructions in @tex.
+ \def\tex{\doignore{tex}}%
+ % Do not execute macro definitions.
+ % `c' is a comment character, so the word `macro' will get cut off.
+ \def\macro{\doignore{ma}}%
+}
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it. Make sure the catcode of space is correct to avoid
+% losing inside @example, for instance.
+%
+\def\set{\begingroup\catcode` =10
+ \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
+ \parsearg\setxxx}
+\def\setxxx#1{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ \def\temp{#2}%
+ \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+ \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
+ \fi
+ \endgroup
+}
+% Can't use \xdef to pre-expand #2 and save some time, since \temp or
+% \next or other control sequences that we've defined might get us into
+% an infinite loop. Consider `@set foo @cite{bar}'.
+\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+
+% @value{foo} gets the text saved in variable foo.
+{
+ \catcode`\_ = \active
+ %
+ % We might end up with active _ or - characters in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}. So \let any
+ % such active characters to their normal equivalents.
+ \gdef\value{\begingroup
+ \catcode`\-=\other \catcode`\_=\other
+ \indexbreaks \let_\normalunderscore
+ \valuexxx}
+}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we \let\value to this in \indexdummies). Ones
+% whose names contain - or _ still won't work, but we can't do anything
+% about that. The command has to be fully expandable (if the variable
+% is set), since the result winds up in the index file. This means that
+% if the variable's value contains other Texinfo commands, it's almost
+% certain it will fail (although perhaps we could fix that with
+% sufficient work to do a one-level expansion on the result, instead of
+% complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+\def\ifset{\parsearg\doifset}
+\def\doifset#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \let\next=\ifsetfail
+ \else
+ \let\next=\ifsetsucceed
+ \fi
+ \next
+}
+\def\ifsetsucceed{\conditionalsucceed{ifset}}
+\def\ifsetfail{\nestedignore{ifset}}
+\defineunmatchedend{ifset}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+\def\ifclear{\parsearg\doifclear}
+\def\doifclear#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \let\next=\ifclearsucceed
+ \else
+ \let\next=\ifclearfail
+ \fi
+ \next
+}
+\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+\def\ifclearfail{\nestedignore{ifclear}}
+\defineunmatchedend{ifclear}
+
+% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
+% read the text following, through the first @end iftex (etc.). Make
+% `@end iftex' (etc.) valid only after an @iftex.
+%
+\def\iftex{\conditionalsucceed{iftex}}
+\def\ifnothtml{\conditionalsucceed{ifnothtml}}
+\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
+\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
+\defineunmatchedend{iftex}
+\defineunmatchedend{ifnothtml}
+\defineunmatchedend{ifnotinfo}
+\defineunmatchedend{ifnotplaintext}
+
+% True conditional. Since \set globally defines its variables, we can
+% just start and end a group (to keep the @end definition undefined at
+% the outer level).
+%
+\def\conditionalsucceed#1{\begingroup
+ \expandafter\def\csname E#1\endcsname{\endgroup}%
+}
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % \definedummyword defines \#1 as \realbackslash #1\space, thus
+ % effectively preventing its expansion. This is used only for control
+ % words, not control letters, because the \space would be incorrect
+ % for control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+ }%
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux file, @ is the escape character. So we want to redefine
+% everything using @ instead of \realbackslash. When everything uses
+% @, this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % (See comments in \indexdummies.)
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{@##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{@##1}%
+ }%
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% Called from \indexdummies and \atdummies. \definedummyword and
+% \definedummyletter must be defined first.
+%
+\def\commondummies{%
+ %
+ \normalturnoffactive
+ %
+ % Control letters and accents.
+ \definedummyletter{_}%
+ \definedummyletter{,}%
+ \definedummyletter{"}%
+ \definedummyletter{`}%
+ \definedummyletter{'}%
+ \definedummyletter{^}%
+ \definedummyletter{~}%
+ \definedummyletter{=}%
+ \definedummyword{u}%
+ \definedummyword{v}%
+ \definedummyword{H}%
+ \definedummyword{dotaccent}%
+ \definedummyword{ringaccent}%
+ \definedummyword{tieaccent}%
+ \definedummyword{ubaraccent}%
+ \definedummyword{udotaccent}%
+ \definedummyword{dotless}%
+ %
+ % Other non-English letters.
+ \definedummyword{AA}%
+ \definedummyword{AE}%
+ \definedummyword{L}%
+ \definedummyword{OE}%
+ \definedummyword{O}%
+ \definedummyword{aa}%
+ \definedummyword{ae}%
+ \definedummyword{l}%
+ \definedummyword{oe}%
+ \definedummyword{o}%
+ \definedummyword{ss}%
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword{bf}%
+ \definedummyword{gtr}%
+ \definedummyword{hat}%
+ \definedummyword{less}%
+ \definedummyword{sf}%
+ \definedummyword{sl}%
+ \definedummyword{tclose}%
+ \definedummyword{tt}%
+ %
+ % Texinfo font commands.
+ \definedummyword{b}%
+ \definedummyword{i}%
+ \definedummyword{r}%
+ \definedummyword{sc}%
+ \definedummyword{t}%
+ %
+ \definedummyword{TeX}%
+ \definedummyword{acronym}%
+ \definedummyword{cite}%
+ \definedummyword{code}%
+ \definedummyword{command}%
+ \definedummyword{dfn}%
+ \definedummyword{dots}%
+ \definedummyword{emph}%
+ \definedummyword{env}%
+ \definedummyword{file}%
+ \definedummyword{kbd}%
+ \definedummyword{key}%
+ \definedummyword{math}%
+ \definedummyword{option}%
+ \definedummyword{samp}%
+ \definedummyword{strong}%
+ \definedummyword{uref}%
+ \definedummyword{url}%
+ \definedummyword{var}%
+ \definedummyword{w}%
+ %
+ % Assorted special characters.
+ \definedummyword{bullet}%
+ \definedummyword{copyright}%
+ \definedummyword{dots}%
+ \definedummyword{enddots}%
+ \definedummyword{equiv}%
+ \definedummyword{error}%
+ \definedummyword{expansion}%
+ \definedummyword{minus}%
+ \definedummyword{pounds}%
+ \definedummyword{point}%
+ \definedummyword{print}%
+ \definedummyword{result}%
+ %
+ % Handle some cases of @value -- where the variable name does not
+ % contain - or _, and the value does not contain any
+ % (non-fully-expandable) commands.
+ \let\value = \expandablevalue
+ %
+ % Normal spaces, not active ones.
+ \unsepspaces
+ %
+ % No macro expansion.
+ \turnoffmacros
+}
+
+% If an index command is used in an @example environment, any spaces
+% therein should become regular spaces in the raw index file, not the
+% expansion of \tie (\leavevmode \penalty \@M \ ).
+{\obeyspaces
+ \gdef\unsepspaces{\obeyspaces\let =\space}}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+%
+\def\indexnofonts{%
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ \let\,=\asis
+ \let\"=\asis
+ \let\`=\asis
+ \let\'=\asis
+ \let\^=\asis
+ \let\~=\asis
+ \let\==\asis
+ \let\u=\asis
+ \let\v=\asis
+ \let\H=\asis
+ \let\dotaccent=\asis
+ \let\ringaccent=\asis
+ \let\tieaccent=\asis
+ \let\ubaraccent=\asis
+ \let\udotaccent=\asis
+ \let\dotless=\asis
+ %
+ % Other non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ % Texinfo font commands.
+ \let\b=\asis
+ \let\i=\asis
+ \let\r=\asis
+ \let\sc=\asis
+ \let\t=\asis
+ %
+ \let\TeX=\indexdummytex
+ \let\acronym=\asis
+ \let\cite=\asis
+ \let\code=\asis
+ \let\command=\asis
+ \let\dfn=\asis
+ \let\dots=\indexdummydots
+ \let\emph=\asis
+ \let\env=\asis
+ \let\file=\asis
+ \let\kbd=\asis
+ \let\key=\asis
+ \let\math=\asis
+ \let\option=\asis
+ \let\samp=\asis
+ \let\strong=\asis
+ \let\uref=\asis
+ \let\url=\asis
+ \let\var=\asis
+ \let\w=\asis
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% For \ifx comparisons.
+\def\emptymacro{\empty}
+
+% Most index entries go through here, but \dosubind is the general case.
+%
+\def\doind#1#2{\dosubind{#1}{#2}\empty}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% \empty if called from \doind, as we usually are. The main exception
+% is with defuns, which call us directly.
+%
+\def\dosubind#1#2#3{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+ \fi
+ {%
+ \count255=\lastpenalty
+ {%
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ {%
+ \let\folio = 0% We will expand all macros now EXCEPT \folio.
+ \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % The main index entry text.
+ \toks0 = {#2}%
+ %
+ % If third arg is present, precede it with space in sort key.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\emptymacro \else
+ % If the third (subentry) arg is present, add it to the index
+ % line to write.
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\csname#1indfile\endcsname{%
+ \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+ }%
+ %
+ % If a skip is the last thing on the list now, preserve it
+ % by backing up by \lastskip, doing the \write, then inserting
+ % the skip again. Otherwise, the whatsit generated by the
+ % \write will make \lastskip zero. The result is that sequences
+ % like this:
+ % @end defun
+ % @tindex whatever
+ % @defun ...
+ % will have extra space inserted, because the \medbreak in the
+ % start of the @defun won't see the skip inserted by the @end of
+ % the previous defun.
+ %
+ % But don't do any of this if we're not in vertical mode. We
+ % don't want to do a \vskip and prematurely end a paragraph.
+ %
+ % Avoid page breaks due to these extra skips, too.
+ %
+ \iflinks
+ \ifvmode
+ \skip0 = \lastskip
+ \ifdim\lastskip = 0pt \else \nobreak\vskip-\skip0 \fi
+ \fi
+ %
+ \temp % do the write
+ %
+ \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
+ \fi
+ }%
+ }%
+ \penalty\count255
+ }%
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\def\printindex{\parsearg\doprintindex}
+\def\doprintindex#1{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \indexbreaks
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\rawbackslashxx}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \penalty -300
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ \vskip .33\baselineskip plus .1\baselineskip
+ %
+ % Do our best not to break after the initial.
+ \nobreak
+}}
+
+% This typesets a paragraph consisting of #1, dot leaders, and then #2
+% flush to the right margin. It is used for index and table of contents
+% entries. The paragraph is indented by \leftskip.
+%
+\def\entry#1#2{\begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing columns.
+ \vskip 0pt plus1pt
+ %
+ % Start a ``paragraph'' for the index entry so the line breaking
+ % parameters we've set above will have an effect.
+ \noindent
+ %
+ % Insert the text of the index entry. TeX will do line-breaking on it.
+ #1%
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#2}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd\ \else%
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ \ #2% The page number ends the paragraph.
+ \fi
+ \fi%
+ \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+% \def\appendixletter{\char\the\appendixno}
+% We do the following for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% Choose a numbered-heading macro
+% #1 is heading level if unmodified by @raisesections or @lowersections
+% #2 is text for heading
+\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \chapterzzz{#2}
+\or
+ \seczzz{#2}
+\or
+ \numberedsubseczzz{#2}
+\or
+ \numberedsubsubseczzz{#2}
+\else
+ \ifnum \absseclevel<0
+ \chapterzzz{#2}
+ \else
+ \numberedsubsubseczzz{#2}
+ \fi
+\fi
+}
+
+% like \numhead, but chooses appendix heading levels
+\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \appendixzzz{#2}
+\or
+ \appendixsectionzzz{#2}
+\or
+ \appendixsubseczzz{#2}
+\or
+ \appendixsubsubseczzz{#2}
+\else
+ \ifnum \absseclevel<0
+ \appendixzzz{#2}
+ \else
+ \appendixsubsubseczzz{#2}
+ \fi
+\fi
+}
+
+% like \numhead, but chooses numberless heading levels
+\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \unnumberedzzz{#2}
+\or
+ \unnumberedseczzz{#2}
+\or
+ \unnumberedsubseczzz{#2}
+\or
+ \unnumberedsubsubseczzz{#2}
+\else
+ \ifnum \absseclevel<0
+ \unnumberedzzz{#2}
+ \else
+ \unnumberedsubsubseczzz{#2}
+ \fi
+\fi
+}
+
+% @chapter, @appendix, @unnumbered.
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapteryyy}
+\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+ \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
+ \chapmacro {#1}{\the\chapno}%
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now.
+ \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
+ \writetocentry{chap}{#1}{{\the\chapno}}
+ \donoderef
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+% we use \chapno to avoid indenting back
+\def\appendixbox#1{%
+ \setbox0 = \hbox{\putwordAppendix{} \the\chapno}%
+ \hbox to \wd0{#1\hss}}
+
+\outer\def\appendix{\parsearg\appendixyyy}
+\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+ \global\advance \appendixno by 1
+ \message{\putwordAppendix\space \appendixletter}%
+ \chapmacro {#1}{\appendixbox{\putwordAppendix{} \appendixletter}}%
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+ \writetocentry{appendix}{#1}{{\appendixletter}}
+ \appendixnoderef
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\def\centerchap{\parsearg\centerchapyyy}
+\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+
+% @top is like @unnumbered.
+\outer\def\top{\parsearg\unnumberedyyy}
+
+\outer\def\unnumbered{\parsearg\unnumberedyyy}
+\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}\message{(\the\toks0)}%
+ %
+ \unnumbchapmacro {#1}%
+ \gdef\thischapter{#1}\gdef\thissection{#1}%
+ \writetocentry{unnumbchap}{#1}{{\the\chapno}}
+ \unnumbnoderef
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% Sections.
+\outer\def\numberedsec{\parsearg\secyyy}
+\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+\def\seczzz #1{%
+ \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+ \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+ \writetocentry{sec}{#1}{{\the\chapno}{\the\secno}}
+ \donoderef
+ \nobreak
+}
+
+\outer\def\appendixsection{\parsearg\appendixsecyyy}
+\outer\def\appendixsec{\parsearg\appendixsecyyy}
+\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz #1{%
+ \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+ \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+ \writetocentry{sec}{#1}{{\appendixletter}{\the\secno}}
+ \appendixnoderef
+ \nobreak
+}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz #1{%
+ \plainsecheading {#1}\gdef\thissection{#1}%
+ \writetocentry{unnumbsec}{#1}{{\the\chapno}{\the\secno}}
+ \unnumbnoderef
+ \nobreak
+}
+
+% Subsections.
+\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz #1{%
+ \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+ \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+ \writetocentry{subsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+ \donoderef
+ \nobreak
+}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz #1{%
+ \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+ \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+ \writetocentry{subsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}}
+ \appendixnoderef
+ \nobreak
+}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz #1{%
+ \plainsubsecheading {#1}\gdef\thissection{#1}%
+ \writetocentry{unnumbsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+ \unnumbnoderef
+ \nobreak
+}
+
+% Subsubsections.
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz #1{%
+ \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+ \subsubsecheading {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+ \writetocentry{subsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+ \donoderef
+ \nobreak
+}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz #1{%
+ \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+ \subsubsecheading {#1}
+ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+ \writetocentry{subsubsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+ \appendixnoderef
+ \nobreak
+}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz #1{%
+ \plainsubsubsecheading {#1}\gdef\thissection{#1}%
+ \writetocentry{unnumbsubsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+ \unnumbnoderef
+ \nobreak
+}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+% @heading, @subheading, @subsubheading.
+\def\heading{\parsearg\plainsecheading}
+\def\subheading{\parsearg\plainsubsecheading}
+\def\subsubheading{\parsearg\plainsubsubsecheading}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain
+\global\let\centerchapmacro=\centerchfplain}
+
+% Plain chapter opening.
+% #1 is the text, #2 the chapter number or empty if unnumbered.
+\def\chfplain#1#2{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ \def\chapnum{#2}%
+ \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent = \wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% Plain opening for unnumbered.
+\def\unnchfplain#1{\chfplain{#1}{}}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+ \def\centerparametersmaybe{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+ }%
+ \chfplain{#1}{}%
+}}
+
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen
+\global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
+\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+
+% Subsection titles.
+\newskip \subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
+\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
+
+% Subsubsection titles.
+\let\subsubsecheadingskip = \subsecheadingskip
+\let\subsubsecheadingbreak = \subsecheadingbreak
+\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
+\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
+
+
+% Print any size section title.
+%
+% #1 is the section type (sec/subsec/subsubsec), #2 is the section
+% number (maybe empty), #3 the text.
+\def\sectionheading#1#2#3{%
+ {%
+ \expandafter\advance\csname #1headingskip\endcsname by \parskip
+ \csname #1headingbreak\endcsname
+ }%
+ {%
+ % Switch to the right set of fonts.
+ \csname #1fonts\endcsname \rm
+ %
+ % Only insert the separating space if we have a section number.
+ \def\secnum{#2}%
+ \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+ %
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent = \wd0 % zero if no section number
+ \unhbox0 #3}%
+ }%
+ % Add extra space after the heading -- either a line space or a
+ % paragraph space, whichever is more. (Some people like to set
+ % \parskip to large values for some reason.) Don't allow stretch, though.
+ \nobreak
+ \ifdim\parskip>\normalbaselineskip
+ \kern\parskip
+ \else
+ \kern\normalbaselineskip
+ \fi
+ \nobreak
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc. We supply {\folio} at the end of the
+% argument, which will end up as the last argument to the \...entry macro.
+%
+% Usage: \writetocentry{chap}{The Name of The Game}{{\the\chapno}}
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+%
+\newif\iftocfileopened
+\def\writetocentry#1#2#3{%
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ \toks0 = {#2}%
+ \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}#3{\folio}}}%
+ \temp
+ \fi
+ %
+ % Tell \shipout to create a page destination if we're doing pdf, which
+ % will be the target of the links in the table of contents. We can't
+ % just do it on every page because the title pages are numbered 1 and
+ % 2 (the page numbers aren't printed), and so are the first two pages
+ % of the document. Thus, we'd have two destinations named `1', and
+ % two named `2'.
+ \ifpdf \pdfmakepagedesttrue \fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Finish up the main text and prepare to read what we've written
+% to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \unnumbchapmacro{#1}\def\thischapter{}%
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ % We can't do this, because then an actual ^ in a section
+ % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
+ %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \pdfmakeoutlines
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\chapentry = \shortchapentry
+ \let\appendixentry = \shortappendixentry
+ \let\unnumbchapentry = \shortunnumberedentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\secentry ##1##2##3##4{}
+ \def\subsecentry ##1##2##3##4##5{}
+ \def\subsubsecentry ##1##2##3##4##5##6{}
+ \let\unnumbsecentry = \secentry
+ \let\unnumbsubsecentry = \subsecentry
+ \let\unnumbsubsubsecentry = \subsubsecentry
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+\ifpdf
+ \pdfcatalog{/PageMode /UseOutlines}%
+\fi
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+}
+
+% Appendices, in the main contents.
+\def\appendixentry#1#2#3{%
+ \dochapentry{\appendixbox{\putwordAppendix{} #2}\labelspace#1}{#3}}
+%
+% Appendices, in the short toc.
+\let\shortappendixentry = \shortchapentry
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
+% We could simplify the code here by writing out an \appendixentry
+% command in the toc file for appendices, instead of using \chapentry
+% for both, but it doesn't seem worth it.
+%
+\newdimen\shortappendixwidth
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ \dimen0 = 1em
+ \hbox to \dimen0{#1\hss}%
+}
+
+% Unnumbered chapters.
+\def\unnumbchapentry#1#2#3{\dochapentry{#1}{#3}}
+\def\shortunnumberedentry#1#2#3{\tocentry{#1}{\doshortpageno\bgroup#3\egroup}}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2#3#4#5{\dosubsecentry{#1}{#5}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#1}{#6}}
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% Final typesetting of a toc entry; we use the same \entry macro as for
+% the index entries, but we want to suppress hyphenation here. (We
+% can't do that in the \entry macro, since index entries might consist
+% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+\def\tocentry#1#2{\begingroup
+ \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
+ % Do not use \turnoffactive in these arguments. Since the toc is
+ % typeset in cmr, characters such as _ would come out wrong; we
+ % have to do the usual translation tricks.
+ \entry{#1}{#2}%
+\endgroup}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\==\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\*=\ptexstar
+ \let\t=\ptext
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @end lisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% Make each space character in the input produce a normal interword
+% space in the output. Don't allow a line break at this space, as this
+% is used only in environments like @example, where each line of input
+% should produce a line of output anyway.
+%
+{\obeyspaces %
+\gdef\sepspaces{\obeyspaces\let =\tie}}
+
+% Define \obeyedspace to be our active space, whatever it is. This is
+% for use in \parsearg.
+{\sepspaces%
+\global\let\obeyedspace= }
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty>10000 \else \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\def\cartouche{%
+\par % can't be in the midst of a paragraph.
+\begingroup
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt %we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+% side, and for 6pt waste from
+% each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \hsize=\cartinner
+ \kern3pt
+ \begingroup
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+\def\Ecartouche{%
+ \endgroup
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+\endgroup
+}}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \inENV % This group ends at the end of the body
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ % @cartouche defines \nonarrowing to inhibit narrowing
+ % at next level down.
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \let\exdent=\nofillexdent
+ \let\nonarrowing=\relax
+ \fi
+}
+
+% Define the \E... control sequence only if we are inside the particular
+% environment, so the error checking in \end will work.
+%
+% To end an @example-like environment, we first end the paragraph (via
+% \afterenvbreak's vertical glue), and then the group. That way we keep
+% the zero \parskip that the environments set -- \parskip glue will be
+% inserted at the beginning of the next paragraph in the document, after
+% the environment.
+%
+\def\nonfillfinish{\afterenvbreak\endgroup}
+
+% @lisp: indented, narrowed, typewriter font.
+\def\lisp{\begingroup
+ \nonfillstart
+ \let\Elisp = \nonfillfinish
+ \tt
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+
+% @example: Same as @lisp.
+\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+\def\smalllisp{\begingroup
+ \def\Esmalllisp{\nonfillfinish\endgroup}%
+ \def\Esmallexample{\nonfillfinish\endgroup}%
+ \smallexamplefonts
+ \lisp
+}
+\let\smallexample = \smalllisp
+
+
+% @display: same as @lisp except keep current font.
+%
+\def\display{\begingroup
+ \nonfillstart
+ \let\Edisplay = \nonfillfinish
+ \gobble
+}
+%
+% @smalldisplay: @display plus smaller fonts.
+%
+\def\smalldisplay{\begingroup
+ \def\Esmalldisplay{\nonfillfinish\endgroup}%
+ \smallexamplefonts \rm
+ \display
+}
+
+% @format: same as @display except don't narrow margins.
+%
+\def\format{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eformat = \nonfillfinish
+ \gobble
+}
+%
+% @smallformat: @format plus smaller fonts.
+%
+\def\smallformat{\begingroup
+ \def\Esmallformat{\nonfillfinish\endgroup}%
+ \smallexamplefonts \rm
+ \format
+}
+
+% @flushleft (same as @format).
+%
+\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
+
+% @flushright.
+%
+\def\flushright{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eflushright = \nonfillfinish
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
+%
+\def\quotation{%
+ \begingroup\inENV %This group ends at the end of the @quotation body
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ % We have retained a nonzero parskip for the environment, since we're
+ % doing normal filling. So to avoid extra space below the environment...
+ \def\Equotation{\parskip = 0pt \nonfillfinish}%
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \let\nonarrowing = \relax
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=12}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+\endgroup
+\def\setupverbatim{%
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%% Include LaTeX hack for completeness -- never know
+%% \begingroup
+%% \catcode`|=0 \catcode`[=1
+%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
+%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
+%% #1|endgroup|def|Everbatim[]|end[verbatim]]
+%% |endgroup
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}%
+\endgroup
+%
+\def\verbatim{%
+ \def\Everbatim{\nonfillfinish\endgroup}%
+ \begingroup
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ \begingroup\setupverbatim\doverbatim
+}
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+% Allow normal characters that we make active in the argument (a file name).
+\def\verbatiminclude{%
+ \begingroup
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \parsearg\doverbatiminclude
+}
+\def\setupverbatiminclude{%
+ \begingroup
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ \begingroup\setupverbatim
+}
+%
+\def\doverbatiminclude#1{%
+ % Restore active chars for included file.
+ \endgroup
+ \begingroup
+ \let\value=\expandablevalue
+ \def\thisfile{#1}%
+ \expandafter\expandafter\setupverbatiminclude\input\thisfile
+ \endgroup
+ \nonfillfinish
+ \endgroup
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later. Many commands won't be
+% allowed in this context, but that's ok.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\begingroup
+ % Define a command to swallow text until we reach `@end copying'.
+ % \ is the escape char in this texinfo.tex file, so it is the
+ % delimiter for the command; @ will be the escape char when we read
+ % it, but that doesn't matter.
+ \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
+ %
+ % We must preserve ^^M's in the input file; see \insertcopying below.
+ \catcode`\^^M = \active
+ \docopying
+}
+
+% What we do to finish off the copying text.
+%
+\def\enddocopying{\endgroup\ignorespaces}
+
+% @insertcopying. Here we must play games with ^^M's. On the one hand,
+% we need them to delimit commands such as `@end quotation', so they
+% must be active. On the other hand, we certainly don't want every
+% end-of-line to be a \par, as would happen with the normal active
+% definition of ^^M. On the third hand, two ^^M's in a row should still
+% generate a \par.
+%
+% Our approach is to make ^^M insert a space and a penalty1 normally;
+% then it can also check if \lastpenalty=1. If it does, then manually
+% do \par.
+%
+% This messes up the normal definitions of @c[omment], so we redefine
+% it. Similarly for @ignore. (These commands are used in the gcc
+% manual for man page generation.)
+%
+% Seems pretty fragile, most line-oriented commands will presumably
+% fail, but for the limited use of getting the copying text (which
+% should be quite simple) inserted, we can hope it's ok.
+%
+{\catcode`\^^M=\active %
+\gdef\insertcopying{\begingroup %
+ \parindent = 0pt % looks wrong on title page
+ \def^^M{%
+ \ifnum \lastpenalty=1 %
+ \par %
+ \else %
+ \space \penalty 1 %
+ \fi %
+ }%
+ %
+ % Fix @c[omment] for catcode 13 ^^M's.
+ \def\c##1^^M{\ignorespaces}%
+ \let\comment = \c %
+ %
+ % Don't bother jumping through all the hoops that \doignore does, it
+ % would be very hard since the catcodes are already set.
+ \long\def\ignore##1\end ignore{\ignorespaces}%
+ %
+ \copyingtext %
+\endgroup}%
+}
+
+\message{defuns,}
+% @defun etc.
+
+% Allow user to change definition object font (\df) internally
+\def\setdeffont#1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\&=\active
+ \catcode`\[=\active \catcode`\]=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+\global\let(=\lparen \global\let)=\rparen
+\global\let[=\lbrack \global\let]=\rbrack
+
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+% This is used to turn on special parens
+% but make & act ordinary (given that it's active).
+\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
+ \global\advance\parencount by 1
+}
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+ % also in that case restore the outer-level definition of (.
+ \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+ \global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text. This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
+\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
+\let\ampnr = \&
+\def\lbrb{{\bf\char`\[}}
+\def\rbrb{{\bf\char`\]}}
+
+% Active &'s sneak into the index arguments, so make sure it's defined.
+{
+ \catcode`& = \active
+ \global\let& = \ampnr
+}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the function name.
+% #2 is the type of definition, such as "Function".
+%
+\def\defname#1#2{%
+ % How we'll output the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \ifempty{#2}%
+ \def\defnametype{}%
+ \else
+ \def\defnametype{[\rm #2]}%
+ \fi
+ %
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \dimen2=\leftskip
+ \advance\dimen2 by -\defbodyindent
+ %
+ % Figure out values for the paragraph shape.
+ \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}%
+ \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+ \dimen1=\hsize \advance \dimen1 by -\defargsindent % size for continuations
+ \parshape 2 0in \dimen0 \defargsindent \dimen1
+ %
+ % Output arg 2 ("Function" or some such) but stuck inside a box of
+ % width 0 so it does not interfere with linebreaking.
+ \noindent
+ %
+ {% Adjust \hsize to exclude the ambient margins,
+ % so that \rightline will obey them.
+ \advance \hsize by -\dimen2
+ \dimen3 = 0pt % was -1.25pc
+ \rlap{\rightline{\defnametype\kern\dimen3}}%
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \advance\leftskip by -\defbodyindent
+ \exdentamount=\defbodyindent
+ {\df #1}\enskip % output function name
+ % \defunargs will be called next to output the arguments, if any.
+}
+
+% Common pieces to start any @def...
+% #1 is the \E... control sequence to end the definition (which we define).
+% #2 is the \...x control sequence (which our caller defines).
+% #3 is the control sequence to process the header, such as \defunheader.
+%
+\def\parsebodycommon#1#2#3{%
+ \begingroup\inENV
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we want to allow a
+ % break after all. Check for penalty 10002 (inserted by
+ % \defargscommonending) instead of 10000, since the sectioning
+ % commands insert a \penalty10000, and we don't want to allow a break
+ % between a section heading and a defun.
+ \ifnum\lastpenalty=10002 \penalty0 \fi
+ \medbreak
+ %
+ % Define the \E... end token that this defining construct specifies
+ % so that it will exit this group.
+ \def#1{\endgraf\endgroup\medbreak}%
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+% Common part of the \...x definitions.
+%
+\def\defxbodycommon{%
+ % As with \parsebodycommon above, allow line break if we have multiple
+ % x headers in a row. It's not a great place, though.
+ \ifnum\lastpenalty=10000 \penalty1000 \fi
+ %
+ \begingroup\obeylines
+}
+
+% Process body of @defun, @deffn, @defmac, etc.
+%
+\def\defparsebody#1#2#3{%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2{\defxbodycommon \activeparens \spacesplit#3}%
+ \catcode\equalChar=\active
+ \begingroup\obeylines\activeparens
+ \spacesplit#3%
+}
+
+% #1, #2, #3 are the common arguments (see \parsebodycommon above).
+% #4, delimited by the space, is the class name.
+%
+\def\defmethparsebody#1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}%
+ \begingroup\obeylines\activeparens
+ % The \empty here prevents misinterpretation of a construct such as
+ % @deffn {whatever} {Enharmonic comma}
+ % See comments at \deftpparsebody, although in our case we don't have
+ % to remove the \empty afterwards, since it is empty.
+ \spacesplit{#3{#4}}\empty
+}
+
+% Used for @deftypemethod and @deftypeivar.
+% #1, #2, #3 are the common arguments (see \defparsebody).
+% #4, delimited by a space, is the class name.
+% #5 is the method's return type.
+%
+\def\deftypemethparsebody#1#2#3#4 #5 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}%
+ \begingroup\obeylines\activeparens
+ \spacesplit{#3{#4}{#5}}%
+}
+
+% Used for @deftypeop. The change from \deftypemethparsebody is an
+% extra argument at the beginning which is the `category', instead of it
+% being the hardwired string `Method' or `Instance Variable'. We have
+% to account for this both in the \...x definition and in parsing the
+% input at hand. Thus also need a control sequence (passed as #5) for
+% the \E... definition to assign the category name to.
+%
+\def\deftypeopparsebody#1#2#3#4#5 #6 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 ##3 {\def#4{##1}%
+ \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}%
+ \begingroup\obeylines\activeparens
+ \spacesplit{#3{#5}{#6}}%
+}
+
+% For @defop.
+\def\defopparsebody #1#2#3#4#5 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 {\def#4{##1}%
+ \defxbodycommon \activeparens \spacesplit{#3{##2}}}%
+ \begingroup\obeylines\activeparens
+ \spacesplit{#3{#5}}%
+}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+%
+\def\defvarparsebody #1#2#3{%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2{\defxbodycommon \spacesplit#3}%
+ \catcode\equalChar=\active
+ \begingroup\obeylines
+ \spacesplit#3%
+}
+
+% @defopvar.
+\def\defopvarparsebody #1#2#3#4#5 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 {\def#4{##1}%
+ \defxbodycommon \spacesplit{#3{##2}}}%
+ \begingroup\obeylines
+ \spacesplit{#3{#5}}%
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+ \begingroup\obeylines
+ \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument. Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name. That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+ \begingroup\obeylines
+ \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any). That's what this does.
+%
+\def\removeemptybraces\empty#1\relax{#1}
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+%
+\def\parsetpheaderline#1#2#3{%
+ #1{\removeemptybraces#2\relax}{#3}%
+}%
+
+% Split up #2 (the rest of the input line) at the first space token.
+% call #1 with two arguments:
+% the first is all of #2 before the space token,
+% the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+%
+{\obeylines %
+ \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}%
+ \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{%
+ \ifx\relax #3%
+ #1{#2}{}%
+ \else %
+ #1{#2}{#3#4}%
+ \fi}%
+}
+
+% Define @defun.
+
+% This is called to end the arguments processing for all the @def... commands.
+%
+\def\defargscommonending{%
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty 10002 % signal to \parsebodycommon.
+}
+
+% This expands the args and terminates the paragraph they comprise.
+%
+\def\defunargs#1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Set the font temporarily and use \font in case \setfont made \tensl a macro.
+{\tensl\hyphenchar\font=0}%
+#1%
+{\tensl\hyphenchar\font=45}%
+\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
+ \defargscommonending
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Use \boldbraxnoamp, not \functionparens, so that & is not special.
+\boldbraxnoamp
+\tclose{#1}% avoid \code because of side effects on active chars
+ \defargscommonending
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDeffunc}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type. #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
+\deftypefunargs {#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% \defheaderxcond#1\relax$.$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
+
+% #1 is the classification. #2 is the data type. #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+% at least some C++ text from working
+\defname {\defheaderxcond#2\relax$.$#3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefmac}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefspec}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defop CATEGORY CLASS OPERATION ARG...
+%
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+%
+\def\defopheader#1#2#3{%
+ \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry
+ \begingroup
+ \defname{#2}{\defoptype\ \putwordon\ #1}%
+ \defunargs{#3}%
+ \endgroup
+}
+
+% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
+%
+\def\deftypeop #1 {\def\deftypeopcategory{#1}%
+ \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
+ \deftypeopcategory}
+%
+% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
+\def\deftypeopheader#1#2#3#4{%
+ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}
+ {\deftypeopcategory\ \putwordon\ \code{#1}}%
+ \deftypefunargs{#4}%
+ \endgroup
+}
+
+% @deftypemethod CLASS TYPE METHOD ARG...
+%
+\def\deftypemethod{%
+ \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
+%
+% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
+\def\deftypemethodheader#1#2#3#4{%
+ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
+ \deftypefunargs{#4}%
+ \endgroup
+}
+
+% @deftypeivar CLASS TYPE VARNAME
+%
+\def\deftypeivar{%
+ \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
+%
+% #1 is the class name, #2 the data type, #3 the variable name.
+\def\deftypeivarheader#1#2#3{%
+ \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}
+ {\putwordInstanceVariableof\ \code{#1}}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defmethod == @defop Method
+%
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+%
+% #1 is the class name, #2 the method name, #3 the args.
+\def\defmethodheader#1#2#3{%
+ \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{#2}{\putwordMethodon\ \code{#1}}%
+ \defunargs{#3}%
+ \endgroup
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+ \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry
+ \begingroup
+ \defname{#2}{\defcvtype\ \putwordof\ #1}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
+%
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+%
+\def\defivarheader#1#2#3{%
+ \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index
+ \begingroup
+ \defname{#2}{\putwordInstanceVariableof\ #1}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defvar
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+ \defargscommonending
+}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefvar}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefopt}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type. #2 is the name, perhaps followed by text that
+% is actually part of the data type, which should not be put into the index.
+\def\deftypevarheader #1#2{%
+\dovarind#2 \relax% Make entry in variables index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
+ \defargscommonending
+\endgroup}
+\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
+\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
+ \defargscommonending
+\endgroup}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% These definitions are used if you use @defunx (etc.)
+% anywhere other than immediately after a @defun or @defunx.
+%
+\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
+\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
+\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
+\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
+\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\defopx#1 {\errmessage{@defopx in invalid context}}
+\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
+\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
+\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
+\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
+\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
+\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
+\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
+\def\defunx#1 {\errmessage{@defunx in invalid context}}
+\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
+\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scanmacro#1{%
+ \begingroup \newlinechar`\^^M
+ % Undo catcode changes of \startcontents and \doprintindex
+ \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ \toks0={#1\endinput}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \let\xeatspaces\eatspaces
+ \input \jobname.tmp
+ \endgroup
+}
+\else
+\def\scanmacro#1{%
+\begingroup \newlinechar`\^^M
+% Undo catcode changes of \startcontents and \doprintindex
+\catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
+\fi
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+\def\macrolist{} % List of all defined macros in the form
+ % \do\macro1\do\macro2...
+
+% Utility routines.
+% Thisdoes \let #1 = #2, except with \csnames.
+\def\cslet#1#2{%
+\expandafter\expandafter
+\expandafter\let
+\expandafter\expandafter
+\csname#1\endcsname
+\csname#2\endcsname}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\macrobodyctxt{%
+ \catcode`\~=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\@=\other
+ \catcode`\^^M=\other
+ \usembodybackslash}
+
+\def\macroargctxt{%
+ \catcode`\~=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
+ \catcode`\@=\other
+ \catcode`\\=\other}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ % Add the macroname to \macrolist
+ \toks0 = \expandafter{\macrolist\do}%
+ \xdef\macrolist{\the\toks0
+ \expandafter\noexpand\csname\the\macname\endcsname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\def\unmacro{\parsearg\dounmacro}
+\def\dounmacro#1{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\do\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx#1\relax
+ % remove this
+ \else
+ \noexpand\do \noexpand #1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \next}
+
+% We mant to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{\ignoreactivespaces
+\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
+ \expandafter\noexpand\csname#2\endcsname}%
+\expandafter\endgroup\next}
+
+
+\message{cross references,}
+% @xref etc.
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's job is to define \lastnode.
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\relax
+
+% The sectioning commands (@chapter, etc.) call these.
+\def\donoderef{%
+ \ifx\lastnode\relax\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}%
+ {Ysectionnumberandtype}%
+ \global\let\lastnode=\relax
+ \fi
+}
+\def\unnumbnoderef{%
+ \ifx\lastnode\relax\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
+ \global\let\lastnode=\relax
+ \fi
+}
+\def\appendixnoderef{%
+ \ifx\lastnode\relax\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}%
+ {Yappendixletterandtype}%
+ \global\let\lastnode=\relax
+ \fi
+}
+
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), namely NAME-title (the corresponding @chapter/etc. name),
+% NAME-pg (the page number), and NAME-snt (section number and type).
+% Called from \foonoderef.
+%
+% We have to set \indexdummies so commands such as @code in a section
+% title aren't expanded. It would be nicer not to expand the titles in
+% the first place, but there's so many layers that that is hard to do.
+%
+% Likewise, use \turnoffactive so that punctuation chars such as underscore
+% and backslash work in node names.
+%
+\def\setref#1#2{{%
+ \atdummies
+ \pdfmkdest{#1}%
+ %
+ \turnoffactive
+ \dosetq{#1-title}{Ytitle}%
+ \dosetq{#1-pg}{Ypagenumber}%
+ \dosetq{#1-snt}{#2}%
+}}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printednodename{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual}%
+ \setbox0=\hbox{\printednodename}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printednodename{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printednodename{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\turnoffactive \otherbackslash
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{#1}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{#1}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive \otherbackslash
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % [mynode],
+ [\printednodename],\space
+ % page 3
+ \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \endlink
+\endgroup}
+
+% \dosetq is called from \setref to do the actual \write (\iflinks).
+%
+\def\dosetq#1#2{%
+ {\let\folio=0%
+ \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
+ \iflinks \next \fi
+ }%
+}
+
+% \internalsetq{foo}{page} expands into
+% CHARACTERS @xrdef{foo}{...expansion of \page...}
+\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq.
+%
+\def\Ypagenumber{\folio}
+\def\Ytitle{\thissection}
+\def\Ynothing{}
+\def\Ysectionnumberandtype{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+\def\Yappendixletterandtype{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname X#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.
+%
+\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
+
+% Read the last existing aux file, if any. No error if none exists.
+\def\readauxfile{\begingroup
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % Make the characters 128-255 be printing characters
+ {%
+ \count 1=128
+ \def\loop{%
+ \catcode\count 1=\other
+ \advance\count 1 by 1
+ \ifnum \count 1<256 \loop \fi
+ }%
+ }%
+ %
+ % Turn off \ as an escape so we do not lose on
+ % entries which were dumped with control sequences in their names.
+ % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
+ % Reference to such entries still does not work the way one would wish,
+ % but at least they do not bomb out when the aux file is read in.
+ \catcode`\\=\other
+ %
+ % @ is our escape character in .aux files.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+ %
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.aux
+ \global\havexrefstrue
+ \global\warnedobstrue
+ \fi
+ % Open the new aux file. TeX will close it automatically at exit.
+ \openout\auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset and anything else that uses
+% \parseargline fail inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+% The start of the footnote looks usually like this:
+\gdef\startfootins{\insert\footins\bgroup}
+%
+% ... but this macro is redefined inside @multitable.
+%
+\gdef\dofootnote{%
+ \startfootins
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ \closein 1
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup\hss
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \hss \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\def\documentlanguage{\parsearg\dodocumentlanguage}
+\def\dodocumentlanguage#1{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \let\temp = \relax
+ \else
+ \def\temp{\input txi-#1.tex }%
+ \fi
+ \temp
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{51\baselineskip}{160mm}
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\def\pagesizes{\parsearg\pagesizesxxx}
+\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`+=\active
+\catcode`\_=\active
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \rawbackslashxx outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\rawbackslashxx=`\\
+
+% \rawbackslash defines an active \ to do \rawbackslashxx.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@rawbackslashxx}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+ @let"=@normaldoublequote
+ @let\=@realbackslash
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'. (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+@c Set initial fonts.
+@textfonts
+@rm
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End: