summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Guerry <bzg@altern.org>2013-01-07 16:19:37 +0100
committerBastien Guerry <bzg@altern.org>2013-01-07 16:19:37 +0100
commitb54d6f5965a62c179f79a804efe4e4337c97b074 (patch)
treef85c680629c15d259d6a0120c23f52fd0797f38e
parent3a1c27060792fc095435efcaf270a6207d5d8d27 (diff)
parentc8bfd50223d1a75d12d7f74571c24951592c56ec (diff)
downloadorg-mode-b54d6f5965a62c179f79a804efe4e4337c97b074.tar.gz
Merge branch 'maint'
Conflicts: lisp/org-agenda.el lisp/org.el testing/lisp/test-org-element.el
-rw-r--r--contrib/lisp/org-depend.el4
-rw-r--r--doc/org.texi4
-rw-r--r--lisp/org-agenda.el61
-rw-r--r--lisp/org-clock.el6
-rw-r--r--lisp/org-icalendar.el3
-rw-r--r--lisp/org.el50
-rw-r--r--testing/lisp/test-org-element.el4
7 files changed, 84 insertions, 48 deletions
diff --git a/contrib/lisp/org-depend.el b/contrib/lisp/org-depend.el
index 0ca5819..81402b4 100644
--- a/contrib/lisp/org-depend.el
+++ b/contrib/lisp/org-depend.el
@@ -205,6 +205,8 @@ This does two different kinds of triggers:
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."
+ ;; Refresh the effort text properties
+ (org-refresh-effort-properties)
;; Get information from the plist
(let* ((type (plist-get change-plist :type))
(pos (plist-get change-plist :position))
@@ -268,7 +270,7 @@ This does two different kinds of triggers:
(tags (match-string 5))
(priority (org-get-priority (or (match-string 3) "")))
(effort (when (or effort-up effort-down)
- (let ((effort (org-get-effort)))
+ (let ((effort (get-text-property (point) 'org-effort)))
(when effort
(org-duration-string-to-minutes effort))))))
(push (list (point) todo-kwd priority tags effort)
diff --git a/doc/org.texi b/doc/org.texi
index c624e4c..95c01b0 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -5580,7 +5580,7 @@ example with optional time
@example
* 22:00-23:00 The nerd meeting on every 2nd Thursday of the month
- <%%(org-float t 4 2)>
+ <%%(diary-float t 4 2)>
@end example
@item Time/Date range
@@ -5917,7 +5917,7 @@ entries. Org mode will issue early and late warnings based on the
assumption that the timestamp represents the @i{nearest instance} of
the repeater. However, the use of diary sexp entries like
@c
-@code{<%%(org-float t 42)>}
+@code{<%%(diary-float t 42)>}
@c
in scheduling and deadline timestamps is limited. Org mode does not
know enough about the internals of each sexp function to issue early and
diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index ba8d041..75bb06d 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -1677,6 +1677,18 @@ When non-nil, this must be the number of minutes, e.g. 60 for one hour."
:group 'org-agenda-line-format
:type 'boolean)
+(defcustom org-agenda-use-tag-inheritance '(todo search timeline agenda)
+ "List of agenda view types where to use tag inheritance.
+
+In tags/tags-todo/tags-tree agenda views, tag inheritance is
+controlled by `org-use-tag-inheritance'. In other agenda types,
+`org-use-tag-inheritance' is not used when selecting the agenda
+entries, but you may want the agenda to use the inherited tags
+anyway, e.g. for later tag filtering.
+
+Setting this to nil will speed up non-tags agenda view a lot."
+ :version "24.3")
+
(defcustom org-agenda-hide-tags-regexp nil
"Regular expression used to filter away specific tags in agenda views.
This means that these tags will be present, but not be shown in the agenda
@@ -3577,9 +3589,20 @@ generating a new one."
(if (and (functionp 'org-habit-insert-consistency-graphs)
(save-excursion (next-single-property-change (point-min) 'org-habit-p)))
(org-habit-insert-consistency-graphs))
+ (setq org-agenda-type (org-get-at-bol 'org-agenda-type))
+ (when (delq nil (mapcar (lambda (tp) (org-agenda-check-type nil tp))
+ org-agenda-use-tag-inheritance))
+ (let (mrk)
+ (save-excursion
+ (goto-char (point-min))
+ (while (equal (forward-line) 0)
+ (when (setq mrk (or (get-text-property (point) 'org-hd-marker)
+ (get-text-property (point) 'org-hd-marker)))
+ (put-text-property (point-at-bol) (point-at-eol)
+ 'tags (org-with-point-at mrk
+ (delete-dups (org-get-tags-at)))))))))
(let ((inhibit-read-only t))
(run-hooks 'org-agenda-finalize-hook))
- (setq org-agenda-type (org-get-at-bol 'org-agenda-type))
(when (or org-agenda-tag-filter (get 'org-agenda-tag-filter :preset-filter))
(org-agenda-filter-apply org-agenda-tag-filter 'tag))
(when (or org-agenda-category-filter (get 'org-agenda-category-filter :preset-filter))
@@ -4456,7 +4479,7 @@ in `org-agenda-text-search-extra-files'."
category (org-get-category)
level (make-string (org-reduced-level (org-outline-level)) ? )
category-pos (get-text-property (point) 'org-category-position)
- tags (org-get-tags-at (point))
+ tags (org-get-tags-at nil t)
txt (org-agenda-format-item
""
(buffer-substring-no-properties
@@ -5292,7 +5315,7 @@ the documentation of `org-diary'."
category-pos (get-text-property (point) 'org-category-position)
txt (org-trim
(buffer-substring (match-beginning 2) (match-end 0)))
- tags (org-get-tags-at (point))
+ tags (org-get-tags-at nil t)
level (make-string (org-reduced-level (org-outline-level)) ? )
txt (org-agenda-format-item "" txt level category tags t)
priority (1+ (org-get-priority txt))
@@ -5461,7 +5484,7 @@ Do we have a reason to ignore this TODO entry because it has a time stamp?
clockp (and org-agenda-include-inactive-timestamps
(or (string-match org-clock-string tmp)
(string-match "]-+\\'" tmp)))
- warntime (org-entry-get (point) "APPT_WARNTIME")
+ warntime (get-text-property (point) 'org-appt-warntime)
donep (member todo-state org-done-keywords))
(if (or scheduledp deadlinep closedp clockp
(and donep org-agenda-skip-timestamp-if-done))
@@ -5480,7 +5503,7 @@ Do we have a reason to ignore this TODO entry because it has a time stamp?
(assoc (point) deadline-position-alist))
(throw :skip nil))
(setq hdmarker (org-agenda-new-marker)
- tags (org-get-tags-at)
+ tags (org-get-tags-at nil t)
level (make-string (org-reduced-level (org-outline-level)) ? ))
(looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
(setq head (or (match-string 1) ""))
@@ -5532,10 +5555,9 @@ Do we have a reason to ignore this TODO entry because it has a time stamp?
level (make-string (org-reduced-level (org-outline-level)) ? )
category (org-get-category beg)
category-pos (get-text-property beg 'org-category-position)
- tags (save-excursion (org-backward-heading-same-level 0)
- (org-get-tags-at))
+ tags (save-excursion (org-back-to-heading t) (org-get-tags-at nil t))
todo-state (org-get-todo-state)
- warntime (org-entry-get (point) "APPT_WARNTIME")
+ warntime (get-text-property (point) 'org-appt-warntime)
extra nil)
(dolist (r (if (stringp result)
@@ -5582,7 +5604,6 @@ Do we have a reason to ignore this TODO entry because it has a time stamp?
(org-no-warnings
(let ((calendar-date-style 'european) (european-calendar-style t))
(diary-date day month year mark))))
-(defalias 'org-float 'diary-float)
;; Define the` org-class' function
(defun org-class (y1 m1 d1 y2 m2 d2 dayname &rest skip-weeks)
@@ -5703,7 +5724,7 @@ please use `org-class' instead."
(setq txt org-agenda-no-heading-message)
(goto-char (match-beginning 0))
(setq hdmarker (org-agenda-new-marker)
- tags (org-get-tags-at)
+ tags (org-get-tags-at nil t)
level (make-string (org-reduced-level (org-outline-level)) ? ))
(looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
(setq txt (match-string 1))
@@ -5922,14 +5943,14 @@ See also the user option `org-agenda-clock-consistency-checks'."
(not (= diff 0))))
(setq txt nil)
(setq category (org-get-category)
- warntime (org-entry-get (point) "APPT_WARNTIME")
+ warntime (get-text-property (point) 'org-appt-warntime)
category-pos (get-text-property (point) 'org-category-position))
(if (not (re-search-backward "^\\*+[ \t]+" nil t))
(setq txt org-agenda-no-heading-message)
(goto-char (match-end 0))
(setq pos1 (match-beginning 0))
(setq level (make-string (org-reduced-level (org-outline-level)) ? ))
- (setq tags (org-get-tags-at pos1))
+ (setq tags (org-get-tags-at pos1 t))
(setq head (buffer-substring-no-properties
(point)
(progn (skip-chars-forward "^\r\n")
@@ -6014,7 +6035,7 @@ FRACTION is what fraction of the head-warning time has passed."
(match-string 1) d1 'past show-all
(current-buffer) pos)
diff (- d2 d1)
- warntime (org-entry-get (point) "APPT_WARNTIME"))
+ warntime (get-text-property (point) 'org-appt-warntime))
(setq pastschedp (and todayp (< diff 0)))
(setq did-habit-check-p nil)
;; When to show a scheduled item in the calendar:
@@ -6060,7 +6081,7 @@ FRACTION is what fraction of the head-warning time has passed."
pastschedp))
(setq mm (assoc pos1 deadline-position-alist)))
(throw :skip nil)))
- (setq tags (org-get-tags-at))
+ (setq tags (org-get-tags-at nil t))
(setq level (make-string (org-reduced-level (org-outline-level)) ? ))
(setq head (buffer-substring-no-properties
(point)
@@ -6144,7 +6165,7 @@ FRACTION is what fraction of the head-warning time has passed."
(setq txt org-agenda-no-heading-message)
(goto-char (match-beginning 0))
(setq hdmarker (org-agenda-new-marker (point)))
- (setq tags (org-get-tags-at))
+ (setq tags (org-get-tags-at nil t))
(setq level (make-string (org-reduced-level (org-outline-level)) ? ))
(looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
(setq head (match-string 1))
@@ -6311,12 +6332,7 @@ Any match of REMOVE-RE will be removed from TXT."
(match-string 2 txt))
t t txt))))
(when (derived-mode-p 'org-mode)
- (setq effort
- (condition-case nil
- (org-get-effort
- (or (get-text-property 0 'org-hd-marker txt)
- (get-text-property 0 'org-marker txt)))
- (error nil)))
+ (setq effort (ignore-errors (get-text-property 0 'org-effort txt)))
(when effort
(setq neffort (org-duration-string-to-minutes effort)
effort (setq effort (concat "[" effort "]")))))
@@ -6840,7 +6856,8 @@ in the file. Otherwise, restriction will be to the current subtree."
(defun org-agenda-check-type (error &rest types)
"Check if agenda buffer is of allowed type.
-If ERROR is non-nil, throw an error, otherwise just return nil."
+If ERROR is non-nil, throw an error, otherwise just return nil.
+Allowed types are 'agenda 'timeline 'todo 'tags 'search."
(if (not org-agenda-type)
(error "No Org agenda currently displayed")
(if (memq org-agenda-type types)
diff --git a/lisp/org-clock.el b/lisp/org-clock.el
index 4af05f5..0c0d373 100644
--- a/lisp/org-clock.el
+++ b/lisp/org-clock.el
@@ -35,6 +35,7 @@
(declare-function calendar-absolute-from-iso "cal-iso" (&optional date))
(declare-function notifications-notify "notifications" (&rest params))
(declare-function org-pop-to-buffer-same-window "org-compat" (&optional buffer-or-name norecord label))
+(declare-function org-refresh-properties "org" (dprop tprop))
(defvar org-time-stamp-formats)
(defvar org-ts-what)
(defvar org-frame-title-format-backup frame-title-format)
@@ -1105,6 +1106,7 @@ time as the start time \(see `org-clock-continuously' to
make this the default behavior.)"
(interactive "P")
(setq org-clock-notification-was-shown nil)
+ (org-refresh-properties org-effort-property 'org-effort)
(catch 'abort
(let ((interrupting (and (not org-clock-resolving-clocks-due-to-idleness)
(org-clocking-p)))
@@ -1226,7 +1228,7 @@ make this the default behavior.)"
(setq org-clock-start-time
(apply 'encode-time
(org-parse-time-string (match-string 1))))
- (setq org-clock-effort (org-get-effort))
+ (setq org-clock-effort (get-text-property (point) 'org-effort))
(setq org-clock-total-time (org-clock-sum-current-item
(org-clock-get-sum-start))))
((eq org-clock-in-resume 'auto-restart)
@@ -1246,7 +1248,7 @@ make this the default behavior.)"
(beginning-of-line 1)
(org-indent-line-to (- (org-get-indentation) 2)))
(insert org-clock-string " ")
- (setq org-clock-effort (org-get-effort))
+ (setq org-clock-effort (get-text-property (point) 'org-effort))
(setq org-clock-total-time (org-clock-sum-current-item
(org-clock-get-sum-start)))
(setq org-clock-start-time
diff --git a/lisp/org-icalendar.el b/lisp/org-icalendar.el
index f13f46d..389dc5d 100644
--- a/lisp/org-icalendar.el
+++ b/lisp/org-icalendar.el
@@ -327,6 +327,7 @@ When COMBINE is non nil, add the category to each line."
tmp pri categories location summary desc uid alarm alarm-time
(sexp-buffer (get-buffer-create "*ical-tmp*")))
(org-refresh-category-properties)
+ (org-refresh-properties "APPT_WARNTIME" 'org-appt-warntime)
(save-excursion
(goto-char (point-min))
(while (re-search-forward re1 nil t)
@@ -357,7 +358,7 @@ When COMBINE is non nil, add the category to each line."
(org-id-get-create)
(or (org-id-get) (org-id-new)))
categories (org-export-get-categories)
- alarm-time (org-entry-get nil "APPT_WARNTIME")
+ alarm-time (get-text-property (point) 'org-appt-warntime)
alarm-time (if alarm-time (string-to-number alarm-time) 0)
alarm ""
deadlinep nil scheduledp nil)
diff --git a/lisp/org.el b/lisp/org.el
index a446d76..8161756 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -3120,7 +3120,7 @@ When nil, only the tags directly given in a specific line apply there.
This may also be a list of tags that should be inherited, or a regexp that
matches tags that should be inherited. Additional control is possible
with the variable `org-tags-exclude-from-inheritance' which gives an
-explicit list of tags to be excluded from inheritance., even if the value of
+explicit list of tags to be excluded from inheritance, even if the value of
`org-use-tag-inheritance' would select it for inheritance.
If this option is t, a match early-on in a tree can lead to a large
@@ -8815,6 +8815,24 @@ call CMD."
(put-text-property beg end 'org-category-position beg)
(goto-char pos)))))))
+(defun org-refresh-properties (dprop tprop)
+ "Refresh buffer text properties.
+DPROP is the drawer property and TPROP is the corresponding text
+property to set."
+ (let ((case-fold-search t)
+ (inhibit-read-only t) p)
+ (org-unmodified
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (while (re-search-forward (concat "^[ \t]*:" dprop ": +\\(.*\\)[ \t]*$") nil t)
+ (setq p (org-match-string-no-properties 1))
+ (save-excursion
+ (org-back-to-heading t)
+ (put-text-property
+ (point-at-bol) (point-at-eol) tprop p))))))))
+
;;;; Link Stuff
@@ -8908,7 +8926,7 @@ type. For a simple example of an export function, see `org-bbdb.el'."
(push (list type follow export) org-link-protocols)))
(defvar org-agenda-buffer-name) ; Defined in org-agenda.el
-(defvar org-link-to-org-use-id) ; Defined in org-id.el
+(defvar org-id-link-to-org-use-id) ; Defined in org-id.el
;;;###autoload
(defun org-store-link (arg)
@@ -10142,12 +10160,6 @@ there is one, return it."
'(add-hook 'org-export-preprocess-before-normalizing-links-hook
'org-remove-file-link-modifiers))
-;;;; Time estimates
-
-(defun org-get-effort (&optional pom)
- "Get the effort estimate for the current entry."
- (org-entry-get pom org-effort-property))
-
;;; File search
(defvar org-create-file-search-functions nil
@@ -13374,15 +13386,7 @@ headlines matching this string."
(or (not todo-only)
(and (member todo org-not-done-keywords)
(or (not org-agenda-tags-todo-honor-ignore-options)
- (not (org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item)))))
-
- ;; Extra check for the archive tag
- ;; FIXME: Does the skipper already do this????
- (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))))
+ (not (org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item))))))
;; select this headline
(cond
@@ -14536,6 +14540,9 @@ When INCREMENT is non-nil, set the property to the next allowed value."
existing nil nil "" nil cur))))))
(unless (equal (org-entry-get nil prop) val)
(org-entry-put nil prop val))
+ (save-excursion
+ (org-back-to-heading t)
+ (put-text-property (point-at-bol) (point-at-eol) 'org-effort val))
(message "%s is now %s" prop val)))
(defun org-at-property-p ()
@@ -15283,7 +15290,8 @@ completion."
(interactive)
(unless (org-at-property-p)
(error "Not at a property"))
- (let* ((key (match-string 2))
+ (let* ((prop (car (save-match-data (org-split-string (match-string 1) ":"))))
+ (key (match-string 2))
(value (match-string 3))
(allowed (or (org-property-get-allowed-values (point) key)
(and (member value '("[ ]" "[-]" "[X]"))
@@ -15302,6 +15310,10 @@ completion."
(org-indent-line)
(beginning-of-line 1)
(skip-chars-forward " \t")
+ (when (equal prop org-effort-property)
+ (save-excursion
+ (org-back-to-heading t)
+ (put-text-property (point-at-bol) (point-at-eol) 'org-effort nval)))
(run-hook-with-args 'org-property-changed-functions key nval)))
(defun org-find-olp (path &optional this-buffer)
@@ -17362,6 +17374,8 @@ When a buffer is unmodified, it is just killed. When modified, it is saved
(widen)
(setq bmp (buffer-modified-p))
(org-refresh-category-properties)
+ (org-refresh-properties org-effort-property 'org-effort)
+ (org-refresh-properties "APPT_WARNTIME" 'org-appt-warntime)
(setq org-todo-keywords-for-agenda
(append org-todo-keywords-for-agenda org-todo-keywords-1))
(setq org-done-keywords-for-agenda
diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el
index ad067cb..2ce99ea 100644
--- a/testing/lisp/test-org-element.el
+++ b/testing/lisp/test-org-element.el
@@ -2260,8 +2260,8 @@ DEADLINE: <2012-01-01> SCHEDULED: <2012-01-01> CLOSED: [2012-01-01]\n"))))
:hour-start 16 :minute-start 40 :year-end 2012 :month-end 3
:day-end 29 :hour-end 16 :minute-end 41)) nil)))
;; Diary.
- (should (equal (org-test-parse-and-interpret "<%%(org-float t 4 2)>")
- "<%%(org-float t 4 2)>\n"))
+ (should (equal (org-test-parse-and-interpret "<%%diary-float t 4 2>")
+ "<%%diary-float t 4 2>\n"))
;; Timestamp with repeater interval.
(should (equal (org-test-parse-and-interpret "<2012-03-29 thu. +1y>")
"<2012-03-29 thu. +1y>\n"))