浏览代码

Merge branch 'master' of git+ssh://repo.or.cz/srv/git/org-mode

Bastien Guerry 17 年之前
父节点
当前提交
85820fa34f
共有 4 个文件被更改,包括 121 次插入61 次删除
  1. 17 0
      ChangeLog
  2. 7 3
      Makefile
  3. 31 45
      lisp/org-agenda.el
  4. 66 13
      lisp/org.el

+ 17 - 0
ChangeLog

@@ -1,3 +1,20 @@
+2008-03-28  Carsten Dominik  <dominik@science.uva.nl>
+
+	* lisp/org.el (org-auto-repeat-maybe): Make sure that repeating
+	dates are pushed into the future, and that the shift is at least
+	one interval, never 0.
+
+	* lisp/org-agenda.el (org-agenda-deadline-leaders): Allow a
+	function value for the deadline leader.
+	(org-agenda-get-deadlines): Deal with new function value.
+
+	* lisp/org.el (org-update-checkbox-count): Fix bug with checkbox
+	counting.
+	(org-add-note): New command.
+	(org-add-log-setup): Renamed from `org-add-log-maybe'.
+	(org-log-note-headings): New entry for plain notes (i.e. notes not
+	related to state changes or clocking).
+
 2008-03-27  Carsten Dominik  <dominik@science.uva.nl>
 
 	* org-agenda.el: New file, split out from org.el.

+ 7 - 3
Makefile

@@ -225,14 +225,18 @@ relup:
 	make upload_release
 	make upload_manual
 
-clean:
+cleanelc:
 	rm -f $(ELCFILES)
+cleandoc:
 	(cd doc; rm -f org.pdf org org.html orgcard.pdf orgcard.ps)
-	rm -f *~ */*~ */*/*~
 	(cd doc; rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.pg *.pgs)
 	(cd doc; rm -f *.toc *.tp *.tps *.vr *.vrs *.log *.html *.ps)
 	(cd doc; rm -f orgcard_letter.tex orgcard_letter.pdf)
-	rm -rf doc/manual
+	(cd doc; rm -rf manual)
+clean:
+	make cleanelc
+	make cleandoc
+	rm -f *~ */*~ */*/*~
 	rm -rf RELEASEDIR
 
 .el.elc:

+ 31 - 45
lisp/org-agenda.el

@@ -31,13 +31,13 @@
 
 ;;; Code:
 
+(require 'org)
 (eval-when-compile
-;  (require 'cl)
-;  (require 'gnus-sum)
   (require 'calendar))
 
 (declare-function add-to-diary-list "diary-lib"
                   (date string specifier &optional marker globcolor literal))
+(declare-function calendar-absolute-from-iso    "cal-iso"    (date))
 (declare-function calendar-astro-date-string    "cal-julian" (&optional date))
 (declare-function calendar-bahai-date-string    "cal-bahai"  (&optional date))
 (declare-function calendar-check-holidays       "holidays"   (date))
@@ -821,7 +821,9 @@ is (was)."
   :group 'org-agenda-line-format
   :type '(list
 	  (string :tag "Deadline today   ")
-	  (string :tag "Deadline relative")))
+	  (choice :tag "Deadline relative"
+		  (string :tag "Format string")
+		  (function))))
 
 (defcustom org-agenda-remove-times-when-in-prefix t
   "Non-nil means, remove duplicate time specifications in agenda items.
@@ -999,6 +1001,8 @@ The following commands are available:
 (org-defkey org-agenda-mode-map "w"        'org-agenda-week-view)
 (org-defkey org-agenda-mode-map "m"        'org-agenda-month-view)
 (org-defkey org-agenda-mode-map "y"        'org-agenda-year-view)
+(org-defkey org-agenda-mode-map "\C-c\C-z" 'org-agenda-add-note)
+(org-defkey org-agenda-mode-map "z"        'org-agenda-add-note)
 (org-defkey org-agenda-mode-map [(shift right)] 'org-agenda-date-later)
 (org-defkey org-agenda-mode-map [(shift left)] 'org-agenda-date-earlier)
 (org-defkey org-agenda-mode-map [?\C-c ?\C-x (right)] 'org-agenda-date-later)
@@ -1084,6 +1088,7 @@ The following commands are available:
     ["Cycle TODO" org-agenda-todo t]
     ["Archive subtree" org-agenda-archive t]
     ["Delete subtree" org-agenda-kill t]
+    ["Add note" org-agenda-add-note t]
     "--"
     ["Goto Today" org-agenda-goto-today (org-agenda-check-type nil 'agenda 'timeline)]
     ["Next Dates" org-agenda-later (org-agenda-check-type nil 'agenda)]
@@ -3237,8 +3242,10 @@ the documentation of `org-diary'."
 		      (setq txt (org-format-agenda-item
 				 (if (= diff 0)
 				     (car org-agenda-deadline-leaders)
-				   (format (nth 1 org-agenda-deadline-leaders)
-					   diff))
+				   (if (functionp (nth 1 org-agenda-deadline-leaders))
+				       (funcall (nth 1 org-agenda-deadline-leaders) diff date)
+				     (format (nth 1 org-agenda-deadline-leaders)
+					     diff)))
 				 head category tags timestr))))
 		(setq txt org-agenda-no-heading-message))
 	      (when txt
@@ -3396,46 +3403,6 @@ FRACTION is what fraction of the head-warning time has passed."
 
 ;;; Agenda presentation and sorting
 
-(defconst org-plain-time-of-day-regexp
-  (concat
-   "\\(\\<[012]?[0-9]"
-   "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
-   "\\(--?"
-   "\\(\\<[012]?[0-9]"
-   "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
-   "\\)?")
-  "Regular expression to match a plain time or time range.
-Examples:  11:45 or 8am-13:15 or 2:45-2:45pm.  After a match, the following
-groups carry important information:
-0  the full match
-1  the first time, range or not
-8  the second time, if it is a range.")
-
-(defconst org-plain-time-extension-regexp
-  (concat
-   "\\(\\<[012]?[0-9]"
-   "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
-   "\\+\\([0-9]+\\)\\(:\\([0-5][0-9]\\)\\)?")
-  "Regular expression to match a time range like 13:30+2:10 = 13:30-15:40.
-Examples:  11:45 or 8am-13:15 or 2:45-2:45pm.  After a match, the following
-groups carry important information:
-0  the full match
-7  hours of duration
-9  minutes of duration")
-
-(defconst org-stamp-time-of-day-regexp
-  (concat
-   "<\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} +\\sw+ +\\)"
-   "\\([012][0-9]:[0-5][0-9]\\(-\\([012][0-9]:[0-5][0-9]\\)\\)?[^\n\r>]*?\\)>"
-   "\\(--?"
-   "<\\1\\([012][0-9]:[0-5][0-9]\\)>\\)?")
-  "Regular expression to match a timestamp time or time range.
-After a match, the following groups carry important information:
-0  the full match
-1  date plus weekday, for backreferencing to make sure both times on same day
-2  the first time, range or not
-4  the second time, if it is a range.")
-
 (defvar org-prefix-has-time nil
   "A flag, set by `org-compile-prefix-format'.
 The flag is set if the currently compiled format contains a `%t'.")
@@ -4433,6 +4400,25 @@ the same tree node, and the headline of the tree node in the Org-mode file."
 	(org-agenda-change-all-lines newhead hdmarker 'fixface))
       (move-to-column col))))
 
+(defun org-agenda-add-note (&optional arg)
+  "Add a time-stamped note to the entry at point."
+  (interactive "P")
+  (org-agenda-check-no-diary)
+  (let* ((marker (or (get-text-property (point) 'org-marker)
+		     (org-agenda-error)))
+	 (buffer (marker-buffer marker))
+	 (pos (marker-position marker))
+	 (hdmarker (get-text-property (point) 'org-hd-marker))
+	 (inhibit-read-only t))
+    (with-current-buffer buffer
+      (widen)
+      (goto-char pos)
+      (org-show-context 'agenda)
+      (save-excursion
+	(and (outline-next-heading)
+	     (org-flag-heading nil)))   ; show the next heading
+      (org-add-note))))
+
 (defun org-agenda-change-all-lines (newhead hdmarker &optional fixface)
   "Change all lines in the agenda buffer which match HDMARKER.
 The new content of the line will be NEWHEAD (as modified by

+ 66 - 13
lisp/org.el

@@ -1530,10 +1530,11 @@ When nil, only the date will be recorded."
   :type 'boolean)
 
 (defcustom org-log-note-headings
-  '((done . "CLOSING NOTE %t")
+  '((done .  "CLOSING NOTE %t")
     (state . "State %-12s %t")
+    (note .  "Note taken on %t")
     (clock-out . ""))
-  "Headings for notes added when clocking out or closing TODO items.
+  "Headings for notes added to entries.
 The value is an alist, with the car being a symbol indicating the note
 context, and the cdr is the heading to be used.  The heading may also be the
 empty string.
@@ -1548,8 +1549,12 @@ empty string.
 	  (cons (const :tag
 		       "Heading when changing todo state (todo sequence only)"
 		       state) string)
+	  (cons (const :tag "Heading when just taking a note" note) string)
 	  (cons (const :tag "Heading when clocking out" clock-out) string)))
 
+(unless (assq 'note org-log-note-headings)
+  (push '(note . "%t") org-log-note-headings))
+
 (defcustom org-log-states-order-reversed t
   "Non-nil means, the latest state change note will be directly after heading.
 When nil, the notes will be orderer according to time."
@@ -2914,6 +2919,46 @@ Also put tags into group 4 if tags are present.")
   "Matches a line with planning or clock info.")
 (make-variable-buffer-local 'org-planning-or-clock-line-re)
 
+(defconst org-plain-time-of-day-regexp
+  (concat
+   "\\(\\<[012]?[0-9]"
+   "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
+   "\\(--?"
+   "\\(\\<[012]?[0-9]"
+   "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
+   "\\)?")
+  "Regular expression to match a plain time or time range.
+Examples:  11:45 or 8am-13:15 or 2:45-2:45pm.  After a match, the following
+groups carry important information:
+0  the full match
+1  the first time, range or not
+8  the second time, if it is a range.")
+
+(defconst org-plain-time-extension-regexp
+  (concat
+   "\\(\\<[012]?[0-9]"
+   "\\(\\(:\\([0-5][0-9]\\([AaPp][Mm]\\)?\\)\\)\\|\\([AaPp][Mm]\\)\\)\\>\\)"
+   "\\+\\([0-9]+\\)\\(:\\([0-5][0-9]\\)\\)?")
+  "Regular expression to match a time range like 13:30+2:10 = 13:30-15:40.
+Examples:  11:45 or 8am-13:15 or 2:45-2:45pm.  After a match, the following
+groups carry important information:
+0  the full match
+7  hours of duration
+9  minutes of duration")
+
+(defconst org-stamp-time-of-day-regexp
+  (concat
+   "<\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} +\\sw+ +\\)"
+   "\\([012][0-9]:[0-5][0-9]\\(-\\([012][0-9]:[0-5][0-9]\\)\\)?[^\n\r>]*?\\)>"
+   "\\(--?"
+   "<\\1\\([012][0-9]:[0-5][0-9]\\)>\\)?")
+  "Regular expression to match a timestamp time or time range.
+After a match, the following groups carry important information:
+0  the full match
+1  date plus weekday, for backreferencing to make sure both times on same day
+2  the first time, range or not
+4  the second time, if it is a range.")
+
 (defconst org-startup-options
   '(("fold" org-startup-folded t)
     ("overview" org-startup-folded t)
@@ -5512,7 +5557,7 @@ the whole buffer."
                (org-beginning-of-item)
                (setq curr-ind (org-get-indentation))
                (setq next-ind curr-ind)
-               (while (= curr-ind next-ind)
+               (while (and (org-at-item-p) (= curr-ind next-ind))
                  (save-excursion (end-of-line) (setq eline (point)))
                  (if (re-search-forward re-box eline t)
 		     (if (member (match-string 2) '("[ ]" "[-]"))
@@ -8450,10 +8495,10 @@ For calling through lisp, arg is also interpreted in the following way:
 	    ;; It is now done, and it was not done before
 	    (org-add-planning-info 'closed (org-current-time))
 	    (if (and (not dolog) (eq 'note org-log-done))
-		(org-add-log-maybe 'done state 'findpos 'note)))
+		(org-add-log-setup 'done state 'findpos 'note)))
 	  (when (and state dolog)
 	    ;; This is a non-nil state, and we need to log it
-	    (org-add-log-maybe 'state state 'findpos dolog)))
+	    (org-add-log-setup 'state state 'findpos dolog)))
 	;; Fixup tag positioning
 	(and org-auto-align-tags (not org-setting-tags) (org-set-tags nil t))
 	(run-hooks 'org-after-todo-state-change-hook)
@@ -8634,7 +8679,7 @@ This function is run automatically after each state change to a DONE state."
 				(default-value 'post-command-hook)))
 		     (eq org-log-note-purpose 'done)))
 	;; Make sure a note is taken;
-	(org-add-log-maybe 'state (or done-word (car org-done-keywords))
+	(org-add-log-setup 'state (or done-word (car org-done-keywords))
 			   'findpos org-log-repeat))
       (org-back-to-heading t)
       (org-add-planning-info nil nil 'closed)
@@ -8661,12 +8706,12 @@ This function is run automatically after each state change to a DONE state."
 	       (- (time-to-days (current-time)) (time-to-days time))
 	       'day))
 	     ((equal (match-string 1 ts) "+")
-	      (while (< (time-to-days time) (time-to-days (current-time)))
+	      (while (or (= nshift 0)
+			 (<= (time-to-days time) (time-to-days (current-time))))
 		(when (= (incf nshift) nshiftmax)
 		  (or (y-or-n-p (message "%d repeater intervals were not enough to shift date past today.  Continue? " nshift))
 		      (error "Abort")))
 		(org-timestamp-change n (cdr (assoc what whata)))
-		(sit-for .0001) ;; so we can watch the date shifting
 		(org-at-timestamp-p t)
 		(setq ts (match-string 1))
 		(setq time (save-match-data (org-time-string-to-time ts))))
@@ -8835,7 +8880,13 @@ be removed."
   "Message to be displayed after a log note has been stored.
 The auto-repeater uses this.")
 
-(defun org-add-log-maybe (&optional purpose state findpos how)
+(defun org-add-note ()
+  "Add a note to the current entry.
+This is done in the same way as adding a state change note."
+  (interactive)
+  (org-add-log-setup 'note nil t nil))
+
+(defun org-add-log-setup (&optional purpose state findpos how)
   "Set up the post command hook to take a note.
 If this is about to TODO state change, the new state is expected in STATE.
 When FINDPOS is non-nil, find the correct position for the note in
@@ -8885,7 +8936,9 @@ the current entry.  If not, assume that it can be inserted at point."
 		     ((eq org-log-note-purpose 'done)  "closed todo item")
 		     ((eq org-log-note-purpose 'state)
 		      (format "state change to \"%s\"" org-log-note-state))
-		   (t (error "This should not happen")))))
+		     ((eq org-log-note-purpose 'note)
+		      "this entry")
+		     (t (error "This should not happen")))))
     (org-set-local 'org-finish-function 'org-store-log-note)))
 
 (defvar org-note-abort nil) ; dynamically scoped
@@ -12399,7 +12452,7 @@ in the timestamp determines what will be changed."
       (setq time0 (org-parse-time-string ts))
       (when (and (eq org-ts-what 'minute)
 		 (eq current-prefix-arg nil))
-	(setq n (* dm (org-no-warnings (signum n))))
+	(setq n (* dm (cond ((> n 0) 1) ((< n 0) -1) (t 0))))
 	(when (not (= 0 (setq rem (% (nth 1 time0) dm))))
 	  (setcar (cdr time0) (+ (nth 1 time0)
 				 (if (> n 0) (- rem) (- dm rem))))))
@@ -12662,7 +12715,7 @@ If there is no running clock, throw an error, unless FAIL-QUIETLY is set."
       (insert " => " (format "%2d:%02d" h m))
       (move-marker org-clock-marker nil)
       (when org-log-note-clock-out
-	(org-add-log-maybe 'clock-out))
+	(org-add-log-setup 'clock-out))
       (when org-mode-line-timer
 	(cancel-timer org-mode-line-timer)
 	(setq org-mode-line-timer nil))
@@ -13771,7 +13824,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
 (org-defkey org-mode-map "\C-c\C-o" 'org-open-at-point)
 (org-defkey org-mode-map "\C-c%"    'org-mark-ring-push)
 (org-defkey org-mode-map "\C-c&"    'org-mark-ring-goto)
-(org-defkey org-mode-map "\C-c\C-z" 'org-time-stamp)  ; Alternative binding
+(org-defkey org-mode-map "\C-c\C-z" 'org-add-note)  ; Alternative binding
 (org-defkey org-mode-map "\C-c."    'org-time-stamp)  ; Minor-mode reserved
 (org-defkey org-mode-map "\C-c!"    'org-time-stamp-inactive) ; Minor-mode r.
 (org-defkey org-mode-map "\C-c,"    'org-priority)    ; Minor-mode reserved