summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/org/ChangeLog119
-rw-r--r--lisp/org/org-agenda.el93
-rw-r--r--lisp/org/org-archive.el2
-rw-r--r--lisp/org/org-bbdb.el2
-rw-r--r--lisp/org/org-bibtex.el2
-rw-r--r--lisp/org/org-clock.el31
-rw-r--r--lisp/org/org-colview.el16
-rw-r--r--lisp/org/org-compat.el2
-rw-r--r--lisp/org/org-exp.el330
-rw-r--r--lisp/org/org-export-latex.el23
-rw-r--r--lisp/org/org-faces.el2
-rw-r--r--lisp/org/org-gnus.el2
-rw-r--r--lisp/org/org-id.el2
-rw-r--r--lisp/org/org-info.el2
-rw-r--r--lisp/org/org-irc.el2
-rw-r--r--lisp/org/org-jsinfo.el2
-rw-r--r--lisp/org/org-mac-message.el2
-rw-r--r--lisp/org/org-macs.el2
-rw-r--r--lisp/org/org-mew.el2
-rw-r--r--lisp/org/org-mhe.el2
-rw-r--r--lisp/org/org-mouse.el2
-rw-r--r--lisp/org/org-publish.el92
-rw-r--r--lisp/org/org-remember.el2
-rw-r--r--lisp/org/org-rmail.el2
-rw-r--r--lisp/org/org-table.el43
-rw-r--r--lisp/org/org-vm.el2
-rw-r--r--lisp/org/org-wl.el2
-rw-r--r--lisp/org/org.el214
28 files changed, 739 insertions, 260 deletions
diff --git a/lisp/org/ChangeLog b/lisp/org/ChangeLog
index 5b633cc9211..ca55cd320eb 100644
--- a/lisp/org/ChangeLog
+++ b/lisp/org/ChangeLog
@@ -1,3 +1,122 @@
+2008-07-24 Carsten Dominik <dominik@science.uva.nl>
+
+ * org-exp.el (org-export-region-as-html, org-export-as-html): Make
+ sure that calls from `org-export-region-as-html' do not do the
+ special check for a subtree.
+
+ * org-agenda.el (org-batch-store-agenda-views): Fix parsing bug.
+
+ * org.el (org-open-file): Use
+ `org-open-directory-means-index-dot-org'.
+ (org-open-directory-means-index-dot-org): New option.
+
+ * org.el (org-make-link-string): Remove link attributes from
+ description.
+ (org-open-at-point): Remove link attributes bevore using the path.
+
+ * org-exp.el (org-export-as-html): Handle link attributes.
+
+ * org.el (org-extract-attributes, org-attributes-to-string): New functions.
+
+ * org-table.el (org-table-to-lisp): New function.
+
+ * org.el (org-narrow-to-subtree): Do not include the final newline
+ into the narrowed region.
+
+ * org-agenda.el (org-agenda-custom-commands-local-options): Fixed
+ bug with user-define skipping condition.
+
+ * org-agenda.el (org-agenda-get-restriction-and-command): Fixed typo.
+
+ * org-exp.el (org-export-html-style-default): Automatic overflow
+ handling for pre fields.
+ (org-export-as-ascii, org-export-as-html): Change default format
+ for time stamp.
+
+ * org-table.el (org-table-export): Offer completion for translator
+ functions, and do not require a heading above the table.
+
+ * org.el (org-renumber-ordered-list, org-beginning-of-item-list):
+ Cater for the case of a list starting in the first line of the
+ buffer.
+
+ * org-publish.el (org-publish-find-title): Bug fix.
+ (org-publish-org-index): Implement new :index-style option.
+
+ * org-publish.el (org-publish-timestamp-filename): Use
+ SHA1-encoded file names in the timestamp directory.
+
+ * org-publish.el (org-publish-needed-p): Be verbose about files
+ published and files skipped.
+
+ * org-exp.el (org-export-preprocess-string): Swap link
+ normalization and inernal link targeting.
+
+ * org-publish.el (org-publish-needed-p): Create timestamp
+ directory when it does not exist.
+
+ * org-clock.el (org-clock-out-when-done): Doc fix.
+
+ * org.el (org-agenda-skip-unavailable-files): Doc fix.
+
+ * org-exp.el (org-export-remove-comment-blocks-and-subtrees):
+ Ignore case when searching for the COMMENT cookie at export time.
+
+ * org-exp.el (org-get-file-contents)
+ (org-get-and-remove-property): New functions.
+ (org-export-handle-include-files): Handle the new prefix options.
+ (org-export-as-html): Fix the verse environment.
+
+ * org.el (org-time=, org-time<, org-time<=, org-time>)
+ (org-time>=, org-time<>, org-2ft): New functions.
+ (org-op-to-function): Also provide for the time testing fucntions.
+
+ * org-exp.el (org-export-html-style-default): New constant.
+
+ * org-exp.el (org-export-html-style-extra): New variable.
+ (org-export-splice-style): New function.
+
+ * org-exp.el (org-export-plist-vars, org-export-as-html):
+ Implement `org-export-creator-info'.
+ (org-export-creator-info): New option.
+
+ * org.el (org-clock-drawer-start-re, org-clock-drawer-end-re)
+ (org-property-drawer-re, org-clock-drawer-re): New constants.
+
+ * org-exp.el (org-icalendar-use-deadline)
+ (org-icalendar-use-scheduled): New options.
+ (org-icalendar-include-todo): Default changed to t.
+ (org-print-icalendar-entries): Implement better utilization of
+ scheduling and deadline time stamps.
+ (org-export-target-internal-links, org-export-as-html): Allow file
+ lines without the "file:" prefix if the file path is an absolute
+ path or starts with ".".
+
+ * org-clock.el (org-clocktable-shift): Also undertand yesterday,
+ lastweek etc.
+ (org-clock-special-range): Also undertand yesterday, lastweek etc.
+
+ * org.el (org-agenda-skip-archived-trees): Docstring now
+ discourages using this.
+ (org-scan-tags): Check for org-agenda-archives-mode.
+ (org-map-entries): Make sure org-agenda-archives-mode is nil.
+ (org-agenda-files): Functionality of second arg changed.
+
+ * org-agenda.el (org-agenda-archives-mode): New variable
+ (org-write-agenda, org-prepare-agenda, org-agenda-list)
+ (org-search-view, org-todo-list, org-tags-view)
+ (org-agenda-list-stuck-projects): Call `org-agenda-files' with
+ `ifmode' argument.
+ (org-agenda-quit): Reset the archives mode.
+ (org-agenda-archives-mode): New command.
+ (org-agenda-set-mode-name): Include archives info.
+
+ * org.el (org-paste-subtree): Make sure the yanked headline is
+ visible if it was yanked at a visible point.
+ (org-move-item-up): Fix the bug with moving white space at the end
+ of the item.
+ (org-show-empty-lines-in-parent): New function.
+
2008-07-19 Juri Linkov <juri@jurta.org>
* org.el (narrow-map): Bind `org-narrow-to-subtree' to "s" on the
diff --git a/lisp/org/org-agenda.el b/lisp/org/org-agenda.el
index 32efe5d8413..23cda508a9a 100644
--- a/lisp/org/org-agenda.el
+++ b/lisp/org/org-agenda.el
@@ -6,7 +6,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
@@ -211,9 +211,8 @@ you can \"misuse\" it to also add other text to the header. However,
(const :tag "no deadline" 'notdeadline))))))
(list :tag "Non-standard skipping condition"
:value (org-agenda-skip-function)
- (list
- (const org-agenda-skip-function)
- (sexp :tag "Function or form (quoted!)")))))
+ (const org-agenda-skip-function)
+ (sexp :tag "Function or form (quoted!)"))))
"Selection of examples for agenda command settings.
This will be spliced into the custom type of
`org-agenda-custom-commands'.")
@@ -392,6 +391,13 @@ or `C-c a #' to produce the list."
:tag "Org Agenda Skip"
:group 'org-agenda)
+(defvar org-agenda-archives-mode nil
+ "Non-nil means, the agenda will include archived items.
+If this is the symbol `trees', trees in the selected agenda scope
+that are marked with the ARCHIVE tag will be included anyway. When this is
+t, also all archive files associated with the current selection of agenda
+files will be included.")
+
(defcustom org-agenda-skip-comment-trees t
"Non-nil means, skip trees that start with teh COMMENT keyword.
When nil, these trees are also scand by agenda commands."
@@ -1105,6 +1111,7 @@ The following commands are available:
(org-defkey org-agenda-mode-map "f" 'org-agenda-follow-mode)
(org-defkey org-agenda-mode-map "R" 'org-agenda-clockreport-mode)
(org-defkey org-agenda-mode-map "l" 'org-agenda-log-mode)
+(org-defkey org-agenda-mode-map "v" 'org-agenda-archives-mode)
(org-defkey org-agenda-mode-map "D" 'org-agenda-toggle-diary)
(org-defkey org-agenda-mode-map "G" 'org-agenda-toggle-time-grid)
(org-defkey org-agenda-mode-map "r" 'org-agenda-redo)
@@ -1234,14 +1241,25 @@ The following commands are available:
["Year View" org-agenda-year-view :active (org-agenda-check-type nil 'agenda)
:style radio :selected (member org-agenda-ndays '(365 366))]
"--"
- ["Show Logbook entries" org-agenda-log-mode
- :style toggle :selected org-agenda-show-log :active (org-agenda-check-type nil 'agenda 'timeline)]
- ["Show clock report" org-agenda-clockreport-mode
- :style toggle :selected org-agenda-clockreport-mode :active (org-agenda-check-type nil 'agenda)]
["Include Diary" org-agenda-toggle-diary
- :style toggle :selected org-agenda-include-diary :active (org-agenda-check-type nil 'agenda)]
+ :style toggle :selected org-agenda-include-diary
+ :active (org-agenda-check-type nil 'agenda)]
["Use Time Grid" org-agenda-toggle-time-grid
- :style toggle :selected org-agenda-use-time-grid :active (org-agenda-check-type nil 'agenda)])
+ :style toggle :selected org-agenda-use-time-grid
+ :active (org-agenda-check-type nil 'agenda)]
+ "--"
+ ["Show clock report" org-agenda-clockreport-mode
+ :style toggle :selected org-agenda-clockreport-mode
+ :active (org-agenda-check-type nil 'agenda)]
+ "--"
+ ["Show Logbook entries" org-agenda-log-mode
+ :style toggle :selected org-agenda-show-log
+ :active (org-agenda-check-type nil 'agenda 'timeline)]
+ ["Include archived trees" org-agenda-archives-mode
+ :style toggle :selected org-agenda-archives-mode :active t]
+ ["Include archive files" (org-agenda-archives-mode t)
+ :style toggle :selected (eq org-agenda-archives-mode t) :active t
+ :keys "C-u v"])
["Write view to file" org-write-agenda t]
["Rebuild buffer" org-agenda-redo t]
["Save all Org-mode Buffers" org-save-all-org-buffers t]
@@ -1475,7 +1493,7 @@ Pressing `<' twice means to restrict to the current subtree or region
(insert (eval-when-compile
(let ((header
"
-Press key for an agenda command: < Buffer,subtree/region restriction
+Press key for an agenda command: < Buffer, subtree/region restriction
-------------------------------- > Remove restriction
a Agenda for current week or day e Export agenda views
t List of all TODO entries T Entries with special TODO kwd
@@ -1790,7 +1808,7 @@ so the export commands can easily use it."
(let ((cmds (org-agenda-normalize-custom-commands org-agenda-custom-commands))
(pop-up-frames nil)
(dir default-directory)
- pars cmd thiscmdkey files opts)
+ pars cmd thiscmdkey files opts cmd-or-set)
(while parameters
(push (list (pop parameters) (if parameters (pop parameters))) pars))
(setq pars (reverse pars))
@@ -1798,8 +1816,9 @@ so the export commands can easily use it."
(while cmds
(setq cmd (pop cmds)
thiscmdkey (car cmd)
- opts (nth 4 cmd)
- files (nth 5 cmd))
+ cmd-or-set (nth 2 cmd)
+ opts (nth (if (listp cmd-or-set) 3 4) cmd)
+ files (nth (if (listp cmd-or-set) 4 5) cmd))
(if (stringp files) (setq files (list files)))
(when files
(eval (list 'let (append org-agenda-exporter-settings opts pars)
@@ -1855,7 +1874,8 @@ higher priority settings."
(org-agenda-collect-markers)))
(org-icalendar-verify-function 'org-check-agenda-marker-table)
(org-combined-agenda-icalendar-file file))
- (apply 'org-export-icalendar 'combine (org-agenda-files))))
+ (apply 'org-export-icalendar 'combine
+ (org-agenda-files nil 'ifmode))))
(t
(let ((bs (buffer-string)))
(find-file file)
@@ -1937,7 +1957,7 @@ higher priority settings."
(org-agenda-reset-markers)
(setq org-agenda-contributing-files nil)
(setq org-agenda-columns-active nil)
- (org-prepare-agenda-buffers (org-agenda-files))
+ (org-prepare-agenda-buffers (org-agenda-files nil 'ifmode))
(setq org-todo-keywords-for-agenda
(org-uniquify org-todo-keywords-for-agenda))
(setq org-done-keywords-for-agenda
@@ -2032,7 +2052,7 @@ it is through options in org-agenda-custom-commands.")
Also moves point to the end of the skipped region, so that search can
continue from there."
(let ((p (point-at-bol)) to fp)
- (and org-agenda-skip-archived-trees
+ (and org-agenda-skip-archived-trees (not org-agenda-archives-mode)
(get-text-property p :org-archived)
(org-end-of-subtree t)
(throw :skip t))
@@ -2255,7 +2275,7 @@ given in `org-agenda-start-on-weekday'."
(let* ((org-agenda-start-on-weekday
(if (or (equal ndays 7) (and (null ndays) (equal 7 org-agenda-ndays)))
org-agenda-start-on-weekday nil))
- (thefiles (org-agenda-files))
+ (thefiles (org-agenda-files nil 'ifmode))
(files thefiles)
(today (time-to-days
(time-subtract (current-time)
@@ -2373,7 +2393,7 @@ given in `org-agenda-start-on-weekday'."
(put-text-property s (1- (point)) 'day d)
(put-text-property s (1- (point)) 'org-day-cnt day-cnt))))
(when (and org-agenda-clockreport-mode clocktable-start)
- (let ((org-agenda-files (org-agenda-files))
+ (let ((org-agenda-files (org-agenda-files nil 'ifmode))
;; the above line is to ensure the restricted range!
(p org-agenda-clockreport-parameter-plist)
tbl)
@@ -2502,7 +2522,7 @@ in `org-agenda-text-search-extra-files'."
(setq regexp (pop regexps+))
(if hdl-only (setq regexp (concat "^" org-outline-regexp ".*?"
regexp))))
- (setq files (org-agenda-files))
+ (setq files (org-agenda-files nil 'ifmode))
(when (eq (car org-agenda-text-search-extra-files) 'agenda-archives)
(pop org-agenda-text-search-extra-files)
(setq files (org-add-archive-files files)))
@@ -2633,7 +2653,7 @@ for a keyword. A numeric prefix directly selects the Nth keyword in
(org-set-local 'org-last-arg arg)
(setq org-agenda-redo-command
'(org-todo-list (or current-prefix-arg org-last-arg)))
- (setq files (org-agenda-files)
+ (setq files (org-agenda-files nil 'ifmode)
rtnall nil)
(while (setq file (pop files))
(catch 'nextfile
@@ -2690,7 +2710,7 @@ The prefix arg TODO-ONLY limits the search to TODO entries."
(setq org-agenda-redo-command
(list 'org-tags-view (list 'quote todo-only)
(list 'if 'current-prefix-arg nil 'org-agenda-query-string)))
- (setq files (org-agenda-files)
+ (setq files (org-agenda-files nil 'ifmode)
rtnall nil)
(while (setq file (pop files))
(catch 'nextfile
@@ -2827,7 +2847,8 @@ MATCH is being ignored."
(todo (nth 1 org-stuck-projects))
(todo-wds (if (member "*" todo)
(progn
- (org-prepare-agenda-buffers (org-agenda-files))
+ (org-prepare-agenda-buffers (org-agenda-files
+ nil 'ifmode))
(org-delete-all
org-done-keywords-for-agenda
(copy-sequence org-todo-keywords-for-agenda)))
@@ -4002,7 +4023,8 @@ If ERROR is non-nil, throw an error, otherwise just return nil."
(if (not (one-window-p)) (delete-window))
(kill-buffer buf)
(org-agenda-reset-markers)
- (org-columns-remove-overlays))
+ (org-columns-remove-overlays)
+ (setq org-agenda-archives-mode nil))
;; Maybe restore the pre-agenda window configuration.
(and org-agenda-restore-windows-after-quit
(not (eq org-agenda-window-setup 'other-frame))
@@ -4340,6 +4362,24 @@ so that the date SD will be in that range."
(message "Log mode is %s"
(if org-agenda-show-log "on" "off")))
+(defun org-agenda-archives-mode (&optional with-files)
+ "Toggle log mode in an agenda buffer."
+ (interactive "P")
+ (setq org-agenda-archives-mode
+ (if with-files t (if org-agenda-archives-mode nil 'trees)))
+ (org-agenda-set-mode-name)
+ (org-agenda-redo)
+ (message
+ "%s"
+ (cond
+ ((eq org-agenda-archives-mode nil)
+ "No archives are included")
+ ((eq org-agenda-archives-mode 'trees)
+ (format "Trees with :%s: tag are included" org-archive-tag))
+ ((eq org-agenda-archives-mode t)
+ (format "Trees with :%s: tag and all active archive files are included"
+ org-archive-tag)))))
+
(defun org-agenda-toggle-diary ()
"Toggle diary inclusion in an agenda buffer."
(interactive)
@@ -4370,6 +4410,11 @@ so that the date SD will be in that range."
(if org-agenda-include-diary " Diary" "")
(if org-agenda-use-time-grid " Grid" "")
(if org-agenda-show-log " Log" "")
+ (if org-agenda-archives-mode
+ (if (eq org-agenda-archives-mode t)
+ " Archives"
+ (format " :%s:" org-archive-tag))
+ "")
(if org-agenda-clockreport-mode " Clock" "")))
(force-mode-line-update))
diff --git a/lisp/org/org-archive.el b/lisp/org/org-archive.el
index 3d7d06f3453..0ddac74d883 100644
--- a/lisp/org/org-archive.el
+++ b/lisp/org/org-archive.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-bbdb.el b/lisp/org/org-bbdb.el
index 4dd6b2332c4..fb913a09f43 100644
--- a/lisp/org/org-bbdb.el
+++ b/lisp/org/org-bbdb.el
@@ -6,7 +6,7 @@
;; Thomas Baumann <thomas dot baumann at ch dot tum dot de>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-bibtex.el b/lisp/org/org-bibtex.el
index e314f452e9f..0fe619d5bc7 100644
--- a/lisp/org/org-bibtex.el
+++ b/lisp/org/org-bibtex.el
@@ -5,7 +5,7 @@
;; Author: Bastien Guerry <bzg at altern dot org>
;; Carsten Dominik <carsten dot dominik at gmail dot com>
;; Keywords: org, wp, remember
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-clock.el b/lisp/org/org-clock.el
index 44d8840482a..6caf8393f94 100644
--- a/lisp/org/org-clock.el
+++ b/lisp/org/org-clock.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
@@ -54,8 +54,8 @@ reaches or exceeds this number, a drawer will be created."
(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.
-When nil, clock will keep running until stopped explicitly with
+ "When non-nil, the clock will be stopped when the relevant entry is marked DONE.
+A nil value 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-clock
:type 'boolean)
@@ -136,7 +136,7 @@ of a different task.")
"Select a task that recently was associated with clocking."
(interactive)
(let (sel-list rpl file task (i 0) s)
- (save-window-excursion
+ (save-window-excursion
(org-switch-to-buffer-other-window
(get-buffer-create "*Clock Task Select*"))
(erase-buffer)
@@ -190,7 +190,7 @@ of a different task.")
(when (and cat task)
(insert (format "[%c] %-15s %s\n" i cat task))
(cons i marker)))))
-
+
(defun org-update-mode-line ()
(let* ((delta (- (time-to-seconds (current-time))
(time-to-seconds org-clock-start-time)))
@@ -207,7 +207,7 @@ of a different task.")
(defun org-clock-in (&optional select)
"Start the clock on the current item.
If necessary, clock-out of the currently active clock.
-With prefix arg SELECT, offer a list of recently clocked ta sks to
+With prefix arg SELECT, offer a list of recently clocked tasks to
clock into. When SELECT is `C-u C-u', clock into the current task and mark
is as the default task, a special task that will always be offered in
the clocking selection, associated with the letter `d'."
@@ -226,13 +226,13 @@ the clocking selection, associated with the letter `d'."
(marker-position org-clock-marker)
(marker-buffer org-clock-marker))
(org-clock-out t))
-
+
(when (equal select '(16))
;; Mark as default clocking task
(save-excursion
(org-back-to-heading t)
(move-marker org-clock-default-task (point))))
-
+
(setq target-pos (point)) ;; we want to clock in at this location
(save-excursion
(when (and selected-task (marker-buffer selected-task))
@@ -261,7 +261,7 @@ the clocking selection, associated with the letter `d'."
(setq org-clock-heading "???")))
(setq org-clock-heading (propertize org-clock-heading 'face nil))
(org-clock-find-position)
-
+
(insert "\n") (backward-char 1)
(indent-relative)
(insert org-clock-string " ")
@@ -638,7 +638,7 @@ the returned times will be formatted strings."
((string-match "\\([-+][0-9]+\\)$" skey)
(setq shift (string-to-number (match-string 1 skey))
key (intern (substring skey 0 (match-beginning 1))))))
- (unless shift
+ (when (= shift 0)
(cond ((eq key 'yesterday) (setq key 'today shift -1))
((eq key 'lastweek) (setq key 'week shift -1))
((eq key 'lastmonth) (setq key 'month shift -1))
@@ -690,6 +690,11 @@ the currently selected interval size."
(s (match-string 1))
block shift ins y mw d date wp m)
(cond
+ ((equal s "yesterday") (setq s "today-1"))
+ ((equal s "lastweek") (setq s "thisweek-1"))
+ ((equal s "lastmonth") (setq s "thismonth-1"))
+ ((equal s "lastyear") (setq s "thisyear-1")))
+ (cond
((string-match "^\\(today\\|thisweek\\|thismonth\\|thisyear\\)\\([-+][0-9]+\\)?$" s)
(setq block (match-string 1 s)
shift (if (match-end 2)
@@ -735,9 +740,9 @@ the currently selected interval size."
(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))
+ (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))
diff --git a/lisp/org/org-colview.el b/lisp/org/org-colview.el
index 95a5aa3fccf..ef7bb690862 100644
--- a/lisp/org/org-colview.el
+++ b/lisp/org/org-colview.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
@@ -1013,13 +1013,13 @@ of fields."
(let* ((title (mapcar 'cadr org-columns-current-fmt-compiled))
(n (length title)) row tbl)
(goto-char (point-min))
- (while (and (re-search-forward "^\\(\\*+\\) " nil t)
- (or (null maxlevel)
- (>= maxlevel
- (if org-odd-levels-only
- (/ (1+ (length (match-string 1))) 2)
- (length (match-string 1))))))
- (when (get-char-property (match-beginning 0) 'org-columns-key)
+ (while (re-search-forward "^\\(\\*+\\) " nil t)
+ (when (and (or (null maxlevel)
+ (>= maxlevel
+ (if org-odd-levels-only
+ (/ (1+ (length (match-string 1))) 2)
+ (length (match-string 1)))))
+ (get-char-property (match-beginning 0) 'org-columns-key))
(setq row nil)
(loop for i from 0 to (1- n) do
(push (or (get-char-property (+ (match-beginning 0) i) 'org-columns-value-modified)
diff --git a/lisp/org/org-compat.el b/lisp/org/org-compat.el
index bc21429cb37..0ba1dcc75b3 100644
--- a/lisp/org/org-compat.el
+++ b/lisp/org/org-compat.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-exp.el b/lisp/org/org-exp.el
index 0ebcdbbfb89..cf02d1808da 100644
--- a/lisp/org/org-exp.el
+++ b/lisp/org/org-exp.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
@@ -209,6 +209,12 @@ e.g. \"author-info:nil\"."
:group 'org-export-general
:type 'boolean)
+(defcustom org-export-creator-info t
+ "Non-nil means, the postamle should contain a creator sentence.
+This sentence is \"HTML generated by org-mode XX in emacs XXX\"."
+ :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.
@@ -466,57 +472,69 @@ Org-mode file."
:group 'org-export-html
:type '(string :tag "File or URL"))
-(defcustom org-export-html-style
+(defconst org-export-html-style-default
"<style type=\"text/css\">
- html {
- font-family: Times, serif;
- font-size: 12pt;
- }
- .title { text-align: center; }
- .todo { color: red; }
- .done { color: green; }
+ html { font-family: Times, serif; font-size: 12pt; }
+ .title { text-align: center; }
+ .todo { color: red; }
+ .done { color: green; }
+ .tag { background-color:lightblue; font-weight:normal }
+ .target { }
.timestamp { color: grey }
.timestamp-kwd { color: CadetBlue }
- .tag { background-color:lightblue; font-weight:normal }
- .target { }
+ p.verse { margin-left: 3% }
pre {
border: 1pt solid #AEBDCC;
background-color: #F3F5F7;
padding: 5pt;
font-family: courier, monospace;
font-size: 90%;
+ overflow:auto;
}
table { border-collapse: collapse; }
- td, th {
- vertical-align: top;
- <!--border: 1pt solid #ADB9CC;-->
- }
+ td, th { vertical-align: top; }
dt { font-weight: bold; }
</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, valid values
-would be:
+Please use the variables `org-export-html-style' and
+`org-export-html-style-extra' to add to this style.")
+
+(defcustom org-export-html-style ""
+ "Org-wide style definitions for exported HTML files.
+
+This variable needs to contain the full HTML structure to provide a style,
+including the surrounding HTML tags. If you set the value of this variable,
+you should consider to include definitions for the following classes:
+ title, todo, done, timestamp, timestamp-kwd, tag, target.
+
+For example, a valid value would be:
<style type=\"text/css\">
p { font-weight: normal; color: gray; }
h1 { color: black; }
.title { text-align: center; }
- .todo, .deadline { color: red; }
+ .todo, .timestamp-kwd { color: red; }
.done { color: green; }
</style>
-or, if you want to keep the style in a file,
+If you'd like to refer to en external style file, use something like
<link rel=\"stylesheet\" type=\"text/css\" href=\"mystyles.css\">
As the value of this option simply gets inserted into the HTML <head> header,
-you can \"misuse\" it to add arbitrary text to the header."
+you can \"misuse\" it to add arbitrary text to the header.
+See also the variable `org-export-html-style-extra'."
:group 'org-export-html
:type 'string)
+(defcustom org-export-html-style-extra ""
+ "Additional style information for HTML export.
+The value of this variable is inserted into the HTML buffer right after
+the value of `org-export-html-style'. Use this variable for per-file
+settings of style information, and do not forget to surround the style
+settings with <style>...</style> tags."
+ :group 'org-export-html
+ :type 'string)
(defcustom org-export-html-title-format "<h1 class=\"title\">%s</h1>\n"
"Format for typesetting the document title in HTML export."
@@ -625,6 +643,46 @@ The file name should be absolute, the file will be overwritten without warning."
:group 'org-export-icalendar
:type 'file)
+(defcustom org-icalendar-combined-name "OrgMode"
+ "Calendar name for the combined iCalendar representing all agenda files."
+ :group 'org-export-icalendar
+ :type 'string)
+
+(defcustom org-icalendar-use-deadline '(event-if-not-todo todo-due)
+ "Contexts where iCalendar export should use a deadline time stamp.
+This is a list with several symbols in it. Valid symbol are:
+
+event-if-todo Deadlines in TODO entries become calendar events.
+event-if-not-todo Deadlines in non-TODO entries become calendar events.
+todo-due Use deadlines in TODO entries as due-dates"
+ :group 'org-export-icalendar
+ :type '(set :greedy t
+ (const :tag "Deadlines in non-TODO entries become events"
+ event-if-not-todo)
+ (const :tag "Deadline in TODO entries become events"
+ event-if-todo)
+ (const :tag "Deadlines in TODO entries become due-dates"
+ todo-due)))
+
+(defcustom org-icalendar-use-scheduled '(todo-start)
+ "Contexts where iCalendar export should use a scheduling time stamp.
+This is a list with several symbols in it. Valid symbol are:
+
+event-if-todo Scheduling time stamps in TODO entries become an event.
+event-if-not-todo Scheduling time stamps in non-TODO entries become an event.
+todo-start Scheduling time stamps in TODO entries become start date.
+ Some calendar applications show TODO entries only after
+ that date."
+ :group 'org-export-icalendar
+ :type '(set :greedy t
+ (const :tag
+ "SCHEDULED timestamps in non-TODO entries become events"
+ event-if-not-todo)
+ (const :tag "SCHEDULED timestamps in TODO entries become events"
+ event-if-todo)
+ (const :tag "SCHEDULED in TODO entries become start date"
+ todo-start)))
+
(defcustom org-icalendar-include-todo nil
"Non-nil means, export to iCalendar files should also cover TODO items."
:group 'org-export-icalendar
@@ -650,11 +708,6 @@ The text will be inserted into the DESCRIPTION field."
(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)
-
(defcustom org-icalendar-store-UID nil
"Non-nil means, store any created UIDs in properties.
The iCalendar standard requires that all entries have a unique identifyer.
@@ -709,10 +762,12 @@ or if they are only using it locally."
(:fixed-width . org-export-with-fixed-width)
(:timestamps . org-export-with-timestamps)
(:author-info . org-export-author-info)
+ (:creator-info . org-export-creator-info)
(:time-stamp-file . org-export-time-stamp-file)
(:tables . org-export-with-tables)
(:table-auto-headline . org-export-highlight-first-table-line)
(:style . org-export-html-style)
+ (:style-extra . org-export-html-style-extra)
(:agenda-style . org-agenda-export-html-style)
(:convert-org-links . org-export-html-link-org-files-as-html)
(:inline-images . org-export-html-inline-images)
@@ -1361,15 +1416,15 @@ on this string to produce the exported version."
;; Find all links that contain a newline and put them into a single line
(org-export-concatenate-multiline-links)
+ ;; Normalize links: Convert angle and plain links into bracket links
+ ;; and expand link abbreviations
+ (org-export-normalize-links)
+
;; Find all internal links. If they have a fuzzy match (i.e. not
;; a *dedicated* target match, let the link point to the
;; corresponding section.
(org-export-target-internal-links target-alist)
- ;; Normalize links: Convert angle and plain links into bracket links
- ;; and expand link abbreviations
- (org-export-normalize-links)
-
;; Find multiline emphasis and put them into single line
(when (plist-get parameters :emph-multiline)
(org-export-concatenate-multiline-emphasis))
@@ -1380,10 +1435,12 @@ on this string to produce the exported version."
(defun org-export-kill-licensed-text ()
"Remove all text that is marked with a :org-license-to-kill property."
- (let (p)
+ (let (p q)
(while (setq p (text-property-any (point-min) (point-max)
:org-license-to-kill t))
- (delete-region p (next-single-property-change p :org-license-to-kill)))))
+ (delete-region
+ p (or (next-single-property-change p :org-license-to-kill)
+ (point-max))))))
(defun org-export-define-heading-targets (target-alist)
"Find all headings and define the targets for them.
@@ -1437,20 +1494,25 @@ let the link point to the corresponding section."
(slink (org-solidify-link-text link))
found props pos
(target
- (or (cdr (assoc slink target-alist))
- (save-excursion
- (unless (string-match org-link-types-re link)
- (setq found (condition-case nil (org-link-search link)
- (error nil)))
- (when (and found
- (or (org-on-heading-p)
- (not (eq found 'dedicated))))
- (or (get-text-property (point) 'target)
- (get-text-property
- (max (point-min)
- (1- (previous-single-property-change
- (point) 'target)))
- 'target))))))))
+ (cond
+ ((cdr (assoc slink target-alist)))
+ ((string-match org-link-types-re link) nil)
+ ((or (file-name-absolute-p link)
+ (string-match "^\\." link))
+ nil)
+ (t
+ (save-excursion
+ (setq found (condition-case nil (org-link-search link)
+ (error nil)))
+ (when (and found
+ (or (org-on-heading-p)
+ (not (eq found 'dedicated))))
+ (or (get-text-property (point) 'target)
+ (get-text-property
+ (max (point-min)
+ (1- (previous-single-property-change
+ (point) 'target)))
+ 'target))))))))
(when target
(set-match-data md)
(goto-char (match-beginning 1))
@@ -1577,7 +1639,8 @@ These special cookies will later be interpreted by the backend."
(defun org-export-remove-comment-blocks-and-subtrees ()
"Remove the comment environment, and also commented subtrees."
- (let ((re-commented (concat "^\\*+[ \t]+" org-comment-string "\\>")))
+ (let ((re-commented (concat "^\\*+[ \t]+" org-comment-string "\\>"))
+ (case-fold-search nil))
;; Remove comment environment
(goto-char (point-min))
(while (re-search-forward
@@ -1653,6 +1716,7 @@ When it is nil, all comments will be removed."
(replace-match s t t))))
(goto-char (point-min))
(while (re-search-forward org-bracket-link-regexp nil t)
+ (goto-char (1- (match-end 0)))
(org-if-unprotected
(let* ((xx (save-match-data
(org-link-expand-abbrev (match-string 1))))
@@ -1835,10 +1899,12 @@ TYPE must be a string, any of:
(defun org-export-handle-include-files ()
"Include the contents of include files, with proper formatting."
(let ((case-fold-search t)
- params file markup lang start end)
+ params file markup lang start end prefix prefix1)
(goto-char (point-min))
(while (re-search-forward "^#\\+INCLUDE:?[ \t]+\\(.*\\)" nil t)
(setq params (read (concat "(" (match-string 1) ")"))
+ prefix (org-get-and-remove-property 'params :prefix)
+ prefix1 (org-get-and-remove-property 'params :prefix1)
file (org-symname-or-string (pop params))
markup (org-symname-or-string (pop params))
lang (org-symname-or-string (pop params)))
@@ -1854,17 +1920,45 @@ TYPE must be a string, any of:
(setq start (format "#+begin_%s\n" markup)
end (format "#+end_%s" markup))))
(insert (or start ""))
- (forward-char (nth 1 (insert-file-contents (expand-file-name file))))
+ (insert (org-get-file-contents (expand-file-name file) prefix prefix1))
(or (bolp) (newline))
(insert (or end ""))))))
+(defun org-get-file-contents (file &optional prefix prefix1)
+ "Get the contents of FILE and return them as a string.
+If PREFIX is a string, prepend it to each line. If PREFIX1
+is a string, prepend it to the first line instead of PREFIX."
+ (with-temp-buffer
+ (insert-file-contents file)
+ (when (or prefix prefix1)
+ (goto-char (point-min))
+ (while (not (eobp))
+ (insert (or prefix1 prefix))
+ (setq prefix1 nil)
+ (beginning-of-line 2)))
+ (buffer-string)))
+
+(defun org-get-and-remove-property (listvar prop)
+ "Check if the value of LISTVAR contains PROP as a property.
+If yes, return the value of that property (i.e. the element following
+in the list) and remove property and value from the list in LISTVAR."
+ (let ((list (symbol-value listvar)) m v)
+ (when (setq m (member prop list))
+ (setq v (nth 1 m))
+ (if (equal (car list) prop)
+ (set listvar (cddr list))
+ (setcdr (nthcdr (- (length list) (length m) 1) list)
+ (cddr m))
+ (set listvar list)))
+ v))
+
(defun org-symname-or-string (s)
(if (symbolp s)
(if s (symbol-name s) s)
s))
;;; Fontification of code
-;; Currently only for th HTML backend, but who knows....
+;; Currently only for the HTML backend, but who knows....
(defun org-export-replace-src-segments ()
"Replace source code segments with special code for export."
(let ((case-fold-search t)
@@ -1915,8 +2009,9 @@ backends, it converts the segment into an EXAMPLE segment."
(org-export-htmlize-region-for-paste
(point-min) (point-max)))))
(if (string-match "<pre\\([^>]*\\)>\n?" htmltext)
- (setq htmltext (replace-match "<pre class=\"src\">"
- t t htmltext)))
+ (setq htmltext (replace-match
+ (format "<pre class=\"src src-%s\">" lang)
+ t t htmltext)))
(concat "#+BEGIN_HTML\n" htmltext "\n#+END_HTML\n"))))
(t
;; This is not HTML, so just make it an example.
@@ -2053,7 +2148,7 @@ underlined headlines. The default is 3."
((and date (string-match "%" date))
(setq date (format-time-string date)))
(date)
- (t (setq date (format-time-string "%Y/%m/%d %X"))))
+ (t (setq date (format-time-string "%Y-%m-%d %T %Z"))))
(if (and date org-export-time-stamp-file)
(insert (concat (nth 2 lang-words) ": " date"\n")))
@@ -2516,12 +2611,13 @@ in a window. A non-interactive call will only return the buffer."
(when (interactive-p)
(setq buffer "*Org HTML Export*"))
(let ((transient-mark-mode t) (zmacs-regions t)
- rtn)
+ ext-plist rtn)
+ (setq ext-plist (plist-put ext-plist :ignore-subree-p t))
(goto-char end)
(set-mark (point)) ;; to activate the region
(goto-char beg)
(setq rtn (org-export-as-html
- nil nil nil
+ nil nil ext-plist
buffer body-only))
(if (fboundp 'deactivate-mark) (deactivate-mark))
(if (and (interactive-p) (bufferp rtn))
@@ -2568,7 +2664,9 @@ PUB-DIR is set, use this as the publishing directory."
ext-plist
(org-infile-export-plist))))
- (style (plist-get opt-plist :style))
+ (style (concat org-export-html-style-default
+ (plist-get opt-plist :style)
+ (plist-get opt-plist :style-extra)))
(html-extension (plist-get opt-plist :html-extension))
(link-validate (plist-get opt-plist :link-validation-function))
valid thetoc have-headings first-heading-pos
@@ -2577,11 +2675,13 @@ PUB-DIR is set, use this as the publishing directory."
(rbeg (and region-p (region-beginning)))
(rend (and region-p (region-end)))
(subtree-p
- (when region-p
- (save-excursion
- (goto-char rbeg)
- (and (org-at-heading-p)
- (>= (org-end-of-subtree t t) rend)))))
+ (if (plist-get opt-plist :ignore-subree-p)
+ nil
+ (when region-p
+ (save-excursion
+ (goto-char rbeg)
+ (and (org-at-heading-p)
+ (>= (org-end-of-subtree t t) rend))))))
(opt-plist (if subtree-p
(org-export-add-subtree-options opt-plist rbeg)
opt-plist))
@@ -2629,6 +2729,7 @@ PUB-DIR is set, use this as the publishing directory."
(quote-re (concat "^\\(\\*+\\)\\([ \t]+" org-quote-string "\\>\\)"))
(inquote nil)
(infixed nil)
+ (inverse nil)
(in-local-list nil)
(local-list-type nil)
(local-list-indent nil)
@@ -2671,7 +2772,7 @@ PUB-DIR is set, use this as the publishing directory."
table-open type
table-buffer table-orig-buffer
ind item-type starter didclose
- rpl path desc descp desc1 desc2 link
+ rpl path attr desc descp desc1 desc2 link
snumber fnc item-tag
)
@@ -2690,7 +2791,7 @@ PUB-DIR is set, use this as the publishing directory."
((and date (string-match "%" date))
(setq date (format-time-string date)))
(date)
- (t (setq date (format-time-string "%Y/%m/%d %X"))))
+ (t (setq date (format-time-string "%Y-%m-%d %T %Z"))))
;; Get the language-dependent settings
(setq lang-words (or (assoc language org-export-language-setup)
@@ -2836,12 +2937,12 @@ lang=\"%s\" xml:lang=\"%s\">
(insert (org-html-protect line) "\n")
(throw 'nextline nil))
- ;; verbatim lines
+ ;; Fixed-width, verbatim lines (examples)
(when (and org-export-with-fixed-width
(string-match "^[ \t]*:\\(.*\\)" line))
(when (not infixed)
(setq infixed t)
- (insert "<pre>\n"))
+ (insert "<pre class=\"example\">\n"))
(insert (org-html-protect (match-string 1 line)) "\n")
(when (or (not lines)
(not (string-match "^[ \t]*\\(:.*\\)"
@@ -2879,11 +2980,20 @@ lang=\"%s\" xml:lang=\"%s\">
(insert "</p>\n</blockquote>\n")
(throw 'nextline nil))
(when (equal "ORG-VERSE-START" line)
- (insert "<verse>\n<p>\n")
+ (insert "\n<p class=\"verse\">\n")
+ (setq inverse t)
(throw 'nextline nil))
(when (equal "ORG-VERSE-END" line)
- (insert "</p>\n</verse>\n")
+ (insert "</p>\n")
+ (setq inverse nil)
(throw 'nextline nil))
+ (when inverse
+ (setq i (org-get-string-indentation line))
+ (if (> i 0)
+ (setq line (concat (mapconcat 'identity
+ (make-list (* 2 i) "\\nbsp") "")
+ " " (org-trim line))))
+ (setq line (concat line " \\\\")))
;; make targets to anchors
(while (string-match "<<<?\\([^<>]*\\)>>>?\\((INVISIBLE)\\)?[ \t]*\n?" line)
@@ -2919,8 +3029,18 @@ lang=\"%s\" xml:lang=\"%s\">
(setq start 0)
(while (string-match org-bracket-link-analytic-regexp line start)
(setq start (match-beginning 0))
- (setq type (if (match-end 2) (match-string 2 line) "internal"))
- (setq path (match-string 3 line))
+ (setq path (save-match-data (org-link-unescape
+ (match-string 3 line))))
+ (setq type (cond
+ ((match-end 2) (match-string 2 line))
+ ((save-match-data
+ (or (file-name-absolute-p path)
+ (string-match "^\\.\\.?/" path)))
+ "file")
+ (t "internal")))
+ (setq path (org-extract-attributes path))
+ (setq attr (org-attributes-to-string
+ (get-text-property 0 'org-attributes path)))
(setq desc1 (if (match-end 5) (match-string 5 line))
desc2 (if (match-end 2) (concat type ":" path) path)
descp (and desc1 (not (equal desc1 desc2)))
@@ -2939,19 +3059,27 @@ lang=\"%s\" xml:lang=\"%s\">
"<a href=\"#"
(org-solidify-link-text
(save-match-data (org-link-unescape path)) nil)
- "\">" desc "</a>")))
+ "\"" attr ">" desc "</a>")))
((member type '("http" "https"))
;; standard URL, just check if we need to inline an image
(if (and (or (eq t org-export-html-inline-images)
(and org-export-html-inline-images (not descp)))
(org-file-image-p path))
- (setq rpl (concat "<img src=\"" type ":" path "\"/>"))
+ (setq rpl (concat "<img src=\"" type ":" path "\"" attr "/>"))
(setq link (concat type ":" path))
- (setq rpl (concat "<a href=\"" link "\">" desc "</a>"))))
+ (setq rpl (concat "<a href=\"" link "\"" attr ">"
+ desc "</a>"))))
((member type '("ftp" "mailto" "news"))
;; standard URL
(setq link (concat type ":" path))
(setq rpl (concat "<a href=\"" link "\">" desc "</a>")))
+
+ ((functionp (setq fnc (nth 2 (assoc type org-link-protocols))))
+ ;; The link protocol has a function for format the link
+ (setq rpl
+ (save-match-data
+ (funcall fnc (org-link-unescape path) desc1 'html))))
+
((string= type "file")
;; FILE link
(let* ((filename path)
@@ -2988,15 +3116,11 @@ lang=\"%s\" xml:lang=\"%s\">
(or (eq t org-export-html-inline-images)
(and org-export-html-inline-images
(not descp))))
- (concat "<img src=\"" thefile "\"/>")
- (concat "<a href=\"" thefile "\">" desc "</a>")))
+ (concat "<img src=\"" thefile "\"" attr "/>")
+ (concat "<a href=\"" thefile "\"" attr ">"
+ desc "</a>")))
(if (not valid) (setq rpl desc))))
- ((functionp (setq fnc (nth 2 (assoc type org-link-protocols))))
- (setq rpl
- (save-match-data
- (funcall fnc (org-link-unescape path) desc1 'html))))
-
(t
;; just publish the path, as default
(setq rpl (concat "<i>&lt;" type ":"
@@ -3199,8 +3323,9 @@ lang=\"%s\" xml:lang=\"%s\">
(insert "<p class=\"date\"> "
(nth 2 lang-words) ": "
date "</p>\n"))
- (insert (format "<p>HTML generated by org-mode %s in emacs %s<\p>\n"
- org-version emacs-major-version))
+ (when org-export-creator-info
+ (insert (format "<p>HTML generated by org-mode %s in emacs %s<\p>\n"
+ org-version emacs-major-version)))
(insert "</div>"))
(if org-export-html-with-timestamp
@@ -3256,6 +3381,7 @@ lang=\"%s\" xml:lang=\"%s\">
(kill-buffer (current-buffer)))
(current-buffer)))))
+
(defvar org-table-colgroup-info nil)
(defun org-format-table-ascii (lines)
"Format a table for ascii export."
@@ -3516,6 +3642,16 @@ But it has the disadvantage, that Org-mode's HTML conversions cannot be used."
(set-buffer " org-tmp2 ")
(buffer-substring (point-min) (point-max))))
+(defun org-export-splice-style (style extra)
+ "Splice EXTRA into STYLE, just before \"</style>\"."
+ (if (and (stringp extra)
+ (string-match "\\S-" extra)
+ (string-match "</style>" style))
+ (concat (substring style 0 (match-beginning 0))
+ "\n" extra "\n"
+ (substring style (match-beginning 0)))
+ style))
+
(defun org-html-handle-time-stamps (s)
"Format time stamps in string S, or remove them."
(catch 'exit
@@ -3932,7 +4068,7 @@ When COMBINE is non nil, add the category to each line."
(format-time-string (cdr org-time-stamp-formats) (current-time))
"DTSTART"))
hd ts ts2 state status (inc t) pos b sexp rrule
- scheduledp deadlinep prefix
+ scheduledp deadlinep todo prefix due start
tmp pri category entry location summary desc uid
(sexp-buffer (get-buffer-create "*ical-tmp*")))
(org-refresh-category-properties)
@@ -3981,8 +4117,21 @@ When COMBINE is non nil, add the category to each line."
ts)
deadlinep (string-match org-deadline-regexp tmp)
scheduledp (string-match org-scheduled-regexp tmp)
+ todo (org-get-todo-state)
;; donep (org-entry-is-done-p)
))
+ (when (and
+ deadlinep
+ (if todo
+ (not (memq 'event-if-todo org-icalendar-use-deadline))
+ (not (memq 'event-if-not-todo org-icalendar-use-deadline))))
+ (throw :skip t))
+ (when (and
+ scheduledp
+ (if todo
+ (not (memq 'event-if-todo org-icalendar-use-scheduled))
+ (not (memq 'event-if-not-todo org-icalendar-use-scheduled))))
+ (throw :skip t))
(setq prefix (if deadlinep "DL-" (if scheduledp "SC-" "TS-")))
(if (or (string-match org-tr-regexp hd)
(string-match org-ts-regexp hd))
@@ -4070,9 +4219,16 @@ END:VEVENT\n"
t org-icalendar-include-body)
location (org-icalendar-cleanup-string
(org-entry-get nil "LOCATION"))
+ due (and (member 'todo-due org-icalendar-use-deadline)
+ (org-entry-get nil "DEADLINE"))
+ start (and (member 'todo-start org-icalendar-use-scheduled)
+ (org-entry-get nil "SCHEDULED"))
uid (if org-icalendar-store-UID
(org-id-get-create)
(or (org-id-get) (org-id-new))))
+ (and due (setq due (org-ical-ts-to-string due "DUE")))
+ (and start (setq start (org-ical-ts-to-string start "DTSTART")))
+
(if (string-match org-bracket-link-regexp hd)
(setq hd (replace-match (if (match-end 3) (match-string 3 hd)
(match-string 1 hd))
@@ -4088,19 +4244,20 @@ END:VEVENT\n"
(princ (format "BEGIN:VTODO
UID: %s
%s
-SUMMARY:%s%s%s
+SUMMARY:%s%s%s%s
CATEGORIES:%s
SEQUENCE:1
PRIORITY:%d
STATUS:%s
END:VTODO\n"
(concat prefix uid)
- dts
+ (or start dts)
(or summary hd)
(if (and location (string-match "\\S-" location))
(concat "\nLOCATION: " location) "")
(if (and desc (string-match "\\S-" desc))
(concat "\nDESCRIPTION: " desc) "")
+ (if due (concat "\n" due) "")
category
pri status)))))))))
@@ -4269,4 +4426,3 @@ The XOXO buffer is named *xoxo-<source buffer name>*"
;; arch-tag: 65985fe9-095c-49c7-a7b6-cb4ee15c0a95
;;; org-exp.el ends here
-
diff --git a/lisp/org/org-export-latex.el b/lisp/org/org-export-latex.el
index 11354fcd501..b17bc02d0c6 100644
--- a/lisp/org/org-export-latex.el
+++ b/lisp/org/org-export-latex.el
@@ -4,7 +4,7 @@
;;
;; Emacs Lisp Archive Entry
;; Filename: org-export-latex.el
-;; Version: 6.05a
+;; Version: 6.06a
;; Author: Bastien Guerry <bzg AT altern DOT org>
;; Maintainer: Bastien Guerry <bzg AT altern DOT org>
;; Keywords: org, wp, tex
@@ -762,11 +762,22 @@ org-protect property."
(replace-match "")
(replace-match (format "\\texttt{%s}" (match-string 0)) t t)))
;; convert tags
- (when (re-search-forward "\\(:[a-zA-Z0-9]+\\)+:" nil t)
+ (when (re-search-forward "\\(:[a-zA-Z0-9_@]+\\)+:" nil t)
(if (or (not org-export-with-tags)
(plist-get remove-list :tags))
(replace-match "")
- (replace-match (format "\\texttt{%s}" (match-string 0)) t t)))))
+ (replace-match
+ (org-export-latex-protect-string
+ (format "\\texttt{%s}" (save-match-data
+ (org-quote-chars (match-string 0)))))
+ t t)))))
+
+(defun org-quote-chars (s)
+ (let ((start 0))
+ (while (string-match "_" s start)
+ (setq start (+ 2 (match-beginning 0))
+ s (replace-match "\\_" t t s))))
+ s)
(defun org-export-latex-fontify-headline (string)
"Fontify special words in string."
@@ -777,10 +788,10 @@ org-protect property."
(goto-char (point-min))
(when (plist-get org-export-latex-options-plist :emphasize)
(org-export-latex-fontify))
- (org-export-latex-special-chars
- (plist-get org-export-latex-options-plist :sub-superscript))
(org-export-latex-keywords-maybe
org-export-latex-remove-from-headlines)
+ (org-export-latex-special-chars
+ (plist-get org-export-latex-options-plist :sub-superscript))
(org-export-latex-links)
(org-trim (buffer-substring-no-properties (point-min) (point-max)))))
@@ -1051,7 +1062,7 @@ Regexps are those from `org-export-latex-special-string-regexps'."
(let* ((re-radio org-export-latex-all-targets-re)
(remove (list (match-beginning 0) (match-end 0)))
(type (match-string 2))
- (raw-path (match-string 3))
+ (raw-path (org-extract-attributes (match-string 3)))
(full-raw-path (concat (match-string 1) raw-path))
(desc (match-string 5))
imgp radiop
diff --git a/lisp/org/org-faces.el b/lisp/org/org-faces.el
index 102bec9db05..2e6f9c24c98 100644
--- a/lisp/org/org-faces.el
+++ b/lisp/org/org-faces.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-gnus.el b/lisp/org/org-gnus.el
index e006f854e3d..9702f41a614 100644
--- a/lisp/org/org-gnus.el
+++ b/lisp/org/org-gnus.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-id.el b/lisp/org/org-id.el
index c818ec0b802..fef64915cf4 100644
--- a/lisp/org/org-id.el
+++ b/lisp/org/org-id.el
@@ -4,7 +4,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-info.el b/lisp/org/org-info.el
index a81eaa793da..e574605efea 100644
--- a/lisp/org/org-info.el
+++ b/lisp/org/org-info.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-irc.el b/lisp/org/org-irc.el
index 16a677c7ba2..13844f08a2b 100644
--- a/lisp/org/org-irc.el
+++ b/lisp/org/org-irc.el
@@ -4,7 +4,7 @@
;;
;; Author: Philip Jackson <emacs@shellarchive.co.uk>
;; Keywords: erc, irc, link, org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-jsinfo.el b/lisp/org/org-jsinfo.el
index 337886c057c..6766a9d0144 100644
--- a/lisp/org/org-jsinfo.el
+++ b/lisp/org/org-jsinfo.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-mac-message.el b/lisp/org/org-mac-message.el
index 8f1607ffc47..aef009d12cd 100644
--- a/lisp/org/org-mac-message.el
+++ b/lisp/org/org-mac-message.el
@@ -3,7 +3,7 @@
;; Copyright (C) 2008 Free Software Foundation, Inc.
;; Author: John Wiegley <johnw@gnu.org>
-;; Version: 6.05a
+;; Version: 6.06a
;; Keywords: outlines, hypermedia, calendar, wp
;; This file is part of GNU Emacs.
diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el
index 3434c57ec7b..b3cdc060201 100644
--- a/lisp/org/org-macs.el
+++ b/lisp/org/org-macs.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-mew.el b/lisp/org/org-mew.el
index 655e344e4ff..fe9f7413c59 100644
--- a/lisp/org/org-mew.el
+++ b/lisp/org/org-mew.el
@@ -5,7 +5,7 @@
;; Author: Tokuya Kameshima <kames at fa2 dot so-net dot ne dot jp>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;; This file is part of GNU Emacs.
diff --git a/lisp/org/org-mhe.el b/lisp/org/org-mhe.el
index 66f1bcc31a8..0f84d02d14a 100644
--- a/lisp/org/org-mhe.el
+++ b/lisp/org/org-mhe.el
@@ -5,7 +5,7 @@
;; Author: Thomas Baumann <thomas dot baumann at ch dot tum dot de>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-mouse.el b/lisp/org/org-mouse.el
index 623afac29fc..a098fc4cefc 100644
--- a/lisp/org/org-mouse.el
+++ b/lisp/org/org-mouse.el
@@ -4,7 +4,7 @@
;;
;; Author: Piotr Zielinski <piotr dot zielinski at gmail dot com>
;; Maintainer: Carsten Dominik <carsten at orgmode dot org>
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-publish.el b/lisp/org/org-publish.el
index 65c49e7b9c9..f239aa2ca08 100644
--- a/lisp/org/org-publish.el
+++ b/lisp/org/org-publish.el
@@ -4,7 +4,7 @@
;; Author: David O'Toole <dto@gnu.org>
;; Maintainer: Bastien Guerry <bzg AT altern DOT org>
;; Keywords: hypermedia, outlines, wp
-;; Version: 6.05a
+;; Version: 6.06a
;; This file is part of GNU Emacs.
;;
@@ -263,7 +263,12 @@ index of files or summary page for a given project.
:index-function Plugin function to use for generation of index.
Defaults to `org-publish-org-index', which
generates a plain list of links to all files
- in the project."
+ in the project.
+ :index-style Can be `list' (index is just an itemized list
+ of the titles of the files involved) or
+ `tree' (the directory structure of the source
+ files is reflected in the index). Defaults to
+ `tree'."
:group 'org-publish
:type 'alist)
@@ -297,24 +302,29 @@ If functions in this hook modify the buffer, it will be saved."
(defun org-publish-timestamp-filename (filename)
"Return path to timestamp file for filename FILENAME."
- (while (string-match
- (if (eq system-type 'windows-nt) "~\\|/\\|:" "~\\|/") filename)
- (setq filename (replace-match "_" nil t filename)))
- (concat org-publish-timestamp-directory filename ".timestamp"))
+ (concat (file-name-as-directory org-publish-timestamp-directory)
+ "X" (if (fboundp 'sha1) (sha1 filename) (md5 filename))))
(defun org-publish-needed-p (filename)
"Return `t' if FILENAME should be published."
- (if org-publish-use-timestamps-flag
- (if (file-exists-p org-publish-timestamp-directory)
- ;; first handle possible wrong timestamp directory
- (if (not (file-directory-p org-publish-timestamp-directory))
- (error "Org publish timestamp: %s is not a directory"
- org-publish-timestamp-directory)
- ;; there is a timestamp, check if FILENAME is newer
- (file-newer-than-file-p
- filename (org-publish-timestamp-filename filename))))
- ;; don't use timestamps, always return t
- t))
+ (let ((rtn
+ (if org-publish-use-timestamps-flag
+ (if (file-exists-p org-publish-timestamp-directory)
+ ;; first handle possible wrong timestamp directory
+ (if (not (file-directory-p org-publish-timestamp-directory))
+ (error "Org publish timestamp: %s is not a directory"
+ org-publish-timestamp-directory)
+ ;; there is a timestamp, check if FILENAME is newer
+ (file-newer-than-file-p
+ filename (org-publish-timestamp-filename filename)))
+ (make-directory org-publish-timestamp-directory)
+ t)
+ ;; don't use timestamps, always return t
+ t)))
+ (if rtn
+ (message "Publishing file %s" filename)
+ (message "Skipping unmodified file %s" filename))
+ rtn))
(defun org-publish-update-timestamp (filename)
"Update publishing timestamp for file FILENAME.
@@ -602,6 +612,8 @@ Default for INDEX-FILENAME is 'index.org'."
(index-filename (concat dir (or index-filename "index.org")))
(index-title (or (plist-get project-plist :index-title)
(concat "Index for project " (car project))))
+ (index-style (or (plist-get project-plist :index-style)
+ 'tree))
(index-buffer (find-buffer-visiting index-filename))
(ifn (file-name-nondirectory index-filename))
file)
@@ -616,25 +628,32 @@ Default for INDEX-FILENAME is 'index.org'."
(oldlocal localdir))
;; index shouldn't index itself
(unless (string= fn ifn)
- (setq localdir (concat (file-name-as-directory dir)
- (file-name-directory link)))
- (unless (string= localdir oldlocal)
- (if (string= localdir dir)
- (setq indent-str (make-string 2 ?\ ))
- (let ((subdirs
- (split-string
- (directory-file-name
- (file-name-directory
- (file-relative-name localdir dir))) "/"))
- (subdir ""))
- (setq indent-str (make-string 2 ?\ ))
- (dolist (d subdirs)
- (setq subdir (concat subdir d "/"))
- (insert (concat indent-str " + [[file:" subdir "][" d "/]]\n"))
- (setq indent-str (make-string (+ (length indent-str) 2) ?\ ))))))
+ (if (eq index-style 'list)
+ (message "Generating list-style index for %s" index-title)
+ (message "Generating tree-style index for %s" index-title)
+ (setq localdir (concat (file-name-as-directory dir)
+ (file-name-directory link)))
+ (unless (string= localdir oldlocal)
+ (if (string= localdir dir)
+ (setq indent-str (make-string 2 ?\ ))
+ (let ((subdirs
+ (split-string
+ (directory-file-name
+ (file-name-directory
+ (file-relative-name localdir dir))) "/"))
+ (subdir ""))
+ (setq indent-str (make-string 2 ?\ ))
+ (dolist (d subdirs)
+ (setq subdir (concat subdir d "/"))
+ (insert (concat indent-str " + [[file:"
+ subdir "][" d "/]]\n"))
+ (setq indent-str (make-string
+ (+ (length indent-str) 2) ?\ )))))))
+ ;; This is common to 'flat and 'tree
(insert (concat indent-str " + [[file:" link "]["
- (file-name-sans-extension fn)
- "]]\n")))))
+ (org-publish-find-title file)
+ "]]\n"))
+ )))
(write-file index-filename)
(kill-buffer (current-buffer)))))
@@ -648,7 +667,8 @@ Default for INDEX-FILENAME is 'index.org'."
(and (not
(plist-get opt-plist :skip-before-1st-heading))
(org-export-grab-title-from-buffer))
- (file-name-sans-extension file)))))
+ (file-name-nondirectory (file-name-sans-extension file))))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Interactive publishing functions
diff --git a/lisp/org/org-remember.el b/lisp/org/org-remember.el
index a97fd647337..2bbb20ef0e6 100644
--- a/lisp/org/org-remember.el
+++ b/lisp/org/org-remember.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-rmail.el b/lisp/org/org-rmail.el
index 337909f3af7..d54dfdddd30 100644
--- a/lisp/org/org-rmail.el
+++ b/lisp/org/org-rmail.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-table.el b/lisp/org/org-table.el
index 7050ecaabac..68963032ff2 100644
--- a/lisp/org/org-table.el
+++ b/lisp/org/org-table.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
@@ -445,8 +445,14 @@ property, locally or anywhere up in the hierarchy."
(let* ((beg (org-table-begin))
(end (org-table-end))
(txt (buffer-substring-no-properties beg end))
- (file (or file (org-entry-get beg "TABLE_EXPORT_FILE" t)))
- (format (or format (org-entry-get beg "TABLE_EXPORT_FORMAT" t)))
+ (file (or file
+ (condition-case nil
+ (org-entry-get beg "TABLE_EXPORT_FILE" t)
+ (error nil))))
+ (format (or format
+ (condition-case nil
+ (org-entry-get beg "TABLE_EXPORT_FORMAT" t)
+ (error nil))))
buf deffmt-readable)
(unless file
(setq file (read-file-name "Export table to: "))
@@ -464,8 +470,13 @@ property, locally or anywhere up in the hierarchy."
(setq deffmt-readable (replace-match "\\t" t t deffmt-readable)))
(while (string-match "\n" deffmt-readable)
(setq deffmt-readable (replace-match "\\n" t t deffmt-readable)))
- (setq format (read-string "Format: " deffmt-readable)))
-
+ (setq format (org-completing-read
+ "Format: "
+ '("orgtbl-to-tsv" "orgtbl-to-csv"
+ "orgtbl-to-latex" "orgtbl-to-html"
+ "orgtbl-to-generic" "orgtbl-to-texinfo"
+ "orgtbl-to-orgtbl") nil nil
+ deffmt-readable)))
(if (string-match "\\([^ \t\r\n]+\\)\\( +.*\\)?" format)
(let* ((transform (intern (match-string 1 format)))
(params (if (match-end 2)
@@ -1864,7 +1875,7 @@ For all numbers larger than LIMIT, shift them by DELTA."
(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))))
- ;; Analyze the line types
+ ;; Analyse the line types
(goto-char beg)
(setq org-table-current-begin-line (org-current-line)
org-table-current-begin-pos (point)
@@ -3541,6 +3552,26 @@ a radio table."
(delete-region beg (point))))
(insert txt "\n")))
+(defun org-table-to-lisp (&optional txt)
+ "Convert the table at point to a Lisp structure.
+The structure will be a list. Each item is either the symbol `hline'
+for a horizontal separator line, or a list of field values as strings.
+The table is taken from the parameter TXT, or from the buffer at point."
+ (unless txt
+ (unless (org-at-table-p)
+ (error "No table at point")))
+ (let* ((txt (or txt
+ (buffer-substring-no-properties (org-table-begin)
+ (org-table-end))))
+ (lines (org-split-string txt "[ \t]*\n[ \t]*")))
+
+ (mapcar
+ (lambda (x)
+ (if (string-match org-table-hline-regexp x)
+ 'hline
+ (org-split-string (org-trim x) "\\s-*|\\s-*")))
+ lines)))
+
(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
diff --git a/lisp/org/org-vm.el b/lisp/org/org-vm.el
index 032881e3eea..6f5e3aaded1 100644
--- a/lisp/org/org-vm.el
+++ b/lisp/org/org-vm.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org-wl.el b/lisp/org/org-wl.el
index 56ad2123972..433343ca29d 100644
--- a/lisp/org/org-wl.el
+++ b/lisp/org/org-wl.el
@@ -5,7 +5,7 @@
;; Author: Tokuya Kameshima <kames at fa2 dot so-net dot ne dot jp>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
diff --git a/lisp/org/org.el b/lisp/org/org.el
index b7d13f7cfb0..40515683075 100644
--- a/lisp/org/org.el
+++ b/lisp/org/org.el
@@ -5,7 +5,7 @@
;; Author: Carsten Dominik <carsten at orgmode dot org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.05a
+;; Version: 6.06a
;;
;; This file is part of GNU Emacs.
;;
@@ -91,7 +91,7 @@
;;; Version
-(defconst org-version "6.05a"
+(defconst org-version "6.06a"
"The version number of the file org.el.")
(defun org-version (&optional here)
@@ -1062,6 +1062,13 @@ When nil, an error will be generated."
:group 'org-link-follow
:type 'boolean)
+(defcustom org-open-directory-means-index-dot-org nil
+ "Non-nil means, a link to a directory really means to index.org.
+When nil, following a directory link will run dired or open a finder/explorer
+window on that directory."
+ :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
@@ -2573,7 +2580,9 @@ get the proper fontification."
(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."
+An archived tree is a tree marked with the tag ARCHIVE. The use of this
+variable is no longer recommended, you should leave it at the value t.
+Instead, use the key `v' to cycle the archives-mode in the agenda."
:group 'org-archive
:group 'org-agenda-skip
:type 'boolean)
@@ -4206,6 +4215,12 @@ are at least `org-cycle-separator-lines' empty lines before the headeline."
(= (match-end 0) (point-max)))
(outline-flag-region (point) (match-end 0) nil))))
+(defun org-show-empty-lines-in-parent ()
+ "Move to the parent and re-show empty lines before visible headlines."
+ (save-excursion
+ (let ((context (if (org-up-heading-safe) 'children 'overview)))
+ (org-cycle-show-empty-lines context))))
+
(defun org-cycle-hide-drawers (state)
"Re-hide all drawers after a visibility state change."
(when (and (org-mode-p)
@@ -4895,6 +4910,7 @@ is signaled in this case."
(insert (make-string (- ne-ins ne-beg) ?\n)))
(move-marker ins-point nil)
(org-compact-display-after-subtree-move)
+ (org-show-empty-lines-in-parent)
(unless folded
(org-show-entry)
(show-children)
@@ -4974,7 +4990,8 @@ If optional TREE is given, use this text instead of the kill ring."
(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))))
+ (let* ((visp (not (org-invisible-p)))
+ (txt (or tree (and kill-ring (current-kill 0))))
(^re (concat "^\\(" outline-regexp "\\)"))
(re (concat "\\(" outline-regexp "\\)"))
(^re_ (concat "\\(\\*+\\)[ \t]*"))
@@ -5028,6 +5045,8 @@ If optional TREE is given, use this text instead of the kill ring."
(goto-char beg)
(skip-chars-forward " \t\n\r")
(setq beg (point))
+ (if (and (org-invisible-p) visp)
+ (save-excursion (outline-show-heading)))
;; Shift if necessary
(unless (= shift 0)
(save-restriction
@@ -5109,7 +5128,7 @@ If yes, remember the marker and the distance to BEG."
(save-match-data
(narrow-to-region
(progn (org-back-to-heading) (point))
- (progn (org-end-of-subtree t t) (point))))))
+ (progn (org-end-of-subtree t) (point))))))
;;; Outline Sorting
@@ -5908,6 +5927,7 @@ so this really moves item trees."
(setq beg (point)))
(goto-char beg0)
(org-end-of-item)
+ (org-back-over-empty-lines)
(setq end (point))
(goto-char beg0)
(catch 'exit
@@ -5923,7 +5943,7 @@ so this really moves item trees."
(throw 'exit t)))))
(condition-case nil
(org-beginning-of-item)
- (error (goto-char beg)
+ (error (goto-char beg0)
(error "Cannot move this item further up")))
(setq ind1 (org-get-indentation))
(if (and (org-at-item-p) (= ind ind1))
@@ -6021,9 +6041,10 @@ with something like \"1.\" or \"2)\"."
(buffer-substring (point-at-bol) (match-beginning 3))))
;; (term (substring (match-string 3) -1))
ind1 (n (1- arg))
- fmt)
+ fmt bob)
;; find where this list begins
(org-beginning-of-item-list)
+ (setq bobp (bobp))
(looking-at "[ \t]*[0-9]+\\([.)]\\)")
(setq fmt (concat "%d" (match-string 1)))
(beginning-of-line 0)
@@ -6031,7 +6052,7 @@ with something like \"1.\" or \"2)\"."
(catch 'exit
(while t
(catch 'next
- (beginning-of-line 2)
+ (if bobp (setq bobp nil) (beginning-of-line 2))
(if (eobp) (throw 'exit nil))
(if (looking-at "[ \t]*$") (throw 'next nil))
(skip-chars-forward " \t") (setq ind1 (current-column))
@@ -6097,7 +6118,8 @@ I.e. to the first item in this list."
(if (or (< ind1 ind)
(and (= ind1 ind)
(not (org-at-item-p)))
- (bobp))
+ (and (= (point-at-bol) (point-min))
+ (setq pos (point-min))))
(throw 'exit t)
(when (org-at-item-p) (setq pos (point-at-bol)))))))
(goto-char pos)))
@@ -6733,7 +6755,7 @@ according to FMT (default from `org-email-link-description-format')."
(setq description nil))
(when (and (not description)
(not (equal link (org-link-escape link))))
- (setq description link))
+ (setq description (org-extract-attributes link)))
(concat "[[" (org-link-escape link) "]"
(if description (concat "[" description "]") "")
"]"))
@@ -7006,6 +7028,27 @@ used as the link location instead of reading one interactively."
(org-defkey minibuffer-local-completion-map " " 'self-insert-command)
(apply 'completing-read args)))
+(defun org-extract-attributes (s)
+ "Extract the attributes cookie from a string and set as text property."
+ (let (a attr (start 0))
+ (save-match-data
+ (when (string-match "{{\\([^}]+\\)}}$" s)
+ (setq a (match-string 1 s) s (substring s 0 (match-beginning 0)))
+ (while (string-match "\\([a-zA-Z]+\\)=\"\\([^\"]*\\)\"" a start)
+ (setq key (match-string 1 a) value (match-string 2 a)
+ start (match-end 0)
+ attr (plist-put attr (intern key) value))))
+ (org-add-props s nil 'org-attributes attr))
+ s))
+
+(defun org-attributes-to-string (plist)
+ "Format a property list into an HTML attribute list."
+ (let ((s "") key value)
+ (while plist
+ (setq key (pop plist) value (pop plist))
+ (setq s (concat s " "(symbol-name key) "=\"" value "\"")))
+ s))
+
;;; Opening/following a link
(defvar org-link-search-failed nil)
@@ -7106,13 +7149,18 @@ optional argument IN-EMACS is non-nil, Emacs will visit the file."
(save-excursion
(skip-chars-forward "^]\n\r")
(when (org-in-regexp org-bracket-link-regexp)
- (setq link (org-link-unescape (org-match-string-no-properties 1)))
+ (setq link (org-extract-attributes
+ (org-link-unescape (org-match-string-no-properties 1))))
(while (string-match " *\n *" link)
(setq link (replace-match " " t t link)))
(setq link (org-link-expand-abbrev link))
- (if (string-match org-link-re-with-space2 link)
- (setq type (match-string 1 link) path (match-string 2 link))
- (setq type "thisfile" path link))
+ (cond
+ ((or (file-name-absolute-p link)
+ (string-match "^\\.\\.?/" link))
+ (setq type "file" path link))
+ ((string-match org-link-re-with-space2 link)
+ (setq type (match-string 1 link) path (match-string 2 link)))
+ (t (setq type "thisfile" path link)))
(throw 'match t)))
(when (get-text-property (point) 'org-linked-text)
@@ -7530,6 +7578,9 @@ If the file does not exist, an error is thrown."
(apps (append org-file-apps (org-default-apps)))
(remp (and (assq 'remote apps) (org-file-remote-p file)))
(dirp (if remp nil (file-directory-p file)))
+ (file (if (and dirp org-open-directory-means-index-dot-org)
+ (concat (file-name-as-directory file) "index.org")
+ file))
(dfile (downcase file))
(old-buffer (current-buffer))
(old-pos (point))
@@ -8586,7 +8637,7 @@ Returns the new TODO keyword, or nil if no state change should occur."
nil)))
(defun org-get-repeat ()
- "Check if tere is a deadline/schedule with repeater in this entry."
+ "Check if there is a deadline/schedule with repeater in this entry."
(save-match-data
(save-excursion
(org-back-to-heading t)
@@ -9196,6 +9247,7 @@ ACTION can be `set', `up', `down', or a character."
;;;; Tags
+(defvar org-agenda-archives-mode)
(defun org-scan-tags (action matcher &optional todo-only)
"Scan headline tags with inheritance and produce output ACTION.
@@ -9211,9 +9263,9 @@ only lines with a TODO keyword are included in the output."
(mapconcat 'regexp-quote org-todo-keywords-1 "\\|")
(org-re
"\\>\\)\\)? *\\(.*?\\)\\(:[[:alnum:]_@:]+:\\)?[ \t]*$")))
- (props (list 'face nil
+ (props (list 'face 'default
'done-face 'org-done
- 'undone-face nil
+ 'undone-face 'default
'mouse-face 'highlight
'org-not-done-regexp org-not-done-regexp
'org-todo-regexp org-todo-regexp
@@ -9265,8 +9317,11 @@ only lines with a TODO keyword are included in the output."
(org-remove-uniherited-tags (cdar tags-alist))))
(when (and (or (not todo-only) (member todo org-not-done-keywords))
(eval matcher)
- (or (not org-agenda-skip-archived-trees)
- (not (member org-archive-tag tags-list))))
+ (or
+ (not (member org-archive-tag tags-list))
+ ;; we have an archive tag, should we use this anyway?
+ (or (not org-agenda-skip-archived-trees)
+ (and (eq action 'agenda) org-agenda-archives-mode))))
(unless (eq action 'sparse-tree) (org-agenda-skip))
;; select this headline
@@ -9420,8 +9475,10 @@ also TODO lines."
cat-p (equal pn "CATEGORY")
re-p (equal (string-to-char pv) ?{)
str-p (equal (string-to-char pv) ?\")
+ time-p (save-match-data (string-match "^\"<.*>\"$" pv))
pv (if (or re-p str-p) (substring pv 1 -1) pv))
- (setq po (org-op-to-function po str-p))
+ (if time-p (setq pv (org-matcher-time pv)))
+ (setq po (org-op-to-function po (if time-p 'time str-p)))
(if (equal pn "CATEGORY")
(setq gv '(get-text-property (point) 'org-category))
(setq gv `(org-cached-entry-get nil ,pn)))
@@ -9476,21 +9533,46 @@ also TODO lines."
(cons match0 matcher)))
(defun org-op-to-function (op &optional stringp)
+ "Turn an operator into the appropriate function."
(setq op
(cond
- ((equal op "<" ) '(< string< ))
- ((equal op ">" ) '(> org-string> ))
- ((member op '("<=" "=<")) '(<= org-string<= ))
- ((member op '(">=" "=>")) '(>= org-string>= ))
- ((member op '("=" "==")) '(= string= ))
- ((member op '("<>" "!=")) '(org<> org-string<> ))))
- (nth (if stringp 1 0) op))
+ ((equal op "<" ) '(< string< org-time<))
+ ((equal op ">" ) '(> org-string> org-time>))
+ ((member op '("<=" "=<")) '(<= org-string<= org-time<=))
+ ((member op '(">=" "=>")) '(>= org-string>= org-time>=))
+ ((member op '("=" "==")) '(= string= org-time=))
+ ((member op '("<>" "!=")) '(org<> org-string<> org-time<>))))
+ (nth (if (eq stringp 'time) 2 (if stringp 1 0)) op))
(defun org<> (a b) (not (= a b)))
(defun org-string<= (a b) (or (string= a b) (string< a b)))
(defun org-string>= (a b) (not (string< a b)))
(defun org-string> (a b) (and (not (string= a b)) (not (string< a b))))
(defun org-string<> (a b) (not (string= a b)))
+(defun org-time= (a b) (= (org-2ft a) (org-2ft b)))
+(defun org-time< (a b) (< (org-2ft a) (org-2ft b)))
+(defun org-time<= (a b) (<= (org-2ft a) (org-2ft b)))
+(defun org-time> (a b) (> (org-2ft a) (org-2ft b)))
+(defun org-time>= (a b) (>= (org-2ft a) (org-2ft b)))
+(defun org-time<> (a b) (org<> (org-2ft a) (org-2ft b)))
+(defun org-2ft (s)
+ "Convert S to a floating point time.
+If S is already a number, just return it. If it is a string, parse
+it as a time string and apply `float-time' to it. f S is nil, just return 0."
+ (cond
+ ((numberp s) s)
+ ((stringp s)
+ (condition-case nil
+ (float-time (apply 'encode-time (org-parse-time-string s)))
+ (error 0.)))
+ (t 0.)))
+
+(defun org-matcher-time (s)
+ (cond
+ ((equal s "<now>") (float-time))
+ ((equal s "<today>")
+ (float-time (append '(0 0 0) (nthcdr 3 (decode-time)))))
+ (t (org-2ft s))))
(defun org-match-any-p (re list)
"Does re match any element of list?"
@@ -9998,7 +10080,8 @@ the scanner. The following items can be given here:
the the function returns t, FUNC will not be called for that
entry and search will continue from the point where the
function leaves it."
- (let* ((org-agenda-skip-archived-trees (memq 'archive skip))
+ (let* ((org-agenda-archives-mode nil) ; just to make sure
+ (org-agenda-skip-archived-trees (memq 'archive skip))
(org-agenda-skip-comment-trees (memq 'comment skip))
(org-agenda-skip-function
(car (org-delete-all '(comment archive) skip)))
@@ -10009,12 +10092,12 @@ the scanner. The following items can be given here:
((eq match t) (setq matcher t))
((eq match nil) (setq matcher t))
(t (setq matcher (if match (org-make-tags-matcher match) t))))
-
+
(when (eq scope 'tree)
(org-back-to-heading t)
(org-narrow-to-subtree)
(setq scope nil))
-
+
(if (not scope)
(progn
(org-prepare-agenda-buffers
@@ -10069,6 +10152,22 @@ Being in this list makes sure that they are offered for completion.")
(defconst org-property-end-re "^[ \t]*:END:[ \t]*$"
"Regular expression matching the first line of a property drawer.")
+(defconst org-clock-drawer-start-re "^[ \t]*:CLOCK:[ \t]*$"
+ "Regular expression matching the first line of a property drawer.")
+
+(defconst org-clock-drawer-end-re "^[ \t]*:END:[ \t]*$"
+ "Regular expression matching the first line of a property drawer.")
+
+(defconst org-property-drawer-re
+ (concat "\\(" org-property-start-re "\\)[^\000]*\\("
+ org-property-end-re "\\)\n?")
+ "Matches an entire property drawer.")
+
+(defconst org-clock-drawer-re
+ (concat "\\(" org-clock-drawer-start-re "\\)[^\000]*\\("
+ org-property-end-re "\\)\n?")
+ "Matches an entire clock drawer.")
+
(defun org-property-action ()
"Do an action on properties."
(interactive)
@@ -11475,7 +11574,7 @@ When SHOW-ALL is nil, only return the current occurence of a time stamp."
date2 (list m d (+ y1 (* (if (< n1 cday) 1 -1) dn)))
n2 (calendar-absolute-from-gregorian date2)))
((eq dw 'month)
- ;; approx number of month between the tow dates
+ ;; approx number of month between the two dates
(setq nmonths (floor (/ (- cday sday) 30.436875)))
;; How often does dn fit in there?
(setq d (nth 1 start) m (car start) y (nth 2 start)
@@ -11489,12 +11588,11 @@ When SHOW-ALL is nil, only return the current occurence of a time stamp."
(setq m2 (+ m dn) y2 y)
(if (> m2 12) (setq y2 (1+ y2) m2 (- m2 12)))
(setq n2 (calendar-absolute-from-gregorian (list m2 d y2)))
- (while (< n2 cday)
+ (while (<= n2 cday)
(setq n1 n2 m m2 y y2)
(setq m2 (+ m dn) y2 y)
(if (> m2 12) (setq y2 (1+ y2) m2 (- m2 12)))
(setq n2 (calendar-absolute-from-gregorian (list m2 d y2))))))
-
(if show-all
(cond
((eq prefer 'past) n1)
@@ -11828,14 +11926,13 @@ If TMP is non-nil, don't include temporary buffers."
(buffer-list)))
(delete nil blist)))
-(defun org-agenda-files (&optional unrestricted ext)
+(defun org-agenda-files (&optional unrestricted archives)
"Get the list of agenda files.
Optional UNRESTRICTED means return the full list even if a restriction
is currently in place.
-When EXT is non-nil, try to add all files that are created by adding EXT
-to the file nemes. Basically, this is a way to add the archive files
-to the list, by setting EXT to \"_archive\" If EXT is non-nil, but not
-a string, \"_archive\" will be used."
+When ARCHIVES is t, include all archive files hat are really being
+used by the agenda files. If ARCHIVE is `ifmode', do this only if
+`org-agenda-archives-mode' is t."
(let ((files
(cond
((and (not unrestricted) (get 'org-agenda-files 'org-restrict)))
@@ -11855,16 +11952,9 @@ a string, \"_archive\" will be used."
(lambda (file)
(and (file-readable-p file) file)))
files))))
- (when ext
- (setq ext (if (and (stringp ext) (string-match "\\S-" ext))
- ext "_archive"))
- (setq files (apply 'append
- (mapcar
- (lambda (f)
- (if (file-exists-p (concat f ext))
- (list f (concat f ext))
- (list f)))
- files))))
+ (when (or (eq archives t)
+ (and (eq archives 'ifmode) (eq org-agenda-archives-mode t)))
+ (setq files (org-add-archive-files files)))
files))
(defun org-edit-agenda-file-list ()
@@ -12327,13 +12417,15 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
(cd dir))
(if (not (file-exists-p dvifile))
(progn (message "Failed to create dvi file from %s" texfile) nil)
- (call-process "dvipng" nil nil nil
- "-E" "-fg" fg "-bg" bg
- "-D" dpi
- ;;"-x" scale "-y" scale
- "-T" "tight"
- "-o" pngfile
- dvifile)
+ (condition-case nil
+ (call-process "dvipng" nil nil nil
+ "-E" "-fg" fg "-bg" bg
+ "-D" dpi
+ ;;"-x" scale "-y" scale
+ "-T" "tight"
+ "-o" pngfile
+ dvifile)
+ (error nil))
(if (not (file-exists-p pngfile))
(progn (message "Failed to create png file from %s" texfile) nil)
;; Use the requested file name and clean up
@@ -12427,7 +12519,9 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
(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 narrow-map "s" 'org-narrow-to-subtree)
+(if (boundp 'narrow-map)
+ (org-defkey narrow-map "s" 'org-narrow-to-subtree)
+ (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)
@@ -13220,9 +13314,6 @@ See the individual commands for more information."
["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))
@@ -14390,7 +14481,9 @@ Show the heading too, if it is currently invisible."
(eval-after-load "imenu"
'(progn
(add-hook 'imenu-after-jump-hook
- (lambda () (org-show-context 'org-goto)))))
+ (lambda ()
+ (if (eq major-mode 'org-mode)
+ (org-show-context 'org-goto))))))
;; Speedbar support
@@ -14513,4 +14606,3 @@ Still experimental, may disappear in the future."
;; arch-tag: e77da1a7-acc7-4336-b19e-efa25af3f9fd
;;; org.el ends here
-