Index: emacs/lisp/textmodes/org.el diff -c emacs/lisp/textmodes/org.el:1.17 emacs/lisp/textmodes/org.el:1.18 *** emacs/lisp/textmodes/org.el:1.17 Thu May 5 20:10:34 2005 --- emacs/lisp/textmodes/org.el Fri May 20 11:24:48 2005 *************** *** 5,11 **** ;; Author: Carsten Dominik <dominik at science dot uva dot nl> ;; Keywords: outlines, hypermedia, calendar ;; Homepage: http://www.astro.uva.nl/~dominik/Tools/org/ ! ;; Version: 3.08 ;; ;; This file is part of GNU Emacs. ;; --- 5,11 ---- ;; Author: Carsten Dominik <dominik at science dot uva dot nl> ;; Keywords: outlines, hypermedia, calendar ;; Homepage: http://www.astro.uva.nl/~dominik/Tools/org/ ! ;; Version: 3.09 ;; ;; This file is part of GNU Emacs. ;; *************** *** 31,57 **** ;; project planning with a fast and effective plain-text system. ;; ;; Org-mode develops organizational tasks around a NOTES file that contains ! ;; information about projects as plain text. Org-mode is implemented on ! ;; top of outline-mode - ideal to keep the content of large files well ! ;; structured. It supports ToDo items, deadlines and time stamps, which ! ;; magically appear in the diary listing of the Emacs calendar. Tables are ! ;; easily created with a built-in table editor. Plain text URL-like links ! ;; connect to websites, emails (VM,RMAIL,WANDERLUST), Usenet messages (Gnus), ! ;; BBDB entries, and any files related to the projects. For printing and ! ;; sharing of notes, an Org-mode file (or a part of it) can be exported as ! ;; a structured ASCII file, or as HTML. ;; ;; Installation ;; ------------ ! ;; The instruction below assume that you have downloaded Org-mode from the ! ;; web. If Org-mode is part of the Emacs distribution or an XEmacs package, ! ;; you only need to add to .emacs the last three lines of Lisp code listed ! ;; below, i.e. the `auto-mode-alist' modification and the global key bindings. ;; ! ;; Byte-compile org.el and put it on your load path. Then copy the ! ;; following lines into .emacs. The last two lines define *global* ! ;; keys for the commands `org-store-link' and `org-agenda' - please ! ;; choose suitable keys yourself. ;; ;; (autoload 'org-mode "org" "Org mode" t) ;; (autoload 'org-diary "org" "Diary entries from Org mode") --- 31,60 ---- ;; project planning with a fast and effective plain-text system. ;; ;; Org-mode develops organizational tasks around a NOTES file that contains ! ;; information about projects as plain text. Org-mode is implemented on top ! ;; of outline-mode - ideal to keep the content of large files well structured. ! ;; It supports ToDo items, deadlines and time stamps, which can be extracted ! ;; to create a daily/weekly agenda that also integrates the diary of the Emacs ! ;; calendar. Tables are easily created with a built-in table editor. Plain ! ;; text URL-like links connect to websites, emails (VM, RMAIL, WANDERLUST), ! ;; Usenet messages (Gnus), BBDB entries, and any files related to the ! ;; projects. For printing and sharing of notes, an Org-mode file (or a part ! ;; of it) can be exported as a structured ASCII file, or as HTML. ;; ;; Installation ;; ------------ ! ;; If Org-mode is part of the Emacs distribution or an XEmacs package, you ! ;; only need to copy the following lines to your .emacs file. The last two ! ;; lines define *global* keys for the commands `org-store-link' and ! ;; `org-agenda' - please choose suitable keys yourself. ;; ! ;; (add-to-list 'auto-mode-alist '("\\.org$" . org-mode)) ! ;; (define-key global-map "\C-cl" 'org-store-link) ! ;; (define-key global-map "\C-ca" 'org-agenda) ! ;; ! ;; If you have downloaded Org-mode from the Web, you must byte-compile ! ;; org.el and put it on your load path. In addition to the Emacs Lisp ! ;; lines above, you also need to add the following lines to .emacs: ;; ;; (autoload 'org-mode "org" "Org mode" t) ;; (autoload 'org-diary "org" "Diary entries from Org mode") *************** *** 59,70 **** ;; (autoload 'org-store-link "org" "Store a link to the current location" t) ;; (autoload 'orgtbl-mode "org" "Org tables as a minor mode" t) ;; (autoload 'turn-on-orgtbl "org" "Org tables as a minor mode") - ;; (add-to-list 'auto-mode-alist '("\\.org$" . org-mode)) - ;; (define-key global-map "\C-cl" 'org-store-link) - ;; (define-key global-map "\C-ca" 'org-agenda) ;; ! ;; This will put all files with extension ".org" into Org-mode. As an ! ;; alternative, make the first line of a file look like this: ;; ;; MY PROJECTS -*- mode: org; -*- ;; --- 62,70 ---- ;; (autoload 'org-store-link "org" "Store a link to the current location" t) ;; (autoload 'orgtbl-mode "org" "Org tables as a minor mode" t) ;; (autoload 'turn-on-orgtbl "org" "Org tables as a minor mode") ;; ! ;; This setup will put all files with extension ".org" into Org-mode. As ! ;; an alternative, make the first line of a file look like this: ;; ;; MY PROJECTS -*- mode: org; -*- ;; *************** *** 73,84 **** ;; ;; Documentation ;; ------------- ! ;; The documentation of Org-mode can be found in the TeXInfo file. ! ;; The distribution also contains a PDF version of it. At the homepage ! ;; of Org-mode, you can read the same text online as HTML. ;; ;; Changes: ;; ------- ;; Version 3.08 ;; - "|" no longer allowed as part of a link, to allow links in tables. ;; - The prefix of items in the agenda buffer can be configured. --- 73,90 ---- ;; ;; Documentation ;; ------------- ! ;; The documentation of Org-mode can be found in the TeXInfo file. The ! ;; distribution also contains a PDF version of it. At the homepage of ! ;; Org-mode, you can read the same text online as HTML. There is also an ! ;; excellent reference card made by Philip Rooke. ;; ;; Changes: ;; ------- + ;; Version 3.09 + ;; - Time-of-day specifications in agenda are extracted and placed + ;; into the prefix. Timed entries can be placed into a time grid for + ;; day. + ;; ;; Version 3.08 ;; - "|" no longer allowed as part of a link, to allow links in tables. ;; - The prefix of items in the agenda buffer can be configured. *************** *** 136,142 **** ;; warnings about upcoming deadlines/overdue scheduled items. ;; That functionality is now limited to the (multifile) agenda. ;; - When reading a date, the calendar can be manipulated with keys. ! ;; - Link support for RMAIL and Wanderlust (from planner.el, untested) ;; - Minor bug fixes and documentation improvements. ;;; Code: --- 142,148 ---- ;; warnings about upcoming deadlines/overdue scheduled items. ;; That functionality is now limited to the (multifile) agenda. ;; - When reading a date, the calendar can be manipulated with keys. ! ;; - Link support for RMAIL and Wanderlust (from planner.el, untested). ;; - Minor bug fixes and documentation improvements. ;;; Code: *************** *** 148,163 **** ;;; Customization variables ! (defvar org-version "3.08" "The version number of the file org.el.") (defun org-version () (interactive) (message "Org-mode version %s" org-version)) ! ;; The following two constants are for compatibility with different ! ;; Emacs versions (Emacs versus XEmacs) and with different versions of ! ;; outline.el. All the compatibility code in org.el is based on these two ! ;; constants. (defconst org-xemacs-p (featurep 'xemacs) "Are we running xemacs?") (defconst org-noutline-p (featurep 'noutline) --- 154,168 ---- ;;; Customization variables ! (defvar org-version "3.09" "The version number of the file org.el.") (defun org-version () (interactive) (message "Org-mode version %s" org-version)) ! ;; The following two constants are for compatibility with different Emacs ! ;; versions (Emacs versus XEmacs) and with different versions of outline.el. ! ;; The compatibility code in org.el is based on these two constants. (defconst org-xemacs-p (featurep 'xemacs) "Are we running xemacs?") (defconst org-noutline-p (featurep 'noutline) *************** *** 570,576 **** the sequence given in `org-agenda-files'. Within each category sort by priority. ! Leaving out the `category-keep' would mean that items will be sorted across categories by priority." :group 'org-agenda :type '(repeat --- 575,581 ---- the sequence given in `org-agenda-files'. Within each category sort by priority. ! Leaving out `category-keep' would mean that items will be sorted across categories by priority." :group 'org-agenda :type '(repeat *************** *** 583,589 **** (const priority-up) (const priority-down)))) ! (defcustom org-agenda-prefix-format " %-12:c% s" "Format specification for the prefix of items in the agenda buffer. This format works similar to a printf format, with the following meaning: --- 588,594 ---- (const priority-up) (const priority-down)))) ! (defcustom org-agenda-prefix-format " %-12:c%?-12t% s" "Format specification for the prefix of items in the agenda buffer. This format works similar to a printf format, with the following meaning: *************** *** 593,614 **** format HH:MM %s Scheduling/Deadline information, a short string ! In addition to the normal printf field modifiers like field width and ! padding instructions, in this format you can also add an additional ! punctuation or whitespace character just before the final format letter. ! This character will be appended to the field value if the value is not ! empty. For example, the format \"%-12:c\" leads to \"Diary: \" if ! the category is \"Diary\". If the category were be empty, no additional ! colon would be interted. ! ! Including `%t' in the format string leads to a double time specification ! because the headline/diary item will contain the time specification as ! well. However, using `%t' in the format will result in a canonical 24 ! hour time specification at a consistent position in the prefix, while the ! time specification in the headline/diary item may be at any position and in ! various formats. ! Example: ! (setq org-agenda-prefix-format \" %-12:c% t% s\")" :type 'string :group 'org-agenda) --- 598,636 ---- format HH:MM %s Scheduling/Deadline information, a short string ! All specifiers work basically like the standard `%s' of printf, but may ! contain two additional characters: A question mark just after the `%' and ! a whitespace/punctuation character just before the final letter. ! ! If the first character after `%' is a question mark, the entire field ! will only be included if the corresponding value applies to the ! current entry. This is useful for fields which should have fixed ! width when present, but zero width when absent. For example, ! \"%?-12t\" will result in a 12 character time field if a time of the ! day is specified, but will completely disappear in entries which do ! not contain a time. ! ! If there is punctuation or whitespace character just before the final ! format letter, this character will be appended to the field value if ! the value is not empty. For example, the format \"%-12:c\" leads to ! \"Diary: \" if the category is \"Diary\". If the category were be ! empty, no additional colon would be interted. ! ! The default value of this option is \" %-12:c%?-12t% s\", meaning: ! - Indent the line with two space characters ! - Give the category in a 12 chars wide field, padded with whitespace on ! the right (because of `-'). Append a colon if there is a category ! (because of `:'). ! - If there is a time-of-day, put it into a 12 chars wide field. If no ! time, don't put in an empty field, just skip it (because of '?'). ! - Finally, put the scheduling information and append a whitespace. ! ! As another example, if you don't want the time-of-day of entries in ! the prefix, you could use: ! ! (setq org-agenda-prefix-format \" %-11:c% s\") ! ! See also the variable `org-agenda-remove-times-when-in-prefix'." :type 'string :group 'org-agenda) *************** *** 618,630 **** :group 'org-agenda) (defvar org-prefix-format-compiled nil ! "The compiled version of `org-???-prefix-format'.") (defcustom org-sort-agenda-notime-is-late t "Non-nil means, items without time are considered late. This is only relevant for sorting. When t, items which have no explicit time like 15:30 will be considered as 24:01, i.e. later than any items which ! do have a time. When nil, the default time is before 0:00." :group 'org-agenda :type 'boolean) --- 640,703 ---- :group 'org-agenda) (defvar org-prefix-format-compiled nil ! "The compiled version of the most recently used prefix format. ! Depending on which command was used last, this may be the compiled version ! of `org-agenda-prefix-format' or `org-timeline-prefix-format'.") ! ! (defcustom org-agenda-use-time-grid t ! "Non-nil means, show a time grid in the agenda schedule. ! A time grid is a set of lines for specific times (like every two hours between ! 8:00 and 20:00. The items scheduled for a day at specific times are ! sorted in between these lines. ! For deails about when the grid will be shown, and what it will look like, see ! the variable `org-agenda-time-grid'." ! :group 'org-agenda ! :type 'boolean) ! ! (defcustom org-agenda-time-grid ! '((daily today require-timed) ! "----------------" ! (800 1000 1200 1400 1600 1800 2000)) ! ! "FIXME: document" ! :group 'org-agenda ! :type ! '(list ! (set :greedy t :tag "Grid Display Options" ! (const :tag "Show grid in single day agenda display" daily) ! (const :tag "Show grid in weekly agenda display" weekly) ! (const :tag "Always show grid for today" today) ! (const :tag "Show grid only if any timed entries are present" ! require-timed) ! (const :tag "Skip grid times already present in an entry" ! remove-match)) ! (string :tag "Grid String") ! (repeat :tag "Grid Times" (integer :tag "Time")))) ! ! (defcustom org-agenda-remove-times-when-in-prefix t ! "Non-nil means, remove duplicate time specifications in agenda items. ! When the format `org-agenda-prefix-format' contains a `%t' specifier, a ! time-of-day specification in a headline or diary entry is extracted and ! placed into the prefix. If this option is non-nil, the original specification ! \(a timestamp or -range, or just a plain time(range) specification like ! 11:30-4pm) will be removed for agenda display. This makes the agenda less ! cluttered. ! The option can be t or nil. It may also be the symbol `beg', indicating ! that the time should only be removed what it is located at the beginning of ! the headline/diary entry." ! :group 'org-agenda ! :type '(choice ! (const :tag "Always" t) ! (const :tag "Never" nil) ! (const :tag "When at beginning of entry" beg))) (defcustom org-sort-agenda-notime-is-late t "Non-nil means, items without time are considered late. This is only relevant for sorting. When t, items which have no explicit time like 15:30 will be considered as 24:01, i.e. later than any items which ! do have a time. When nil, the default time is before 0:00. You can use this ! option to decide if the schedule for today should come before or after timeless ! agenda entries." :group 'org-agenda :type 'boolean) *************** *** 1370,1375 **** --- 1443,1456 ---- "Face used for tables." :group 'org-faces) + (defface org-time-grid-face ;; font-lock-variable-name-face + '((((type tty) (class color)) (:foreground "yellow" :weight light)) + (((class color) (background light)) (:foreground "DarkGoldenrod")) + (((class color) (background dark)) (:foreground "LightGoldenrod")) + (t (:bold t :italic t))) + "Face used for level 2 headlines." + :group 'org-faces) + (defvar org-level-faces '( org-level-1-face *************** *** 1496,1502 **** (save-excursion (goto-char (point-min)) (insert " -*- mode: org -*-\n\n"))) ! (run-hooks 'org-mode-hook) ;FIXME: Should be run-mode-hooks. (unless org-inhibit-startup (if org-startup-with-deadline-check (call-interactively 'org-check-deadlines) --- 1577,1583 ---- (save-excursion (goto-char (point-min)) (insert " -*- mode: org -*-\n\n"))) ! (run-hooks 'org-mode-hook) (unless org-inhibit-startup (if org-startup-with-deadline-check (call-interactively 'org-check-deadlines) *************** *** 1565,1571 **** (save-excursion (org-back-to-heading t) (- (match-end 0) (match-beginning 0)))) ! (defvar org-font-lock-keywords nil) (defun org-set-font-lock-defaults () --- 1646,1652 ---- (save-excursion (org-back-to-heading t) (- (match-end 0) (match-beginning 0)))) ! (defvar org-font-lock-keywords nil) (defun org-set-font-lock-defaults () *************** *** 2844,2856 **** (defun org-time-string-to-time (s) (apply 'encode-time (org-parse-time-string s))) ! (defun org-parse-time-string (s) "Parse the standard Org-mode time string. ! This should be a lot faster than the normal `parse-time-string'." (if (string-match org-ts-regexp1 s) (list 0 ! (string-to-number (or (match-string 8 s) "0")) ! (string-to-number (or (match-string 7 s) "0")) (string-to-number (match-string 4 s)) (string-to-number (match-string 3 s)) (string-to-number (match-string 2 s)) --- 2925,2941 ---- (defun org-time-string-to-time (s) (apply 'encode-time (org-parse-time-string s))) ! (defun org-parse-time-string (s &optional nodefault) "Parse the standard Org-mode time string. ! This should be a lot faster than the normal `parse-time-string'. ! If time is not given, defaults to 0:00. However, with optional NODEFAULT, ! hour and minute fields will be nil if not given." (if (string-match org-ts-regexp1 s) (list 0 ! (if (or (match-beginning 8) (not nodefault)) ! (string-to-number (or (match-string 8 s) "0"))) ! (if (or (match-beginning 7) (not nodefault)) ! (string-to-number (or (match-string 7 s) "0"))) (string-to-number (match-string 4 s)) (string-to-number (match-string 3 s)) (string-to-number (match-string 2 s)) *************** *** 3056,3061 **** --- 3141,3147 ---- (define-key org-agenda-mode-map "f" 'org-agenda-follow-mode) (define-key org-agenda-mode-map "d" 'org-agenda-toggle-diary) + (define-key org-agenda-mode-map "g" 'org-agenda-toggle-time-grid) (define-key org-agenda-mode-map "r" 'org-agenda-redo) (define-key org-agenda-mode-map "q" 'org-agenda-quit) (define-key org-agenda-mode-map "x" 'org-agenda-exit) *************** *** 3115,3121 **** ["Decrease Priority" org-agenda-priority-down t] ["Show Priority" org-agenda-show-priority t]) "--" ! ["Rebuild" org-agenda-redo t] ["Goto Today" org-agenda-goto-today t] ["Next Dates" org-agenda-later (local-variable-p 'starting-day)] ["Previous Dates" org-agenda-earlier (local-variable-p 'starting-day)] --- 3201,3207 ---- ["Decrease Priority" org-agenda-priority-down t] ["Show Priority" org-agenda-show-priority t]) "--" ! ["Rebuild buffer" org-agenda-redo t] ["Goto Today" org-agenda-goto-today t] ["Next Dates" org-agenda-later (local-variable-p 'starting-day)] ["Previous Dates" org-agenda-earlier (local-variable-p 'starting-day)] *************** *** 3124,3129 **** --- 3210,3217 ---- (local-variable-p 'starting-day)] ["Include Diary" org-agenda-toggle-diary :style toggle :selected org-agenda-include-diary :active t] + ["Use Time Grid" org-agenda-toggle-time-grid + :style toggle :selected org-agenda-use-time-grid :active t] "--" ["New Diary Entry" org-agenda-diary-entry t] ("Calendar Commands" *************** *** 3294,3304 **** (d (- nt n1))) (- sd (+ (if (< d 0) 7 0) d))))) (day-numbers (list start)) ! s e rtn rtnall file date d start-pos end-pos) (setq org-agenda-redo-command (list 'org-agenda include-all start-day ndays)) ;; Make the list of days ! (setq ndays (or ndays org-agenda-ndays)) (while (> ndays 1) (push (1+ (car day-numbers)) day-numbers) (setq ndays (1- ndays))) --- 3382,3394 ---- (d (- nt n1))) (- sd (+ (if (< d 0) 7 0) d))))) (day-numbers (list start)) ! (inhibit-redisplay t) ! s e rtn rtnall file date d start-pos end-pos todayp nd) (setq org-agenda-redo-command (list 'org-agenda include-all start-day ndays)) ;; Make the list of days ! (setq ndays (or ndays org-agenda-ndays) ! nd ndays) (while (> ndays 1) (push (1+ (car day-numbers)) day-numbers) (setq ndays (1- ndays))) *************** *** 3324,3334 **** rtn (org-agenda-get-day-entries file date :todo)) (setq rtnall (append rtnall rtn)))) ! (if rtnall (insert (org-finalize-agenda-entries rtnall) "\n"))) (while (setq d (pop day-numbers)) (setq date (calendar-gregorian-from-absolute d) s (point)) ! (if (or (= d today) (and (not start-pos) (= d sd))) (setq start-pos (point)) (if (and start-pos (not end-pos)) --- 3414,3428 ---- rtn (org-agenda-get-day-entries file date :todo)) (setq rtnall (append rtnall rtn)))) ! (when rtnall ! (insert "ALL CURRENTLY OPEN TODO ITEMS:\n") ! (add-text-properties (point-min) (1- (point)) ! (list 'face 'org-link-face)) ! (insert (org-finalize-agenda-entries rtnall) "\n"))) (while (setq d (pop day-numbers)) (setq date (calendar-gregorian-from-absolute d) s (point)) ! (if (or (setq todayp (= d today)) (and (not start-pos) (= d sd))) (setq start-pos (point)) (if (and start-pos (not end-pos)) *************** *** 3347,3360 **** (setq rtnall (append rtnall rtn)))) (if (or rtnall org-agenda-show-all-dates) (progn ! (insert (format "%-9s %2d %-9s %4d\n" (calendar-day-name date) (extract-calendar-day date) (calendar-month-name (extract-calendar-month date)) (extract-calendar-year date))) (put-text-property s (1- (point)) 'face 'org-link-face) ! (if rtnall (insert (org-finalize-agenda-entries rtnall) "\n")) (put-text-property s (1- (point)) 'day d)))) (goto-char (point-min)) (setq buffer-read-only t) --- 3441,3458 ---- (setq rtnall (append rtnall rtn)))) (if (or rtnall org-agenda-show-all-dates) (progn ! (insert (format "%-9s %2d %s %4d\n" (calendar-day-name date) (extract-calendar-day date) (calendar-month-name (extract-calendar-month date)) (extract-calendar-year date))) (put-text-property s (1- (point)) 'face 'org-link-face) ! (if rtnall (insert ! (org-finalize-agenda-entries ;; FIXME: condition needed ! (org-agenda-add-time-grid-maybe ! rtnall nd todayp)) ! "\n")) (put-text-property s (1- (point)) 'day d)))) (goto-char (point-min)) (setq buffer-read-only t) *************** *** 3502,3507 **** --- 3600,3614 ---- (message "Diary inclusion turned %s" (if org-agenda-include-diary "on" "off"))) + (defun org-agenda-toggle-time-grid () + "Toggle follow mode in an agenda buffer." + (interactive) + (setq org-agenda-use-time-grid (not org-agenda-use-time-grid)) + (org-agenda-redo) + (org-agenda-set-mode-name) + (message "Time-grid turned %s" + (if org-agenda-use-time-grid "on" "off"))) + (defun org-agenda-set-mode-name () "Set the mode name to indicate all the small mode settings." (setq mode-name *************** *** 3509,3515 **** (if (equal org-agenda-ndays 1) " Day" "") (if (equal org-agenda-ndays 7) " Week" "") (if org-agenda-follow-mode " Follow" "") ! (if org-agenda-include-diary " Diary" ""))) (force-mode-line-update)) (defun org-agenda-post-command-hook () --- 3616,3623 ---- (if (equal org-agenda-ndays 1) " Day" "") (if (equal org-agenda-ndays 7) " Week" "") (if org-agenda-follow-mode " Follow" "") ! (if org-agenda-include-diary " Diary" "") ! (if org-agenda-use-time-grid " Grid" ""))) (force-mode-line-update)) (defun org-agenda-post-command-hook () *************** *** 3524,3530 **** "Get the (Emacs Calendar) diary entries for DATE." (let* ((fancy-diary-buffer "*temporary-fancy-diary-buffer*") (diary-display-hook '(fancy-diary-display)) ! (list-diary-entries-hook (cons 'org-diary-default-entry list-diary-entries-hook)) entries (org-disable-diary t)) --- 3632,3638 ---- "Get the (Emacs Calendar) diary entries for DATE." (let* ((fancy-diary-buffer "*temporary-fancy-diary-buffer*") (diary-display-hook '(fancy-diary-display)) ! (list-diary-entries-hook (cons 'org-diary-default-entry list-diary-entries-hook)) entries (org-disable-diary t)) *************** *** 3551,3557 **** (setq entries (mapcar (lambda (x) ! (setq x (org-format-agenda-item "" x "Diary")) ;; Extend the text properties to the beginning of the line (add-text-properties 0 (length x) --- 3659,3665 ---- (setq entries (mapcar (lambda (x) ! (setq x (org-format-agenda-item "" x "Diary" 'time)) ;; Extend the text properties to the beginning of the line (add-text-properties 0 (length x) *************** *** 3764,3770 **** arg results rtn) (if (not buffer) ;; If file does not exist, make sure an error message ends up in diary ! (format "ORG-AGENDA-ERROR: No such org-file %s" file) (with-current-buffer buffer (unless (eq major-mode 'org-mode) (error "Agenda file %s is not in `org-mode'" file)) --- 3872,3878 ---- arg results rtn) (if (not buffer) ;; If file does not exist, make sure an error message ends up in diary ! (list (format "ORG-AGENDA-ERROR: No such org-file %s" file)) (with-current-buffer buffer (unless (eq major-mode 'org-mode) (error "Agenda file %s is not in `org-mode'" file)) *************** *** 3796,3803 **** ((and (eq arg :deadline) (equal date (calendar-current-date))) (setq rtn (org-agenda-get-deadlines)) ! (setq results (append results rtn)))))))))) ! results)) (defun org-entry-is-done-p () "Is the current entry marked DONE?" --- 3904,3911 ---- ((and (eq arg :deadline) (equal date (calendar-current-date))) (setq rtn (org-agenda-get-deadlines)) ! (setq results (append results rtn)))))))) ! results)))) (defun org-entry-is-done-p () "Is the current entry marked DONE?" *************** *** 3876,3882 **** (list 0 0 0 (nth 1 date) (car date) (nth 2 date)))) 0 11))) marker hdmarker deadlinep scheduledp donep tmp priority ! ee txt) (goto-char (point-min)) (while (re-search-forward regexp nil t) (if (not (save-match-data (org-at-date-range-p))) --- 3984,3990 ---- (list 0 0 0 (nth 1 date) (car date) (nth 2 date)))) 0 11))) marker hdmarker deadlinep scheduledp donep tmp priority ! ee txt timestr) (goto-char (point-min)) (while (re-search-forward regexp nil t) (if (not (save-match-data (org-at-date-range-p))) *************** *** 3886,3894 **** --- 3994,4006 ---- (- (match-beginning 0) org-ds-keyword-length)) (match-beginning 0)) + timestr (buffer-substring (match-beginning 0) (point-at-eol)) deadlinep (string-match org-deadline-regexp tmp) scheduledp (string-match org-scheduled-regexp tmp) donep (org-entry-is-done-p)) + (if (string-match ">" timestr) + ;; substring should only run to end of time stamp + (setq timestr (substring timestr 0 (match-end 0)))) (save-excursion (if (re-search-backward "\\(^\\|\r\\)\\*+" nil t) (progn *************** *** 3899,3905 **** (format "%s%s" (if deadlinep "Deadline: " "") (if scheduledp "Scheduled: " "")) ! (match-string 1)))) (setq txt org-agenda-no-heading-message)) (setq priority (org-get-priority txt)) (add-text-properties --- 4011,4017 ---- (format "%s%s" (if deadlinep "Deadline: " "") (if scheduledp "Scheduled: " "")) ! (match-string 1) nil timestr))) (setq txt org-agenda-no-heading-message)) (setq priority (org-get-priority txt)) (add-text-properties *************** *** 4044,4053 **** (abbreviate-file-name (buffer-file-name))))) (regexp org-tr-regexp) (d0 (calendar-absolute-from-gregorian date)) ! marker hdmarker ee txt d1 d2 s1 s2) (goto-char (point-min)) (while (re-search-forward regexp nil t) ! (setq s1 (match-string 1) s2 (match-string 2) d1 (time-to-days (org-time-string-to-time s1)) d2 (time-to-days (org-time-string-to-time s2))) --- 4156,4166 ---- (abbreviate-file-name (buffer-file-name))))) (regexp org-tr-regexp) (d0 (calendar-absolute-from-gregorian date)) ! marker hdmarker ee txt d1 d2 s1 s2 timestr) (goto-char (point-min)) (while (re-search-forward regexp nil t) ! (setq timestr (match-string 0) ! s1 (match-string 1) s2 (match-string 2) d1 (time-to-days (org-time-string-to-time s1)) d2 (time-to-days (org-time-string-to-time s2))) *************** *** 4062,4070 **** (goto-char (match-end 1)) (looking-at "\\*+[ \t]*\\([^\r\n]+\\)") (setq txt (org-format-agenda-item ! (format "(%d/%d): " (1+ (- d0 d1)) (1+ (- d2 d1))) ! (match-string 1)))) (setq txt org-agenda-no-heading-message)) (add-text-properties 0 (length txt) (append (list 'org-marker marker --- 4175,4183 ---- (goto-char (match-end 1)) (looking-at "\\*+[ \t]*\\([^\r\n]+\\)") (setq txt (org-format-agenda-item ! (format (if (= d1 d2) "" "(%d/%d): ") (1+ (- d0 d1)) (1+ (- d2 d1))) ! (match-string 1) nil (if (= d0 d1) timestr)))) (setq txt org-agenda-no-heading-message)) (add-text-properties 0 (length txt) (append (list 'org-marker marker *************** *** 4077,4142 **** ;; Sort the entries by expiration date. (nreverse ee))) ! (defun org-format-agenda-item (prefix txt &optional category) "Format TXT to be inserted into the agenda buffer. ! In particular, this indents the line and adds a category." ! (let* ((category (or category ! org-category ! (file-name-sans-extension ! (file-name-nondirectory (buffer-file-name))))) ! (extra prefix) ! (time-of-day (org-get-time-of-day txt)) ! (t1 (if time-of-day (concat "0" (int-to-string time-of-day)) "0000")) ! (time (if time-of-day ! (concat (substring t1 -4 -2) ! ":" (substring t1 -2)) ! "")) ! rtn) ! (if (symbolp category) (setq category (symbol-name category))) ! (setq rtn (concat (eval org-prefix-format-compiled) txt)) ! (add-text-properties ! 0 (length rtn) (list 'category (downcase category) ! 'prefix-length (- (length rtn) (length txt)) ! 'time-of-day time-of-day) ! rtn) ! rtn)) ! (defun org-compile-prefix-format (format) "Compile the prefix format into a Lisp form that can be evaluated. The resulting form is returned and stored in the variable `org-prefix-format-compiled'." ! (let ((start 0) varform vars (s format) c) ! (while (string-match "%\\([-+]?[0-9.]*\\)\\([ .;,:!?=|/<>]?\\)\\([cts]\\)" s start) ! (setq var (cdr (assoc (match-string 3 s) '(("c" . category) ("t" . time) ("s" . extra)))) ! c (match-string 2 s) start (1+ (match-beginning 0))) ! (if (= (length c) 1) ! (setq varform `(if (equal "" ,var) "" (concat ,var ,c))) ! (setq varform var)) ! (setq s (replace-match "%\\1s" t nil s)) (push varform vars)) (setq vars (nreverse vars)) (setq org-prefix-format-compiled `(format ,s ,@vars)))) ! (defun org-get-time-of-day (s) "Check string S for a time of day. If found, return it as a military time number between 0 and 2400. ! If not found, return nil." (save-match-data ! (when (or ! (string-match ! "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)\\([AaPp][Mm]\\)?\\>" s) ! (string-match ! "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\([AaPp][Mm]\\)\\>" s)) ! (+ (* 100 (+ (string-to-number (match-string 1 s)) ! (if (and (match-beginning 4) ! (equal (downcase (match-string 4 s)) "pm")) ! 12 0))) ! (if (match-beginning 3) ! (string-to-number (match-string 3 s)) ! 0))))) (defun org-finalize-agenda-entries (list) "Sort and concatenate the agenda items." --- 4190,4376 ---- ;; Sort the entries by expiration date. (nreverse ee))) ! ! ! (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-stamp-time-of-day-regexp ! (concat ! "<\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} +[a-zA-Z]+ +\\)" ! "\\([012][0-9]:[0-5][0-9]\\)>" ! "\\(--?" ! "<\\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'.") ! ! (defun org-format-agenda-item (extra txt &optional category dotime noprefix) "Format TXT to be inserted into the agenda buffer. ! In particular, it adds the prefix and corresponding text properties. EXTRA ! must be a string and replaces the `%s' specifier in the prefix format. ! CATEGORY (string, symbol or nil) may be used to overule the default ! category taken from local variable or file name. It will replace the `%c' ! specifier in the format. DOTIME, when non-nil, indicates that a ! time-of-day should be extracted from TXT for sorting of this entry, and for ! the `%t' specifier in the format. When DOTIME is a string, this string is ! searched for a time before TXT is. NOPREFIX is a flag and indicates that ! only the correctly processes TXT should be returned - this is used by ! `org-agenda-change-all-lines'." ! (save-match-data ! ;; Diary entries sometimes have extra whitespace at the beginning ! (if (string-match "^ +" txt) (setq txt (replace-match "" nil nil txt))) ! (let* ((category (or category ! org-category ! (if (buffer-file-name) ! (file-name-sans-extension ! (file-name-nondirectory (buffer-file-name))) ! ""))) ! time ;; needed for the eval of the prefix format ! (ts (if dotime (concat (if (stringp dotime) dotime "") txt))) ! (time-of-day (and dotime (org-get-time-of-day ts))) ! stamp plain s0 s1 s2 rtn) ! (when (and dotime time-of-day org-prefix-has-time) ! ;; Extract starting and ending time and move them to prefix ! (when (or (setq stamp (string-match org-stamp-time-of-day-regexp ts)) ! (setq plain (string-match org-plain-time-of-day-regexp ts))) ! (setq s0 (match-string 0 ts) ! s1 (match-string (if plain 1 2) ts) ! s2 (match-string (if plain 8 4) ts)) ! ! ;; If the times are in TXT (not in DOTIMES), and the prefix will list ! ;; them, we might want to remove them there to avoid duplication. ! ;; The user can turn this off with a variable. ! (if (and org-agenda-remove-times-when-in-prefix (or stamp plain) ! (string-match (concat (regexp-quote s0) " *") txt) ! (if (eq org-agenda-remove-times-when-in-prefix 'beg) ! (= (match-beginning 0) 0) ! t)) ! (setq txt (replace-match "" nil nil txt)))) ! ;; Normalize the time(s) to 24 hour ! (if s1 (setq s1 (org-get-time-of-day s1 'string))) ! (if s2 (setq s2 (org-get-time-of-day s2 'string)))) ! ! ;; Create the final string ! (if noprefix ! (setq rtn txt) ! ;; Prepare the variables needed in the eval of the compiled format ! (setq time (cond (s2 (concat s1 "-" s2)) ! (s1 (concat s1 "......")) ! (t "")) ! extra (or extra "") ! category (if (symbolp category) (symbol-name category) category)) ! ;; Evaluate the compiled format ! (setq rtn (concat (eval org-prefix-format-compiled) txt))) ! ! ;; And finally add the text properties ! (add-text-properties ! 0 (length rtn) (list 'category (downcase category) ! 'prefix-length (- (length rtn) (length txt)) ! 'time-of-day time-of-day ! 'dotime dotime) ! rtn) ! rtn))) ! ! (defun org-agenda-add-time-grid-maybe (list ndays todayp) ! (catch 'exit ! (cond ((not org-agenda-use-time-grid) (throw 'exit list)) ! ((and todayp (member 'today (car org-agenda-time-grid)))) ! ((and (= ndays 1) (member 'daily (car org-agenda-time-grid)))) ! ((member 'weekly (car org-agenda-time-grid))) ! (t (throw 'exit list))) ! (let* ((have (delq nil (mapcar ! (lambda (x) (get-text-property 1 'time-of-day x)) ! list))) ! (string (nth 1 org-agenda-time-grid)) ! (gridtimes (nth 2 org-agenda-time-grid)) ! (req (car org-agenda-time-grid)) ! (remove (member 'remove-match req)) ! new time) ! (if (and (member 'require-timed req) (not have)) ! ;; don't show empty grid ! (throw 'exit list)) ! (while (setq time (pop gridtimes)) ! (unless (and remove (member time have)) ! (setq time (int-to-string time)) ! (push (org-format-agenda-item ! nil string "" ;; FIXME: put a category? ! (concat (substring time 0 -2) ":" (substring time -2))) ! new) ! (put-text-property ! 1 (length (car new)) 'face 'org-time-grid-face (car new)))) ! (if (member 'time-up org-agenda-sorting-strategy) ! (append new list) ! (append list new))))) ! (defun org-compile-prefix-format (format) "Compile the prefix format into a Lisp form that can be evaluated. The resulting form is returned and stored in the variable `org-prefix-format-compiled'." ! (setq org-prefix-has-time nil) ! (let ((start 0) varform vars var (s format) c f opt) ! (while (string-match "%\\(\\?\\)?\\([-+]?[0-9.]*\\)\\([ .;,:!?=|/<>]?\\)\\([cts]\\)" s start) ! (setq var (cdr (assoc (match-string 4 s) '(("c" . category) ("t" . time) ("s" . extra)))) ! c (or (match-string 3 s) "") ! opt (match-beginning 1) start (1+ (match-beginning 0))) ! (if (equal var 'time) (setq org-prefix-has-time t)) ! (setq f (concat "%" (match-string 2 s) "s")) ! (if opt ! (setq varform ! `(if (equal "" ,var) ! "" ! (format ,f (if (equal "" ,var) "" (concat ,var ,c))))) ! (setq varform `(format ,f (if (equal ,var "") "" (concat ,var ,c))))) ! (setq s (replace-match "%s" t nil s)) (push varform vars)) (setq vars (nreverse vars)) (setq org-prefix-format-compiled `(format ,s ,@vars)))) ! (defun org-get-time-of-day (s &optional string) "Check string S for a time of day. If found, return it as a military time number between 0 and 2400. ! If not found, return nil. ! The optional STRING argument forces conversion into a 5 character wide string ! HH:MM." (save-match-data ! (when ! (or ! (string-match ! "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)\\([AaPp][Mm]\\)?\\> *" s) ! (string-match ! "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\([AaPp][Mm]\\)\\> *" s)) ! (let* ((t0 (+ (* 100 ! (+ (string-to-number (match-string 1 s)) ! (if (and (match-beginning 4) ! (equal (downcase (match-string 4 s)) "pm")) ! 12 0))) ! (if (match-beginning 3) ! (string-to-number (match-string 3 s)) ! 0))) ! (t1 (concat " " (int-to-string t0)))) ! (if string (concat (substring t1 -4 -2) ":" (substring t1 -2)) t0))))) (defun org-finalize-agenda-entries (list) "Sort and concatenate the agenda items." *************** *** 4295,4317 **** (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. HDMARKER is checked with ! `equal' against all `org-hd-marker' text properties in the file." ! (let* (props m pl undone-face done-face) (save-excursion (goto-char (point-max)) (beginning-of-line 1) ! (while (not (bobp)) (when (and (setq m (get-text-property (point) 'org-hd-marker)) (equal m hdmarker)) (setq props (text-properties-at (point)) pl (get-text-property (point) 'prefix-length) undone-face (get-text-property (point) 'undone-face) done-face (get-text-property (point) 'done-face)) (move-to-column pl) (if (looking-at ".*") (progn ! (replace-match newhead t t) (beginning-of-line 1) (add-text-properties (point-at-bol) (point-at-eol) props) (if fixface --- 4529,4558 ---- (defun org-agenda-change-all-lines (newhead hdmarker &optional fixface) "Change all lines in the agenda buffer which match hdmarker. ! The new content of the line will be NEWHEAD (as modified by ! `org-format-agenda-item'). HDMARKER is checked with ! `equal' against all `org-hd-marker' text properties in the file. ! If FIXFACE is non-nil, the face of each item is modified acording to ! the new TODO state." ! (let* (props m pl undone-face done-face finish new dotime) ! ; (setq newhead (org-format-agenda-item "x" newhead "x" nil 'noprefix)) (save-excursion (goto-char (point-max)) (beginning-of-line 1) ! (while (not finish) ! (setq finish (bobp)) (when (and (setq m (get-text-property (point) 'org-hd-marker)) (equal m hdmarker)) (setq props (text-properties-at (point)) + dotime (get-text-property (point) 'dotime) + new (org-format-agenda-item "x" newhead "x" dotime 'noprefix) pl (get-text-property (point) 'prefix-length) undone-face (get-text-property (point) 'undone-face) done-face (get-text-property (point) 'done-face)) (move-to-column pl) (if (looking-at ".*") (progn ! (replace-match new t t) (beginning-of-line 1) (add-text-properties (point-at-bol) (point-at-eol) props) (if fixface *************** *** 4355,4360 **** --- 4596,4602 ---- (and (outline-next-heading) (org-flag-heading nil))) ; show the next heading (funcall 'org-priority force-direction) + (end-of-line 1) (setq newhead (org-get-heading))) (org-agenda-change-all-lines newhead hdmarker) (beginning-of-line 1))) *************** *** 4519,4525 **** "ISO: " (calendar-iso-date-string date) "\n" "Day of Yr: " (calendar-day-of-year-string date) "\n" "Julian: " (calendar-julian-date-string date) "\n" ! "Astronomic: " (calendar-astro-date-string date) " (Julian date number at noon UTC)\n" "Hebrew: " (calendar-hebrew-date-string date) " (until sunset)\n" "Islamic: " (calendar-islamic-date-string date) " (until sunset)\n" --- 4761,4767 ---- "ISO: " (calendar-iso-date-string date) "\n" "Day of Yr: " (calendar-day-of-year-string date) "\n" "Julian: " (calendar-julian-date-string date) "\n" ! "Astron. JD: " (calendar-astro-date-string date) " (Julian date number at noon UTC)\n" "Hebrew: " (calendar-hebrew-date-string date) " (until sunset)\n" "Islamic: " (calendar-islamic-date-string date) " (until sunset)\n" *************** *** 4865,4874 **** ((fboundp 'gnus-group-name) (gnus-group-name)) (t "???")))) ! (setq link (concat (if (org-xor arg org-usenet-links-prefer-google) ! "http://groups.google.com/groups?group=" ! "gnus:") ! group)))) ((memq major-mode '(gnus-summary-mode gnus-article-mode)) (and (eq major-mode 'gnus-article-mode) (gnus-article-show-summary)) --- 5107,5117 ---- ((fboundp 'gnus-group-name) (gnus-group-name)) (t "???")))) ! (setq link (concat ! (if (org-xor arg org-usenet-links-prefer-google) ! "http://groups.google.com/groups?group=" ! "gnus:") ! group)))) ((memq major-mode '(gnus-summary-mode gnus-article-mode)) (and (eq major-mode 'gnus-article-mode) (gnus-article-show-summary)) *************** *** 4919,4927 **** (defun org-xor (a b) "Exclusive or." ! ;; (if a (not b) b) ! (or (and a (not b)) ! (and b (not a)))) (defun org-get-header (header) "Find a header field in the current buffer." --- 5162,5168 ---- (defun org-xor (a b) "Exclusive or." ! (if a (not b) b)) (defun org-get-header (header) "Find a header field in the current buffer." *************** *** 5217,5223 **** (point-at-bol) (point))) (beginning-of-line 1) (newline)) ! (mapcar (lambda (x) (insert line)) (make-list rows t)) (goto-char pos) (if (> rows 1) ;; Insert a hline after the first row. --- 5458,5465 ---- (point-at-bol) (point))) (beginning-of-line 1) (newline)) ! ;; (mapcar (lambda (x) (insert line)) (make-list rows t)) ! (dotimes (i rows) (insert line)) (goto-char pos) (if (> rows 1) ;; Insert a hline after the first row. *************** *** 5285,5292 **** (unless (or (not (file-exists-p file)) (y-or-n-p (format "Overwrite file %s? " file))) (error "Abort")) ! (save-excursion ! (find-file file) (setq buf (current-buffer)) (erase-buffer) (fundamental-mode) --- 5527,5533 ---- (unless (or (not (file-exists-p file)) (y-or-n-p (format "Overwrite file %s? " file))) (error "Abort")) ! (with-current-buffer (find-file-noselect file) (setq buf (current-buffer)) (erase-buffer) (fundamental-mode) *************** *** 5406,5417 **** (setq rfmt (concat rfmt "\n") hfmt (concat (substring hfmt 0 -1) "|\n")) ;; Produce the new table ! (while lines ! (setq l (pop lines)) ! (if l ! (setq new (concat new (apply 'format rfmt ! (append (pop fields) emptystrings)))) ! (setq new (concat new hfmt)))) ;; Replace the old one (delete-region beg end) (move-marker end nil) --- 5647,5664 ---- (setq rfmt (concat rfmt "\n") hfmt (concat (substring hfmt 0 -1) "|\n")) ;; Produce the new table ! ;;(while lines ! ;; (setq l (pop lines)) ! ;; (if l ! ;; (setq new (concat new (apply 'format rfmt ! ;; (append (pop fields) emptystrings)))) ! ;; (setq new (concat new hfmt)))) ! (setq new (mapconcat ! (lambda (l) ! (if l (apply 'format rfmt ! (append (pop fields) emptystrings)) ! hfmt)) ! lines "")) ;; Replace the old one (delete-region beg end) (move-marker end nil) *************** *** 8480,8488 **** (get-char-property (point) 'invisible)) (save-excursion (skip-chars-backward "^\r\n") ! (if (bobp) ! nil ! (equal (char-before) ?\r))))) (defun org-back-to-heading (&optional invisible-ok) "Move to previous heading line, or beg of this line if it's a heading. --- 8727,8733 ---- (get-char-property (point) 'invisible)) (save-excursion (skip-chars-backward "^\r\n") ! (equal (char-before) ?\r)))) (defun org-back-to-heading (&optional invisible-ok) "Move to previous heading line, or beg of this line if it's a heading.
_______________________________________________ Emacs-diffs mailing list [email protected] http://lists.gnu.org/mailman/listinfo/emacs-diffs
