From 93c665b56da394fdb19049bbd05f7d66c90a9cc2 Mon Sep 17 00:00:00 2001 From: Carsten Dominik Date: Thu, 31 Jan 2008 16:04:26 +0100 Subject: [PATCH] Intermediate state, I am just trying comiting now. --- BUGFIXING/org-log.el | 348 + CONTRIB/org-depend.el | 235 + CONTRIB/org-export-freemind-0.1.0/ChangeLog | 33 + CONTRIB/org-export-freemind-0.1.0/README | 50 + .../org-export-freemind-install.el | 7 + .../org-export-freemind.el | 196 + CONTRIB/org-export-freemind.el | 196 + CONTRIB/org-mairix.el | 153 + CONTRIB/org-man.el | 39 + CONTRIB/org-toc.el | 488 + ChangeLog | 41 +- EXPERIMENTAL/find-links-to-local.el | 3 + .../org-interactive-query.patch.txt | 328 + EXPERIMENTAL/interactive-query/org.el | 28057 ++++++++++++++++ .../interactive-query/org.el.orig | 10836 ++++-- EXPERIMENTAL/john.el | 70 + EXPERIMENTAL/org-bibtex.el | 154 + EXPERIMENTAL/org-depend.el | 235 + EXPERIMENTAL/org-elisp-symbol.el | 158 + EXPERIMENTAL/org-fastup.el | 135 + EXPERIMENTAL/org-indent.el | 107 + EXPERIMENTAL/org-panel.el | 642 + EXPERIMENTAL/org-pic.el | 191 + EXPERIMENTAL/sacha-load.el | 111 + Makefile | 27 +- ORGWEBPAGE/.DS_Store | Bin 0 -> 12292 bytes ORGWEBPAGE/Changes.html | 6354 ++++ ORGWEBPAGE/Changes.org | 3353 ++ ORGWEBPAGE/Changes.txt | 3152 ++ ORGWEBPAGE/faq.html | 555 + ORGWEBPAGE/faq.org | 372 + ORGWEBPAGE/freeshell2.css | 66 + ORGWEBPAGE/index.html | 403 + ORGWEBPAGE/index.org | 211 + ORGWEBPAGE/index.txt | 151 + ORGWEBPAGE/org.texi | 5 + ORGWEBPAGE/org/index.html | 24 + ORGWEBPAGE/qanda.org | 231 + ORGWEBPAGE/survey.html | 2195 ++ ORGWEBPAGE/survey.org | 1158 + ORGWEBPAGE/tmp/.DS_Store | Bin 0 -> 6148 bytes ORGWEBPAGE/tmp/Changes.html | 6368 ++++ ORGWEBPAGE/tmp/Changes.txt | 3562 ++ ORGWEBPAGE/tmp/faq.html | 663 + ORGWEBPAGE/tmp/freeshell2.css | 65 + ORGWEBPAGE/tmp/index.html | 419 + ORGWEBPAGE/tmp/orgcard.txt | 457 + ORGWEBPAGE/tmp/qanda.html | 449 + ORGWEBPAGE/tmp/request-assign-future.txt | 44 + ORGWEBPAGE/tmp/survey.html | 2169 ++ ORGWEBPAGE/tmp/todo.html | 1209 + ORGWEBPAGE/tmp/tutorials.html | 317 + ORGWEBPAGE/todo.html | 920 + ORGWEBPAGE/todo.org | 649 + ORGWEBPAGE/tutorials.html | 340 + ORGWEBPAGE/tutorials.org | 105 + TODO | 206 + UTILITIES/fake_change_log.pl | 72 + org.el | 754 +- org.texi | 47 +- orgcard.tex | 6 +- orgcard.txt | 457 + texinfo.tex | 6688 ++++ 63 files changed, 84212 insertions(+), 2824 deletions(-) create mode 100644 BUGFIXING/org-log.el create mode 100644 CONTRIB/org-depend.el create mode 100755 CONTRIB/org-export-freemind-0.1.0/ChangeLog create mode 100755 CONTRIB/org-export-freemind-0.1.0/README create mode 100755 CONTRIB/org-export-freemind-0.1.0/org-export-freemind-install.el create mode 100755 CONTRIB/org-export-freemind-0.1.0/org-export-freemind.el create mode 100644 CONTRIB/org-export-freemind.el create mode 100644 CONTRIB/org-mairix.el create mode 100644 CONTRIB/org-man.el create mode 100644 CONTRIB/org-toc.el create mode 100644 EXPERIMENTAL/find-links-to-local.el create mode 100644 EXPERIMENTAL/interactive-query/org-interactive-query.patch.txt create mode 100644 EXPERIMENTAL/interactive-query/org.el rename org_xemacs.el => EXPERIMENTAL/interactive-query/org.el.orig (70%) create mode 100644 EXPERIMENTAL/john.el create mode 100644 EXPERIMENTAL/org-bibtex.el create mode 100644 EXPERIMENTAL/org-depend.el create mode 100644 EXPERIMENTAL/org-elisp-symbol.el create mode 100644 EXPERIMENTAL/org-fastup.el create mode 100644 EXPERIMENTAL/org-indent.el create mode 100644 EXPERIMENTAL/org-panel.el create mode 100644 EXPERIMENTAL/org-pic.el create mode 100644 EXPERIMENTAL/sacha-load.el create mode 100644 ORGWEBPAGE/.DS_Store create mode 100644 ORGWEBPAGE/Changes.html create mode 100644 ORGWEBPAGE/Changes.org create mode 100644 ORGWEBPAGE/Changes.txt create mode 100644 ORGWEBPAGE/faq.html create mode 100644 ORGWEBPAGE/faq.org create mode 100644 ORGWEBPAGE/freeshell2.css create mode 100644 ORGWEBPAGE/index.html create mode 100644 ORGWEBPAGE/index.org create mode 100644 ORGWEBPAGE/index.txt create mode 100644 ORGWEBPAGE/org.texi create mode 100644 ORGWEBPAGE/org/index.html create mode 100644 ORGWEBPAGE/qanda.org create mode 100644 ORGWEBPAGE/survey.html create mode 100644 ORGWEBPAGE/survey.org create mode 100644 ORGWEBPAGE/tmp/.DS_Store create mode 100644 ORGWEBPAGE/tmp/Changes.html create mode 100644 ORGWEBPAGE/tmp/Changes.txt create mode 100644 ORGWEBPAGE/tmp/faq.html create mode 100644 ORGWEBPAGE/tmp/freeshell2.css create mode 100644 ORGWEBPAGE/tmp/index.html create mode 100644 ORGWEBPAGE/tmp/orgcard.txt create mode 100644 ORGWEBPAGE/tmp/qanda.html create mode 100644 ORGWEBPAGE/tmp/request-assign-future.txt create mode 100644 ORGWEBPAGE/tmp/survey.html create mode 100644 ORGWEBPAGE/tmp/todo.html create mode 100644 ORGWEBPAGE/tmp/tutorials.html create mode 100644 ORGWEBPAGE/todo.html create mode 100644 ORGWEBPAGE/todo.org create mode 100644 ORGWEBPAGE/tutorials.html create mode 100644 ORGWEBPAGE/tutorials.org create mode 100644 TODO create mode 100755 UTILITIES/fake_change_log.pl create mode 100644 orgcard.txt create mode 100644 texinfo.tex diff --git a/BUGFIXING/org-log.el b/BUGFIXING/org-log.el new file mode 100644 index 000000000..8ebedfe61 --- /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 000000000..1f0fb17f8 --- /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 000000000..db8612799 --- /dev/null +++ b/CONTRIB/org-export-freemind-0.1.0/ChangeLog @@ -0,0 +1,33 @@ +2007-06-25 Marco Vezzoli + + * org-export-freemind-install.el (org-export-as-freemind): + - created installation file + +2007-06-25 Marco Vezzoli + + * 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 + + * 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 000000000..97d0ac379 --- /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 000000000..dab60f15b --- /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 000000000..58791413a --- /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 +;; 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 "\n"))) + (org-export-as-xoxo-insert-into out + "\n") + (if (bufferp outbuffer) + (org-export-as-xoxo-insert-into out "\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 "\n"))) + (org-export-as-xoxo-insert-into out "\n" x "")) + text) + "")) + (html-quoted-heading (org-html-expand heading)) + (exp-quote-heading (replace-regexp-in-string "'" """ 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 "\n"))) + (dolist (rule org-freemind-cloud-alist) + (when (string-match (car rule) text) + (progn + (org-export-as-xoxo-insert-into out + "\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 "\n"))) + (org-export-as-xoxo-insert-into out "\n") + + ;; Finish the buffer off and clean it up. + (unless (bufferp outbuffer) + (progn + (org-export-as-xoxo-insert-into out "\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 "\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 "\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 000000000..58791413a --- /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 +;; 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 "\n"))) + (org-export-as-xoxo-insert-into out + "\n") + (if (bufferp outbuffer) + (org-export-as-xoxo-insert-into out "\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 "\n"))) + (org-export-as-xoxo-insert-into out "\n" x "")) + text) + "")) + (html-quoted-heading (org-html-expand heading)) + (exp-quote-heading (replace-regexp-in-string "'" """ 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 "\n"))) + (dolist (rule org-freemind-cloud-alist) + (when (string-match (car rule) text) + (progn + (org-export-as-xoxo-insert-into out + "\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 "\n"))) + (org-export-as-xoxo-insert-into out "\n") + + ;; Finish the buffer off and clean it up. + (unless (bufferp outbuffer) + (progn + (org-export-as-xoxo-insert-into out "\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 "\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 "\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 000000000..ede278e7e --- /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 + "?")) + (setq org-link-re-with-space2 + (concat + "?")) + (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 000000000..f4933d0a0 --- /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 000000000..cc2a46efe --- /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 +;; 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-") + '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 9fe9a20b2..c7a5f06c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,46 @@ +2008-01-26 Carsten Dominik + + * org.el (org-archive-all-done): Fixed incorrect number of stars + in regexp. + +2008-01-25 Carsten Dominik + + * 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 + + * org.el (org-columns-edit-value) + (org-columns-next-allowed-value): Only update if not in agenda. + +2008-01-22 Carsten Dominik + + * 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 * 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 - - * 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 000000000..d9a94c1bd --- /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 000000000..35c47a5a1 --- /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 000000000..0d2f0a598 --- /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 +;; 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 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- 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 " + +\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 + . +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 ." + :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. +\\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 + +or, if you want to keep the style in a file, + + + +As the value of this option simply gets inserted into the HTML header, +you can \"misuse\" it to also add other text to the header. However, + 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 + -----+----------+-------- + \\- ­ \\- + -- – -- + --- — --- + ... … \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: + +\\- : ­ +-- : – +--- : — + +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 α and \\AA to Å. +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 instead of . +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 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 +"" + "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: + + + +or, if you want to keep the style in a file, + + + +As the value of this option simply gets inserted into the HTML header, +you can \"misuse\" it to add arbitrary text to the header." + :group 'org-export-html + :type 'string) + + +(defcustom org-export-html-title-format "

%s

\n" + "Format for typesetting the document title in HTML export." + :group 'org-export-html + :type 'string) + +(defcustom org-export-html-toplevel-hlevel 2 + "The 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 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 + "" + "The HTML tag that is used to start a table. +This must be a
tag, but you may change the options like +borders and spacing." + :group 'org-export-html + :type 'string) + +(defcustom org-export-table-header-tags '("") + "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 '("") + "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 + "


\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 "" "") + ("/" italic "" "") + ("_" underline "" "") + ("=" org-code "" "" verbatim) + ("~" org-verbatim "" "" verbatim) + ("+" (:strike-through t) "" "") + ) + "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 + "?") + org-link-re-with-space2 + (concat + "?") + 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 <<> 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-"] + ["Move Column Right" org-metaright :active (org-at-table-p) :keys "M-"] + ["Delete Column" org-shiftmetaleft :active (org-at-table-p) :keys "M-S-"] + ["Insert Column" org-shiftmetaright :active (org-at-table-p) :keys "M-S-"]) + ("Row" + ["Move Row Up" org-metaup :active (org-at-table-p) :keys "M-"] + ["Move Row Down" org-metadown :active (org-at-table-p) :keys "M-"] + ["Delete Row" org-shiftmetaup :active (org-at-table-p) :keys "M-S-"] + ["Insert Row" org-shiftmetadown :active (org-at-table-p) :keys "M-S-"] + ["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
" . "" . "
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) + "\\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 / 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 "\\]+\\)" 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 "\\" "") html)) + (setq tbopen t) + (while (setq line (pop lines)) + (catch 'next-line + (if (string-match "^[ \t]*|-" line) + (progn + (unless splice + (push (if head "" "") html) + (if lines (push "" 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 "" + (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 "") + "") + html))) + (unless splice (if tbopen (push "" html))) + (unless splice (push "
\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%s" + (if (memq gr '(:start :startend)) + (prog1 + (if colgropen "\n" "") + (setq colgropen t)) + "") + (if (> (/ (float x) nlines) org-table-number-fraction) + "right" "left") + (if (memq gr '(:end :startend)) + (progn (setq colgropen nil) "") + ""))) + fnum "") + html) + (if colgropen (setq html (cons (car html) (cons "" (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 '("<" "<")) :start) + ((member x '(">" ">")) :end) + ((member x '("<>" "<>")) :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 '("<" "<")) :start) + ((member x '(">" ">")) :end) + ((member x '("<>" "<>")) :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 " ") + (catch 'next-line + (if (string-match "^[ \t]*\\+-" line) + (progn + (if field-buffer + (progn + (setq + html + (concat + html + "" + (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") + "\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 "
" (pop fields))) + field-buffer)) + (setq field-buffer fields)))) + (setq html (concat html "\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 "@%s @" + (match-string 1 s))) + (format " @%s@" + (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 "@
"))) + r)))) + +(defun org-html-protect (s) + ;; convert & to &, < to < and > to > + (let ((start 0)) + (while (string-match "&" s start) + (setq s (replace-match "&" t t s) + start (1+ (match-beginning 0)))) + (while (string-match "<" s) + (setq s (replace-match "<" t t s))) + (while (string-match ">" s) + (setq s (replace-match ">" 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 "@<\\([^&]*\\)>" 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 + '(("\\\\-" . "­") + ("---\\([^-]\\)" . "—\\1") + ("--\\([^-]\\)" . "–\\1") + ("\\.\\.\\." . "…")) + "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 "") + 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

, but first close previous paragraph if any." + (org-close-par-maybe) + (insert "\n

") + (setq org-par-open t)) +(defun org-close-par-maybe () + "Close paragraph if there is one open." + (when org-par-open + (insert "

") + (setq org-par-open nil))) +(defun org-close-li () + "Close
  • if necessary." + (org-close-par-maybe) + (insert "
  • \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 + "   " + (mapconcat 'identity (org-split-string + (match-string 1 title) ":") + " ") + "")) + "") + t t title))) + (if (> level umax) + (progn + (if (aref org-levels-open (1- level)) + (progn + (org-close-li) + (insert "
  • " title "
    \n")) + (aset org-levels-open (1- level) t) + (org-close-par-maybe) + (insert "
      \n
    • " title "
      \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
      \n%s\n" + level level head-count title level)) + (insert (format "\n
      \n%s\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 "
      \n") + (org-close-li) + (insert "
    \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-*" + (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 "
      \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
        \n")) + + ((< level last-level) + (dotimes (- (- last-level level) 1) + (if hanging-li + (org-export-as-xoxo-insert-into out "\n")) + (org-export-as-xoxo-insert-into out "
      \n")) + (when hanging-li + (org-export-as-xoxo-insert-into out "\n") + (setq hanging-li nil))) + + ((equal level last-level) + (if hanging-li + (org-export-as-xoxo-insert-into out "\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 "
    1. ") + (org-export-as-xoxo-insert-into out "
    2. " text)))) + + ;; Finally finish off the ol + (dotimes (- last-level 1) + (if hanging-li + (org-export-as-xoxo-insert-into out "
    3. \n")) + (org-export-as-xoxo-insert-into out "
    \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 <<>>, 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 <> +:radio-target on a <<>> +: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 similarity index 70% rename from org_xemacs.el rename to EXPERIMENTAL/interactive-query/org.el.orig index ceb6eb476..276854ad5 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 +;; Author: Carsten Dominik ;; 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 ." (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-repeat t - "Non-nil means, prompt for a note when REPEAT is resetting a TODO entry. -When nil, no note will be taken." +(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" @@ -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." - :group 'org-time - :type 'number) +(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. -(defcustom org-popup-calendar-for-date-prompt t +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. @@ -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)))) +(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. +(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 + -----+----------+-------- + \\- ­ \\- + -- – -- + --- — --- + ... … \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: + +\\- : ­ +-- : – +--- : — + +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 α and \\AA to Å. @@ -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 " + +

    Org-mode list of User-visible changes

    + +
    +

    Version 5.20

    + + + +
    +

    Overview

    + + +
    + +
    +

    Incompatible Changes

    + + +
    + +
    +

    Details

    + + +

    ++————+–——————+-——————+-————+ ++————+–——————+-——————+-————+ ++————+–——————+-——————+-————+ ++————+–——————+-——————+-————+ ++————+–——————+-——————+-————+ +

    +
      +
    • +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: + +
    • +
    • +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. + +
    • +
    • +`C-u C-c C-w' allows you to jump to a refiling location. + +
    • +
    • +`C-u C-u C-c C-w' uses the refile interface to jum to any +headline in the current file. + +
    • +
    • +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: + + ++ + + + + + + + + + + + + + + + + + + + +
      CommandC-uC-u C-u
      org-rememberselect template andselect template andgoto location
      store a notego to its defaultlast used by
      targetremember
      org-refileselect a targer andgoto a targetgoto location
      refile subtreelast used by
      refile
      org-gotogo to a headlineUse outline-path-
      selected fromcompletion to
      outline f currentselect the
      buffer.headline
      OrgDescriptionHTML
      \\-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: + + ++ + + + + + + + + + + +
      valuescope
      nilthe current buffer or narrowed region
      filethe full current buffer
      subtreethe subtree where the clocktable is located
      treeNthe surrounding level N tree, for example tree3
      treethe surrounding level 1 tree
      agendaall 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 like1 are now exported to HTML + +

      1This 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. + + ++ + + + + + + + + + + + +
      CommandOld TTYNew TTY
      org-…..Main KeyReplacementReplacement
      shiftleftS-leftC-c C-x leftC-c left
      shiftrightS-rightC-c C-x rightC-c right
      shiftupS-upC-c C-x upC-c up
      shiftdownS-downC-c C-x downC-c down
      shiftcontrolleftC-S-leftC-c C-x left
      shiftcontrolrightC-s-rightC-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 ab +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 + + + +
    • +
    +
    +

    Author: Carsten Dominik +<carsten at orgmode dot org> +

    +

    Date: 2008/01/25 14:14:58

    +
    + diff --git a/ORGWEBPAGE/Changes.org b/ORGWEBPAGE/Changes.org new file mode 100644 index 000000000..6340e7ac8 --- /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 | ­ | + | ~--~ | two dashes (minuses) | – | + | ~---~ | three dashes (minuses) | — | + | ~...~ | three dots | … | + + 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
    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
    structure + + There is now a
    -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
    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 tags with + ), 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- 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 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 + .., and each part of the body (as separated in + org-mode by hlines) is wrapped into .. tags. I + have also changed the CSS style for 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 "" 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
    , 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 "". + - 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-/ 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 000000000..067c8ebe2 --- /dev/null +++ b/ORGWEBPAGE/Changes.txt @@ -0,0 +1,3152 @@ + Org-mode list of User-visible changes + ===================================== + +Author: Carsten Dominik +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 ­ + - - two dashes (minuses) – + - - - three dashes (minuses) — + . . . three dots … + + 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
    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
    structure +-------------------- + + There is now a
    -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
    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 tags with + ), 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- 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 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 + .., and each part of the body (as separated in + org-mode by hlines) is wrapped into .. tags. I + have also changed the CSS style for 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 "" 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
    , 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 "". + - 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-/ 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 000000000..eb293c8b9 --- /dev/null +++ b/ORGWEBPAGE/faq.html @@ -0,0 +1,555 @@ + + + +Org-mode Frequently Asked Questions + + + + + + +

    Org-mode Frequently Asked Questions

    +

    Table of Contents

    + + +

    1 General

    + + +

    1.1 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. +

    + + +

    1.2 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 Outline Magic. +

    + +

    2 Errors

    + + +

    2.1 (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 Conflicts section in the manual +

    + +

    2.2 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. +

    + +

    2.3 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 Conflicts section of the manual. +

    + +

    3 Setup and Structure

    + + +

    3.1 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)
    +
    +

    + +

    3.2 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. +

    + +

    3.3 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. +

    + +

    3.4 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))
    +
    +

    + + +

    3.5 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. +

    + +

    3.6 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. +

    + +

    4 Hyperlinks

    + + + +

    4.1 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. +

    + +

    4.2 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)
    +
    +

    + +

    4.3 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)
    +
    +

    + + +

    5 Export

    + + +

    5.1 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; ...
    +
    +

    + +

    5.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. +

    + +

    5.3 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 +

    + +

    6 Tables

    + + +

    6.1 #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! +

    + +

    6.2 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)
    +
    +

    + +

    6.3 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 C-c = and C-u C-c = +

    + + +

    6.4 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. +

    + +

    6.5 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. +

    + +

    6.6 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. +

    + +

    6.7 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)
    +
    +

    + +

    7 Agenda

    + + +

    7.1 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 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 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. +

    + +

    Author: Carsten Dominik +<carsten.dominik@gmail.com> +

    +

    Date: 2007/09/10 07:06:01

    + + diff --git a/ORGWEBPAGE/faq.org b/ORGWEBPAGE/faq.org new file mode 100644 index 000000000..b2fbe67d1 --- /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 @C-c =@ and @C-u C-c =@ + + +** 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 @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 /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: " " +# End: diff --git a/ORGWEBPAGE/freeshell2.css b/ORGWEBPAGE/freeshell2.css new file mode 100644 index 000000000..d88a0d9be --- /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 000000000..ea618eb85 --- /dev/null +++ b/ORGWEBPAGE/index.html @@ -0,0 +1,403 @@ + + + +Org-Mode Homepage + + + + + + +

    Org-Mode Homepage

    + + +
    +

    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, HTML, and LaTeX. +

    +
    + +
    +

    Current Version (5.19) and Compatibility

    + + +

    +The current version is 5.19. To see what has changed in recent +releases, check this 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 zip file or 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 here. + +
    • +
    +
    + +
    +

    Documentation

    + + +
    +

    Manual and Reference card

    + +
      +
    • +Read the documentation 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 single monolithic file. +
    • +
    • +Download the documentation in other formats: PDF, Info, or TeXInfo. +
    • +
    • +Download the Refcard for org-mode, and Kyle Sherman hast created a +text version of the reference card +
    • +
    • +There is also a Japanese translation of the manual (version 4.60), +produced by Takeshi Okano. +
    • +
    • +The 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 this webpage. +
    • +
    • +Directly 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 Gmane through a web interface or with a +newsreader. +
    • + + + +
      + +
    • +
    + +
    +

    Tutorials

    + + +

    +Tutorials and screencasts are listed on a separate page. +

    +
    + +
    +

    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 David Allen's strategy for 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. +

    +
      +
    • +John Wiegley has written an excellent document describing his +way of using Org-mode as a day planner. See also some later +messages for enhancements of his setup: +emacs-orgmode-2962, emacs-orgmode-3629 + +
    • +
    • +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 summarizing 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 +
      • +
      • +The SOMEDAY/MAYBE vs. low priorities thread contains a +discussion about priorities that is quite instructive. +
      • +
      • +Here is a 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 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 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 great 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 been really prolific in writing interesting +add-ons, all available at his 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 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

    + + +
    + +
    +

    XXX to Org-mode

    + + +
    + +
    +

    Bi-directional

    + + +

    +Unfortunately nothing so far. +

    +
    +
    + +
    +

    Alternative distributions

    + + +
    + +
    +

    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, 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 list of ideas that are still to be processed +somehow, when I get to it… +

    +
    +
    +

    Author: Carsten Dominik +<carsten at orgmode dot org> +

    +

    Date: 2008/01/18 12:46:32

    +
    + diff --git a/ORGWEBPAGE/index.org b/ORGWEBPAGE/index.org new file mode 100644 index 000000000..142c3c294 --- /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: + +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 +
  • + + + +
    +#+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 000000000..f9366d37b --- /dev/null +++ b/ORGWEBPAGE/index.txt @@ -0,0 +1,151 @@ + Org-Mode Homepage + ================= + +Author: Carsten Dominik +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 000000000..7dbd028d3 --- /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 000000000..6bff35d73 --- /dev/null +++ b/ORGWEBPAGE/org/index.html @@ -0,0 +1,24 @@ + + +Untitled + + + + + + + + + + + diff --git a/ORGWEBPAGE/qanda.org b/ORGWEBPAGE/qanda.org new file mode 100644 index 000000000..aa2ba0d53 --- /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: " " +# End: diff --git a/ORGWEBPAGE/survey.html b/ORGWEBPAGE/survey.html new file mode 100644 index 000000000..fab186d6a --- /dev/null +++ b/ORGWEBPAGE/survey.html @@ -0,0 +1,2195 @@ + + + +Org-Mode Survey Results + + + + + + +

    Org-Mode Survey Results

    +Some descriptive text to be emitted. Several lines OK. + + + + +
    +

    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?

    + + ++ + + + + + + + +
    OSNbar
    Windows31*******************************
    Linux55*******************************************************
    Mac OS X12************
    + + +

    +The different Linux distributions: +

    + ++ + + + + + + + + + + + + + + + + + + +
    DistributionNbar
    Arch Linux1*
    Centos1*
    Debian14**************
    Fedora7*******
    FreeBSD1*
    Gentoo7*******
    Kununtu1*
    MagicLinux1*
    OpenBSD1*
    RedHat2**
    Solarus2**
    Suse7*******
    Ubuntu9*********
    Unspecified2**
    + + +
    + +
    +

    2. Which Emacs are you using (GNU/Xemacs, etc) and which version? Paste the result of M-x version.

    + + +

    +Summary: +

    ++ + + + + + + + + + +
    Emacs/XEmacsNumber of answers
    XEmacs7
    Emacs total73
    Emacs 214
    Emacs 2247
    Emacs 2318
    + + +

    +The raw replies can be found 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 rangeNbar
    16 - 200
    21 - 255*****
    26 - 3015***************
    31 - 3521*********************
    36 - 4011***********
    41 - 4513*************
    46 - 503***
    51 - 553***
    56 - 600
    + + +
    + +
    +

    9. Which country do you live in?

    + + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CountryNbar
    Australia3***
    Canada2**
    China2**
    Croatia2*
    France5*****
    Germany17*****************
    Hungary1*
    Iceland1*
    India4****
    Italy2**
    Netherlands3***
    New Zealand1*
    Norway1*
    Pakistan1*
    Romania1*
    Russia1*
    Scotland1*
    Slovenia1*
    Spain1*
    Sweden1*
    Switzerland1*
    UK7*******
    USA23***********************
    + + +
    + +
    +

    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 +

    +
    +
    +

    Author: Charles Cave +<charles.cave@gmail.com> +

    +

    Date: 2008/01/27 22:10:13

    +
    + diff --git a/ORGWEBPAGE/survey.org b/ORGWEBPAGE/survey.org new file mode 100644 index 000000000..378c45bd9 --- /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 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 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: + +** <> +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) + +** <> + +: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 0000000000000000000000000000000000000000..820fdd61b3fa71746e1f7ed95479f50ec92d5481 GIT binary patch literal 6148 zcmeHKyGjH>5Ukb<4!mGP!}$RP|6n=Jz}O#*cXn8 z@#$cQ5rDX0I*jX>C5X)v#J+G$WQJx*B_`Es#IU3@->R-J921ici<@~)-E1|XSlrHh zi*i_>s3--bz*K?L+;-moujxO`|5K87Qa}p)D+O$^x!tV!O4VCuFXz3s(eLP9^Fepx pIw%a$j)~EZx$$;<9z|K#e9h;5;g}e7=7Ubu&w%S9lLCLOz!%BCBW3^q literal 0 HcmV?d00001 diff --git a/ORGWEBPAGE/tmp/Changes.html b/ORGWEBPAGE/tmp/Changes.html new file mode 100644 index 000000000..5e177ffd8 --- /dev/null +++ b/ORGWEBPAGE/tmp/Changes.html @@ -0,0 +1,6368 @@ + + + +Org-mode list of User-visible changes + + + + + + +

    Org-mode list of User-visible changes

    + +
    +

    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: + + ++ + + + + + + + + +
      OrgDescriptionHTML
      \\-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: + + ++ + + + + + + + + + + +
      valuescope
      nilthe current buffer or narrowed region
      filethe full current buffer
      subtreethe subtree where the clocktable is located
      treeNthe surrounding level N tree, for example tree3
      treethe surrounding level 1 tree
      agendaall 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 like1 are now exported to HTML + +

      1This 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. + + ++ + + + + + + + + + + + +
      CommandOld TTYNew TTY
      org-…..Main KeyReplacementReplacement
      shiftleftS-leftC-c C-x leftC-c left
      shiftrightS-rightC-c C-x rightC-c right
      shiftupS-upC-c C-x upC-c up
      shiftdownS-downC-c C-x downC-c down
      shiftcontrolleftC-S-leftC-c C-x left
      shiftcontrolrightC-s-rightC-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 ab +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 + + + +
    • +
    +
    +

    Author: Carsten Dominik +<carsten at orgmode dot org> +

    +

    Date: 2008/01/27 10:12:09

    +
    + diff --git a/ORGWEBPAGE/tmp/Changes.txt b/ORGWEBPAGE/tmp/Changes.txt new file mode 100644 index 000000000..b64dca750 --- /dev/null +++ b/ORGWEBPAGE/tmp/Changes.txt @@ -0,0 +1,3562 @@ + Org-mode list of User-visible changes + ===================================== + +Author: Carsten Dominik +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 ­ + `--' two dashes (minuses) – + `---' three dashes (minuses) — + `...' three dots … + + 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
    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
    structure +-------------------- + + There is now a
    -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
    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 tags with + ), 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- 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 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 + .., and each part of the body (as separated in + org-mode by hlines) is wrapped into .. tags. I + have also changed the CSS style for 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 "" 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
    , 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 "". + - 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-/ 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 000000000..014bfc864 --- /dev/null +++ b/ORGWEBPAGE/tmp/faq.html @@ -0,0 +1,663 @@ + + + +Org-mode Frequently Asked Questions + + + + + + +

    Org-mode Frequently Asked Questions

    + + +
    +

    1 General

    + + +
    +

    1.1 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. +

    + +
    + +
    +

    1.2 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 Outline Magic. +

    +
    +
    + +
    +

    2 Errors

    + + +
    +

    2.1 (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 Conflicts section in the manual +

    +
    + +
    +

    2.2 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. +

    +
    + +
    +

    2.3 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 Conflicts section of the manual. +

    +
    +
    + +
    +

    3 Setup and Structure

    + + +
    +

    3.1 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)
    +
    +

    +
    + +
    +

    3.2 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. +

    +
    + +
    +

    3.3 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. +

    +
    + +
    +

    3.4 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))
    +
    +

    + +
    + +
    +

    3.5 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. +

    +
    + +
    +

    3.6 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. +

    +
    +
    + +
    +

    4 Hyperlinks

    + + + +
    +

    4.1 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. +

    +
    + +
    +

    4.2 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)
    +
    +

    +
    + +
    +

    4.3 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)
    +
    +

    +
    +
    + +
    +

    5 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. +

    +
    + +
    +

    6 Export

    + + +
    +

    6.1 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; ...
    +
    +

    +
    + +
    +

    6.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. +

    +
    + +
    +

    6.3 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 +

    +
    +
    + +
    +

    7 Tables

    + + +
    +

    7.1 #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! +

    +
    + +
    +

    7.2 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)
    +
    +

    +
    + +
    +

    7.3 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 C-c = and C-u C-c = +

    + +
    + +
    +

    7.4 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. +

    +
    + +
    +

    7.5 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. +

    +
    + +
    +

    7.6 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. +

    +
    + +
    +

    7.7 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)
    +
    +

    +
    +
    + +
    +

    8 Agenda

    + + +
    +

    8.1 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 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 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. +

    + +
    +
    +

    Author: Carsten Dominik +<carsten.dominik@gmail.com> +

    +

    Date: 2008/01/27 10:12:10

    +
    + diff --git a/ORGWEBPAGE/tmp/freeshell2.css b/ORGWEBPAGE/tmp/freeshell2.css new file mode 100644 index 000000000..832be9357 --- /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 000000000..326f644d0 --- /dev/null +++ b/ORGWEBPAGE/tmp/index.html @@ -0,0 +1,419 @@ + + + +Org-Mode Homepage + + + + + + +

    Org-Mode Homepage

    + + +
    +

    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, 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 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 zip file or 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 here. + +
    • +
    +
    + +
    +

    Documentation

    + + +
    +

    Manual and Reference card

    + +
      +
    • +Read the documentation 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 single monolithic file. +
    • +
    • +Download the documentation in other formats: PDF, Info, or TeXInfo. +
    • +
    • +Download the Refcard for org-mode, and Kyle Sherman hast created a +text version of the reference card +
    • +
    • +There is also a Japanese translation of the manual (version 4.60), +produced by Takeshi Okano. +
    • +
    • +The 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 this webpage. +
    • +
    • +Directly 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 Gmane through a web interface or with a +newsreader. +
    • + + + +
      + +
    • +
    + +
    +

    Worg - user-driven knowledge-base about org-mode

    + + +

    +Worg, created by 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 the Worg page, and start from there. +

    +
    + +
    +

    Tutorials

    + + +

    +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 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 David Allen's strategy for 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. +

    +
      +
    • +John Wiegley has written an excellent document describing his +way of using Org-mode as a day planner. See also some later +messages for enhancements of his setup: +emacs-orgmode-2962, emacs-orgmode-3629 + +
    • +
    • +Charles Cave has written an article/tutorial about the basic +elements of GTD and how he implements them in Org-mode. There +is also a french translation of this document. + +
    • +
    • +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 summarizing 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 +
      • +
      • +The SOMEDAY/MAYBE vs. low priorities thread contains a +discussion about priorities that is quite instructive. +
      • +
      • +Here is a 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 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 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 great 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 been really prolific in writing interesting +add-ons, all available at his 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 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

    + + +
    + +
    +

    XXX to Org-mode

    + + +
    + +
    +

    Bi-directional

    + + +

    +Unfortunately nothing so far. +

    +
    +
    + +
    +

    Alternative distributions

    + + +
    + +
    +

    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, 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 list of ideas that are still to be processed +somehow, when I get to it… +

    +
    +
    + +
    +

    Related Software

    + +

    Sacha Chua about Choosing between Planner and Org. +

    +
    +

    Author: Carsten Dominik +<carsten at orgmode dot org> +

    +

    Date: 2008/01/27 22:14:32

    +
    + diff --git a/ORGWEBPAGE/tmp/orgcard.txt b/ORGWEBPAGE/tmp/orgcard.txt new file mode 100644 index 000000000..cc7aff3ac --- /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 ...| |... +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 +-------------------------------------------------------------------------------- + +<> 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 @...@ + +-------------------------------------------------------------------------------- +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 <<>> 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 000000000..7a6105254 --- /dev/null +++ b/ORGWEBPAGE/tmp/qanda.html @@ -0,0 +1,449 @@ + + + +Org-mode Frequently Asked Questions + + + + + + +

    Org-mode Frequently Asked Questions

    + + +
    +

    1 General

    + + +
    +

    1.1 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. +

    + +
    + +
    +

    1.2 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 Outline Magic. +

    +
    +
    + +
    +

    2 Errors

    + + +
    +

    2.1 (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. +

    +
    + +
    +

    2.2 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. +

    +
    +
    + +
    +

    3 Setup and Structure

    + + +
    +

    3.1 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))
    +
    +

    + +
    + +
    +

    3.2 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. +

    +
    + +
    +

    3.3 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. +

    +
    +
    + +
    +

    4 Hyperlinks

    + + +
    +

    4.1 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][bbdb:Richard Stallman]]
    +
    +

    +
    + +
    +

    4.2 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. +

    +
    + +
    +

    4.3 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>")
    +
    +

    +
    + +
    +

    4.4 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. +

    + + +
    +
    + +
    +

    5 Export

    + + +
    +

    5.1 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; ...
    +
    +

    +
    + +
    +

    5.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. +

    +
    +
    + +
    +

    6 Tables

    + + +
    +

    6.1 #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! +

    +
    + +
    +

    6.2 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. +

    +
    + +
    +

    6.3 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. +

    +
    +
    + +
    +

    7 Agenda

    + + +
    +

    7.1 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. +

    + +
    +
    +

    Author: Carsten Dominik +<carsten.dominik@gmail.com> +

    +

    Date: 2007/12/20 07:18:18

    +
    + diff --git a/ORGWEBPAGE/tmp/request-assign-future.txt b/ORGWEBPAGE/tmp/request-assign-future.txt new file mode 100644 index 000000000..8ee77473f --- /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 000000000..6a4836367 --- /dev/null +++ b/ORGWEBPAGE/tmp/survey.html @@ -0,0 +1,2169 @@ + + + +Org-Mode Survey Results + + + + + + +

    Org-Mode Survey Results

    + + +
    +

    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?

    + + ++ + + + + + + + +
    OSNbar
    Windows31*******************************
    Linux55*******************************************************
    Mac OS X12************
    + + +

    +The different Linux distributions: +

    + ++ + + + + + + + + + + + + + + + + + + +
    DistributionNbar
    Arch Linux1*
    Centos1*
    Debian14**************
    Fedora7*******
    FreeBSD1*
    Gentoo7*******
    Kununtu1*
    MagicLinux1*
    OpenBSD1*
    RedHat2**
    Solarus2**
    Suse7*******
    Ubuntu9*********
    Unspecified2**
    + + +
    + +
    +

    2. Which Emacs are you using (GNU/Xemacs, etc) and which version? Paste the result of M-x version.

    + + +

    +Summary: +

    ++ + + + + + + + + + +
    Emacs/XEmacsNumber of answers
    XEmacs7
    Emacs total73
    Emacs 214
    Emacs 2247
    Emacs 2318
    + + +

    +The raw replies can be found 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 rangeNbar
    16 - 200
    21 - 255*****
    26 - 3015***************
    31 - 3521*********************
    36 - 4011***********
    41 - 4513*************
    46 - 503***
    51 - 553***
    56 - 600
    + + +
    + +
    +

    9. Which country do you live in?

    + + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CountryNbar
    Australia3***
    Canada2**
    China2**
    Croatia2*
    France5*****
    Germany17*****************
    Hungary1*
    Iceland1*
    India4****
    Italy2**
    Netherlands3***
    New Zealand1*
    Norway1*
    Pakistan1*
    Romania1*
    Russia1*
    Scotland1*
    Slovenia1*
    Spain1*
    Sweden1*
    Switzerland1*
    UK7*******
    USA23***********************
    + + +
    + +
    +

    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 +

    +
    +
    +

    Author: Charles Cave +<charles.cave@gmail.com> +

    +

    Date: 2008/01/27 22:26:27

    +
    + diff --git a/ORGWEBPAGE/tmp/todo.html b/ORGWEBPAGE/tmp/todo.html new file mode 100644 index 000000000..a311c9056 --- /dev/null +++ b/ORGWEBPAGE/tmp/todo.html @@ -0,0 +1,1209 @@ + + + +The Org-mode TODO list + + + + + + +

    The Org-mode TODO list

    + + +
    +

    1 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. +

    + +
    +

    1.1 Nomenclature

    + +

    On this page, I am using TODO keywords in the following way: +

    ++ + + + + + + + + + + + + + + +
    KeywordIntention
    TODOA development that is going to happen, once I have time or once I figure out how to do it.
    IDEAA new idea, I have not yet decided what if anything I will do about it.
    WISHA wish, probably voiced by someone on emacs-orgmode@gnu.org. This is less than a new idea, more a change in existing behavior.
    QUESTIONA question someone asked, that needs some thinking before it can be answered
    DECLINEDI 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.
    INCONSISTENCYSome behavior in Org-mode that is not as clean and consistent as I would like it to be.
    BUGThis needs to be fixed, as soon as possible.
    DONEWell, done is done.
    NEWThis is a tag, indicating recently added entries
    <50>
    + + + +
    +
    + +
    +

    2 Tasks

    + + + +
    +

    2.1 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 #+SEQTODO?
      +
    • +
    +
      +
    • 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.
      + +
    • +
    +
    + +
    +

    2.2 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. + + +
    • +
    +
    + +
    +

    2.3 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 Austin Frank + +
    • +
    +
      +
    • DECLINED Agenda collections, based on #+COLLECTION lines.
      +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. + + +
    • +
    +
    + +
    +

    2.4 DECLINED Fast update for external editing

    + +

    Could I use a dynamic block for this? +

    + +
    + +
    +

    2.5 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 + + +
    • +
    +
    + +
    +

    2.6 Properties and Column View

    + +
      +
    • TODO Mouse support for selecting values
      +This could/should be part of org-mouse.el. +
        +
      • +[X] tags +
      • +
      • +[X] todo +
      • +
      • +[X] priority +
      • +
      • +[X] allowed values +
      • +
      • +[X] deadline +
      • +
      • +[X] scheduled. +
      • +
    • +
    +
      +
    • BUG We have no clear view on what to do with properties upon export.
      + + +
    • +
    +
    + +
    +

    2.7 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. + + +
      • +
      +
    • +
    +
    + +
    +

    2.8 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 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 Niels Giesen and 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… + + + +
    • +
    +
    + +
    +

    2.9 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 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. +
        +
      • 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. + + +
    • +
    +
    +
    + +
    +

    3 Archive

    + + +
    +

    3.1 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 +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 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 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 + + + +

      +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?
      +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. + + +
    • +
    +
    +
    +

    Author: Carsten Dominik +<carsten.dominik@gmail.com> +

    +

    Date: 2007/12/20 07:18:18

    +
    + diff --git a/ORGWEBPAGE/tmp/tutorials.html b/ORGWEBPAGE/tmp/tutorials.html new file mode 100644 index 000000000..171647c54 --- /dev/null +++ b/ORGWEBPAGE/tmp/tutorials.html @@ -0,0 +1,317 @@ + + + +Org-Mode Tutorials, Blogposts, and Screenscasts + + + + + + +

    Org-Mode Tutorials, Blogposts, and Screenscasts

    + +

    +This page lists tutorials, screencasts, and extensive blog posts about +Org-mode +

    + + + + + + + +
    +

    General Introductions to Org-mode

    + + +
    + +
    +

    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

    + +
    + +
    +

    Complex searches for Tags, TODO keywords and Properties

    + +

    Your chance for everlasting fame +

    + +
    +

    Timestamps, Appointments etc

    + +
    + +
    +

    The Clock Table    NEW

    + +
    + +
    +

    Using Remember Templates    NEW

    + +
    + +
    +

    Properties and Column View

    + +
    + +
    +

    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

    + +
    +
    + +
    +

    Personal Setup

    + + + +
    +

    Extensive documents

    + + +
    + +
    +

    Short descriptions

    + + +
      +
    • +David O'Toole explains his setup in this post. + +
    • +
    • +This 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 +

    + +
    +

    Author: Carsten Dominik +<carsten at orgmode dot org> +

    +

    Date: 2008/01/20 09:24:39

    +
    + diff --git a/ORGWEBPAGE/todo.html b/ORGWEBPAGE/todo.html new file mode 100644 index 000000000..a93978524 --- /dev/null +++ b/ORGWEBPAGE/todo.html @@ -0,0 +1,920 @@ + + + +The Org-mode TODO list + + + + + + +

    The Org-mode TODO list

    +

    Table of Contents

    + + +

    1 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. +

    + +

    1.1 Nomenclature

    + +

    On this page, I am using TODO keywords in the following way: +

    ++ + + + + + + + + + + + + + +
    KeywordIntention
    TODOA development that is going to happen, once I have time or once I figure out how to do it.
    IDEAA new idea, I have not yet decided what if anything I will do about it.
    WISHA wish, probably voiced by someone on emacs-orgmode@gnu.org. This is less than a new idea, more a change in existing behavior.
    QUESTIONA question someone asked, that needs some thinking before it can be answered
    DECLINEDI 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.
    INCONSISTENCYSome behavior in Org-mode that is not as clean and consistent as I would like it to be.
    BUGThis needs to be fixed, as soon as possible.
    DONEWell, done is done.
    NEWThis is a tag, indicating recently added entries
    + + + + +

    2 Tasks

    + + +

    2.1 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 #+SEQTODO?
      +
    • +
    • 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. +
    • +
    + +

    2.2 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. +
    • +
    + +

    2.3 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 Austin Frank + +
    • +
    • DECLINED Agenda collections, based on #+COLLECTION lines.
      +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. +
    • +
    + +

    2.4 DECLINED Fast update for external editing

    + +

    Could I use a dynamic block for this? +

    + +

    2.5 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 + +
    • +
    + +

    2.6 Properties and Column View

    + +
      +
    • TODO Mouse support for selecting values
      +This could/should be part of org-mouse.el. +
        +
      • +[X] tags +
      • +
      • +[X] todo +
      • +
      • +[X] priority +
      • +
      • +[X] allowed values +
      • +
      • +[X] deadline +
      • +
      • +[X] scheduled. +
      • +
    • +
    • BUG We have no clear view on what to do with properties upon export.
      + +
    • +
    + +

    2.7 Compatibility issues

    + +
      +
    • Emacs 21 compatibility
      +This is being phased out. Almost everything works under Emacs 21, +but in the future I wwill 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. + + +
      • +
      +
    • +
    + +

    2.8 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 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 Niels Giesen and 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... + + + +
    • +
    + +

    2.9 Miscellaneous Stuff

    + +
      +
    • TODO reinstating a repeated item: keyword for logging.
      +
    • +
    • BUG Comments cannot be filled
      +
    • +
    • 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. +
    • +
    • 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 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. +
        +
      • 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 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. + +
    • +
    + +

    3 Archive

    + + +

    3.1 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 +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 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 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 + + + +

      +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?
      +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. + +
    • +
    +

    Author: Carsten Dominik +<carsten.dominik@gmail.com> +

    +

    Date: 2007/07/10 10:35:08

    + + diff --git a/ORGWEBPAGE/todo.org b/ORGWEBPAGE/todo.org new file mode 100644 index 000000000..f2bee19cd --- /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 + SCHEDULED: timestamp goes here
    + +*** 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 + and , 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: " " +# End: diff --git a/ORGWEBPAGE/tutorials.html b/ORGWEBPAGE/tutorials.html new file mode 100644 index 000000000..b15c67e50 --- /dev/null +++ b/ORGWEBPAGE/tutorials.html @@ -0,0 +1,340 @@ + + + +Org-Mode Tutorials, Blogposts, and Screenscasts + + + + + + +

    Org-Mode Tutorials, Blogposts, and Screenscasts

    + +

    +This page lists tutorials, screencasts, and extensive blog posts about +Org-mode +

    + + + + + + + +
    +

    General Introductions to Org-mode

    + + +
    + +
    +

    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

    + +
    + +
    +

    Complex searches for Tags, TODO keywords and Properties

    + +

    Your chance for everlasting fame +

    + +
    +

    Timestamps, Appointments etc

    + +
    + +
    +

    The Clock Table    NEW

    + +
    + +
    +

    Using Remember Templates    NEW

    + +
    + +
    +

    Properties and Column View

    + +
    + +
    +

    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

    + +
    +
    + +
    +

    Personal Setup

    + + + +
    +

    Extensive documents

    + + +
    + +
    +

    Short descriptions

    + + +
      +
    • +David O'Toole explains his setup in this post. + +
    • +
    • +This 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 +

    + +
    +

    Author: Carsten Dominik +<carsten at orgmode dot org> +

    +

    Date: 2008/01/20 09:11:36

    +
    + diff --git a/ORGWEBPAGE/tutorials.org b/ORGWEBPAGE/tutorials.org new file mode 100644 index 000000000..f9f446bb1 --- /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: + +* 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 000000000..eff423972 --- /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 ... +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 000000000..6ed3bc273 --- /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 () { + 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 () { + 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 83f24b3f6..6de4a2a36 100644 --- a/org.el +++ b/org.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik ;; 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 3583009e3..ff376e5b5 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 f0651fa45..5abc74bd4 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 000000000..cc7aff3ac --- /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 ...| |... +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 +-------------------------------------------------------------------------------- + +<> 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 @...@ + +-------------------------------------------------------------------------------- +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 <<>> 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 000000000..555a07707 --- /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 . + % + \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 to achieve this: TeX expands \the only once, + % simply yielding the contents of . (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 + \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{...} +% If we want to allow any 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'{'#1'}'{#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\}\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 +% 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: